При разработке на платформе 1С программисты часто сталкиваются с необходимостью динамически ограничить тип значения реквизита на форме или программно сформировать колонку таблицы значений. Для таких задач используется объект ОписаниеТипов. Разберем по шагам, как правильно инициализировать этот объект из строковой переменной, проанализируем частую ошибку начинающих разработчиков и рассмотрим полезные приемы работы с типами.
Рассмотрим ситуацию. У нас есть задача — ограничить тип элемента формы строкой, которую мы формируем динамически в коде. Посмотрим на пример кода, который вызывает ошибку:
ОбъектМетаданных = СписокОбъектовМетаданных.НайтиПоЗначению(Список).Представление;
СтрокаДанных = "ДокументСсылка." + Строка(ОбъектМетаданных);
СтрокаДанных = """" + Строка(СтрокаДанных) + """"; // Ошибочная строка
Элементы.СамОбъект.ОграничениеТипа = Новый ОписаниеТипов(СтрокаДанных);
При выполнении этого кода платформа выдает исключение:
Ошибка при вызове конструктора (ОписаниеТипов) по причине: Недопустимое значение параметра (параметр номер '1') ("ДокументСсылка.ОперацияБух")
Выясним причину такого поведения. Дело в том, что в конструктор объекта ОписаниеТипов необходимо передать либо массив типов, либо обычную строку, содержащую имена типов. В данном коде разработчик попытался искусственно добавить кавычки внутрь строковой переменной, написав СтрокаДанных = """" + Строка(СтрокаДанных) + """". Платформа воспринимает эти добавленные кавычки как часть имени типа. Разумеется, объекта метаданных с именем, начинающимся и заканчивающимся кавычкой, не существует, поэтому и возникает ошибка параметра.
Чтобы код заработал, достаточно просто передать корректно сформированную текстовую переменную без добавления экранированных кавычек. Строковая переменная в 1С уже сама по себе является строкой, и дополнительно "оборачивать" ее содержимое для конструктора не нужно.
Исправленный рабочий код выглядит так:
ОбъектМетаданных = "ОперацияБух"; // Пример получения имени
СтрокаДанных = "ДокументСсылка." + ОбъектМетаданных;
// Сразу передаем сформированную строку в конструктор
Элементы.СамОбъект.ОграничениеТипа = Новый ОписаниеТипов(СтрокаДанных);
Проверить это можно даже в табло отладчика или конфигураторе. Конструкция Новый ОписаниеТипов("ДокументСсылка.АвансовыйОтчет") отрабатывает без ошибок и возвращает корректное описание типа.
Посмотрим подробнее на то, какие еще возможности предоставляет конструктор ОписаниеТипов при передаче ему строкового значения. Это очень гибкий инструмент, который не ограничивается одним ссылочным типом.
ДопустимыеТипы = Новый ОписаниеТипов("Строка, ДокументСсылка.ОперацияБух, СправочникСсылка.Номенклатура");
Строка, Число, Дата, Булево, Массив, Структура, ХранилищеЗначения.Рассмотрим важную особенность. Если мы получаем описание типа из строки вида "Строка" или "Число", то такие типы создаются неограниченными (строка неограниченной длины или число с максимальной разрядностью). Для интерфейса или таблиц базы данных это часто бывает нежелательно.
Чтобы задать длину строки или точность числа, необходимо передавать специальные квалификаторы в последующие параметры конструктора:
ПараметрыСтроки = Новый КвалификаторыСтроки(50);
ПараметрыЧисла = Новый КвалификаторыЧисла(15, 2);
// Создаем составной тип из числа и строки с заданными ограничениями
СоставнойТип = Новый ОписаниеТипов("Строка, Число", ПараметрыЧисла, ПараметрыСтроки);
Проанализируем ситуацию с составными типами. Если вы перечисляете в строке несколько типов (создаете составной тип), платформа 1С автоматически добавляет в область допустимых значений тип Неопределено. Это критически важная особенность, которую необходимо учитывать, например, при проверке заполненности реквизита. Значение такого поля может быть равно Неопределено, даже если вы явно не указывали его при формировании списка типов.
В современных типовых конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), рекомендуется использовать готовые программные интерфейсы. Это делает код чище и безопаснее.
Рассмотрим примеры таких функций из модуля ОбщегоНазначения:
ОбщегоНазначения.ОписаниеТипаСтрока(100) — быстрое создание типа "Строка" с длиной 100 символов.ОбщегоНазначения.ОписаниеТипаЧисло(15, 2) — создание числового типа с нужной разрядностью.ОбщегоНазначения.ОписаниеТипаВсеСсылки() — полезная функция, если требуется описать тип, включающий ссылки на все объекты базы данных.Применяя эти функции, вы избавляете себя от необходимости вручную формировать строки, инициализировать квалификаторы и снижаете риск опечаток, как в случае с лишними кавычками.
Иногда требуется не создать ОписаниеТипов с нуля из строки, а дополнить уже имеющееся. В 1С есть альтернативный вариант конструктора, который позволяет создать новое описание на основе другого, добавив к нему новые типы или исключив ненужные.
СуществующиеТипы = Элементы.СамОбъект.ОграничениеТипа;
ДобавляемыеТипы = "ДокументСсылка.РеализацияТоваровУслуг";
// Формируем новое описание, объединяя старые типы с новыми
НовоеОграничение = Новый ОписаниеТипов(СуществующиеТипы, ДобавляемыеТипы);
Элементы.СамОбъект.ОграничениеТипа = НовоеОграничение;
Такой подход незаменим, когда тип колонки или реквизита собирается алгоритмически, и вам нужно постепенно расширять доступные для выбора варианты.