Если необходимо получить итог по колонке динамического списка (с учетом отборов), можно воспользоваться следующим “костылем”
Если кто знает альтернативный вариант, сообщите в комментариях…
Поделиться ссылкой:
Похожее
1С 8.3 : Возврат итога по колонке динамического списка : 6 комментариев
Мммм. Круть. А я запрос тупо копировал, выполнял и обрабатывал в модуле. Ты гений
Еще есть проблема которую я не встречал чтоб кто нибудь решил. Нумерация строк в динамическом списке
А в чем сложность?
Там вроде все автоматом работает
Что не получилось?
Так всё не получается. Кидаю на форму динамический список. Произвольный запрос. Выбор * из справочника. Всё, нумерации нет в списке не форме. И как сделать хз
Да, не обратил внимания, в динамическом списке не предусмотрена нумерация в связи с тем, что он может иметь различные виды представления данных, в виде дерева, с группировками и т.д… Поэтому если все же нумерация нужна, и источником динамического списка является произвольный запрос, то достаточно в самом запросе сформировать порядковый номер, но это корректно будет только до тех пор, пока средствами динамического списка Вы не поменяете порядок выводимых данных и не добавите отборы, тогда нумерация ломается.
В конфигурациях на платформе 1С:Предприятие 8.2, ориентированных на использование в режиме управляемого приложения достаточно часто используются динамические списки. Этот объект позволяет выводить в любой управляемой форме данные справочников, документов (и других объектов конфигурации), а также результаты произвольных запросов.
Одна из особенностей динамического списка состоит в том, что как правило, данные в него выводятся порциями (для минимизации трафика между клиентом и сервером). Если в настройках динамического списка установлен флаг “Динамическое считывание данных”, то с сервера клиенту будет передаваться только та часть данных, которая помещается в табличное поле.
В связи с такой особенностью, а возможно и в связи с нецелесообразностью и противоречием клиент-серверным принципам работы, в динамическом списке в отличии от таблицы значений нет стандартной возможности вывода итогов по числовым колонкам. Сегодня я расскажу как можно выйти из положения, если итоги всё-таки нужны.
Решение
Сразу предупрежу, что предложенное ниже решение хотя и является универсальным и наиболее приемлемым для поставленной задачи, все же имеет ряд недостатков (о которых я скажу позже). Поэтому, если есть возможность, то лучше обойтись без использования итогов динамического списка (например сделать отчёт, который будет выводить необходимые пользователю итоги).
За основу для разработки возьмём демо-конфигурацию. Будем добавлять итог по колонке “Сумма долга” динамического списка в форме справочника “Контрагенты” “ФормаСпискаРабочийСтол”. Общая идея состоит в следующем:
- Создадим пустую схему компоновки данных (далее “СКД”) с ресурсом “Сумма долга” для справочника “Контрагенты”.
- Программно скопируем текст запроса из динамического списка в “СКД”
- Программно перенесём отбор, установленный в форме списка в настройки СКД
- Выведем результат компоновки данных в таблицу и отобразим данные на форме
На том как создать СКД подробно останавливаться не буду. Сделать это не сложно. Для этого достаточно добавить для справочника “Контрагенты” новый макет с типом “Схема компоновки данных”. В СКД добавить набора данных “Запрос” (назовём его “Основной”). Текст запроса должен быть, например, таким:
ВЫБРАТЬ 1 КАК СуммаДолга
Вместо значения “1″ в тексте запроса может быть что угодно, этот текст всё равно будет заменён текстом запроса динамического списка. Затем необходимо перенести поле “СуммаДолга” из доступных полей в поля ресурсов на закладке “Ресурсы” (в поле “Выражение” должно быть “Сумма(СуммаДолга)”). И наконец перейдём на закладку “Настройки”, где добавим группировку по пустому полю (она будет называться “ ”) и перенесём поле “СуммаДолга” в выбранные поля.
Теперь добавим в форму списка контрагентов “ФормаСпискаРабочийСтол” таблицу итогов с колонками “Сумма долга” и “Отбор”.
На закладке “Команды” добавим команду “Пересчитать итоги” и разместим кнопку вызова этой команды в панель инструментов таблицы итогов. Ниже приведён текст модуля формы.
// подготовим таблицу и процессор вывода результата СКД в таблицу
Таб = Новый ТаблицаЗначений ;
ПроцессорВыводаВТЗ = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений ;
ПроцессорВыводаВТЗ . УстановитьОбъект ( Таб ) ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ;
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных ;
КомпоновщикНастроек . ЗагрузитьНастройки ( СКД . НастройкиПоУмолчанию ) ;
// загрузим настройки из настроек динамического списка
Для Каждого ЭлементОтбораГП Из Список . Отбор . Элементы Цикл
ЭлементОтбораСКД = КомпоновщикНастроек . Настройки . Отбор . Элементы . Добавить ( Тип ( «ЭлементОтбораКомпоновкиДанных» ) ) ;
ЗаполнитьЗначенияСвойств ( ЭлементОтбораСКД , ЭлементОтбораГП ) ;
КонецЦикла ;
МакетКомпоновки = КомпоновщикМакета . Выполнить ( СКД , КомпоновщикНастроек . Настройки , , , Тип ( «ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений» ) ) ;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновкиДанных . Инициализировать ( МакетКомпоновки ) ;
Таб = ПроцессорВыводаВТЗ . Вывести ( ПроцессорКомпоновкиДанных ) ;
Если Таб . Количество ( ) = 0 Тогда
Возврат Неопределено ;
Иначе
Таб . Колонки . Добавить ( «Отбор» ) ;
ТекстОтбора = Строка ( Список . Отбор ) ;
Таб [ 0 ] . Отбор = ? ( ТекстОтбора = «» , «Отбор не задан» , ТекстОтбора ) ;
СтруктураДанных = Новый Структура ;
Для Каждого Колонка Из Таб . Колонки Цикл
СтруктураДанных . Вставить ( Колонка . Имя , Таб [ 0 ] [ Колонка . Имя ] ) ;
КонецЦикла ;
Возврат СтруктураДанных ;
КонецЕсли ;
КонецФункции
&НаКлиенте
Процедура ПересчитатьИтоги ( Команда )
СтрокаДанных = ИтогиСпискаКонтрагентов ( ) ;
ТаблицаИтогов . Очистить ( ) ;
Если СтрокаДанных > Неопределено Тогда
СтрокаИтогов = ТаблицаИтогов . Добавить ( ) ;
ЗаполнитьЗначенияСвойств ( СтрокаИтогов , СтрокаДанных ) ;
КонецЕсли ;
КонецПроцедуры
Для того чтобы проверить работу примера запустим конфигурацию, установим отбор в форме списка контрагентов на рабочем столе и нажмём на кнопку “Пересчитать итоги”.
Теперь, как и обещал, перечислю недостатки такого решения.
- Необходимо нажимать кнопку “Пересчитать итоги” при любых изменениях в списке.
- Если отбор был изменён или изменилась сумма долга по контрагенту, то данные итогов перестают быть актуальными.
- Отследить изменения отбора невозможно – для этого нет подходящего обработчика событий.
- Если вы воспользовались кнопкой “Найти” панели инструментов динамического списка, то в списке отобразятся только строки, соответствующие условию поиска, но при пересчёте итогов сумма не изменится, так как эти условия не являются отбором.
Статья найдена на просторах интернета
Фараоны рекламировали себя при помощи пирамид
Здравствуйте! Спасибо большое за статью! Сейчас занимаюсь похожей задачей и столкнулся с тем, что, помимо отбора, в списке может быть установлен поиск, который программно считать я не смог. Знаете ли Вы какие-либо способы обхода данной проблемы, кроме запрета поиска?
Надежного способа считать наложенный программный отбор я не смог. Сделал по другому: на форму добавил тестовое поле «Поиск». Там пользователь набирает поиска (плюс можно выбрать поле поиска). Выполняет команду найти и автоматически в отборах динамического списка программно создается отбор. Например, вида:
«Номенклатура.Наименование Содержит «Некоторый текст поиска»».
Ну и соответственно предусмотрена команда удаления поиска.
Таким подходом в динамическом списке можно даже реализовать поиск, аналогичный тому, который был в обычных формах (набираете текст поиска, программа находит первую найденную строку и позиционируется на ней ну и т.д.).
Спасибо! Я пошел в итоге тем же путем — запрет стандартных «поиска», «настройки списка» и «установки интервала» с размещением аналогичных реквизитов на форме и программной их обработкой. В обычной форме было бы намного проще, но нет динамического списка с произвольным запросом.