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

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

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

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

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

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

Ниже разобраны основные методы получения ссылки: НайтиПоНомеру, ПолучитьСсылку по GUID, работа с выборкой и запросом, а также способы проверить, что ссылка корректна и документ реально существует в базе. Каждый пример применим как в толстом, так и в тонком клиенте, на сервере и во внешних обработках.

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

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

ДокументОбъект — это полная копия данных документа в памяти. Его получают вызовом метода ПолучитьОбъект() у ссылки. Объект нужен только тогда, когда вы собираетесь изменять и записывать документ. Частая ошибка начинающих разработчиков — получать объект там, где достаточно ссылки: это замедляет код и увеличивает нагрузку на сервер.

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

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

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

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

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

Иначе

Сообщить("Найден: " + ДокСсылка);

КонецЕсли;

Обратите внимание на формат номера: метод ищет точное совпадение строки, включая ведущие нули и префиксы. Если документ в базе имеет номер «0000-000125», поиск по «125» ничего не вернёт. При интеграциях номер часто приходит из внешней системы в «коротком» виде — тогда надёжнее искать запросом с условием по подобию или хранить соответствие номеров.

Если документ не найден, метод возвращает пустую ссылку. Проверка через Пустая() обязательна перед дальнейшей работой, иначе получите ошибку при попытке обратиться к реквизитам.

Получение ссылки по уникальному идентификатору (GUID)

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

GUIDСтрокой = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";

УникИд = Новый УникальныйИдентификатор(GUIDСтрокой);

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

Важная особенность: ПолучитьСсылку не проверяет, существует ли документ в базе. Она просто конструирует ссылку из идентификатора. Если документ с таким GUID был удалён или никогда не загружался, вы получите «битую ссылку» — при обращении к её реквизитам платформа вернёт значение неопределённого типа или текст вида «Объект не найден».

Ссылка из запроса и выборки

В прикладном коде чаще всего ссылка приходит не поиском, а выборкой из запроса. Поле «Ссылка» есть у любой таблицы документов, и его можно получать напрямую или через точку от реквизита-ссылки.

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

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

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

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

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

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

ДокСсылка = Выборка.Ссылка;

КонецЕсли;

Тот же результат даёт метод Выбрать() менеджера документов с отбором, но запрос предпочтительнее: он позволяет фильтровать по любым реквизитам, соединять таблицы и забирать за одно обращение к базе и ссылку, и нужные поля. Метод Выбрать() без параметров перебирает все документы вида — на больших базах это заметная нагрузка.

Получение ссылки у существующего объекта и создание новой

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

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

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

// Вариант 1: записать и получить ссылку

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

ДокСсылка = НовыйДок.Ссылка;

// Вариант 2: назначить ссылку заранее

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

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

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

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

Порядок действий
  1. 1
    Определите, какие данные есть на входе: номер и дата, GUID или условие отбора
  2. 2
    Выберите метод: НайтиПоНомеру, ПолучитьСсылку или запрос
  3. 3
    Выполните получение ссылки в серверном контексте
  4. 4
    Проверьте результат: Пустая() для поиска, существование — для ПолучитьСсылку
  5. 5
    Используйте ссылку для чтения; вызывайте ПолучитьОбъект() только при необходимости изменения

Проверка ссылки: пустая, «битая», существующая

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

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

"ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА

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

|ГДЕ Док.Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", ДокСсылка);

ДокументСуществует = Не Запрос.Выполнить().Пустой();

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

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

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

Проверка после НайтиПоНомеру
Норма

Ссылка.Пустая() = Ложь, реквизиты читаются

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

Пустая() = Истина — документ не найден, проверьте формат номера и дату

Проверка после ПолучитьСсылку по GUID
Норма

Запрос по ссылке возвращает строку

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

Запрос пуст — «битая» ссылка, документа в базе нет

Чтение реквизита через ссылку
Норма

Возвращается значение ожидаемого типа

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

Текст «Объект не найден» или Неопределено

Типичные ошибки и ограничения

Первая группа ошибок связана с поиском по номеру: несовпадение формата номера (префиксы, ведущие нули), неверная дата интервала, периодичность нумерации. Вторая группа — работа с GUID: попытка сконструировать УникальныйИдентификатор из строки неверного формата вызывает исключение, поэтому в интеграциях оборачивайте конструктор в Попытка/Исключение.

Отдельно стоит контекст выполнения: все описанные методы — серверные. В клиентском модуле формы с директивой &НаКлиенте они недоступны; вызывайте серверную процедуру. Также помните, что в запросах нельзя сравнивать ссылки разных видов документов напрямую без приведения типов — это приводит к ошибке СУБД.

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

Какой способ выбрать в конкретной ситуации

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

Маршрут решения

Как выбрать действие

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

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

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

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

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

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

Чем отличается НайтиПоНомеру от ПолучитьСсылку?

НайтиПоНомеру выполняет реальный поиск в базе и возвращает пустую ссылку, если документ не найден. ПолучитьСсылку не обращается к данным — она просто формирует ссылку из переданного идентификатора, поэтому результат может оказаться «битым» и требует отдельной проверки существования.

Как проверить, что ссылка не «битая»?

Самый быстрый способ — запрос вида «ВЫБРАТЬ ПЕРВЫЕ 1 ... ГДЕ Ссылка = &Ссылка»: пустой результат означает отсутствие документа. Альтернатива — сравнить Ссылка.ПолучитьОбъект() с Неопределено, но это медленнее, так как объект вычитывается целиком.

Можно ли получить ссылку на клиенте в управляемой форме?

Нет, методы менеджеров документов доступны только на сервере. В клиентской процедуре вызовите серверную процедуру (с директивой &НаСервере или &НаСервереБезКонтекста), которая получит и вернёт ссылку. Сами ссылки свободно передаются между клиентом и сервером.

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

Строковое представление вида «Реализация товаров и услуг 0000-000125 от 15.03.2026» ненадёжно для поиска. Если у вас есть GUID в виде строки — используйте Новый УникальныйИдентификатор(Строка) и ПолучитьСсылку. Если только номер и дата — НайтиПоНомеру или запрос.

Зачем нужен метод УстановитьСсылкуНового?

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