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

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

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

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

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

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

В типовых конфигурациях на базе Библиотеки стандартных подсистем определяемых типов десятки: «ВладелецПрисоединенныхФайлов», «ОбъектСНаборамиЗначенийДоступа», «КонтрагентБИП» и другие. Понимание того, как они устроены, необходимо и разработчику собственных подсистем, и внедренцу, который подключает типовую библиотеку к своей конфигурации.

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

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

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

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

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

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

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

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

Создание выполняется в конфигураторе и занимает несколько минут. Важно сразу продумать имя: оно должно отражать роль типа в предметной области, а не его текущий состав, потому что состав будет меняться, а имя останется.

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

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

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

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

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

В коде встроенного языка проверка фактического типа значения делается стандартно — через функцию ТипЗнч() и сравнение с конкретным типом. Сам определяемый тип в коде напрямую не используется: это конструкция уровня метаданных.

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

Определяемые типы при внедрении БСП и типовых подсистем

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

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

Ограничения, подводные камни и типичные ошибки

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

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

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

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

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

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

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

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

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

Перечислены только реально нужные типы

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

Есть типы, которые нигде не используются осознанно

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

Выбор предлагает ожидаемые виды объектов

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

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

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

Найдены все ожидаемые реквизиты и ресурсы

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

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

Данные в реквизитах после сужения состава
Норма

Все значения соответствуют новому составу

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

Есть значения типов, исключённых из состава — они будут потеряны

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

Сравнение подходов

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

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

Составной тип в реквизите напрямую

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

План видов характеристик (характеристики)

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

Общий реквизит

Подходит, когда одинаковый реквизит нужен во многих объектах с единым типом. Не решает задачу «переменного состава типов».

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

Итог

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

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

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

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

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

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

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

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

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

Почему после внедрения подсистемы БСП она «не видит» мои объекты?

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

Влияет ли большой состав определяемого типа на производительность?

Да, если реквизит с таким типом участвует в соединениях и отборах запросов: платформа работает со всеми таблицами состава. Для полей, активно используемых в запросах, состав стоит минимизировать, а при необходимости рассмотреть отдельные реквизиты под конкретные типы.

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

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