К статье
Практический материал

Разработка и Конфигурация · 10 мин

Когда формируется ссылка документа в 1С

Разбираем, в какой момент у документа 1С появляется ссылка (GUID): при записи, через ПолучитьСсылку, при обмене. Примеры кода, ошибки и способы проверки.

Ссылка документа в 1С — это уникальный идентификатор (GUID), по которому платформа однозначно находит объект в базе данных. Понимание момента, когда эта ссылка появляется, критично для разработчиков: от этого зависит корректность обменов, заполнение реквизитов типа «ДокументСсылка», работа с COM-соединениями и внешними источниками. Ошибка в логике приводит к битым ссылкам, дублям документов и потере связей между объектами.

Ключевой факт, который нужно уяснить сразу: у только что созданного, но не записанного документа ссылки нет. Метод СоздатьДокумент() или команда «Создать» в интерфейсе формируют лишь объект в памяти. Ссылка появляется либо при первой записи объекта в базу, либо принудительно — через метод УстановитьСсылкуНового() с заранее полученным значением.

Ниже разобраны все сценарии формирования ссылки: интерактивная запись, программная запись, предварительное получение ссылки до записи, поведение при обмене данными и типичные ошибки, которые встречаются на практике.

Что такое ссылка документа и из чего она состоит

Ссылка — это значение типа ДокументСсылка.<ИмяДокумента>, внутри которого хранится уникальный идентификатор (UUID/GUID) — 128-битное значение. Именно GUID записывается в поле ссылки таблицы документа в СУБД и используется во всех реквизитах, табличных частях, регистрах и движениях, где на документ ссылаются.

Важное свойство: GUID присваивается один раз и никогда не меняется. Перепроведение, изменение реквизитов, перенумерация — ничто не влияет на ссылку. Именно поэтому ссылку используют как надёжный ключ связи между базами при обменах, в отличие от номера и даты, которые могут совпадать или изменяться.

Ссылка существует независимо от «полноценности» объекта: документ может быть записан с минимальным набором данных, но ссылка у него уже есть, и на него можно ссылаться из других объектов.

Момент формирования ссылки при интерактивной работе

Когда пользователь нажимает «Создать» в списке документов, открывается форма нового объекта. В этот момент документ существует только в памяти клиента и на сервере в контексте формы — в базе данных его нет, и ссылки у него нет. Если закрыть форму без записи, в базе не останется никакого следа.

Ссылка появляется в момент нажатия кнопок «Записать», «Провести» или «ОК» (если форма настроена на запись при закрытии). Платформа генерирует GUID, вставляет строку в таблицу документа, и с этого момента свойство Ссылка объекта заполнено. Проверить это просто: до записи выражение Объект.Ссылка.Пустая() вернёт Истина, после записи — Ложь.

Документ, записанный, но не проведённый, уже имеет ссылку. Проведение влияет только на движения по регистрам, но не на факт существования ссылки. Это частый источник недопонимания: «непроведённый» не значит «несуществующий».

Программное создание: когда появляется ссылка

При программной работе логика та же. Рассмотрим типовой код:

НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

// В этот момент НовыйДок.Ссылка — пустая ссылка

НовыйДок.Дата = ТекущаяДатаСеанса();

НовыйДок.Записать();

// Только теперь НовыйДок.Ссылка содержит реальный GUID

До вызова Записать() свойство Ссылка содержит пустую ссылку соответствующего типа. Попытка использовать её как значение реквизита другого объекта до записи приведёт к сохранению пустой ссылки — и это одна из самых распространённых ошибок начинающих разработчиков.

Режим записи (РежимЗаписиДокумента.Запись или Проведение) на формирование ссылки не влияет: GUID генерируется при первом физическом сохранении объекта в базу в любом режиме.

Как получить ссылку до записи документа

В ряде задач ссылка нужна до записи: например, при загрузке данных из внешних систем, когда документ и связанные с ним объекты создаются одновременно, или при восстановлении связей по известному GUID. Для этого платформа предоставляет пару методов.

НовыйДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();

НоваяСсылка = Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку(

Новый УникальныйИдентификатор("a1b2c3d4-..."));

НовыйДок.УстановитьСсылкуНового(НоваяСсылка);

// Теперь НовыйДок.Ссылка заполнена, хотя документ ещё не записан

НовыйДок.Записать();

Порядок получения ссылки до записи
  1. 1
    Создайте объект методом СоздатьДокумент()
  2. 2
    Получите ссылку: МенеджерДокумента.ПолучитьСсылку() — без параметра сгенерируется новый GUID, с параметром — заданный
  3. 3
    Назначьте её объекту методом УстановитьСсылкуНового()
  4. 4
    Заполните реквизиты и вызовите Записать()
  5. 5
    Проверьте, что объект записался с именно этим GUID

Метод ПолучитьСсылку() без параметра просто генерирует новый GUID, не создавая ничего в базе. С параметром-строкой GUID он возвращает ссылку с заданным идентификатором — именно так работают механизмы обмена, сохраняя соответствие объектов между базами.

Ограничение: УстановитьСсылкуНового() можно вызвать только для нового объекта до его первой записи. Назначить другую ссылку уже существующему документу нельзя — GUID неизменен.

Ссылка при обмене данными и конвертации

В обменах (РИБ, универсальный обмен, EnterpriseData) ссылка играет роль ключа сопоставления. При выгрузке документа вместе с данными передаётся его GUID. На стороне приёмника механизм обмена сначала ищет объект по этому GUID через ПолучитьСсылку(УникальныйИдентификатор) и проверяет, существует ли он в базе.

Если объект с таким GUID не найден, создаётся новый документ, ему через УстановитьСсылкуНового() назначается ссылка с идентификатором из пакета обмена, и только затем объект записывается. Благодаря этому один и тот же документ имеет одинаковый GUID во всех связанных базах.

Отсюда практический вывод: при самостоятельной разработке загрузки из внешней системы храните в ней GUID документа 1С (или наоборот — внешний ключ в реквизите документа). Сопоставление по номеру и дате ненадёжно из-за перенумерации и возможных дублей.

Как проверить, сформирована ли ссылка

Для диагностики используются простые проверки. Основная — ЗначениеЗаполнено(ДокОбъект.Ссылка) или ДокОбъект.Ссылка.Пустая(). Дополнительно можно получить сам идентификатор: Строка(ДокОбъект.Ссылка.УникальныйИдентификатор()).

Контрольные точки

Как проверить состояние ссылки

Ссылка.Пустая() до записи
Норма

Возвращает Истина — документ новый

Тревожный признак

Возвращает Ложь у незаписанного — значит, ссылку установили программно, проверьте логику

Ссылка после Записать()
Норма

Заполнена, УникальныйИдентификатор() возвращает GUID

Тревожный признак

Пустая — запись не выполнилась, смотрите исключения и отказ в обработчиках

Ссылка в реквизите другого объекта
Норма

Ссылается на существующий документ, открывается по клику

Тревожный признак

«Объект не найден» — битая ссылка после удаления без контроля целостности

Отдельный случай — «битые ссылки». Они появляются, когда документ удалили непосредственно (без контроля ссылочной целостности) или при сбоях обмена. В базе остаются значения ссылок на несуществующий GUID. Найти такие места помогает штатная обработка поиска и удаления помеченных объектов с контролем ссылок, а в коде — проверка через запрос или попытку получить объект методом ПолучитьОбъект().

Типичные ошибки при работе со ссылками новых документов

Типичные ошибки
01
Использование Ссылка до Записать() — в связанные объекты сохраняется пустая ссылка
02
Попытка изменить ссылку существующего документа — GUID неизменен, нужно создавать новый объект и переносить связи
03
Сопоставление документов между базами по номеру и дате — при перенумерации связи ломаются, используйте GUID
04
Вызов УстановитьСсылкуНового() после записи — метод работает только для нового объекта
05
Игнорирование исключения при Записать() — ссылка остаётся пустой, а код продолжает работать с ней как с реальной

Ещё одна тонкость касается транзакций. Если документ записан внутри транзакции, ссылка формально уже существует и её можно использовать в коде, но при откате транзакции объект исчезнет из базы — и все сохранённые за пределами транзакции ссылки станут битыми. Поэтому передавать ссылку «наружу» следует только после успешной фиксации.

При копировании документа (метод Скопировать() или команда «Скопировать» в интерфейсе) создаётся новый объект без ссылки — при записи ему будет сгенерирован новый GUID. Рассчитывать на то, что копия унаследует идентификатор оригинала, нельзя.

Итог

Что важно запомнить

Ссылка документа появляется при первой записи в базу или назначается заранее через ПолучитьСсылку() + УстановитьСсылкуНового(). GUID формируется один раз и не меняется. До записи ссылка пустая — использовать её в связях нельзя. В обменах сопоставляйте объекты по GUID, а не по номеру и дате.

Частые вопросы

Можно ли узнать ссылку документа, который ещё не записан?

Да, но только если вы сами её назначили: вызовите МенеджерДокумента.ПолучитьСсылку(), затем УстановитьСсылкуНового() у объекта. Без этих действий у незаписанного документа ссылка пустая, и «узнать» будущий GUID невозможно — он генерируется в момент записи.

Меняется ли ссылка при перепроведении документа?

Нет. GUID присваивается один раз при первой записи и остаётся неизменным при любых дальнейших операциях: изменении реквизитов, перепроведении, отмене проведения, перенумерации.

Чем ссылка отличается от номера документа?

Номер — это пользовательский реквизит, который может меняться при перенумерации и совпадать у разных документов в разных периодах или базах. Ссылка — внутренний уникальный идентификатор, который гарантированно уникален и неизменен. Для программных связей и обменов используется только ссылка.

Что такое «битая ссылка» и откуда она берётся?

Это значение ссылки, указывающее на GUID, которого нет в базе. Возникает при непосредственном удалении документа без контроля целостности, при откате транзакций или сбоях обмена. В интерфейсе отображается как «Объект не найден».

Как при обмене сохранить одинаковые ссылки в двух базах?

При загрузке получите ссылку по GUID из пакета обмена через ПолучитьСсылку(УникальныйИдентификатор), назначьте её новому объекту методом УстановитьСсылкуНового() и запишите. Штатные планы обмена делают это автоматически.

Почему после Записать() ссылка всё равно пустая?

Скорее всего, запись не выполнилась: сработало исключение, обработчик ПередЗаписью вернул Отказ = Истина, или не заполнены обязательные реквизиты. Проверяйте результат записи через попытку/исключение и сообщения пользователю, не продолжайте работу с пустой ссылкой.