Разработка и Конфигурация · 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Определите, какие данные есть на входе: номер и дата, GUID или условие отбора
- 2Выберите метод: НайтиПоНомеру, ПолучитьСсылку или запрос
- 3Выполните получение ссылки в серверном контексте
- 4Проверьте результат: Пустая() для поиска, существование — для ПолучитьСсылку
- 5Используйте ссылку для чтения; вызывайте ПолучитьОбъект() только при необходимости изменения
Проверка ссылки: пустая, «битая», существующая
Три разных состояния ссылки требуют трёх разных проверок. Пустая ссылка (документ не найден поиском) проверяется методом Пустая() или сравнением с Документы.Имя.ПустаяСсылка(). Существование документа по ссылке, полученной через ПолучитьСсылку или извне, надёжнее всего проверить запросом:
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА
|ИЗ Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ Док.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ДокСсылка);
ДокументСуществует = Не Запрос.Выполнить().Пустой();
Альтернатива без запроса — сравнение ДокСсылка.ПолучитьОбъект() с Неопределено: если документа нет, метод вернёт Неопределено. Но это дорогой способ: объект полностью вычитывается из базы. Для массовых проверок используйте один запрос с условием «Ссылка В (&СписокСсылок)».
Как проверить результат
Ссылка.Пустая() = Ложь, реквизиты читаются
Пустая() = Истина — документ не найден, проверьте формат номера и дату
Запрос по ссылке возвращает строку
Запрос пуст — «битая» ссылка, документа в базе нет
Возвращается значение ожидаемого типа
Текст «Объект не найден» или Неопределено
Типичные ошибки и ограничения
Первая группа ошибок связана с поиском по номеру: несовпадение формата номера (префиксы, ведущие нули), неверная дата интервала, периодичность нумерации. Вторая группа — работа с GUID: попытка сконструировать УникальныйИдентификатор из строки неверного формата вызывает исключение, поэтому в интеграциях оборачивайте конструктор в Попытка/Исключение.
Отдельно стоит контекст выполнения: все описанные методы — серверные. В клиентском модуле формы с директивой &НаКлиенте они недоступны; вызывайте серверную процедуру. Также помните, что в запросах нельзя сравнивать ссылки разных видов документов напрямую без приведения типов — это приводит к ошибке СУБД.
Какой способ выбрать в конкретной ситуации
Правило выбора простое: используйте самый специфичный ключ, который у вас есть. GUID — для обменов и интеграций, номер с датой — для поиска по данным, введённым пользователем, запрос — для любых прикладных отборов по реквизитам. Избегайте универсальных решений «найти как-нибудь»: они непредсказуемы по производительности.
Как выбрать действие
Что важно запомнить
Ссылка — лёгкий идентификатор, объект — данные для изменения. Получайте ссылку через НайтиПоНомеру, ПолучитьСсылку по GUID или запрос, всегда проверяйте результат на пустоту и существование, а ПолучитьОбъект() вызывайте только при необходимости записи.
Частые вопросы
Как получить ссылку на документ, если известен только номер без даты?
Используйте запрос с условием по номеру без ограничения даты, но учтите, что номер может повторяться в разных периодах нумерации. Добавьте в запрос упорядочивание по дате и, при необходимости, дополнительный отбор, чтобы однозначно определить нужный документ.
Чем отличается НайтиПоНомеру от ПолучитьСсылку?
НайтиПоНомеру выполняет реальный поиск в базе и возвращает пустую ссылку, если документ не найден. ПолучитьСсылку не обращается к данным — она просто формирует ссылку из переданного идентификатора, поэтому результат может оказаться «битым» и требует отдельной проверки существования.
Как проверить, что ссылка не «битая»?
Самый быстрый способ — запрос вида «ВЫБРАТЬ ПЕРВЫЕ 1 ... ГДЕ Ссылка = &Ссылка»: пустой результат означает отсутствие документа. Альтернатива — сравнить Ссылка.ПолучитьОбъект() с Неопределено, но это медленнее, так как объект вычитывается целиком.
Можно ли получить ссылку на клиенте в управляемой форме?
Нет, методы менеджеров документов доступны только на сервере. В клиентской процедуре вызовите серверную процедуру (с директивой &НаСервере или &НаСервереБезКонтекста), которая получит и вернёт ссылку. Сами ссылки свободно передаются между клиентом и сервером.
Как найти документ по строковому представлению ссылки?
Строковое представление вида «Реализация товаров и услуг 0000-000125 от 15.03.2026» ненадёжно для поиска. Если у вас есть GUID в виде строки — используйте Новый УникальныйИдентификатор(Строка) и ПолучитьСсылку. Если только номер и дата — НайтиПоНомеру или запрос.
Зачем нужен метод УстановитьСсылкуНового?
Он назначает ссылку новому, ещё не записанному документу. Это необходимо в обменах, когда ссылка на документ должна быть сохранена в других объектах или связана с внешним GUID до фактической записи документа в базу.