В экземпляре объекта не задана ссылка на объект 1с
Мы уже познакомились с таким понятием, как объект в 1С , следующим шагом будет логично познакомиться с таким понятием, как ссылка в 1С.
Ссылка указывает на данные экземпляра объекта, но не хранит их, т.е. получив ссылку на конкретный экземпляр объекта, мы сможем узнать всю информацию об экземпляре этого объекта, но не сможем внести какие-нибудь коррективы в эту информацию.
Мы помним, что в платформе 1С 8.3. существуют три вида объектов. Это объекты метаданных, общие объекты и универсальные коллекции значений.
Так вот, ссылка может быть только у объектов метаданных.
Замечу что, ссылка указывает не на сам объект, а на экземпляр объекта. Хотя, очень часто употребляют выражения «ссылка объекта», «ссылка на объект» и т.п.
Все ссылки объектов имеют тип СправочникСсылка.<НазваниеОбъекта>, ДокументСсылка.<НазваниеОбъекта> и т.д.
Ссылку можно использовать в качестве переменной, и также ссылку можно указывать, как реквизит других объектов метаданных.
Например, в моей конфигурации есть справочник Контрагенты.
Это значит, теперь в документе Оплата можно хранить информацию о контрагенте, который сделал оплату.
Если мы используем ссылку в качестве реквизита какого-то объекта, то при редактировании экземпляра, на который указывает ссылка, сам реквизит не изменится.
Поясню на примере. Я выше создал документ Оплата и реквизит Оплативший для этого документа с типом СправочникСсылка.Контрагенты.
Если я переименую элемент справочника Контрагенты.
Затем, зайду обратно в выше созданный документ Оплата, то увижу, что отображение контрагента в реквизите поменялось автоматически.
Что это значит? Это не значит, что реквизит Оплативший элемента и сам элемент справочника Номенклатура поменялся автоматически. Нет, это значит, что данный реквизит хранит указатель на экземпляр объекта, который отображается посредством наименования. Поменяли наименование, поменялось только отображение, если бы поменяли какой-нибудь другой реквизит справочника Контрагенты, то пользователь бы ничего не заметил.
Получить ссылку 1С
Каким образом программно получить ссылку на экземпляр объекта, который уже есть в базе?
Сделать это можно несколькими способами: найти по коду, найти по наименованию, найти по реквизиту и найти по нескольким реквизитам через запрос. Я рассмотрю первые два метода.
Для демонстрации этих методов, на основной форме документа Оплата я создам команду «Установить контрагента», которую размещу в командной панели формы.
При выполнении этой команды я буду в поле Оплативший записывать определенного контрагента. Для этого я создам обработчики команды на клиенте и на сервере.
Первый способ получения ссылки: найти по коду, для поиска по коду необходимо использовать функцию менеджера объекта НайтиПоКоду.
Функция НайтиПоКоду вернёт ссылку на экземпляр объекта справочник Контрагенты, которому соответствует код 000000002. Почему мы задали код в виде строки, а не в виде цифры, например? Чтобы понять это, нужно открыть непосредственно редактор справочника Контрагенты в конфигураторе, перейти на закладку «Данные» и посмотреть, какой тип кода у этого справочника.
Таким образом, данный код:
Рассмотрим синтаксис этой функции для менеджера справочника:
НайтиПоКоду(<Код>,<ПоискПоПолномуКоду>,<Родитель>,<Владелец>)
Код – непосредственно тот код, по которому мы ищем наш элемент;
Данное поле необязательно, по умолчанию – Ложь;
Родитель – для иерархических справочников можно указать группу, тогда поиск будет вестись внутри группы. Данное поле необязательно;
Владелец – для подчиненных справочников можно указать владельца, тогда поиск будет вестись только среди элементов, подчиненных данному владельцу. Данное поле необязательно.
Второй способ получения ссылки: найти по наименованию, для поиска по наименованию необходимо использовать функцию менеджера объекта НайтиПоНаименованию.
Этот способ можно применить только для тех объектов, у которых имеется стандартный реквизит Наименование.
Например, у справочников этот реквизит имеется.
А у документов его нет.
В случае этой функции, поиск ведется по тому значению, которое в поле Наименование объекта
Синтаксис функции для менеджера справочника следующий:
НайтиПоНаименованию(<Наименование>,<ТочноеСоответствие>,<Родитель>,<Владелец>)
«Наименование» – непосредственно то наименование, по которому мы ищем наш элемент;
Данное поле необязательно, по умолчанию – Ложь.
Помните это, что по умолчанию поиск ведется не точно;
Параметры «Родитель» и «Владелец» точно такие же, как для процедуры НайтиПоКоду.
Пустая ссылка 1С
Выглядит он так:
ПустаяНоменклатура= Справочники.Номенклатура.ПустаяСсылка();
ПустаяОплата = Документы.Оплата.ПустаяСсылка();
Переменные ПустаяНоменклатура и ПустаяОплата содержат в себе пустые ссылки на каждый объект.
Обращаю Ваше внимание, что для каждого вида справочника и каждого документа будет своя собственная пустая ссылка.
Данный метод очень удобно использовать, когда нам необходимо знать, найден ли элемент справочника по коду (названию) или нет.
Метод Пустая() удобно использовать работая в клиентском контексте (в том числе на тонком клиенте), потому что менеджер объекта это «тяжелый» объекта и с ним можно работать только в серверном контексте. Т.е. установку контрагента можно сделать таким способом:
В этом коде я получаю по наименованию ссылку на нужного контрагента, делаю это в серверном методе, поскольку обращаюсь к менеджеру справочника, записываю если он не пустой, а потом в клиентском методе проверяю, найден контрагент по такому наименованию или нет, если не найден то вывожу предупреждение.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Пожалуйста, помогите, а также объясните, что происходит. Спасибо.
Я наконец нашел проблему. Это произошло из-за того, что мой брандмауэр, похоже, блокирует подключения к Visual Studio. Теперь он работает без каких-либо изменений :) Спасибо за вашу поддержку
Эта ошибка причиняет боль, в основном это означает, что какой-то доступный вам объект по-прежнему имеет значение NULL.
В этом случае, где вы инициализируете временную шкалу? Если ваш код выглядит примерно так:
Хорошо, я смотрел документацию twiteroo, которая немного скудна, и я думаю, что вам определенно нужно создать экземпляр Timeline для передачи в GetTimeline (который возвращает коллекции пользователей, не очень хорошо названных IMHO). Я не могу понять, как запустить экземпляр Timeline.
Хорошо, это не Timeline, который имеет значение null (это Enum!), Поэтому, как говорит bthb, это может быть только ядро, возможно, имя пользователя или пароль неправильные, или он не может подключиться к твиттеру?
Это может быть ядро, имя пользователя, пароль или Timeline.Friends, невозможно узнать, какие из них, по информации, которую вы нам предоставили.
Если бы я был на вашем месте, я бы поставил точку останова в строке с ошибкой, затем пристегнул бы часы к Timeline.Friends и проверил бы, что он не равен нулю, если нет, то поставьте часы на core.GetTimeline (Timeline.Friends) и посмотрите, если это так. возвращает null.
Это должно дать вам толчок в правильном направлении, вам, вероятно, придется прочитать документацию по твиттеру API, который вы используете, чтобы узнать, почему любой из них возвращает null.
Как насчет проверки вашего кода, например:
Если это выполняется без исключений, один из объектов, вероятно, был нулевым.
Во-первых, ссылку на объект можно рассматривать как переменную в функции или классе. Этот термин может также относиться к параметрам функции, которые ожидают конкретной ссылки на объект. Первоначально значение переменной равно NULL, пока не будет установлено значение с помощью оператора '='. Часто у вас будет объявление переменной и операция '=' в одном и том же операторе.
Термин экземпляр объекта относится к объекту, который был создан с использованием синтаксиса new . Когда вы вызываете new для инициализации объекта, неиспользуемая область памяти выделяется для хранения копии объекта до завершения программы или до тех пор, пока объект не выйдет из области видимости и не будет освобожден сборщиком мусора. Во время создания свойства объекта определяются методом конструктора, вызываемым для создания объекта.
Рассмотрим этот код:
В этом примере my_int - это ссылка на объект на создаваемый экземпляр объекта Integer .
Если вы декомпилируете dll, вы увидите, что GetTimeline (Enum) принимает аргумент Enumeration.
В итоге я получаю ссылку на объект, которая не соответствует экземпляру объекта (между ///// в приведенном выше коде ..
Я попытался создать один экземпляр Cell, и он отлично работает.
4 ответа
Когда вы создаете экземпляр массива, элементы в массиве получают значение по умолчанию для этого типа. Таким образом, для
Дело в том, что для каждого i с 0 <= i < length у нас есть array[i] = default(T) . Таким образом, для ссылочных типов array[i] будет null . Вот почему вы видите NullReferenceException . В вашем случае Cell является ссылочным типом, поэтому, поскольку у вас есть
И все, что вы сделали, это установили массив ссылок на Cell , но вы никогда не назначали эти ссылки экземплярам Cell . То есть вы сказали компилятору: «Дайте мне массив, который может содержать ссылки на Cell », но вы не сказали компилятору: «Дайте мне массив, который может содержать ссылки на Cell » и назначить каждому этих ссылок на новый экземпляр Cell . " Таким образом, компилятор установит начальное значение этих ссылок на null . Поэтому вам необходимо инициализировать HomeArray :
Массивы инициализируются как пустые - ссылка Null возникает из-за того, что HomeArray[i,j] имеет значение NULL, а не потому, что HomeArray[i,j].currentCell имеет значение NULL.
ОБНОВЛЕНИЕ: Если у вас есть инструкция, в которой несколько разных вещей могут быть нулевыми, я обычно разбиваю ее на несколько строк, чтобы было легче определить, что является нулевым.
Например, в вашем случае:
Либо HomeArray[i,j] , либо HomeArray[i,j].currentCell потенциально могут иметь значение NULL и вызывать исключение NullReferenceException - нет способа определить, что это было из исключения. Однако если вы разделите это утверждение:
В этом случае, если HomeArray[i,j] имеет значение NULL, вы получите исключение NullReferenceException в первой строке, тогда как если cell имеет значение NULL, вы получите его во второй строке.
Вам необходимо инициализировать ячейки в ваших массивах.
Вы получаете исключение, потому что вы не назначаете экземпляр Cell ни одному из слотов ваших матриц.
Читайте также: