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