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