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

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

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

Как в 1С найти документ по ссылке: методы ПолучитьОбъект, НайтиПоСсылке, запросы, обработка битых ссылок и проверка результата. Практические примеры кода.

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

На практике задача возникает в нескольких сценариях: при отладке обмена данными, когда известен GUID документа; при разборе «битых ссылок» после удаления объектов; при написании обработок, которые должны найти документ по переданному идентификатору; при работе с внешними системами, передающими ссылки через COM или веб-сервисы.

Ниже разобраны основные способы поиска документа по ссылке во встроенном языке 1С, методы проверки существования объекта, работа с битыми ссылками и типичные ошибки, которые приводят к неверным результатам.

Что такое ссылка на документ и где её взять

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

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

Поиск документа методом НайтиПоСсылке

Менеджер каждого вида документов предоставляет метод НайтиПоСсылке(), который принимает ссылку и возвращает либо ту же ссылку (если объект существует), либо пустую ссылку данного вида. Это основной способ проверить, есть ли документ в базе, не загружая его данные.

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

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

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

Иначе

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

КонецЕсли;

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

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

Когда ссылка известна и объект существует, доступ к данным даёт метод ПолучитьОбъект(). Он загружает документ из базы в память, после чего можно читать и изменять реквизиты, табличные части, проводить или отменять проведение.

ДокОбъект = ИсходнаяСсылка.ПолучитьОбъект();

Если ДокОбъект = Неопределено Тогда

Сообщить("Объект не найден (битая ссылка)");

Иначе

Сообщить("Номер: " + ДокОбъект.Номер + ", Дата: " + ДокОбъект.Дата);

КонецЕсли;

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

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

Частая ситуация: есть строка вида «8a3f2b1c-…» — уникальный идентификатор, полученный из внешней системы, журнала обмена или текста битой ссылки. Чтобы найти документ, GUID преобразуют в ссылку конкретного вида документа.

УИД = Новый УникальныйИдентификатор("8a3f2b1c-1111-2222-3333-444455556666");

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

Если НЕ СсылкаНаДокумент.ПолучитьОбъект() = Неопределено Тогда

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

КонецЕсли;

Если вид документа заранее неизвестен, придётся перебрать все виды документов конфигурации через метаданные и для каждого вызвать ПолучитьСсылку с проверкой существования. Это медленная операция, поэтому её выполняют разово в сервисных обработках, а не в прикладном коде.

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

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

Запрос — предпочтительный способ, когда нужно не только найти документ, но и сразу получить его реквизиты, отобрать по условиям или обработать пакет ссылок. В запросе ссылка передаётся как параметр.

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

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

"ВЫБРАТЬ

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

| Реализация.Номер КАК Номер,

| Реализация.СуммаДокумента КАК Сумма

|ИЗ

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

|ГДЕ

| Реализация.Ссылка = &Ссылка";

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

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

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

Сообщить("Найден документ № " + Выборка.Номер);

КонецЕсли;

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

Проверка результата и работа с битыми ссылками

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

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

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

Ссылка.Пустая()
Норма

Ложь — ссылка содержит идентификатор

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

Истина — ссылка пустая, искать дальше бессмысленно

Ссылка.ПолучитьОбъект()
Норма

Возвращает объект документа

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

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

Строковое представление
Норма

«Реализация товаров и услуг 000-001 от …»

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

«<Объект не найден> (GUID)» — битая ссылка

Запрос по ссылке
Норма

Выборка содержит одну строку

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

Выборка пустая — документа нет в базе

Битые ссылки не удаляются автоматически: они остаются в реквизитах других объектов и в регистрах. Найти их массово помогает штатная обработка «Поиск и удаление помеченных объектов» с контролем ссылочной целостности, а также типовые и сторонние обработки поиска битых ссылок. Удалять битые ссылки из реквизитов следует осознанно — иногда правильнее восстановить документ из резервной копии или архива обмена.

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

Выбор способа под задачу

Единого «лучшего» метода нет — выбор зависит от того, что известно и что нужно получить. Ниже сопоставлены основные варианты.

Сравнение способов поиска

НайтиПоСсылке()

Быстрая проверка существования документа известного вида. Не возвращает данные, только факт наличия

ПолучитьОбъект()

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

Запрос по ссылке

Оптимален для чтения отдельных реквизитов и пакетной обработки. Безопасен при битых ссылках

ПолучитьСсылку() по GUID

Единственный вариант, когда известен только идентификатор из внешней системы. Требует знания вида документа

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

Итог

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

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

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

Можно ли найти документ по ссылке, не зная его вида?

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

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

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

Как получить GUID существующего документа?

Через метод Ссылка.УникальныйИдентификатор(). Полученный идентификатор можно передать во внешнюю систему, чтобы та позже нашла этот же документ через ПолучитьСсылку.

Почему запрос по ссылке возвращает пустой результат, хотя документ виден в журнале?

Чаще всего причина в несовпадении вида: в параметр передана ссылка другого типа документа. Реже — в ограничении прав доступа на уровне записей (RLS), из-за которого запрос «не видит» документ, доступный в интерфейсе.

Что делать, если по ссылке находится «Объект не найден»?

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

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

Да. Навигационная ссылка вида e1cib/data/Документ.РеализацияТоваровУслуг?ref=… содержит закодированный идентификатор. В тонком клиенте её можно открыть напрямую, а в коде — разобрать через функции работы со строками или штатные методы получения ссылки по навигационной ссылке.