В одной из предыдущих статей, мы говорили о программной модификации форм. Но я оставил в стороне момент с программной модификацией динамических списков, так как он немного выбивается из общей концепции модификации форм.
Самое главное в динамическом списке – это то, что источником данных для него является база данных. Другими словами платформа частями (как бы динамически) считывает данные из базы данных и выводит данные в пользовательский интерфейс.
Давайте попробуем решить эту задачу на примере демонстрационной базы УНФ 3.0
Шаг №1. Программное создание динамического списка.
Начнем с того, что прежде чем выводить динамический список на форму, нужно создать его как реквизит формы. Для этого будем описывать код в событии ПриСозданииНаСервере
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// Опишем тип данных для динамического списка МассивТиповДинамическогоСписка = Новый Массив; МассивТиповДинамическогоСписка.Добавить(Тип("ДинамическийСписок")); ОписаниеТиповДинамическогоСписка = Новый ОписаниеТипов(МассивТиповДинамическогоСписка); // Добавим реквизит МассивДобавляемыхРеквизитов = Новый Массив; МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("РеквизитСписокНоменклатура", // Имя ОписаниеТиповДинамическогоСписка, // Тип , // Путь "Список номенклатура", // Заголовок Ложь)); // Сохраняемые данные ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); // Настроим динамический список РеквизитФормыСписокНоменклатура = ЭтаФорма["РеквизитСписокНоменклатура"]; РеквизитФормыСписокНоменклатура.ТекстЗапроса = "ВЫБРАТЬ | Номенклатура.Наименование КАК Наименование, | Номенклатура.Код КАК Код |ИЗ | Справочник.Номенклатура КАК Номенклатура"; // Назначаем основную таблицу, // если хотим иметь стандартные команды справочника // (добавить, скопировать, пометить на удаление итп) РеквизитФормыСписокНоменклатура.ОсновнаяТаблица = "Справочник.Номенклатура"; |
Шаг №2. Программное добавление динамического списка на форму.
На этом этапе мы просто выводим динамический список на форму. Это ничем не отличается от выведения любого другого реквизита на форму.
1 2 3 4 5 6 7 8 9 10 |
// Вывести динамический список на форму ЭлементДинамическийСписок = Элементы.Добавить("ЭлементСписокНоменклатура", Тип("ТаблицаФормы")); ЭлементДинамическийСписок.ПутьКДанным = "РеквизитСписокНоменклатура"; // Создать колонки и вывести в динамический список НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаНаименование", Тип("ПолеФормы"), ЭлементДинамическийСписок); НоваяКолонкаТаблицы.ПутьКДанным = "РеквизитСписокНоменклатура.Наименование"; НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаКод", Тип("ПолеФормы"), ЭлементДинамическийСписок); НоваяКолонкаТаблицы.ПутьКДанным = "РеквизитСписокНоменклатура.Код"; |
Результат:
Шаг №3. Программная модификация существующего списка
На этом этапе мы понимаем, что источником данных (и колонок) для динамического списка является запрос. Но что, если мы хотим модифицировать уже существующий динамический список.
Для этого нам нужно сделать 2 вещи:
- Переопределить запрос динамического списка
- Вывести недостающие колонки на форму
Давайте представим, что мы хотим вывести актуальные остатки на форму. Начнем с имеющего право на существование, но не очень оптимального варианата.
Вообще выводить остатки в динамические списки таким образом – не очень хорошая идея, особенно на больших базах. Так как при прокрутке будет выполняться большое количество небольших, но достаточно дорогих запросов к базе данных.
Вообще фирма 1С рекомендует выводить остатки для конкретной номенклатуры в отдельном поле в событием ПриАктивизацииСтроки. Хотя, на мой взгляд такой вариант тоже не айс.
Выводим остатки (неоптимальный вариант)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// Модификация существующего динамического списка // ДС - Динамический Список СуществующийДС = ЭтаФорма["РеквизитСписокНоменклатура"]; // ОБРАТИ ВНИМАНИЕ! // |Справочник.Номенклатура КАК СправочникНоменклатура // Приходиться менять псевдоним на СправочникНоменклатура, так как Номенклатура будет неоднозначным полем, // потому, что в регистре есть поле с таким же именем (Номенклатура) СуществующийДС.ТекстЗапроса = "ВЫБРАТЬ | СправочникНоменклатура.Наименование КАК Наименование, | СправочникНоменклатура.Код КАК Код, | ЗапасыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток |ИЗ | Справочник.Номенклатура КАК СправочникНоменклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки КАК ЗапасыНаСкладахОстатки | ПО (СправочникНоменклатура.Ссылка = ЗапасыНаСкладахОстатки.Номенклатура)"; // Получим элемент динамического списка СуществующийЭлементДС = Элементы["ЭлементСписокНоменклатура"]; // Добавим колонку НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаКоличествоОстаток", Тип("ПолеФормы"), СуществующийЭлементДС); НоваяКолонкаТаблицы.ПутьКДанным = "РеквизитСписокНоменклатура.КоличествоОстаток"; |
Выводим остатки (способ получше)
Конкретно в УНФ уменьшили нагрузку на СУБД при помощи записи актуальных остатков в непериодический регистр СВЕДЕНИЙ
Запрос (на уровне СУБД) получатся проще и выполняется существенно быстрее.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Модификация существующего динамического списка // ДС - Динамический Список СуществующийДС = ЭтаФорма["РеквизитСписокНоменклатура"]; // ОБРАТИ ВНИМАНИЕ! // |Справочник.Номенклатура КАК СправочникНоменклатура // Приходиться менять псевдоним на СправочникНоменклатура, так как Номенклатура будет неоднозначным полем, // потому, что в регистре есть поле с таким же именем (Номенклатура) СуществующийДС.ТекстЗапроса = "ВЫБРАТЬ | СправочникНоменклатура.Наименование КАК Наименование, | СправочникНоменклатура.Код КАК Код, | СУММА(ОстаткиТоваров.Количество) КАК Количество |ИЗ | Справочник.Номенклатура КАК СправочникНоменклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОстаткиТоваров КАК ОстаткиТоваров | ПО (ОстаткиТоваров.Номенклатура = СправочникНоменклатура.Ссылка) | |СГРУППИРОВАТЬ ПО | СправочникНоменклатура.Наименование, | СправочникНоменклатура.Код"; // Получим элемент динамического списка СуществующийЭлементДС = Элементы["ЭлементСписокНоменклатура"]; // Добавим колонку НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаКоличествоОстаток", Тип("ПолеФормы"), СуществующийЭлементДС); НоваяКолонкаТаблицы.ПутьКДанным = "РеквизитСписокНоменклатура.Количество" |
Файлы для скачивания
В качестве примера прикладываю обработку в которой полностью программно создается и модифицируется динамический список с номенклатурой на примере конфигурации 1С УНФ 3.0