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

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

В статье рассмотрены следующие вопросы:

  1. Как программно создать реквизит формы с типом динамический список и установить для него произвольный запрос.
  2. Как программно добавить на форму элемент управления табличное поле, связать его с реквизитом формы и создать необходимые колонки.
  3. Как программно удалить созданные реквизиты и элементы формы.

Итак, в начале у нас не должно быть реквизитов и элементов формы с тем динамическим списком, который мы планируем создавать.

Как программно добавить динамический список в 1С

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

Процедура РегистрСведенийПриИзменении(Элемент)

//Проверяем, заполнил ли пользователь имя регистра сведений. Если нет, то прерываем процедуру
Если НЕ ЗначениеЗаполнено(Объект.РегистрСведений) Тогда
Возврат;
КонецЕсли;

//Перед созданием нового динамического списка нужно удалить ранее созданный.
//Процедура удаления будет рассмотрена далее
УдалитьЭлементыСписка();

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

КонецПроцедуры

Для создания динамического списка нам потребуется передать в процедуру несколько параметров. Рассмотрим их.

Во-первых, нужно сформировать текст запроса для динамического списка. Для его формирования нам потребуется имя регистра сведений. В запросе будут выбираться все поля регистра.

Функция ТекстЗапроса (ИмяРС)

Возврат "ВЫБРАТЬ * ИЗ РегистрСведений."+ИмяРС+" КАК РегистрСведений";

КонецФункции

Во-вторых, потребуется массив колонок, которые мы хотим вывести на форму. Колонки возьмем из полей регистра сведений. А их в свою очередь получим из метаданных регистра.

&НаСервере
Функция ПолучитьМассивКолонок(ИмяРС)

МассивКолонок = новый массив;

Для каждого Измерение из Метаданные.РегистрыСведений[ИмяРС].Измерения Цикл
МассивКолонок.Добавить(Измерение.Имя);
КонецЦикла;

Для каждого Ресурс из Метаданные.РегистрыСведений[ИмяРС].Ресурсы Цикл
МассивКолонок.Добавить(Ресурс.Имя);
КонецЦикла;

Для каждого Реквизит из Метаданные.РегистрыСведений[ИмяРС].Реквизиты Цикл
МассивКолонок.Добавить(Реквизит.Имя);
КонецЦикла;

Возврат МассивКолонок;

КонецФункции

Теперь можно приступить к созданию динамического списка и выводу его на форму. Добавлять реквизиты и элементы формы можно только на сервере.

&НаСервере
Процедура СозданиеДинамическогоСписка(
ИмяСписка, //Имя элемента динамического списка на форме и реквизита
ТекстЗапроса, //Текст произвольного запроса для динамического списка
МассивКолонок, //Массив имен колонок табличного поля с динамическим списком
ТаблицаСписка, //Имя основной таблицы динамического списка
ПараметрыЗапроса = Неопределено)//тип структура - содержит перечень параметров, если они используются в запросе.

//Создаем реквизит формы с типом ДинамическийСписок и преданным в процедуру именем
ТипыРеквизита = Новый Массив;
ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
ДинамическийСписок = Новый РеквизитФормы(ИмяСписка, ОписаниеТиповДляРеквизита,,"",ЛОЖЬ);
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);

//Задаем свойства реквизита
РеквизитДинамическийСписок = ЭтаФорма[ИмяСписка]; //Имя реквизита
РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;

//Заполняем параметры если они были указаны
Если ПараметрыЗапроса <> Неопределено Тогда
Для Каждого Параметра из ПараметрыЗапроса Цикл
РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
КонецЦикла;
КонецЕсли;

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

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

КонецПроцедуры

Данная процедура использует произвольные запросы в динамическом списке. Если это не требуется, процедуру можно модифицировать.

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

При использовании процедуры удаления реквизитов и элементов формы нужно учитывать, что удалить можно только реквизиты и элементы, созданные программно.

&НаСервере
Процедура УдалитьЭлементыСписка()

Попытка

Элементы.Удалить(Элементы.Список);
МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить("Список");
ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);

Исключение
КонецПопытки;

КонецПроцедуры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

15 + 1 =