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

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

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

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

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

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

Как определить вид документа через интерфейс

Самый простой способ — открыть сам документ. Вид отображается в заголовке формы: например, «Реализация (акты, накладные, УПД)» или «Поступление (акты, накладные, УПД)». Рядом обычно указаны номер и дата. Если документ открыт из журнала, вид также виден в колонке списка или в названии самого журнала.

В типовых конфигурациях многие журналы объединяют несколько видов документов. Например, журнал «Покупки» может содержать поступления товаров, услуг и дополнительные расходы. Чтобы понять, какой именно вид у конкретной строки, включите отображение колонки с типом документа через меню «Ещё → Изменить формы» или просто откройте строку двойным щелчком.

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

Заголовок формыСодержит вид документа

Сравните с ожидаемым названием операции

Название журналаПоказывает состав типов

Проверьте, какие виды объединены в журнале

Набор полейЗависит от вида

Нетипичные поля — признак другого вида документа

Проверка вида документа в коде: ТипЗнч и Тип

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

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

// Это реализация товаров и услуг

КонецЕсли;

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

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

bsl
Если ТипЗнч(Ссылка) = Тип("ДокументСсылка.ПриходныйКассовыйОрдер") Тогда Сообщить("Это ПКО"); КонецЕсли;

Проверка через метаданные и имя вида

У любой ссылки на документ есть метод Метаданные(), который возвращает описание объекта конфигурации. Через него можно получить имя вида, синоним и проверить принадлежность к документам вообще:

ИмяВида = ДокументСсылка.Метаданные().Имя; // например, "РеализацияТоваровУслуг"

Представление = ДокументСсылка.Метаданные().Синоним; // "Реализация (акты, накладные, УПД)"

Чтобы убедиться, что произвольное значение вообще является ссылкой на документ (любого вида), используют описание типов:

Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда

// Передана ссылка на какой-то документ

КонецЕсли;

В управляемых формах на клиенте метод Метаданные() у ссылки недоступен — вызов выполняется на сервере. Учитывайте это при написании клиент-серверного кода: проверку типа выносите в серверную процедуру модуля формы или общего модуля.

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

Когда документы выбираются запросом, вид задаётся именем таблицы: Документ.РеализацияТоваровУслуг. Если нужно отобрать по виду из составного поля (например, регистратора в регистре), применяют оператор ССЫЛКА:

ВЫБРАТЬ

Движения.Регистратор

ИЗ

РегистрНакопления.ТоварыНаСкладах.Обороты КАК Движения

ГДЕ

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

Этот приём полезен при анализе движений: регистратором может быть документ нескольких видов, а отчёт нужен только по одному. Альтернатива — функция ВЫРАЗИТЬ(... КАК Документ.ИмяВида), которая приводит значение к нужному типу и возвращает пустую ссылку для остальных.

Помните, что сравнение типов в запросе работает только для ссылочных значений. Если поле хранит строку или число, оператор ССЫЛКА неприменим — сначала проверьте тип данных поля в конфигураторе.

Проверка вида через отборы и настройки списков

Без программирования вид документа можно проверить и отфильтровать прямо в списке. В журнале, содержащем несколько видов, откройте «Ещё → Настроить список» и добавьте отбор по полю «Тип» (или откройте список конкретного вида через раздел меню, например «Продажи → Реализация (акты, накладные, УПД)»).

В отчётах на СКД вид документа-регистратора часто доступен как поле отбора. Добавьте условие «Регистратор = конкретный документ» или используйте группировку по типу регистратора, чтобы увидеть распределение по видам.

Порядок действий в интерфейсе
  1. 1
    Откройте журнал или раздел с документами
  2. 2
    Откройте нужную строку и посмотрите заголовок формы
  3. 3
    Если видов несколько, включите колонку с типом через настройку списка
  4. 4
    Для проверки движений откройте отчёт по регистру и отфильтруйте по регистратору

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

Частая ошибка — сравнение имени вида как строки с синонимом. Код Если Ссылка.Метаданные().Имя = "Реализация товаров и услуг" никогда не сработает, потому что имя метаданных пишется без пробелов: «РеализацияТоваровУслуг». Всегда сверяйтесь с конфигуратором.

Вторая ошибка — попытка вызвать Тип("ДокументСсылка.Имя") для вида, которого нет в конфигурации (например, после обновления или в другой конфигурации). Возникнет исключение. Для универсального кода сначала проверяйте наличие объекта: Метаданные.Документы.Найти("ИмяВида").

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

Типичные ошибки
01
Сравнение с синонимом вместо имени метаданных — условие никогда не выполняется
02
Вызов Тип() с несуществующим именем вида — исключение в коде
03
Проверка метаданных на клиенте — ошибка недоступности в тонком клиенте
04
Проверка ссылки у незаписанного документа — ссылка пустая, тип определяется неверно
Маршрут решения

Как выбрать способ проверки

Нужно просто посмотреть вид одного документаОткройте форму и посмотрите заголовок
Нужно сравнить тип в коде с известным видомИспользуйте ТипЗнч(Ссылка) = Тип("ДокументСсылка.Имя")
Код должен работать с разными видами универсальноПолучите имя через Ссылка.Метаданные().Имя
Нужно отобрать документы в запросе или отчётеИспользуйте оператор ССЫЛКА или имя таблицы Документ.ИмяВида

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

После написания кода проверьте его на документах разных видов: условие должно срабатывать только для целевого вида и не срабатывать для похожих. Например, проверка на «РеализацияТоваровУслуг» не должна ловить «КорректировкаРеализации», хотя документы связаны.

Для отладки выведите тип значения через Сообщить(ТипЗнч(Ссылка)) или посмотрите значение в табло отладчика. В конфигурациях с БСП есть готовая функция ОбщегоНазначения.ВидОбъектаПоСсылке() и похожие методы — они уже учитывают краевые случаи, и использовать их надёжнее, чем писать свои.

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

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

Срабатывание условия
Норма

Выполняется только для нужного вида

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

Срабатывает для похожих документов или не срабатывает вовсе

Имя вида в коде
Норма

Совпадает с именем в конфигураторе

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

Содержит пробелы или отличается регистром

Контекст выполнения
Норма

Проверка метаданных выполняется на сервере

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

Ошибка вызова в тонком клиенте

Итог

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

В интерфейсе вид документа виден в заголовке формы и настройках списка. В коде тип проверяют через ТипЗнч и Тип с именем метаданных, для универсальных решений — через Метаданные().Имя, в запросах — через оператор ССЫЛКА. Сравнивайте только по имени метаданных и выполняйте проверку на сервере.

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

Чем вид документа отличается от типа документа в 1С?

В контексте 1С это синонимы: «вид» — термин из конфигуратора (объект метаданных в ветке «Документы»), «тип» — соответствующее значение встроенного языка вида ДокументСсылка.ИмяВида. Не путайте с «видом операции» — это реквизит внутри одного вида документа.

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

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

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

Чаще всего имя вида в строке не совпадает с именем метаданных — лишние пробелы, другой регистр или синоним вместо имени. Реже причина в том, что переменная содержит не ссылку, а объект ДокументОбъект: у него другой тип, и сравнение с ДокументСсылка не пройдёт.

Как проверить вид документа у регистратора в регистре?

В запросе используйте условие «Регистратор ССЫЛКА Документ.ИмяВида». В коде получите регистратор и примените ТипЗнч(Регистратор) = Тип("ДокументСсылка.ИмяВида").

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

Частично: ТипЗнч и Тип работают и на клиенте, поэтому простое сравнение типов доступно. А вот обращение к метаданным и запросы требуют серверного контекста — выносите такую логику в серверные процедуры.

Что делать, если код должен работать в разных конфигурациях с разными видами документов?

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