Разработка и Конфигурация · 10 мин
Определяемые типы в 1С: назначение и практика применения
Определяемые типы в 1С: что это, зачем нужны, как создать и использовать в конфигурации. Примеры, типичные ошибки и проверка результата для разработчиков.
Определяемый тип — это объект метаданных в конфигураторе 1С, который представляет собой именованный набор допустимых типов данных. Вместо того чтобы в каждом реквизите документа или справочника вручную перечислять состав типов, разработчик один раз описывает определяемый тип, а затем ссылается на него из любых объектов конфигурации. Это централизованная точка управления составом типов.
Механизм особенно востребован при разработке библиотек и подсистем, которые должны работать в разных конфигурациях. Например, подсистема взаимодействий не знает заранее, какие документы будут в конкретной конфигурации, — она объявляет определяемый тип «ПредметВзаимодействия», а внедренец при внедрении просто включает в него нужные документы. Так стандартные подсистемы БСП остаются переносимыми без правки кода.
Ниже разобрано, как устроены определяемые типы, когда их применять, как создать и проверить, а также какие ошибки встречаются чаще всего.
Что такое определяемый тип и как он устроен
В дереве конфигурации определяемые типы находятся в ветке «Общие» → «Определяемые типы». Каждый такой объект содержит свойство «Тип», в котором перечисляются допустимые типы: примитивные (Строка, Число, Дата, Булево) и ссылочные (ДокументСсылка, СправочникСсылка и конкретные объекты). Дополнительно можно задать квалификаторы — например, длину строки или точность числа.
Ключевое отличие от обычного составного типа реквизита в том, что определяемый тип существует как самостоятельный объект метаданных с именем. На него можно сослаться из реквизитов документов, измерений регистров, параметров запросов и других мест, где указывается тип. При изменении состава определяемого типа все объекты, которые его используют, получают новый состав автоматически.
Зачем нужны определяемые типы: основные задачи
Первая задача — централизованное управление составом типов. Если в конфигурации пятнадцать документов имеют реквизит «Контрагент», который может ссылаться на справочники «Контрагенты» и «Организации», то при добавлении третьего варианта без определяемого типа пришлось бы править каждый реквизит вручную. С определяемым типом правится одно место.
Вторая задача — разработка переносимых подсистем. Библиотека стандартных подсистем (БСП) активно использует этот механизм: подсистема объявляет определяемый тип, а прикладной разработчик при внедрении наполняет его объектами своей конфигурации. Код подсистемы при этом не меняется, что упрощает обновления.
Третья задача — единообразие квалификаторов. Если денежные суммы во всех документах должны иметь одинаковую точность, разумно создать определяемый тип с заданными квалификаторами числа и использовать его повсеместно. Это исключает ситуацию, когда в одном документе сумма хранится с двумя знаками после запятой, а в другом — с четырьмя.
Один и тот же состав типов нужен в реквизитах разных документов, справочников или регистров
Код должен работать в разных конфигурациях без правки — состав типов задаёт внедренец
Длина строки или точность числа должны совпадать во всех местах использования
Как создать определяемый тип в конфигураторе
Создание выполняется в конфигураторе и не требует написания кода. Операция безопасна, но добавление определяемого типа в существующие реквизиты с данными может повлечь реструктуризацию таблиц — на больших базах это занимает время, поэтому такие изменения лучше выполнять вне рабочих часов.
Ограничения и когда определяемый тип не нужен
Определяемый тип не заменяет проверку типов в коде. Если реквизит имеет составной тип, при программной работе со значением всё равно нужно определять, какой именно тип пришёл, — через функцию ТипЗнч() и сравнение с конкретным типом. Определяемый тип управляет только тем, что можно сохранить в поле, а не логикой обработки.
Не стоит создавать определяемый тип ради одного реквизита в одном объекте — это лишняя сущность без выигрыша. Также механизм не подходит, если состав типов должен отличаться в разных объектах: определяемый тип един для всех мест использования, и «частные» варианты придётся описывать отдельными типами.
Определяемый тип или составной тип реквизита
Подходит, когда состав типов повторяется в нескольких объектах или нужен для переносимой подсистемы. Ограничение: единый состав для всех мест использования
Подходит для разовых случаев, когда набор типов уникален для конкретного реквизита. Ограничение: править придётся в каждом объекте отдельно
Подходит для простых полей без вариантов типа. Ограничение: нет единой точки управления квалификаторами
Типичные ошибки и как их избежать
Отдельный риск связан с реструктуризацией: изменение состава типа реквизита, в котором уже есть данные, приводит к перестроению таблиц. На больших базах это длительная операция, а при сужении состава типов данные несовместимых типов будут очищены. Перед такими изменениями обязательно делайте резервную копию и проверяйте, какие значения фактически хранятся в поле.
Как проверить результат
Как проверить результат
В свойстве «Тип» перечислены только нужные типы, квалификаторы заданы
Есть ссылки на удалённые объекты или лишние типы
Реструктуризация проходит без ошибок, данные на месте
Ошибки реструктуризации или очищенные поля
В полях с определяемым типом доступен выбор нужных объектов, значения сохраняются
Поле не даёт выбрать нужный объект или обрезает ввод
Дополнительно полезно программно проверить описание типов: через менеджер объекта получить реквизит и посмотреть его свойство «Тип» — оно вернёт объект ОписаниеТипов с фактическим составом. Это помогает убедиться, что определяемый тип применился именно так, как ожидалось.
Что важно запомнить
Определяемый тип — единая точка управления составом типов для множества реквизитов и основа переносимых подсистем. Создавайте его там, где состав типов повторяется, не включайте лишние объекты и перед сужением состава в рабочей базе проверяйте существующие данные.
Частые вопросы
Чем определяемый тип отличается от составного типа реквизита?
Составной тип задаётся локально в конкретном реквизите и действует только там. Определяемый тип — самостоятельный объект метаданных, на который ссылаются многие реквизиты; изменение его состава автоматически отражается во всех местах использования.
Можно ли использовать определяемый тип в запросе?
Напрямую в тексте запроса — нет, там работают конкретные типы. Но определяемый тип влияет на состав полей таблиц, и в запросах к таким полям применяются обычные механизмы: ВЫРАЗИТЬ, ССЫЛКА, проверка типов через ТИПЗНАЧЕНИЯ.
Что будет, если удалить объект, входящий в определяемый тип?
В определяемом типе останется битая ссылка на несуществующий объект, что вызовет ошибки при проверке и обновлении конфигурации. Перед удалением объекта исключите его из всех определяемых типов и реквизитов.
Можно ли менять состав определяемого типа в расширении конфигурации?
Расширения позволяют добавлять собственные определяемые типы и ряд объектов метаданных, но возможности по изменению типов основной конфигурации ограничены. Для подсистем БСП предусмотрен штатный механизм внедрения — правка определяемых типов в основной конфигурации при снятой или частичной поддержке.
Нужно ли проверять тип значения в коде, если реквизит имеет определяемый тип?
Да, если тип составной. Определяемый тип ограничивает только то, что можно записать, но в конкретном значении может оказаться любой из допустимых типов. Используйте ТипЗнч() и ветвление логики по конкретным типам.
Когда определяемый тип создавать не стоит?
Когда набор типов используется только в одном реквизите одного объекта — проще задать составной тип локально. Также не стоит плодить определяемые типы без повторного использования: каждый лишний объект метаданных усложняет поддержку конфигурации.