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

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

Как получить ссылку на текущий документ в 1С 8.3

Способы получить ссылку на текущий документ в 1С 8.3: в модуле объекта, форме, запросе и через COM. Примеры кода, типичные ошибки и проверка результата.

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

Способ получения ссылки зависит от контекста исполнения кода: в модуле объекта документа это свойство Ссылка, в модуле формы — реквизит Объект.Ссылка, а вне документа ссылку получают через выборку, запрос или метод НайтиПоНомеру. Ниже разобраны все основные сценарии с рабочими примерами кода.

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

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

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

Проверить тип значения можно функцией ТипЗнч(): для ссылки она вернёт, например, «ДокументСсылка.РеализацияТоваровУслуг». Это удобно, когда процедура принимает и объект, и ссылку, и нужно понять, что именно передано.

Получение ссылки в модуле объекта документа

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

// Ссылка на текущий документ

ТекущаяСсылка = Ссылка;

Движения.ОстаткиНоменклатуры.Записывать = Истина;

Для Каждого Строка Из Товары Цикл

Движение = Движения.ОстаткиНоменклатуры.Добавить();

Движение.Период = Дата;

Движение.Номенклатура = Строка.Номенклатура;

Движение.Количество = Строка.Количество;

КонецЦикла;

КонецПроцедуры

Учтите особенность обработчика ПередЗаписью: для нового документа, который записывается впервые, свойство Ссылка ещё может быть пустым на момент начала записи, но к моменту фактической записи платформа уже присвоит идентификатор. Если нужно гарантированно получить ссылку до записи — используйте ПолучитьСсылкуНового(), о котором ниже.

Получение ссылки в модуле формы документа

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

&НаКлиенте

Процедура ПоказатьСвязанныеДокументы(Команда)

Если Объект.Ссылка.Пустая() Тогда

ПоказатьПредупреждение(, "Документ ещё не записан");

Возврат;

КонецЕсли;

ПараметрыФормы = Новый Структура("ДокументОснование", Объект.Ссылка);

ОткрытьФорму("Отчет.СвязанныеДокументы.Форма", ПараметрыФормы);

КонецПроцедуры

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

Ссылка на новый документ до записи

Иногда ссылка нужна ещё до того, как документ записан: например, когда в одной транзакции создаются два документа, ссылающиеся друг на друга. Для этого платформа предоставляет пару методов ПолучитьСсылкуНового() и УстановитьСсылкуНового().

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

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

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

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

// ... заполнение реквизитов

НовыйДок.Записать(РежимЗаписиДокумента.Проведение);

// После записи НовыйДок.Ссылка = НоваяСсылка

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

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

Поиск по номеру и дате

Когда известны номер и дата документа, ссылку находят методом менеджера документа НайтиПоНомеру(). Дата обязательна, потому что нумерация документов периодична: один и тот же номер может повторяться в разных периодах.

СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0000-000125", Дата(2026, 6, 15));

Если СсылкаНаДокумент.Пустая() Тогда

Сообщить("Документ не найден");

КонецЕсли;

Получение ссылки запросом

Для поиска по произвольным условиям — контрагенту, организации, комментарию — используется запрос. В запросе поле Ссылка доступно у любой таблицы документа и обычно выбирается именно оно.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Реализация.Ссылка КАК Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Контрагент = &Контрагент

| И Реализация.Проведен

|УПОРЯДОЧИТЬ ПО

| Реализация.Дата УБЫВ";

Запрос.УстановитьПараметр("Контрагент", Контрагент);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

ТекущаяСсылка = Выборка.Ссылка;

КонецЕсли;

Ссылка из строки табличной части или регистра

Если код обрабатывает движения или табличную часть, ссылка на документ-регистратор доступна в поле Регистратор наборов записей и в реквизитах типа «ДокументСсылка» — например, ДокументОснование. При обходе выборки по регистру Выборка.Регистратор и будет ссылкой на документ, сформировавший движение.

Сравнение способов получения ссылки

Свойство Ссылка в модуле объекта

Самый быстрый способ, без обращения к базе. Работает только внутри модуля документа.

НайтиПоНомеру()

Подходит, когда известны номер и дата. Требует обращения к базе, не ищет по другим реквизитам.

Запрос

Универсальный поиск по любым условиям. Тяжелее по ресурсам, требует аккуратной работы с индексами.

ПолучитьСсылку(УникальныйИдентификатор)

Используется при обменах и загрузках, когда GUID известен заранее. Не проверяет существование документа.

Проверка результата и типичные ошибки

После получения ссылки всегда проверяйте, что она не пустая и указывает на существующий документ. Пустая ссылка проверяется методом Пустая() или функцией ЗначениеЗаполнено(). Существование документа в базе проверяется запросом или попыткой обращения к реквизиту.

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

Ещё одна частая ошибка — попытка изменить данные через ссылку. Ссылка доступна только для чтения: конструкция Ссылка.Сумма = 100 вызовет ошибку. Для изменения нужно получить объект: ДокОбъект = Ссылка.ПолучитьОбъект(), изменить реквизиты и вызвать Записать().

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

Как проверить результат

Тип полученного значения
Норма

ТипЗнч() возвращает ДокументСсылка.ИмяДокумента

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

Возвращается Неопределено или строка — значит, получено не то значение

Заполненность ссылки
Норма

Ссылка.Пустая() = Ложь

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

Пустая ссылка — документ не записан или не найден

Существование в базе
Норма

Запрос по ссылке возвращает строку, реквизиты читаются

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

Объект не найден — битая ссылка

Часто задаваемые вопросы

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

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

Как получить ссылку по строке GUID из внешней системы?

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

Почему Ссылка пустая в обработчике ПередЗаписью нового документа?

До первой записи документу ещё не присвоен идентификатор. Если ссылка нужна до записи, вызовите ПолучитьСсылкуНового() — платформа зарезервирует идентификатор, и при записи документ получит именно его. В обработчике ПриЗаписи ссылка уже заполнена.

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

Да, если код находится в форме документа: Объект.Ссылка доступен на клиенте, потому что данные формы уже содержат ссылку. А вот поиск по номеру или запрос на клиенте недоступны — их нужно выносить в серверную процедуру.

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

Ссылки сравниваются напрямую оператором равенства: Если Ссылка1 = Ссылка2 Тогда. Сравнивать строковые представления или GUID отдельно не нужно — платформа корректно сравнивает и тип, и идентификатор.

Что делать, если НайтиПоНомеру не находит существующий документ?

Проверьте три вещи: точное совпадение номера с учётом префиксов и лидирующих нулей, правильность даты (поиск идёт в пределах периода нумерации) и пометку удаления — по умолчанию метод находит и помеченные документы, но если используется дополнительная фильтрация, они могут исключаться.

Итог

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

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