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

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

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

Как определить тип документа по ссылке в 1С: метод Метаданные(), ТипЗнч, XMLТипЗнч, сравнение типов, примеры кода, типичные ошибки и ответы на вопросы.

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

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

Ниже разобраны практические приёмы определения типа документа по ссылке с примерами кода на встроенном языке, сравнение способов между собой и разбор типичных ошибок, которые приводят к падению кода или неверным ветвлениям логики.

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

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

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

Способ 1. Метод Метаданные() — универсальное решение

Основной и самый читаемый способ — вызвать у ссылки метод Метаданные(), который вернёт объект описания метаданных. У него доступны свойства Имя (короткое имя вида документа) и ПолноеИмя() (строка вида «Документ.РеализацияТоваровУслуг»).

ИмяВида = Ссылка.Метаданные().Имя;

Если ИмяВида = "РеализацияТоваровУслуг" Тогда

// логика для реализации

ИначеЕсли ИмяВида = "ПоступлениеТоваровУслуг" Тогда

// логика для поступления

КонецЕсли;

Если нужно убедиться, что ссылка вообще относится к документам, а не к справочнику или другому виду объектов, используйте полное имя:

ПолноеИмя = Ссылка.Метаданные().ПолноеИмя();

Если СтрНачинаетсяС(ПолноеИмя, "Документ.") Тогда

// это документ

КонецЕсли;

Плюс метода — наглядность и возможность получить дополнительные сведения о метаданных (представление, реквизиты, движения). Минус — при сравнении строк легко ошибиться в написании имени, поэтому лучше выносить имена в константы или использовать строгое сравнение типов (способ 2).

Способ 2. ТипЗнч() и Тип() — строгое сравнение типов

Когда нужно проверить, является ли ссылка конкретным видом документа, используют связку функций ТипЗнч() и Тип(). Функция ТипЗнч() возвращает тип значения, а Тип() формирует тип по строковому имени.

Если ТипЗнч(Ссылка) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда

// это реализация

КонецЕсли;

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

Способ 3. XMLТипЗнч() — определение типа по строковому имени

Функция XMLТипЗнч() возвращает описание типа значения в терминах XML-сериализации. Её свойство ИмяТипа содержит строку вида «DocumentRef.РеализацияТоваровУслуг» (в локализованной версии — «ДокументСсылка.РеализацияТоваровУслуг»).

ОписаниеТипа = XMLТипЗнч(Ссылка);

ИмяТипа = ОписаниеТипа.ИмяТипа; // "DocumentRef.РеализацияТоваровУслуг"

Если СтрНайти(ИмяТипа, "DocumentRef.") > 0 Тогда

// ссылка на документ любого вида

КонецЕсли;

Этот способ удобен, когда имя вида документа приходит из внешнего источника — из настроек, файла обмена, параметров отчёта — и заранее неизвестно. Обратная функция XMLТип("ДокументСсылка.Имя") позволяет получить тип по строке и сравнить его с типом ссылки.

Способ 4. Определение типа в запросе

Если ссылка получена в запросе и тип нужно проверить прямо в тексте запроса, используется оператор ВЫБОР КОГДА ... ТОГДА с конструкцией ССЫЛКА или функция ТИПЗНАЧЕНИЯ():

ВЫБРАТ

ВЫБОР

КОГДА Таблица.ДокументОснование ССЫЛКА Документ.РеализацияТоваровУслуг

ТОГДА "Реализация"

КОГДА Таблица.ДокументОснование ССЫЛКА Документ.ПоступлениеТоваровУслуг

ТОГДА "Поступление"

ИНАЧЕ "Прочее"

КОНЕЦ КАК ВидДокумента

ИЗ

РегистрНакопления.Продажи КАК Таблица

Альтернатива — функция ТИПЗНАЧЕНИЯ(Таблица.ДокументОснование) в сочетании с ТИП() в условии. Учтите, что проверки типа в запросе выполняются на стороне СУБД и при больших выборках могут заметно влиять на производительность; где возможно, фильтруйте состав типов на уровне типизированных полей.

Сравнение способов и выбор подходящего

Сравнение вариантов

Ссылка.Метаданные().Имя

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

ТипЗнч() = Тип()

Строгое сравнение типов для условий в коде. Ошибка в имени выявляется сразу исключением. Не подходит, если вид документа может отсутствовать в конфигурации.

XMLТипЗнч().ИмяТипа

Лучший выбор, когда имя вида приходит извне (настройки, обмен, универсальные обработки). Работает со строками без обращения к конкретным типам конфигурации.

Проверка в запросе (ССЫЛКА, ТИПЗНАЧЕНИЯ)

Когда тип нужно отфильтровать или вывести прямо в выборке СКД/отчёта. Не заменяет проверки в коде и может снижать производительность запроса.

Практический сценарий: универсальная обработка документов-оснований

Типичная задача — обработать реквизит «ДокументОснование» составного типа, в котором может лежать ссылка на несколько видов документов. Рабочий шаблон выглядит так:

Процедура ОбработатьОснование(Основание)

Если Не ЗначениеЗаполнено(Основание) Тогда

Возврат;

КонецЕсли;

ТипОснования = ТипЗнч(Основание);

Если ТипОснования = Тип("ДокументСсылка.ЗаказКлиента") Тогда

ОбработатьЗаказ(Основание);

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

ОбработатьРеализацию(Основание);

Иначе

ТекстСообщения = СтрШаблон("Неизвестный тип основания: %1",

Основание.Метаданные().ПолноеИмя());

ЗаписьЖурналаРегистрации("ОбработкаОснований",

УровеньЖурналаРегистрации.Предупреждение, , , ТекстСообщения);

КонецЕсли;

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

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

Порядок действий при отладке
  1. 1
    В конфигураторе откройте общий модуль или обработчик, где нужна проверка типа
  2. 2
    Вставьте проверку через ТипЗнч(Ссылка) = Тип("ДокументСсылка.Имя")
  3. 3
    Добавьте ветку Иначе с записью в журнал регистрации полного имени типа через Ссылка.Метаданные().ПолноеИмя()
  4. 4
    Запустите сценарий в тестовой базе и убедитесь, что ветвление срабатывает для каждого ожидаемого вида документа
  5. 5
    Проверьте журнал регистрации на предмет непредусмотренных типов

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

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

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

В подписках на события (ПередЗаписью, ПриЗаписи) источником является объект документа, а не ссылка, но Метаданные() и ТипЗнч() работают с ним так же. Если подписка назначена на несколько видов документов, ветвление по ТипЗнч(Источник) — стандартный приём, только не забывайте, что у объекта ещё доступно свойство ЭтоНовый(), которое часто нужно в той же логике.
ПЗ
Практическое замечание
Итог

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

Тип документа по ссылке определяется без обращения к базе. Для ветвления в коде используйте ТипЗнч(Ссылка) = Тип("ДокументСсылка.Имя"), для получения имени вида — Ссылка.Метаданные().Имя, для работы с именами из внешних источников — XMLТипЗнч(). Всегда предусматривайте ветку для непредусмотренных типов и проверяйте заполненность ссылки.

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

Как определить тип документа в тонком клиенте и на мобильной платформе?

Все перечисленные способы — Метаданные(), ТипЗнч(), Тип(), XMLТипЗнч() — доступны на клиенте и на сервере, включая тонкий и веб-клиент. Различий в синтаксисе нет; учитывайте только директивы компиляции, если код размещён в клиентском общем модуле.

Чем отличается ТипЗнч() от Метаданные().Имя?

ТипЗнч() возвращает объект «Тип», который сравнивается с другим типом напрямую — это надёжно для условий. Метаданные().Имя возвращает строку с именем вида документа, удобную для сообщений, логов и сравнения с внешними настройками. Для ветвления логики предпочтительнее сравнение типов.

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

Используйте Ссылка.Метаданные().ПолноеИмя() и проверьте, что строка начинается с «Документ.», либо сравните XMLТипЗнч(Ссылка).ИмяТипа с префиксом «DocumentRef.» («ДокументСсылка.»). Ещё один вариант — проверка Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)).

Работает ли определение типа для битой ссылки на удалённый документ?

Да. Тип хранится внутри самой ссылки, поэтому Метаданные() и ТипЗнч() вернут корректный вид документа даже если объект удалён из базы. Однако чтение реквизитов такой ссылки даст пустые значения, поэтому существование объекта проверяйте отдельно — запросом или через ПолучитьОбъект().

Можно ли определить тип документа по строковому представлению ссылки?

Строковое представление (например, «Реализация товаров и услуг 0000-000001 от 12.01.2026») содержит синоним вида документа, но парсить его ненадёжно: синонимы могут меняться и совпадать. Если у вас есть только строка, получите ссылку через ЗначениеВСтрокуВнутр() (для внутреннего формата) или найдите документ по номеру и дате, а затем уже определяйте тип штатными методами.

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

Обратитесь к метаданным реквизита: Метаданные.Документы.ИмяДокумента.Реквизиты.ИмяРеквизита.Тип.Типы() вернёт массив типов. Для каждого типа можно получить имя вида через Метаданные.НайтиПоТипу(Тип).Имя. Это удобно для построения универсальных обработок без жёсткого перечисления видов документов в коде.