Разработка и Конфигурация · 10 мин
Как получить ссылку на текущий документ в 1С 8.3
Способы получить ссылку на текущий документ в 1С 8.3: в модуле объекта, форме, запросе и через COM. Примеры кода, типичные ошибки и проверка результата.
Ссылка на документ в 1С 8.3 — это значение типа «ДокументСсылка», которое однозначно идентифицирует запись документа в базе данных. Именно ссылка, а не номер или дата, используется для связей между объектами: реквизитов, движений по регистрам, подчинённых документов. Получить ссылку текущего документа требуется при записи движений, программном создании связанных объектов, передаче данных в отчёты и обменах.
Способ получения ссылки зависит от контекста исполнения кода: в модуле объекта документа это свойство Ссылка, в модуле формы — реквизит Объект.Ссылка, а вне документа ссылку получают через выборку, запрос или метод НайтиПоНомеру. Ниже разобраны все основные сценарии с рабочими примерами кода.
Важно понимать разницу между объектом и ссылкой. Объект (тип «ДокументОбъект») — это полная копия данных документа в памяти, которую можно изменять и записывать. Ссылка — лёгкий идентификатор, по которому можно получить объект методом ПолучитьОбъект(). Для большинства задач достаточно ссылки, и работать через неё быстрее.
Как устроена ссылка на документ в 1С
Ссылка документа состоит из типа документа и уникального идентификатора (GUID), который платформа присваивает при создании. Именно GUID хранится в базе данных и обеспечивает уникальность даже при обмене между разными информационными базами. Номер и дата документа в ссылку не входят — это отдельные реквизиты.
Проверить тип значения можно функцией ТипЗнч(): для ссылки она вернёт, например, «ДокументСсылка.РеализацияТоваровУслуг». Это удобно, когда процедура принимает и объект, и ссылку, и нужно понять, что именно передано.
Получение ссылки в модуле объекта документа
Если код выполняется в модуле объекта документа (обработчики ПередЗаписью, ПриЗаписи, ОбработкаПроведения), ссылка доступна напрямую через свойство Ссылка. Это самый частый сценарий — например, при формировании движений регистратор указывается именно ссылкой.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Ссылка на текущий документ
ТекущаяСсылка = Ссылка;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Для Каждого Строка Из Товары Цикл
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Строка.Номенклатура;
Движение.Количество = Строка.Количество;
КонецЦикла;
КонецПроцедуры
Учтите особенность обработчика ПередЗаписью: для нового документа, который записывается впервые, свойство Ссылка ещё может быть пустым на момент начала записи, но к моменту фактической записи платформа уже присвоит идентификатор. Если нужно гарантированно получить ссылку до записи — используйте ПолучитьСсылкуНового(), о котором ниже.
Получение ссылки в модуле формы документа
В управляемой форме документа основной реквизит формы обычно называется Объект, и ссылка доступна как Объект.Ссылка. Это стандартный способ, когда ссылка нужна в клиентском коде: например, для открытия связанного отчёта или передачи в серверную процедуру.
&НаКлиенте
Процедура ПоказатьСвязанныеДокументы(Команда)
Если Объект.Ссылка.Пустая() Тогда
ПоказатьПредупреждение(, "Документ ещё не записан");
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура("ДокументОснование", Объект.Ссылка);
ОткрытьФорму("Отчет.СвязанныеДокументы.Форма", ПараметрыФормы);
КонецПроцедуры
Обратите внимание на проверку Объект.Ссылка.Пустая(). Пока новый документ не записан, его ссылка пустая, и передавать её куда-либо бессмысленно. Правильное поведение — предложить пользователю записать документ или выполнить запись программно.
Ссылка на новый документ до записи
Иногда ссылка нужна ещё до того, как документ записан: например, когда в одной транзакции создаются два документа, ссылающиеся друг на друга. Для этого платформа предоставляет пару методов ПолучитьСсылкуНового() и УстановитьСсылкуНового().
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НоваяСсылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор);
НовыйДок.УстановитьСсылкуНового(НоваяСсылка);
НовыйДок.Дата = ТекущаяДатаСеанса();
// ... заполнение реквизитов
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
// После записи НовыйДок.Ссылка = НоваяСсылка
Такой приём безопасен, только если документ будет обязательно записан. Если после УстановитьСсылкуНового() запись не выполнена, а ссылка уже передана в другой объект, в базе появится ссылка на несуществующий документ — классическая «битая ссылка», которая отображается как «Объект не найден».
Получение ссылки вне документа: поиск и запрос
Поиск по номеру и дате
Когда известны номер и дата документа, ссылку находят методом менеджера документа НайтиПоНомеру(). Дата обязательна, потому что нумерация документов периодична: один и тот же номер может повторяться в разных периодах.
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0000-000125", Дата(2026, 6, 15));
Если СсылкаНаДокумент.Пустая() Тогда
Сообщить("Документ не найден");
КонецЕсли;
Получение ссылки запросом
Для поиска по произвольным условиям — контрагенту, организации, комментарию — используется запрос. В запросе поле Ссылка доступно у любой таблицы документа и обычно выбирается именно оно.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Реализация.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Контрагент = &Контрагент
| И Реализация.Проведен
|УПОРЯДОЧИТЬ ПО
| Реализация.Дата УБЫВ";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ТекущаяСсылка = Выборка.Ссылка;
КонецЕсли;
Ссылка из строки табличной части или регистра
Если код обрабатывает движения или табличную часть, ссылка на документ-регистратор доступна в поле Регистратор наборов записей и в реквизитах типа «ДокументСсылка» — например, ДокументОснование. При обходе выборки по регистру Выборка.Регистратор и будет ссылкой на документ, сформировавший движение.
Сравнение способов получения ссылки
Самый быстрый способ, без обращения к базе. Работает только внутри модуля документа.
Подходит, когда известны номер и дата. Требует обращения к базе, не ищет по другим реквизитам.
Универсальный поиск по любым условиям. Тяжелее по ресурсам, требует аккуратной работы с индексами.
Используется при обменах и загрузках, когда GUID известен заранее. Не проверяет существование документа.
Проверка результата и типичные ошибки
После получения ссылки всегда проверяйте, что она не пустая и указывает на существующий документ. Пустая ссылка проверяется методом Пустая() или функцией ЗначениеЗаполнено(). Существование документа в базе проверяется запросом или попыткой обращения к реквизиту.
Ещё одна частая ошибка — попытка изменить данные через ссылку. Ссылка доступна только для чтения: конструкция Ссылка.Сумма = 100 вызовет ошибку. Для изменения нужно получить объект: ДокОбъект = Ссылка.ПолучитьОбъект(), изменить реквизиты и вызвать Записать().
Как проверить результат
ТипЗнч() возвращает ДокументСсылка.ИмяДокумента
Возвращается Неопределено или строка — значит, получено не то значение
Ссылка.Пустая() = Ложь
Пустая ссылка — документ не записан или не найден
Запрос по ссылке возвращает строку, реквизиты читаются
Объект не найден — битая ссылка
Часто задаваемые вопросы
Чем ссылка отличается от объекта документа?
Ссылка — это только идентификатор (тип плюс GUID), она не содержит данных и не может изменяться. Объект — полная копия документа в памяти с доступом ко всем реквизитам и табличным частям. Получить объект из ссылки можно методом ПолучитьОбъект(), обратно — через свойство Ссылка.
Как получить ссылку по строке GUID из внешней системы?
Используйте конструктор: Документы.ИмяДокумента.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)). Учтите, что метод не проверяет, существует ли документ с таким идентификатором, — при обращении к несуществующей ссылке вы получите «Объект не найден».
Почему Ссылка пустая в обработчике ПередЗаписью нового документа?
До первой записи документу ещё не присвоен идентификатор. Если ссылка нужна до записи, вызовите ПолучитьСсылкуНового() — платформа зарезервирует идентификатор, и при записи документ получит именно его. В обработчике ПриЗаписи ссылка уже заполнена.
Можно ли получить ссылку на текущий документ в тонком клиенте без вызова сервера?
Да, если код находится в форме документа: Объект.Ссылка доступен на клиенте, потому что данные формы уже содержат ссылку. А вот поиск по номеру или запрос на клиенте недоступны — их нужно выносить в серверную процедуру.
Как сравнить две ссылки на документы?
Ссылки сравниваются напрямую оператором равенства: Если Ссылка1 = Ссылка2 Тогда. Сравнивать строковые представления или GUID отдельно не нужно — платформа корректно сравнивает и тип, и идентификатор.
Что делать, если НайтиПоНомеру не находит существующий документ?
Проверьте три вещи: точное совпадение номера с учётом префиксов и лидирующих нулей, правильность даты (поиск идёт в пределах периода нумерации) и пометку удаления — по умолчанию метод находит и помеченные документы, но если используется дополнительная фильтрация, они могут исключаться.
Что важно запомнить
Внутри документа ссылка доступна как Ссылка (модуль объекта) или Объект.Ссылка (форма). Снаружи — через НайтиПоНомеру(), запрос или ПолучитьСсылку(GUID). Всегда проверяйте ссылку на пустоту, а для изменения данных получайте объект методом ПолучитьОбъект().