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