Как программно создать динамический список на управляемой форме в 1С?

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

В процессе разработки конфигураций и адаптации типовых решений на управляемых формах нередко возникает необходимость добавить динамический список программно, без изменения метаданных самой формы в конфигураторе. Разберем по шагам, как правильно реализовать эту задачу в обработчике ПриСозданииНаСервере, а также проанализируем типичные ошибки, с которыми сталкиваются разработчики при обращении к реквизитам, создании колонок и передаче параметров в запрос.

Типичные ошибки при создании динамического списка

Посмотрим на ошибки, возникающие при первых попытках программного добавления списка:

  1. Ошибка «Поле объекта не обнаружено (ТекстЗапроса)». Разработчик пытается установить текст запроса напрямую объекту РеквизитФормы. Объект РеквизитФормы служит только описанием для метода ИзменитьРеквизиты(). Сам динамический список появляется в контексте формы как реквизит только после применения изменений, и обращаться к нему нужно через ЭтаФорма["ИмяРеквизита"] или ЭтаФорма.ИмяРеквизита.
  2. Ошибка «Ошибка при установке значения атрибута контекста (ПутьКДанным): Недопустимое значение». Такая ошибка возникает при связывании созданной колонки таблицы с полем динамического списка. Главная причина — синтаксическая ошибка в тексте запроса динамического списка (например, пропущенная запятая между выбираемыми полями) либо опечатка в имени поля. Если запрос не компилируется платформой, список полей не создается, и платформа считает указанный путь к данным некорректным.
  3. Ошибка «Поле объекта не обнаружено (ИмяПараметра)» при передаче параметров. Коллекция Параметры у динамического списка не поддерживает прямое обращение к именам параметров через точку как к свойствам. Передавать значения необходимо только через специализированный метод.

Пошаговый алгоритм программного создания динамического списка

Разберем процесс построения таблицы динамического списка на форме с нуля. Весь код выполняется на сервере, как правило, в обработчике ПриСозданииНаСервере.

Шаг 1. Создание реквизита формы типа «ДинамическийСписок».

Сначала сформируем описание нового реквизита формы и применим изменения через метод ИзменитьРеквизиты():


МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ДинамическийСписок"));

РеквизитСписка = Новый РеквизитФормы(
    "СписокПроводок", 
    Новый ОписаниеТипов(МассивТипов), 
    , 
    "Список проводок", 
    Истина
);

ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(РеквизитСписка);

ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Шаг 2. Настройка свойств динамического списка и текста запроса.

После вызова ИзменитьРеквизиты() мы можем обращаться к динамическому списку через контекст формы. На этом этапе настраиваем признак произвольного запроса, передаем текст и задаем параметры:


ДинамическийСписокОбъект = ЭтаФорма["СписокПроводок"];

ДинамическийСписокОбъект.ПроизвольныйЗапрос = Истина;
ДинамическийСписокОбъект.ТекстЗапроса = 
"ВЫБРАТЬ
|   Хозрасчетный.СчетДт КАК СчетДт,
|   Хозрасчетный.СчетКт КАК СчетКт,
|   Хозрасчетный.Организация КАК Организация,
|   Хозрасчетный.Сумма КАК Сумма,
|   Хозрасчетный.Содержание КАК Содержание
|ИЗ
|   РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
|   Хозрасчетный.Регистратор = &Регистратор";

// Передача параметра через специализированный метод
ДинамическийСписокОбъект.Параметры.УстановитьЗначениеПараметра("Регистратор", ДокументСсылка);

Шаг 3. Создание визуального элемента таблицы на форме.

Теперь создадим визуальный элемент интерфейса — таблицу формы, и свяжем ее путь к данным с ранее добавленным реквизитом:


ТаблицаФормы = ЭтаФорма.Элементы.Добавить("ТаблицаПроводок", Тип("ТаблицаФормы"), ЭтаФорма);
ТаблицаФормы.ПутьКДанным = "СписокПроводок";
ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Верх;

Шаг 4. Добавление колонок таблицы.

Для отображения данных необходимо добавить подчиненные элементы типа ПолеФормы внутрь созданной таблицы. Для каждого поля обязательно указываем его вид и корректный путь к данным в формате ИмяРеквизита.ИмяПоляВЗапросе:


// Колонка "СчетДт"
КолонкаСчетДт = ЭтаФорма.Элементы.Добавить("КолонкаСчетДт", Тип("ПолеФормы"), ТаблицаФормы);
КолонкаСчетДт.Вид = ВидПоляФормы.ПолеНадписи;
КолонкаСчетДт.ПутьКДанным = "СписокПроводок.СчетДт";
КолонкаСчетДт.Заголовок = "Счет Дт";

// Колонка "СчетКт"
КолонкаСчетКт = ЭтаФорма.Элементы.Добавить("КолонкаСчетКт", Тип("ПолеФормы"), ТаблицаФормы);
КолонкаСчетКт.Вид = ВидПоляФормы.ПолеНадписи;
КолонкаСчетКт.ПутьКДанным = "СписокПроводок.СчетКт";
КолонкаСчетКт.Заголовок = "Счет Кт";

// Колонка "Сумма"
КолонкаСумма = ЭтаФорма.Элементы.Добавить("КолонкаСумма", Тип("ПолеФормы"), ТаблицаФормы);
КолонкаСумма.Вид = ВидПоляФормы.ПолеВвода;
КолонкаСумма.ПутьКДанным = "СписокПроводок.Сумма";
КолонкаСумма.Заголовок = "Сумма проводки";

Особенности и нюансы работы с программными списками

Разберем важные архитектурные аспекты, на которые следует обратить внимание при программном создании списков:

  1. Установка свойства ОсновнаяТаблица. Если динамический список отображает данные одного справочника или документа, рекомендуется явно заполнить свойство ОсновнаяТаблица (например, ДинамическийСписокОбъект.ОсновнаяТаблица = "Справочник.Номенклатура";). Это позволит платформе включить динамическое считывание данных порциями и активирует стандартные функции открытия формы объекта.
  2. Ключевые поля в произвольных запросах. Если список строится на базе сложного запроса без основной таблицы, для корректной навигации и выбора строк платформе необходим ключ. Для этого используются свойства ВидКлюча и КлючевыеПоля динамического списка.
  3. Производительность. Вызов ИзменитьРеквизиты() приводит к полной переинициализации контекста формы, что может существенно замедлять ее открытие при частом использовании. Если есть возможность, предпочтительнее реализовывать визуальные доработки через механизм расширений конфигурации или размещать скрытые элементы в конфигураторе заранее, управляя ими через свойство Видимость.
← На главную