Разработка и Конфигурация · 10 мин
Когда появляется ссылка на объект 1С
Разбираем, в какой момент у объекта 1С появляется ссылка: при создании, записи и интерактивном вводе. Отличия СоздатьОбъект, ПолучитьСсылку и Новый, типичные ошибки.
Вопрос о том, когда именно у объекта 1С появляется ссылка, возникает почти у каждого разработчика, который начинает работать со ссылочными типами: справочниками, документами, планами счетов, планами видов характеристик. От ответа зависит корректность обмена данными, заполнение реквизитов табличных частей и поведение кода при откате транзакции.
Ключевой принцип платформы 1С прост: ссылка — это уникальный идентификатор объекта в базе данных, и она появляется либо в момент записи объекта в базу, либо заранее — если разработчик явно запросил её до записи. Между этими двумя сценариями есть важные различия, которые влияют на логику программы.
Ниже разберём все ситуации: интерактивное создание элемента, программное создание через СоздатьЭлемент() и СоздатьДокумент(), метод ПолучитьСсылку(), работу конструктора Новый и особенности обмена данными, где ссылка присваивается ещё до появления самого объекта в базе.
Что такое ссылка в 1С и зачем она нужна
Ссылка — это значение ссылочного типа, которое однозначно идентифицирует объект в информационной базе. Физически это уникальный идентификатор (GUID) плюс информация о типе объекта. Именно ссылки хранятся в реквизитах других объектов, в регистрах и в табличных частях — база никогда не хранит «копию» объекта, только указатель на него.
Важно различать два понятия: объект (например, СправочникОбъект.Номенклатура) — это набор данных в памяти, который можно изменять, и ссылка (СправочникСсылка.Номенклатура) — неизменяемый идентификатор, через который данные только читаются. Пока объект существует только в памяти и не записан, ссылки у него по умолчанию нет.
Когда ссылка появляется при интерактивном создании
Когда пользователь в режиме «1С:Предприятие» нажимает «Создать» в списке справочника или документов, открывается форма нового объекта. В этот момент объект существует только в памяти клиента и сервера — в базе данных его нет, и ссылки у него тоже нет. Это легко проверить: свойство Ссылка в обработчиках формы для нового объекта будет пустым, а функция ЭтоНовый() вернёт Истина.
Ссылка появляется в момент, когда пользователь нажимает «Записать» или «Провести»: платформа выполняет запись в базу данных, присваивает объекту уникальный идентификатор и возвращает ссылку. Если пользователь закроет форму без записи, объект просто исчезнет — никаких следов в базе не останется.
Для документов существует дополнительный нюанс: номер документа и ссылка присваиваются независимо. Номер может быть назначен при записи (в зависимости от настроек нумерации), но ссылка формируется именно фактом записи, а не присвоением номера.
Программное создание: СоздатьЭлемент и СоздатьДокумент
При программном создании объекта через Справочники.Номенклатура.СоздатьЭлемент() или Документы.РеализацияТоваровУслуг.СоздатьДокумент() возвращается объект, существующий только в памяти. Вызов этих методов не обращается к базе данных на запись, поэтому ссылка на этом этапе не создаётся.
Ссылка появляется только после вызова метода Записать(). До этого момента обращение к свойству Ссылка даст пустую ссылку соответствующего типа. Это типичный источник ошибок: разработчик заполняет реквизит ссылочного типа значением НовыйОбъект.Ссылка до записи — и в базу попадает пустая ссылка.
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Тестовая позиция";
// Здесь НовыйЭлемент.Ссылка — ещё пустая!
НовыйЭлемент.Записать();
// Только теперь ссылка существует:
Сообщить(НовыйЭлемент.Ссылка);Правильный порядок всегда одинаков: создать объект, заполнить реквизиты, записать, и только после записи использовать ссылку — например, передавать её в другие объекты или регистры.
Получение ссылки до записи: метод ПолучитьСсылку
Платформа позволяет получить ссылку до записи объекта. Для этого у объекта есть метод ПолучитьСсылку() (для справочников и некоторых других типов также доступен менеджер ПолучитьСсылку() с параметром — уникальным идентификатором). После вызова этого метода объекту назначается идентификатор, и свойство Ссылка начинает возвращать осмысленное значение, хотя в базе данных записи ещё нет.
Эта возможность незаменима, когда нужно в одной транзакции создать несколько взаимосвязанных объектов: например, элемент справочника и запись регистра сведений, которая на него ссылается. Получив ссылку заранее, можно заполнить все реквизиты и записать объекты в нужном порядке.
Ссылка при обмене данными и загрузке
В механизмах обмена данными ситуация особая: ссылка фактически «приезжает» вместе с сообщением обмена раньше, чем объект записывается в базу-приёмник. Каждый объект в плане обмена идентифицируется своим GUID из базы-источника, и платформа сначала ищет объект по этому идентификатору.
Если объект с таким идентификатором не найден, при загрузке создаётся новый объект, которому принудительно назначается ссылка с переданным GUID. Благодаря этому один и тот же элемент номенклатуры в двух базах имеет одинаковую ссылку, что критично для сопоставления данных.
Похожий механизм используется при программной синхронизации: разработчик может заранее сформировать ссылку по известному GUID через Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)) и проверить её существование запросом или методом ПолучитьОбъект().
Конструктор «Новый» и нессылочные типы
Конструктор Новый (например, Новый Структура, Новый Массив, Новый УникальныйИдентификатор) не имеет отношения к ссылкам на объекты базы данных. Значения, созданные через Новый, — это нессылочные типы: они существуют только в памяти и не могут храниться в реквизитах объектов как ссылки.
Единственное пересечение — Новый УникальныйИдентификатор: так можно сгенерировать GUID, который затем используется для создания ссылки с заранее заданным идентификатором. Это применяется в интеграциях, когда внешняя система должна знать идентификатор объекта до его фактической записи в 1С.
Как проверить, что ссылка появилась и корректна
После записи объекта убедитесь, что ссылка не пустая: используйте функцию ЗначениеЗаполнено(Объект.Ссылка) или сравнение с пустой ссылкой через Справочники.Номенклатура.ПустаяСсылка(). Пустая ссылка после успешной записи — признак того, что запись фактически не выполнилась (например, была откачена транзакция).
Для проверки того, что ссылка указывает на реально существующий объект, не полагайтесь на само наличие значения. Выполните запрос по ссылке или вызовите Ссылка.ПолучитьОбъект(): если объекта нет, метод вернёт Неопределено.
Как проверить результат
Ссылка заполнена, ЗначениеЗаполнено() = Истина
Ссылка пустая — запись не выполнена или транзакция откачена
ПолучитьОбъект() возвращает объект
Возвращается Неопределено — ссылка «битая»
Пустая ссылка — это норма
Код использует эту ссылку как значение реквизита
Типичные ошибки при работе со ссылками
Большинство проблем связано с неверным пониманием момента появления ссылки. Ниже — ситуации, которые встречаются чаще всего.
Отдельно отметим работу в транзакциях: если объект записан внутри транзакции, ссылка появляется сразу после Записать(), но при откате транзакции объект исчезает из базы, а полученная ссылка становится «битой». Поэтому передавать ссылку за пределы транзакции (например, во внешнюю систему) безопасно только после успешной фиксации.
Что важно запомнить
Ссылка появляется при записи объекта в базу данных. До записи ссылки нет, но её можно назначить заранее методом ПолучитьСсылку(). Ссылка без записанного объекта — это «битая» ссылка, которую нужно избегать, записывая объект в той же транзакции.
Частые вопросы
Можно ли узнать ссылку документа до его записи?
Да, вызовите у объекта документа метод ПолучитьСсылку() — платформа назначит идентификатор, и свойство Ссылка станет заполненным. Но объект обязательно нужно записать, иначе ссылка окажется «битой».
Почему после Записать() ссылка всё равно пустая?
Чаще всего запись завершилась ошибкой или транзакция была откачена после записи. Проверьте, не обёрнут ли вызов Записать() в Попытка/Исключение с подавлением ошибки, и не откатывается ли транзакция выше по стеку вызовов.
Что означает «<Объект не найден>» вместо ссылки?
Это «битая» ссылка: значение ссылки хранится в реквизите, но сам объект в базе отсутствует — удалён или никогда не был записан. Такие ситуации возникают после неполных обменов, откатов транзакций и удаления объектов без контроля ссылочной целостности.
Одинаковы ли ссылки на один объект в разных информационных базах?
По умолчанию нет: при создании объекта в каждой базе генерируется свой GUID. Одинаковыми ссылки становятся только при обмене данными или при принудительном назначении ссылки с заданным уникальным идентификатором.
Чем пустая ссылка отличается от Неопределено?
Пустая ссылка — это типизированное значение: у неё известен тип (например, СправочникСсылка.Номенклатура), но идентификатор нулевой. Неопределено означает отсутствие значения вообще, без типа. В реквизитах составного типа важно проверять оба варианта.
Можно ли изменить ссылку уже записанного объекта?
Штатными средствами — нет, идентификатор объекта неизменен. Если нужен объект с другой ссылкой, создают новый объект с требуемым GUID и переносят данные, а старый удаляют с контролем ссылочной целостности.