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