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