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

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

Тип документа в 1С: как работать с ним в конфигураторе

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

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

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

Где в конфигураторе находятся типы документов

Откройте конфигуратор и перейдите в дерево конфигурации (меню «Конфигурация» → «Открыть конфигурацию»). Все виды документов находятся в ветке «Документы». Каждый элемент этой ветки — отдельный тип документа с собственным именем, синонимом и набором свойств.

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

Чтобы посмотреть свойства конкретного типа, выделите документ в дереве и откройте палитру свойств (правый клик → «Свойства»). Здесь задаются длина номера, периодичность нумерации, контроль уникальности, проведение (разрешить/запретить), движения по регистрам, журналы, в которых документ регистрируется.

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

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

ТипДок = ТипЗнч(ДокументСсылка);

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

// обработка реализации

КонецЕсли;

Обратите внимание на различие: у одного и того же документа может быть тип «ДокументСсылка.<Имя>» (лёгкая ссылка для чтения реквизитов через точку) и «ДокументОбъект.<Имя>» (полный объект для изменения и записи). Сравнение ТипЗнч(Объект) = Тип("ДокументСсылка.РеализацияТоваровУслуг") вернёт Ложь, если переменная содержит объект, а не ссылку. Это одна из самых распространённых ошибок начинающих разработчиков.

Альтернативный способ — через метаданные конкретного объекта:

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

Если ИмяДокумента = "РеализацияТоваровУслуг" Тогда

// ...

КонецЕсли;

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

1c
Если ТипЗнч(Док) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
    Сообщить("Это поступление: " + Док.Метаданные().Имя);
КонецЕсли;

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

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

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

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

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

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

Нужно сравнить с одним конкретным видом документаИспользуйте ТипЗнч() и сравнение с Тип("ДокументСсылка.Имя")
Нужна строка с именем типа для логов или динамических запросовВозьмите ДокументСсылка.Метаданные().Имя
Нужно проверить принадлежность к группе видов документовСоздайте определяемый тип или массив допустимых типов
Проверка выполняется в запросеИспользуйте оператор ССЫЛКА в условии ГДЕ или ВЫРАЗИТЬ для приведения типа

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

В языке запросов 1С тип документа проверяется оператором ССЫЛКА:

ВЫБРАТЬ Ссылка

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

ГДЕ Ссылка.Контрагент = &Контрагент

Когда запрос обращается к составному реквизиту (например, «ДокументОснование», который может хранить ссылки на разные виды документов), используйте проверку:

ГДЕ Регистр.ДокументОснование ССЫЛКА Документ.ПоступлениеТоваровУслуг

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

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

Чтобы добавить собственный вид документа, выделите ветку «Документы» и нажмите «Добавить». Задайте имя (латиницей, без пробелов, по нему будет идти обращение из кода) и синоним. Затем настройте ключевые свойства.

Порядок создания типа документа
  1. 1
    В ветке «Документы» нажмите «Добавить», задайте имя и синоним
  2. 2
    На закладке «Данные» добавьте реквизиты и табличные части
  3. 3
    На закладке «Нумерация» настройте длину номера, периодичность и контроль уникальности
  4. 4
    На закладке «Движения» разрешите проведение и отметьте регистры, по которым документ делает движения
  5. 5
    На закладке «Журналы» включите документ в нужные журналы
  6. 6
    Создайте формы документа и списка, напишите обработку проведения в модуле объекта
  7. 7
    Обновите конфигурацию базы данных (F7) и проверьте создание документа в режиме предприятия

После добавления документа обязательно проверьте права доступа: новые объекты по умолчанию могут быть недоступны существующим ролям. Откройте используемые роли и установите права на чтение, добавление, изменение и проведение для нового типа.

При обновлении конфигурации базы данных платформа выполнит реструктуризацию — создаст новые таблицы. На больших базах это может занять заметное время, поэтому обновление рабочей базы планируйте вне рабочих часов и только после резервного копирования.

Типичные ошибки при работе с типами документов

Большинство проблем связаны не со сложностью механизмов, а с невнимательностью к различиям ссылок и объектов, а также к поведению составных типов.

Типичные ошибки
01
Сравнение объекта с типом ссылки: ТипЗнч(ДокументОбъект) никогда не равен Тип("ДокументСсылка.Имя") — сравнивайте через ДокументОбъект.Ссылка
02
Обращение к реквизиту составного типа без ВЫРАЗИТЬ в запросе — получаете NULL или падение производительности
03
Переименование документа без поиска обращений по имени в коде, запросах и внешних обработках — после обновления код перестаёт компилироваться или молча перестаёт находить данные
04
Использование синонима вместо имени в программных обращениях — синоним может меняться, имя в коде должно быть идентификатором из конфигуратора
05
Забытые права: новый тип документа создан, но пользователи его не видят, потому что роли не обновлены

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

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

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

Открытие документа в режиме предприятия
Норма

Документ создаётся, записывается и проводится без ошибок

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

Ошибка прав доступа или отсутствие документа в меню — проверьте роли и подсистемы

Сравнение типа в коде
Норма

Условие ТипЗнч() = Тип(...) срабатывает для нужных документов

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

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

Запрос по составному реквизиту
Норма

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

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

NULL в реквизитах или лишние строки — добавьте ВЫРАЗИТЬ и условие ССЫЛКА

FAQ

Чем отличается ДокументСсылка от ДокументОбъект?

Ссылка — это лёгкий указатель на запись в базе: через неё можно читать реквизиты, но нельзя изменять и записывать документ. Объект — полная программная копия документа в памяти, получаемая методом ПолучитьОбъект(); только через объект выполняются изменение, запись и проведение. Работа через ссылку быстрее и безопаснее для чтения.

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

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

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

Нет, тип документа неизменен после создания экземпляра. Чтобы «перевести» документ в другой вид, создают новый документ нужного типа (часто на основании исходного через ввод на основании), а старый помечают на удаление или отменяют его проведение.

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

Используйте ОБЪЕДИНИТЬ ВСЕ для выборок из таблиц каждого вида документа, либо обращайтесь к общему регистру, журналу документов или критерию отбора, если документы в них регистрируются. Проверка ССЫЛКА в условии ГДЕ работает только для составных реквизитов, а не для объединения разных таблиц.

Что такое определяемый тип и зачем он нужен?

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

Итог

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

Тип документа задаётся в конфигураторе в ветке «Документы» и определяется в коде через ТипЗнч() или Метаданные().Имя. Различайте ссылку и объект, в запросах используйте ССЫЛКА и ВЫРАЗИТЬ, а перед переименованием или удалением типа обязательно делайте резервную копию и ищите все обращения по имени.