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