Как программно создать составное описание типов в 1С:Предприятие?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Анализ типовых ошибок при вызове конструктора

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

Рассмотрим следующий ошибочный фрагмент кода:


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ДокументСсылка.РеализацияТоваровУслуг"));
МассивТипов.Добавить(Тип("ДокументСсылка.ПоступлениеТоваровУслуг"));
ОписаниеТиповДок = Новый ОписаниеТипов(, МассивТипов);

В этом примере передача массива вторым параметром с пропуском первого (через запятую) приводит к исключению «Несоответствие типов (параметр номер 2)». Выясним причину такого поведения платформы. У объекта ОписаниеТипов есть два основных варианта конструктора:

  1. Создание с нуля: Новый ОписаниеТипов(<Типы>, <КвалификаторыЧисла>, ...). В этой сигнатуре первым параметром передается массив типов, имя типа строкой или существующее описание типов.
  2. Изменение состава типов: Новый ОписаниеТипов(<ИсходноеОписаниеТипов>, <ДобавляемыеТипы>, <ВычитаемыеТипы>, ...). В данном варианте первый параметр обязателен и должен иметь тип ОписаниеТипов.

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

Также важно помнить: сам конструктор Новый ОписаниеТипов(...) никогда не возвращает Неопределено — он либо возвращает инициализированный объект, либо вызывает исключение. Если в отладчике переменная равна Неопределено, это означает, что строка еще не была выполнена или проверялся результат метода ПривестиЗначение(). Для любого составного описания типов значение по умолчанию всегда равно Неопределено, а метод СодержитТип(Тип("Неопределено")) всегда возвращает Истина.

Способ 1. Инициализация через массив типов

Рассмотрим классический способ создания составного типа с передачей массива типов в первый параметр конструктора. Это наиболее надежный подход с точки зрения контроля синтаксиса.


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ДокументСсылка.РеализацияТоваровУслуг"));
МассивТипов.Добавить(Тип("ДокументСсылка.ПоступлениеТоваровУслуг"));

ОписаниеТиповДок = Новый ОписаниеТипов(МассивТипов);

Преимущество этого способа заключается в том, что функция Тип() проверяется синтаксическим контролем конфигуратора. Если имя документа изменится или будет допущена опечатка, платформа укажет на ошибку еще на этапе проверки модулей.

Способ 2. Создание составного типа через строку

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


ОписаниеТиповДок = Новый ОписаниеТипов("ДокументСсылка.РеализацияТоваровУслуг, ДокументСсылка.ПоступлениеТоваровУслуг");

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

Способ 3. Получение описания типов из существующих метаданных

Если в конфигурации уже есть реквизит с нужным набором типов (например, реквизит ДокументОснование), создавать объект вручную не требуется. Мы можем прочитать готовое описание напрямую из метаданных:


ОписаниеТиповДок = Метаданные.Документы.СчетНаОплатуПокупателю.Реквизиты.ДокументОснование.Тип;

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

Способ 4. Использование метода Документы.ТипВсеСсылки с исключением типов

Когда требуется разрешить выбор практически любых документов за исключением нескольких конкретных, удобно использовать второй вариант конструктора совместно со свойством Документы.ТипВсеСсылки():


ИсключаемыеТипы = Новый Массив;
ИсключаемыеТипы.Добавить(Тип("ДокументСсылка.ОперацияБух"));

ОписаниеТиповДок = Новый ОписаниеТипов(Документы.ТипВсеСсылки(), , ИсключаемыеТипы);

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

← На главную