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