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

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

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

Как определить вид документа в 1С 8: функция ТипЗнч, метод Метаданные(), свойство ВидДокумента, определение по ссылке и в запросе. Примеры кода и типичные ошибки.

Задача определить вид документа возникает в 1С 8 постоянно: при написании обработок, проверок в подписках на события, формировании отчётов и при работе с произвольными ссылками. «Вид документа» — это имя объекта метаданных, например «РеализацияТоваровУслуг» или «ПриходныйКассовыйОрдер», а не номер и не дата конкретного документа.

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

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

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

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

Получение вида через Метаданные()

Универсальный способ — вызвать метод Метаданные() у ссылки или объекта документа. Он возвращает объект описания метаданных, у которого доступны свойства Имя, Синоним и ПолноеИмя().

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

// Например: "РеализацияТоваровУслуг"

ПредставлениеВида = ДокументСсылка.Метаданные().Синоним;

// Например: "Реализация товаров и услуг"

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

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

Метод работает и на клиенте, и на сервере, и не требует обращения к базе данных за дополнительными данными — описание метаданных доступно сразу. Поэтому это самый быстрый и безопасный способ, когда ссылка уже есть в руках.

Отдельное удобство — свойство Синоним. Если нужно показать пользователю понятное название вида документа, выводите именно синоним, а не внутреннее имя, которое пишется слитно и на латинской раскладке слов.

Определение вида через ТипЗнч()

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

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

// Действия для реализации

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

// Действия для поступления

КонецЕсли;

Если видов много, условия выстраивают через массив типов или через сравнение имени метаданных со списком. Для двух-трёх видов достаточно прямого сравнения — оно читается проще и работает быстрее, чем разбор строки с именем.

Получение вида в запросе

Когда документы выбираются запросом, вид определяют двумя способами. Первый — функция языка запросов ТИПЗНАЧЕНИЯ(), которая возвращает тип ссылки. Её применяют в условиях и в секции ВЫБОР для сравнения.

ВЫБРАТЬ

Хозрасчетный.Регистратор КАК Регистратор

ИЗ

РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный

ГДЕ

ТИПЗНАЧЕНИЯ(Хозрасчетный.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)

Второй способ — обращение к таблице конкретного вида документа. Если вам заранее известен нужный вид, просто выбирайте из таблицы Документ.РеализацияТоваровУслуг: это и быстрее, и даёт доступ к реквизитам, которых нет в общей таблице.

Учтите ограничение: в запросе нельзя напрямую получить имя вида строкой. Функция ТИПЗНАЧЕНИЯ возвращает тип, а не его текстовое имя. Если в отчёте нужна колонка «Вид документа», имя получают уже на этапе вывода — через Метаданные() для ссылки в строке результата.

Перебор всех видов документов конфигурации

Иногда нужно получить не вид конкретного документа, а список всех видов, существующих в конфигурации. Для этого служит коллекция Метаданные.Документы.

Для Каждого ВидДок Из Метаданные.Документы Цикл

Сообщить(ВидДок.Имя + " — " + ВидДок.Синоним);

КонецЦикла;

Такой перебор используют при построении универсальных обработок: например, групповой перепроводке, поиске документов по реквизиту или выгрузке данных. Коллекция доступна только на сервере и в толстом клиенте, поэтому в тонком клиенте код с перебором метаданных выносят в серверную процедуру.

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

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

Если Метаданные.Документы.Найти("РеализацияТоваровУслуг") <> Неопределено Тогда

// Вид существует, можно работать

КонецЕсли;

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

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

Если колонки нет, её добавляют через «Ещё — Изменить форму» в журнале документов: в списке реквизитов находят «Вид документа» и включают его отображение. Это удобно, когда в одном журнале сведены, например, все складские документы.

Как узнать вид документа в режиме предприятия
  1. 1
    Откройте журнал, в котором зарегистрирован документ
  2. 2
    Убедитесь, что в списке есть колонка «Вид документа»; при её отсутствии откройте «Ещё — Изменить форму» и включите её
  3. 3
    Найдите нужный документ — его вид отображается в этой колонке
  4. 4
    Либо откройте сам документ: вид указан в заголовке формы перед номером и датой

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

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

Отдельная группа проблем — производительность. Вызов Метаданные() сам по себе дёшев, но если в цикле по тысячам ссылок вы ещё и получаете объект документа через ПолучитьОбъект() только ради определения вида, это лишняя нагрузка. Вид доступен у ссылки без чтения объекта из базы.

Проверка результата и выбор подхода

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

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

Имя вида в сообщении или логе
Норма

Выводится имя как в конфигураторе, без пробелов и точек

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

Пустая строка или имя другого вида — проверьте источник ссылки

Условие с ТипЗнч
Норма

Ветка срабатывает для документов нужного вида

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

Условие всегда ложно — вероятно, сравниваете ссылку с типом объекта

Запрос с ТИПЗНАЧЕНИЯ
Норма

В результат попадают только записи нужного вида

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

Пустой результат — проверьте, тот ли это регистратор и вид

Маршрут решения

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

Есть ссылка или объект документа в кодеИспользуйте Ссылка.Метаданные().Имя для имени или ТипЗнч() для сравнения
Нужно отобрать документы вида в выборкеФильтруйте запросом через ТИПЗНАЧЕНИЯ или выбирайте из таблицы конкретного вида
Нужен список всех видов конфигурацииПереберите Метаданные.Документы в серверной процедуре
Нужно просто посмотреть вид без кодаОткройте журнал документов и включите колонку «Вид документа»
Итог

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

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

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

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

Строковое представление вида «Реализация товаров и услуг 0001 от 12.03» нельзя надёжно преобразовать в вид. Нужна ссылка: получите её по номеру и дате через Документы[ИмяВида].НайтиПоНомеру() или из параметра, где хранится ссылка, а не строка.

Работает ли Метаданные() на тонком клиенте?

Да, вызов Метаданные() у ссылки доступен на клиенте. Но перебор коллекции Метаданные.Документы и поиск по ней выполняются только на сервере, поэтому такую логику выносят в серверные процедуры общих модулей.

Чем отличается Имя от Синонима у метаданных документа?

Имя — внутренний идентификатор вида, используется в коде и запросах и не меняется при переводе интерфейса. Синоним — представление для пользователя, может редактироваться и локализоваться. В условиях и сравнениях используйте только Имя.

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

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

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

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

Как вывести вид документа в СКД-отчёте?

В запросе набора данных выберите ссылку на документ, а в вычисляемом поле или при расшифровке используйте выражение на встроенном языке: Ссылка.Метаданные().Синоним. Альтернатива — выводить представление ссылки, где вид уже содержится в тексте.