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

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

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

Что такое определяемые типы в 1С, зачем они нужны, как создать и подключить к документам и справочникам. Примеры, ошибки, проверка результата и FAQ.

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

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

Механизм особенно активно применяется в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП): там определяемые типы связывают подсистемы между собой и позволяют внедрять функциональность без жёсткой привязки к конкретным объектам. Понимание этого механизма необходимо и при доработке типовых решений, и при разработке собственных конфигураций.

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

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

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

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

Для чего определяемые типы применяются на практике

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

Второй сценарий — связывание подсистем в типовых конфигурациях. БСП определяет типы вроде «ВладелецПрисоединенныхФайлов» или «ОбъектСОграничениемДоступаНаУровнеЗаписей». Конкретная прикладная конфигурация расширяет их состав своими объектами, и механизмы библиотеки (присоединённые файлы, RLS, версионирование) автоматически начинают работать с этими объектами без изменения кода подсистемы.

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

Одинаковый составной типПовторяется в нескольких объектах

Если 3 и более реквизитов имеют одинаковый состав типов — кандидат на определяемый тип

Подсистема БСПТребует заполнения типа

Присоединённые файлы, версионирование, даты запрета требуют указать свои определяемые типы

Планируются расширенияСостав типов будет расти

Если состав реквизита будет дополняться новыми объектами, централизация упростит доработку

Единичный реквизитСостав стабилен

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

Как создать и подключить определяемый тип

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

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

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

Порядок создания определяемого типа
  1. 1
    В конфигураторе откройте ветку «Общие» → «Определяемые типы» и добавьте новый элемент
  2. 2
    Задайте осмысленное имя, например «КонтрагентРасширенный»
  3. 3
    В свойстве «Тип» отметьте нужные ссылочные и примитивные типы, задайте квалификаторы
  4. 4
    Откройте реквизит целевого объекта и в свойстве «Тип» выберите созданный определяемый тип
  5. 5
    Повторите для всех реквизитов с тем же составом типов
  6. 6
    Выполните обновление конфигурации базы данных и проверьте реструктуризацию

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

Во встроенном языке определяемый тип доступен через менеджер «ОпределяемыеТипы» — например, ОпределяемыеТипы.ВладелецПрисоединенныхФайлов. Из него можно получить описание типов методом ПолучитьОписаниеТипов() и использовать для проверок: ОписаниеТипов.СодержитТип(ТипЗнч(Значение)). Это удобно для универсальных проверок входных параметров процедур.

В запросах реквизиты составного типа (в том числе на базе определяемого) требуют осторожности: соединение по такому полю без приведения типов может привести к соединению с несколькими таблицами и падению производительности. Рекомендуется использовать оператор ВЫРАЗИТЬ(... КАК Справочник.Контрагенты) перед соединением или обращением через точку к реквизитам ссылки.

Для проверки, какие объекты используют конкретный определяемый тип, в конфигураторе есть стандартный механизм: правый клик по типу → «Поиск ссылок на объект». Перед удалением или сокращением состава типа эта проверка обязательна.

bsl
ОписаниеТипа = ОпределяемыеТипы.ВладелецПрисоединенныхФайлов.ПолучитьОписаниеТипов();
Если ОписаниеТипа.СодержитТип(ТипЗнч(ПроверяемыйОбъект)) Тогда
	// объект поддерживает присоединённые файлы
КонецЕсли;

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

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

КритерийОпределяемый типСоставной тип в реквизите
Изменение составаВ одном месте, применяется ко всем реквизитамПравка каждого реквизита отдельно
Единообразие квалификаторовГарантировано наследованиемЗависит от внимательности разработчика
Интеграция с БСПОбязателен для ряда подсистемНе подходит
Дополнение из расширенияВозможноНевозможно без изменения объекта
Простота для единичного случаяИзбыточенПроще и нагляднее

Какой подход выбрать

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

Состав повторяется в нескольких объектах, планируется рост состава, нужна интеграция с БСП или расширениями

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

Реквизит единственный, состав стабилен, конфигурация небольшая и не дорабатывается расширениями

Типичные ошибки и ограничения

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

Вторая ошибка — чрезмерно широкий состав «на вырост», например включение в тип всех существующих справочников. Это раздувает индексы составных полей, замедляет запросы с соединениями и затрудняет ввод данных пользователем: в поле выбора отображается длинный список ненужных типов. Состав должен включать только реально используемые типы.

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

Типичные ошибки
01
Удаление типа из состава без проверки данных — ошибка реструктуризации или потеря значений
02
Включение в состав лишних типов «про запас» — тяжёлые индексы и неудобный выбор в полях ввода
03
Соединение в запросе по составному полю без ВЫРАЗИТЬ — соединение со всеми таблицами состава и падение производительности
04
Дублирование состава: часть реквизитов на определяемом типе, часть — на ручном составном, из-за чего изменения применяются неравномерно

Проверка результата после внедрения

После подключения определяемого типа проверьте три вещи. Во-первых, ввод данных: откройте форму объекта и убедитесь, что поле предлагает выбор именно тех типов, которые входят в состав, — не больше и не меньше. Во-вторых, запросы и отчёты: отчёты, обращающиеся к реквизиту, должны корректно отрабатывать соединения; при необходимости добавьте приведение типов. В-третьих, обмены и права: составные поля участвуют в планах обмена и RLS, убедитесь, что новые типы из состава учтены в настройках.

Для программной проверки удобно сравнить фактический состав типа реквизита с ожидаемым через метаданные: Метаданные.Документы.Заказ.Реквизиты.Контрагент.Тип вернёт описание типов, которое можно разобрать в цикле и сверить с эталоном. Такая проверка полезна в автотестах перед выпуском обновления.

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

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

Поле ввода в форме
Норма

Предлагает выбор только типов из состава определяемого типа

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

В списке выбора лишние типы или отсутствуют нужные

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

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

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

Ошибка о невозможности исключить тип с имеющимися значениями

Запросы и отчёты
Норма

Соединения по реквизиту работают, время выполнения не выросло

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

Запрос обращается ко всем таблицам состава, отчёт тормозит

Расширения
Норма

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

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

После обновления типовой конфигурации расширение отключается с ошибкой

FAQ: частые вопросы об определяемых типах

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

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

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

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

Зачем в типовых конфигурациях столько пустых определяемых типов?

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

Влияют ли определяемые типы на производительность?

Сам механизм — нет: это уровень метаданных. На производительность влияет состав типа: чем больше ссылочных типов в составном поле, тем тяжелее его индекс и тем дороже соединения в запросах без приведения типа. Держите состав минимальным и используйте ВЫРАЗИТЬ в запросах.

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

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

Как найти все объекты, использующие конкретный определяемый тип?

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

Итог

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

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