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