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