Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором? 17
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (!!! не путать с реквизитом справочника !!!) с типом » ДинамическийСписок» В поле » Основная табли Поле выбора ~ Заполнение списка значений в элементе поле выбора на форме 10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип — Произвольный, Использование — Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Форма ~ Программное создание таблицы значений с условным оформлением 9
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Как обновить динамический список или реквизит на форме клиента? 9
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Поле выбора ~ Как ограничить список выбора? 7
Ограничим список элементов, установив отбор в открываемой форме //Пример 1 Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка) ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент); ЭлементОтбораВидПДР = Форма Посмотреть все в категории Работа с Формой (Диалог) и её элементами
Например, поставлена задача, чтобы в форме списка справочника «Номенклатура» присутствовала колонка «Остаток», отображающая остаток каждой номенклатуры на текущую дату. Для упрощения примера остатки у нас будут хранится в регистре накопления только с одним измерением «Номенклатура» и с 1 ресурсом «Количество».
Решение.
В форме списка справочника «Номенклатура» добавляем колонку с названием «Остаток». В событии табличного поля справочника списка ПриПолученииДанных прописываем следующий код:
Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок)
СоответствиеНоменклатуры = Новый Соответствие;
ОтображаемыеТовары = Новый Массив;
// заполняем массив и соответствие только теми строками, которые отображаются на текущий момент, при этом отсеиваем строки с группами номенклатуры
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Если ОформлениеСтроки.ДанныеСтроки.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Товар = ОформлениеСтроки.ДанныеСтроки.Ссылка;
ОтображаемыеТовары.Добавить(Товар);
СоответствиеНоменклатуры.Вставить(Товар, ОформлениеСтроки);
КонецЦикла;
// получаем из регистра остатки на текущую дату для товаров из соответствия и заполняем ими колонку «Остаток»
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ РАЗЛИЧНЫЕ
|ОстаткиТМЦОстатки.Номенклатура,
|ОстаткиТМЦОстатки.КоличествоОстаток
|ИЗ
|РегистрНакопления.ОстаткиТМЦ.Остатки(&ТекДата, Номенклатура В (&Номенклатура)) КАК ОстаткиТМЦОстатки»;
Запрос.УстановитьПараметр(«Номенклатура», ОтображаемыеТовары);
Запрос.УстановитьПараметр(«ТекДата»,ТекущаяДата());
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаДляОформления = СоответствиеНоменклатуры.Получить(Выборка.Номенклатура);
СтрокаДляОформления.Ячейки.Остаток.Значение = Выборка.КоличествоОстаток;
КонецЦикла;
КонецПроцедуры
1С:Предприятие 8.2 /
Разработчикам /
Разработка пользовательских интерфейсов
См. также
1. Платформа 1С:Предприятиепо умолчанию обновляет содержимое динамических списков при выполнении пользователем стандартных команд по изменению элементов этого списка (Записать, Провести, Пометить на удаление и т.п.) и при добавлении новых элементов. Но в ряде ниже перечисленных случаев такое обновление следует предусмотреть явно в прикладном коде.
2. Команды, которые изменяют объекты и размещаются в форме списка, должны заботиться об обновлении списка объектов после своего выполнения. Например, после изменения одного объекта рекомендуется вызывать метод ОповеститьОбИзменении:
&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ОбъектСсылка = ПараметрКоманды; // Меняем объект // … ОповеститьОбИзменении(ОбъектСсылка); КонецПроцедуры
При изменении нескольких объектов целесообразно обновлять список однократно, в конце операции:
&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Для Каждого ОбъектСсылка Из ПараметрКоманды Цикл // Меняем объект // … КонецЦикла; ОповеститьОбИзменении(ТипЗнч(ПараметрКоманды)); КонецПроцедуры
3. Также должно быть обеспечено обновление данных в динамическом списке, у которого не назначена основная таблица. Такие динамические списки могут отображать данные из нескольких таблиц.
3.1 Если данные добавляются или изменяются командой, расположенной в форме динамического списка, то необходимо обновить список явно после выполнения команды.
3.2 Если данные изменяются в какой-либо другой форме (например, в форме объекта), то необходимо организовать обновление списка через оповещение. Для этого в каждой форме объекта, данные которого выводятся в динамическом списке, следует реализовать обработчик события ПослеЗаписи с использованием метода Оповестить:
Оповестить («Запись_», ПараметрыОповещения, ОбъектСсылка);
где
- Запись_<ИмяОбъекта> — имя события, в котором <ИмяОбъекта> — имя объекта, как оно задано в метаданных. Например, для документа «Расходная накладная» имя события будет «Запись_РасходнаяНакладная».
- ПараметрыОповещения – как правило, это параметр события ПослеЗаписи формы объекта. Состав свойств структуры может быть расширен исходя из потребностей прикладной логики.
- ОбъектСсылка – ссылка на записываемый объект.
Пример:
&НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Оповестить(«Запись_РасходнаяНакладная», ПараметрыЗаписи, Объект.Ссылка); КонецПроцедуры
Затем в обработчике событияОповещение в форме динамического списка разместить код по обновлению динамического списка вида:
&НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если Врег(ИмяСобытия) = Врег(«Запись_РасходнаяНакладная») Или Врег(ИмяСобытия) = Врег(«Запись_НакладнаяНаПеремещение») Тогда Элементы.СписокНакладных.Обновить(); КонецЕсли; КонецПроцедуры
При этом имена событий следует проверять явным образом, чтобы исключить неоправданное обновление списка.
См. также
- Особенности реализации команд для форм списков
Другие материалы по теме:
конфигурирование
Статья писалась по итогу выполнения работы, в рамках которой требовалось выводить на форму содержимое различных регистров сведений. Вывод содержимого осуществляется через динамический список.
В статье рассмотрены следующие вопросы:
- Как программно создать реквизит формы с типом динамический список и установить для него произвольный запрос.
- Как программно добавить на форму элемент управления табличное поле, связать его с реквизитом формы и создать необходимые колонки.
- Как программно удалить созданные реквизиты и элементы формы.
Итак, в начале у нас не должно быть реквизитов и элементов формы с тем динамическим списком, который мы планируем создавать.
Сначала, нужно определить событие/команду и процедуру, при выполнении которой будет создаваться динамический список. В нашем случае это будет изменение элемента формы РегистрСведений. В этом элементе пользователь будет выбирать имя регистра сведений, который должен быть отображен в динамическом списке. Создаем процедуру для события ПриИзменении этого элемента:
Процедура РегистрСведенийПриИзменении(Элемент)
//Проверяем, заполнил ли пользователь имя регистра сведений. Если нет, то прерываем процедуру
Если НЕ ЗначениеЗаполнено(Объект.РегистрСведений) Тогда
Возврат;
КонецЕсли;
//Перед созданием нового динамического списка нужно удалить ранее созданный.
//Процедура удаления будет рассмотрена далее
УдалитьЭлементыСписка();
//Создаем новый динамический список.
//Назначение параметров будет описано далее в процедуре СозданиеДинамическогоСписка
СозданиеДинамическогоСписка(«Список», ТекстЗапроса(Объект.РегистрСведений), ПолучитьМассивКолонок(Объект.РегистрСведений), «РегистрСведений.»+Объект.РегистрСведений);
КонецПроцедуры
Для создания динамического списка нам потребуется передать в процедуру несколько параметров. Рассмотрим их.
Во-первых, нужно сформировать текст запроса для динамического списка. Для его формирования нам потребуется имя регистра сведений. В запросе будут выбираться все поля регистра.
Функция ТекстЗапроса (ИмяРС)
Возврат «ВЫБРАТЬ * ИЗ РегистрСведений.»+ИмяРС+» КАК РегистрСведений»;
КонецФункции
Во-вторых, потребуется массив колонок, которые мы хотим вывести на форму. Колонки возьмем из полей регистра сведений. А их в свою очередь получим из метаданных регистра.
&НаСервере
Функция ПолучитьМассивКолонок(ИмяРС)
МассивКолонок = новый массив;
Для каждого Измерение из Метаданные.РегистрыСведений.Измерения Цикл
МассивКолонок.Добавить(Измерение.Имя);
КонецЦикла;
Для каждого Ресурс из Метаданные.РегистрыСведений.Ресурсы Цикл
МассивКолонок.Добавить(Ресурс.Имя);
КонецЦикла;
Для каждого Реквизит из Метаданные.РегистрыСведений.Реквизиты Цикл
МассивКолонок.Добавить(Реквизит.Имя);
КонецЦикла;
Возврат МассивКолонок;
КонецФункции
Теперь можно приступить к созданию динамического списка и выводу его на форму. Добавлять реквизиты и элементы формы можно только на сервере.
&НаСервере
Процедура СозданиеДинамическогоСписка(
ИмяСписка, //Имя элемента динамического списка на форме и реквизита
ТекстЗапроса, //Текст произвольного запроса для динамического списка
МассивКолонок, //Массив имен колонок табличного поля с динамическим списком
ТаблицаСписка, //Имя основной таблицы динамического списка
ПараметрыЗапроса = Неопределено)//тип структура — содержит перечень параметров, если они используются в запросе.
//Создаем реквизит формы с типом ДинамическийСписок и преданным в процедуру именем
ТипыРеквизита = Новый Массив;
ТипыРеквизита.Добавить(Тип(«ДинамическийСписок»));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
ДинамическийСписок = Новый РеквизитФормы(ИмяСписка, ОписаниеТиповДляРеквизита,,»»,ЛОЖЬ);
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//Задаем свойства реквизита
РеквизитДинамическийСписок = ЭтаФорма; //Имя реквизита
РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
//Заполняем параметры если они были указаны
Если ПараметрыЗапроса <> Неопределено Тогда
Для Каждого Параметра из ПараметрыЗапроса Цикл
РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
КонецЦикла;
КонецЕсли;
//Размещаем реквизит на форме
ТаблицаФормы = Элементы.Вставить(ИмяСписка,Тип(«ТаблицаФормы»));
ТаблицаФормы.ПутьКДанным = ИмяСписка; //Имя реквизита
//Создание колонок из переданного массива колонок
Для Каждого ИмяКолонки Из МассивКолонок Цикл
НоваяКолонкаТаблицы = Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип(«ПолеФормы»), ТаблицаФормы);
НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + «.» + ИмяКолонки;
КонецЦикла;
КонецПроцедуры
Данная процедура использует произвольные запросы в динамическом списке. Если это не требуется, процедуру можно модифицировать.
Перед тем, как создавать новый динамический список нужно попытаться удалить уже существующий (если пользователь его ранее создал). Иначе возникнет ошибка при создании. Рассмотрим процедуру удаления. Она тоже должна выполняться на сервере. Удаление оборачиваем в оператор Попытка, т.к. удаляемого реквизита и элемента формы может не существовать.
При использовании процедуры удаления реквизитов и элементов формы нужно учитывать, что удалить можно только реквизиты и элементы, созданные программно.
&НаСервере
Процедура УдалитьЭлементыСписка()
Попытка
Элементы.Удалить(Элементы.Список);
МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить(«Список»);
ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);
Исключение
КонецПопытки;
КонецПроцедуры