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