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