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

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

Определяемые типы в 1С: назначение и практика применения

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

Определяемый тип — это объект метаданных в конфигураторе 1С, который представляет собой именованный набор допустимых типов данных. Вместо того чтобы в каждом реквизите документа или справочника вручную перечислять состав типов, разработчик один раз описывает определяемый тип, а затем ссылается на него из любых объектов конфигурации. Это централизованная точка управления составом типов.

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

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

Что такое определяемый тип и как он устроен

В дереве конфигурации определяемые типы находятся в ветке «Общие» → «Определяемые типы». Каждый такой объект содержит свойство «Тип», в котором перечисляются допустимые типы: примитивные (Строка, Число, Дата, Булево) и ссылочные (ДокументСсылка, СправочникСсылка и конкретные объекты). Дополнительно можно задать квалификаторы — например, длину строки или точность числа.

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

Зачем нужны определяемые типы: основные задачи

Первая задача — централизованное управление составом типов. Если в конфигурации пятнадцать документов имеют реквизит «Контрагент», который может ссылаться на справочники «Контрагенты» и «Организации», то при добавлении третьего варианта без определяемого типа пришлось бы править каждый реквизит вручную. С определяемым типом правится одно место.

Вторая задача — разработка переносимых подсистем. Библиотека стандартных подсистем (БСП) активно использует этот механизм: подсистема объявляет определяемый тип, а прикладной разработчик при внедрении наполняет его объектами своей конфигурации. Код подсистемы при этом не меняется, что упрощает обновления.

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

ПризнакТип повторяется в нескольких объектах

Один и тот же состав типов нужен в реквизитах разных документов, справочников или регистров

ПризнакРазрабатывается подсистема

Код должен работать в разных конфигурациях без правки — состав типов задаёт внедренец

ПризнакНужны единые квалификаторы

Длина строки или точность числа должны совпадать во всех местах использования

Как создать определяемый тип в конфигураторе

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

Ограничения и когда определяемый тип не нужен

Определяемый тип не заменяет проверку типов в коде. Если реквизит имеет составной тип, при программной работе со значением всё равно нужно определять, какой именно тип пришёл, — через функцию ТипЗнч() и сравнение с конкретным типом. Определяемый тип управляет только тем, что можно сохранить в поле, а не логикой обработки.

Не стоит создавать определяемый тип ради одного реквизита в одном объекте — это лишняя сущность без выигрыша. Также механизм не подходит, если состав типов должен отличаться в разных объектах: определяемый тип един для всех мест использования, и «частные» варианты придётся описывать отдельными типами.

Определяемый тип или составной тип реквизита

Определяемый тип

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

Составной тип реквизита

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

Примитивный тип с квалификаторами

Подходит для простых полей без вариантов типа. Ограничение: нет единой точки управления квалификаторами

Типичные ошибки и как их избежать

Типичные ошибки
01
Включение в определяемый тип «лишних» объектов на всякий случай — это увеличивает состав полей в базе и усложняет формы выбора без необходимости
02
Удаление объекта из конфигурации без очистки определяемого типа — ссылка на несуществующий объект вызывает ошибки при обновлении конфигурации
03
Использование определяемого типа без проверки типа в коде — при составном типе обращение к реквизиту, которого нет у конкретного значения, приводит к ошибке исполнения
04
Разные квалификаторы у определяемого типа и ожиданий кода — например, строка обрезается по длине, заданной в типе, а разработчик об этом забывает

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

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

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

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

Состав типа в конфигураторе
Норма

В свойстве «Тип» перечислены только нужные типы, квалификаторы заданы

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

Есть ссылки на удалённые объекты или лишние типы

Обновление конфигурации БД
Норма

Реструктуризация проходит без ошибок, данные на месте

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

Ошибки реструктуризации или очищенные поля

Работа в пользовательском режиме
Норма

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

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

Поле не даёт выбрать нужный объект или обрезает ввод

Дополнительно полезно программно проверить описание типов: через менеджер объекта получить реквизит и посмотреть его свойство «Тип» — оно вернёт объект ОписаниеТипов с фактическим составом. Это помогает убедиться, что определяемый тип применился именно так, как ожидалось.

Итог

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

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

Частые вопросы

Чем определяемый тип отличается от составного типа реквизита?

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

Можно ли использовать определяемый тип в запросе?

Напрямую в тексте запроса — нет, там работают конкретные типы. Но определяемый тип влияет на состав полей таблиц, и в запросах к таким полям применяются обычные механизмы: ВЫРАЗИТЬ, ССЫЛКА, проверка типов через ТИПЗНАЧЕНИЯ.

Что будет, если удалить объект, входящий в определяемый тип?

В определяемом типе останется битая ссылка на несуществующий объект, что вызовет ошибки при проверке и обновлении конфигурации. Перед удалением объекта исключите его из всех определяемых типов и реквизитов.

Можно ли менять состав определяемого типа в расширении конфигурации?

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

Нужно ли проверять тип значения в коде, если реквизит имеет определяемый тип?

Да, если тип составной. Определяемый тип ограничивает только то, что можно записать, но в конкретном значении может оказаться любой из допустимых типов. Используйте ТипЗнч() и ветвление логики по конкретным типам.

Когда определяемый тип создавать не стоит?

Когда набор типов используется только в одном реквизите одного объекта — проще задать составной тип локально. Также не стоит плодить определяемые типы без повторного использования: каждый лишний объект метаданных усложняет поддержку конфигурации.