Разработка и Конфигурация · 12 мин
1С ДокументСсылка: как получить ссылку на документ
Как получить ДокументСсылка в 1С: методы ПолучитьСсылку, НайтиПоНомеру, выборка запросом, работа с УникальныйИдентификатор и проверка ссылки на заполненность.
Тип «ДокументСсылка» в 1С — это не сам документ, а лёгкий указатель на запись в базе. Он позволяет идентифицировать объект, передавать его между процедурами, использовать в запросах и отборах без чтения всех данных документа. Понимание того, как получить ссылку разными способами, нужно практически в каждой доработке: при обмене данными, поиске дублей, программном создании документов и отладке.
Способ получения ссылки зависит от исходных данных. Если у вас есть объект документа — ссылка уже хранится в его свойстве «Ссылка». Если известен только номер и дата — используется поиск. Если документ ещё не создан, но ссылка нужна заранее (например, для заполнения реквизита до записи), применяется метод ПолучитьСсылку с генерацией нового уникального идентификатора.
Ниже разобраны основные сценарии: получение ссылки из объекта, поиск по номеру, поиск по уникальному идентификатору, предварительное получение ссылки для нового документа, работа через запрос и типичные ошибки, которые приводят к «битым» ссылкам и пустым отборам.
Что такое ДокументСсылка и чем она отличается от объекта
В платформе 1С работа с документом идёт через два разных типа. ДокументОбъект — это полная копия данных документа в памяти: шапка, табличные части, движения. Его чтение и запись — относительно «тяжёлые» операции. ДокументСсылка — это только идентификатор записи, по сути уникальный идентификатор плюс указание типа документа.
Через ссылку можно обращаться к реквизитам документа «через точку» — платформа неявно выполнит чтение из базы. Но изменить данные через ссылку нельзя: для записи нужно получить объект методом ПолучитьОбъект(), изменить его и вызвать Записать().
Практическое правило: если нужно только проверить существование документа, сравнить его с другим значением или использовать в отборе — работайте со ссылкой. Если нужно менять данные — получайте объект. Избыточное использование ПолучитьОбъект() в циклах — одна из главных причин медленных обработок.
Получение ссылки из существующего объекта
Самый простой случай: документ уже открыт как объект — например, в обработчике проведения, при программном создании или после ПолучитьОбъект(). Ссылка доступна через одноимённое свойство:
ДокОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// ... заполнение реквизитов
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
СсылкаНаДокумент = ДокОбъект.Ссылка;
Важный нюанс: у нового объекта до записи свойство Ссылка может быть пустым, если ссылка не была установлена заранее. Поэтому надёжная последовательность — сначала записать объект, потом читать Ссылка. После успешной записи ссылка гарантированно заполнена.
В форме документа ссылка текущего документа доступна через Объект.Ссылка (для управляемых форм) или через реквизит формы, связанный с данными документа. Это удобно, когда нужно передать документ в отчёт или другую процедуру, не считывая его заново.
Поиск ссылки по номеру и дате
Когда известны номер и период документа, используется метод НайтиПоНомеру менеджера документа:
Ссылка = Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("000000123", Дата(2026, 5, 15));
Если Ссылка.Пустая() Тогда
Сообщить("Документ не найден");
КонецЕсли;
Метод ищет документ в пределах периодичности нумерации: второй параметр задаёт дату, определяющую период (обычно год). Если указать дату из другого года, документ с тем же номером, но из другого периода, найден не будет. Это частая причина «не находит документ, который точно есть».
Проверка результата обязательна: если документ не найден, метод возвращает пустую ссылку соответствующего типа, а не Неопределено. Проверяйте через Ссылка.Пустая() — сравнение с Неопределено даст ложный результат.
Получение ссылки по уникальному идентификатору
При обмене данными между базами документы идентифицируются не номерами, а GUID — уникальными идентификаторами. Если у вас есть строка с GUID, ссылка восстанавливается так:
УИД = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
Ссылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(УИД);
Критически важное отличие: ПолучитьСсылку не проверяет, существует ли документ в базе. Он просто конструирует ссылку из идентификатора. Если документа с таким GUID нет, вы получите «битую» ссылку, которая выглядит заполненной. Проверка существования делается отдельно — например, запросом или проверкой на равенство полученного объекта:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
ДокументСуществует = Не Запрос.Выполнить().Пустой();
Обратное действие — получить строку GUID из ссылки — выполняется через XMLСтрока(Ссылка) или Ссылка.УникальныйИдентификатор(). Это нужно при передаче ссылки во внешние системы, веб-сервисы и HTTP-запросы.
Предварительное получение ссылки для нового документа
Иногда ссылка нужна до записи документа: например, чтобы заполнить реквизит «Основание» в другом объекте или установить связь между двумя создаваемыми документами. Для этого ссылка генерируется заранее и назначается объекту:
НоваяСсылка = Документы.СчетНаОплатуПокупателю.ПолучитьСсылку(Новый УникальныйИдентификатор);
ДокОбъект = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
ДокОбъект.УстановитьСсылкуНового(НоваяСсылка);
// ... заполнение реквизитов
ДокОбъект.Записать();
Метод УстановитьСсылкуНового работает только для новых, ещё не записанных объектов. Применить его к уже записанному документу нельзя — будет вызвана ошибка. После записи объект получит именно тот GUID, который вы сгенерировали, что удобно для синхронизации с внешними системами.
Тот же приём используется в механизмах обмена: план обмена при загрузке данных устанавливает ссылку нового объекта по идентификатору из сообщения, чтобы сохранить связи между объектами разных баз.
- 1Определите, что известно: объект, номер с датой или GUID
- 2Для объекта — прочитайте свойство Ссылка после записи
- 3Для номера — вызовите НайтиПоНомеру с датой нужного периода
- 4Для GUID — вызовите ПолучитьСсылку и проверьте существование запросом
- 5Для нового документа — сгенерируйте ссылку и назначьте через УстановитьСсылкуНового
- 6Проверьте результат: Ссылка.Пустая() и существование записи в базе
Получение ссылки через запрос
Когда нужно найти документы по произвольным условиям — по контрагенту, сумме, организации — используется запрос. Он же самый производительный способ массового получения ссылок:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Контрагент = &Контрагент
| И Док.Проведен
|УПОРЯДОЧИТЬ ПО
| Док.Дата УБЫВ";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Ссылка = Выборка.Ссылка;
КонецЕсли;
Запрос предпочтительнее перебора выборки методом Выбрать() менеджера документов, когда условия сложные или нужно ограничить количество результатов. Конструкция «ВЫБРАТЬ ПЕРВЫЕ 1» с сортировкой — стандартный способ найти последний документ по условию.
Учтите: запрос возвращает ссылки, включая помеченные на удаление, если вы явно не отфильтровали их по ПометкаУдаления. Для бизнес-логики обычно добавляют условие на проведённость или отсутствие пометки.
Как выбрать действие
Проверка результата и типичные ошибки
После получения ссылки всегда проверяйте два независимых условия: заполненность и существование. Заполненность проверяется через Пустая() или ЗначениеЗаполнено(). Существование — запросом или попыткой обращения к реквизиту с обработкой исключения. Пустая ссылка и «битая» ссылка — разные проблемы с разными причинами.
К типичным ошибкам относятся: поиск по номеру с датой не того периода; сравнение результата НайтиПоНомеру с Неопределено вместо проверки Пустая(); использование ПолучитьСсылку без проверки существования; попытка изменить документ через ссылку без ПолучитьОбъект(); массовый вызов ПолучитьОбъект() в цикле там, где достаточно ссылок из запроса.
Ещё одна ловушка — составные типы реквизитов. Если реквизит имеет тип «ДокументСсылка» по нескольким видам документов, перед вызовом методов вроде НайтиПоНомеру нужно явно определить конкретный вид через ТипЗнч(Ссылка) — иначе логика поиска будет работать непредсказуемо.
Ограничения и безопасная работа со ссылками
При работе в транзакциях помните: ссылка, полученная до записи объекта, становится валидной только после фиксации транзакции. Если транзакция откатится, все сгенерированные и записанные в другие места ссылки превратятся в битые. Поэтому запись связанных объектов и самого документа логично выполнять в одной транзакции.
В разделённых базах (режим SaaS) и при использовании RLS запрос может не вернуть документ, который физически существует, но недоступен текущему пользователю. Прежде чем делать вывод «документа нет», проверьте, не влияют ли ограничения доступа — например, выполнив проверку под полными правами в тестовом сеансе.
Наконец, не храните GUID документов в виде строк в произвольных реквизитах без необходимости: при переносе данных через конвертацию с перегенерацией идентификаторов такие строковые связи разрушатся. Штатный механизм ссылочных типов надёжнее любых самодельных связок.
Что важно запомнить
Ссылку берут из свойства Ссылка объекта, НайтиПоНомеру, ПолучитьСсылку(GUID) или запросом — в зависимости от исходных данных. Результат всегда проверяют на пустоту и существование. Для нового документа ссылку назначают заранее через УстановитьСсылкуНового.
Частые вопросы
Чем отличается ПолучитьСсылку от НайтиПоНомеру?
НайтиПоНомеру выполняет реальный поиск в базе и возвращает ссылку только на существующий документ. ПолучитьСсылку конструирует ссылку из переданного GUID без обращения к данным — документ может не существовать, и вы получите битую ссылку.
Как проверить, что ссылка «битая»?
Выполните запрос вида «ВЫБРАТЬ Ссылка ИЗ Документ.Вид ГДЕ Ссылка = &Ссылка» — если результат пустой, а сама ссылка не пустая, она битая. Альтернатива — сравнить Ссылка.ПолучитьОбъект() с Неопределено: для несуществующей записи метод вернёт Неопределено.
Как получить строку GUID из ссылки для передачи во внешнюю систему?
Используйте XMLСтрока(Ссылка) или Ссылка.УникальныйИдентификатор() с последующим преобразованием в строку. Обратное восстановление — Новый УникальныйИдентификатор(Строка) и ПолучитьСсылку менеджера документа.
Почему НайтиПоНомеру не находит документ, который виден в списке?
Чаще всего дата, переданная вторым параметром, попадает в другой период нумерации (другой год). Также проверьте точное совпадение номера с учётом префиксов и лидирующих нулей и отсутствие ограничений доступа к данным.
Можно ли изменить документ, имея только ссылку?
Напрямую через ссылку — нет. Нужно вызвать Ссылка.ПолучитьОбъект(), изменить реквизиты полученного объекта и записать его методом Записать(). Сама ссылка предназначена только для чтения и идентификации.
Когда оправдано заранее генерировать ссылку для нового документа?
Когда ссылка нужна до записи: для заполнения реквизитов связанных объектов, для синхронизации с внешней системой по заданному GUID или при загрузке данных из обмена, где связи между объектами строятся по идентификаторам.