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