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