При программной настройке интерфейса управляемой формы разработчики часто сталкиваются с ошибкой «Недопустимое значение параметров» при вызове метода Элементы.Добавить(). Рассмотрим подробно, почему возникает эта проблема, как правильно генерировать группы элементов на управляемой форме и как решить сопутствующую задачу по динамическому выводу изображений.
Разберем ситуацию, когда в коде вызывается добавление элемента формы со следующим синтаксисом:
ГруппаДляКнопок = Элементы.Добавить("ГруппаДляКнопок" + Строка(КоличествоГрупп), Тип("ОбычнаяГруппаФормы"), РодительскаяГруппа);
При выполнении данной строки платформа 1С:Предприятие генерирует исключение. Выясним причину этого поведения:
ОбычнаяГруппаФормы. Все контейнеры формы (обычные группы, страницы, панель страниц, командные панели) описываются универсальным типом ГруппаФормы.Вид, которому присваивается значение системного перечисления ВидГруппыФормы (например, ВидГруппыФормы.ОбычнаяГруппа или ВидГруппыФормы.Страницы).Строка() или СокрЛП().Рассмотрим правильный алгоритм программного создания обычной группы на управляемой форме:
Элементы.Добавить() укажем в качестве второго параметра универсальный тип Тип("ГруппаФормы").Вид.Посмотрим на исправленный и рабочий вариант кода:
ИмяНовойГруппы = "ГруппаДляКнопок" + СокрЛП(Строка(КоличествоГрупп));
ГруппаДляКнопок = Элементы.Добавить(ИмяНовойГруппы, Тип("ГруппаФормы"), Элементы.ГруппаПодборКнопки);
ГруппаДляКнопок.Вид = ВидГруппыФормы.ОбычнаяГруппа;
Таким образом, группа создается корректно, и платформа не выдает ошибку о недопустимых параметрах.
Проанализируем следующую задачу, которая часто возникает при создании динамических интерфейсов подбора: как отобразить картинку товара на кнопке или отдельном элементе управляемой формы?
Платформа 1С накладывает ограничение: свойство Картинка у объектов КнопкаФормы и КомандаФормы может принимать только предопределенные изображения из библиотеки картинки конфигурации (БиблиотекаКартинок). Назначить произвольную картинку из файла или хранилища напрямую объекту кнопки нельзя.
Для обхода данного ограничения разберем вариант с программным созданием реквизита и элемента с видом ПолеКартинки.
Чтобы вывести динамическое изображение (например, фото номенклатуры), разберем следующий алгоритм:
Строка, который будет хранить навигационную ссылку или адрес во временном хранилище.ИзменитьРеквизиты() для добавления реквизита в контекст формы.ПолеФормы с видом ВидПоляФормы.ПолеКартинки и связываем его с созданным реквизитом через свойство ПутьКДанным.Рассмотрим пример реализации:
// 1. Формируем имя и описание нового реквизита
ИмяРеквизита = "АдресКартинки_" + СокрЛП(КодТовара);
РеквизитКнопки = Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("Строка"));
// 2. Добавляем реквизит в состав реквизитов формы
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(РеквизитКнопки);
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// 3. Записываем адрес временного хранилища или навигационную ссылку в реквизит
ЭтаФорма[ИмяРеквизита] = АдресКартинкиВоВременномХранилище;
// 4. Создаем элемент поля картинки на форме
ИзображениеКнопки = Элементы.Добавить("ИзображениеТовара_" + СокрЛП(КодТовара), Тип("ПолеФормы"), ГруппаКнопки);
ИзображениеКнопки.Вид = ВидПоляФормы.ПолеКартинки;
ИзображениеКнопки.ПутьКДанным = ИмяРеквизита;
// 5. Настраиваем поведение поля под кнопку
ИзображениеКнопки.Гиперссылка = Истина;
ИзображениеКнопки.УстановитьДействие("Нажатие", "ИзображениеТовараНажатие");
Обратим внимание на важные технические нюансы при массовом создании элементов:
ИзменитьРеквизиты() вызывает пересчет и перестройку структуры формы на сервере. Вызывать этот метод внутри цикла для каждого товара крайне не рекомендуется. Сформируйте полный массив всех новых реквизитов и передайте его в метод ИзменитьРеквизиты() один раз за вызов.ТаблицаФормы со столбцом ПолеКартинки или поле с видом ПолеHTMLДокумента, сформировав верстку плитки товаров на HTML и CSS.