Итоговая сумма в формах с динамическими списками и программный вывод в эти же формы доп. реквизитов.
Итоговая сумма в формах с динамическими списками с учетом текущего отбора. И программный вывод в этиже формы доп. реквизитов.
- Описание
- Подробнее
Описание
Данная статья является продолжением и развитием этой статьи: //sale.itcity.ru/public/58224/
Данная доработка актуальна для динамических списков!
Возникла необходимость посчитать итоговые суммы в динамических списках (список документов, список справочников). Так как подсчет итогов «на лету» в больших списках довольно тормозное решение (сильно влияет на производительность системы), то повесил это все на кнопку. При этом была задача минимум изменений, для удобства дальнейшего сопровождения (обновления).
Итого добавлено 7 строчек в «ФормаСписка» объекта и добавлен новый общий модуль. И по желанию можно добавить новую Общую картинку.
Новые Общий модуль и Общая картинка на обновления не влияют, а код в форме списка всегда легко вернуть, если затерся обновлением.
Комментариями по передаваемым параметрам процедуры снабжены.
Итак в форму списка добавляем нижеследующий код:
Процедура Ледокол_ДобавитьЭлементыВФормуСписка_ПересчитатьИтоги()
Ледокол_ПоПодпискамНаСобытия.Ледокол_ВывестиИтогиСписка(Новый Структура(«СуммаДокумента»), Сред(СокрЛП(ЭтаФорма.ДокументСписок),Найти(СокрЛП(ЭтаФорма.ДокументСписок), «.»)+1), ДокументСписок, ЭтаФорма);
КонецПроцедуры
Процедура Ледокол_ДобавитьЭлементыВФормуСписка_Итоги()
Ледокол_ПоПодпискамНаСобытия.Ледокол_ПоказатьСкрытьПересчитатьИтоги(ЭтаФорма, ЭтаФорма.ДокументСписок, ЭлементыФормы.ДействияФормы, Новый Структура(«СуммаДокумента»));
КонецПроцедуры
Процедура ПриОткрытии()
Ледокол_ПоПодпискамНаСобытия.Ледокол_ПередОткрытииФормыСписка(ЭтаФорма, ЭлементыФормы.ДействияФормы, Истина, Сред(СокрЛП(ЭтаФорма.ДокументСписок),Найти(СокрЛП(ЭтаФорма.ДокументСписок), «.»)+1), «ДокументСписок»);
КонецПроцедуры
Внимание! Процедура ПриОткрытии() должна быть связана с соответствующим событием формы. В обращении к процедуре Ледокол_ПоПодпискамНаСобытия.Ледокол_ВывестиИтогиСписка( в первый параметр и в обращении к процедуре Ледокол_ПоПодпискамНаСобытия.Ледокол_ПоказатьСкрытьПересчитатьИтоги( в последний параметр: Новый Структура(«СуммаДокумента»),можно включать несколько реквизитов которые необходимо просуммировать через запятую, например:
Новый Структура(«СуммаДокумента,НДСПоДокументу,ЕщеКакойТоРеквизит»)
Если реквизит имеет тип «Число» то по нему рассчитаются итоги в подвале.
Новый общий модуль « Ледокол_ПоПодпискамНаСобытия» (если не брать из cf-ника то вот его параметры):
Глобальный = ложь
Клиент = Истина
Внешнее содинение = Истина
Привилегированный = Ложь
Текс модуля:
//
//ВыводимыйРеквизит — структура с заполненным свойством — ревизиты
//ТипДокумента — строка с именем типа документа, например «ПриходнаяНакладная»
//ИсточникСписок — ДокументСписок или СправочникСписок
//ТекФорма — Форма
Процедура Ледокол_ВывестиИтогиСписка(ВыводимыйРеквизит, ТипДокумента, ИсточникСписок, ТекФорма) Экспорт
#Если Клиент Тогда
ПостроительЗапроса = Новый ПостроительЗапроса;
спВыводимыйРеквизит = Новый СписокЗначений;
Для Каждого Стр Из ВыводимыйРеквизит Цикл
Если ТекФорма.ЭлементыФормы.ДокументСписок.Колонки.Найти(Стр.Ключ) = Неопределено Тогда
Продолжить;
КонецЕсли;
спВыводимыйРеквизит.Добавить(Стр.Ключ);
КонецЦикла;
ТекстПостроителя = «ВЫБРАТЬ
|»;
Для Индекс = 0 По спВыводимыйРеквизит.Количество()-1 Цикл
ТекстПостроителя = ТекстПостроителя + » КассовоеПоступление.» + СокрЛП(спВыводимыйРеквизит[Индекс]) + » КАК » + СокрЛП(спВыводимыйРеквизит[Индекс]) + » «;
Если спВыводимыйРеквизит.Количество()-1 <> Индекс Тогда
ТекстПостроителя = ТекстПостроителя + «,»;
КонецЕсли;
КонецЦикла;
ТекстПостроителя = ТекстПостроителя + «
| ИЗ Документ.КассовоеПоступление КАК КассовоеПоступление
|ГДЕ
| КассовоеПоступление.Проведен = ИСТИНА
|»;
ТекстПостроителя = СтрЗаменить(ТекстПостроителя, «КассовоеПоступление», ТипДокумента);
ПостроительЗапроса.Текст = ТекстПостроителя;
ОписаниеИсточникаДанных= Новый ОписаниеИсточникаДанных(ИсточникСписок);
ПостроительЗапроса.ИсточникДанных = ОписаниеИсточникаДанных;
ПостроительЗапроса.Выполнить();
Если НЕ ТекФорма.ЭлементыФормы.ДокументСписок.Подвал Тогда
ТекФорма.ЭлементыФормы.ДокументСписок.Подвал = Истина;
КонецЕсли;
тз = ПостроительЗапроса.Результат.Выгрузить();
Для Индекс = 0 По спВыводимыйРеквизит.Количество()-1 Цикл
СуммаПоТЗ = Формат(тз.Итог(СокрЛП(спВыводимыйРеквизит[Индекс])), «ЧЦ=14; ЧДЦ=2»);
ТекФорма.ЭлементыФормы.ДокументСписок.Колонки[СокрЛП(спВыводимыйРеквизит[Индекс])].ТекстПодвала = СокрЛП(СуммаПоТЗ);
КонецЦикла;
#КонецЕсли
КонецПроцедуры
// Процедура вызывается обработчиком обновляющий элементы формы списка
//ТекФорма — Форма
//ИсточникСписок — ДокументСписок или СправочникСписок
//КоманднаяПанель — КоманднаяПанель на форме куда добавляются кнопки
//ИтоговыеПоля — структура с заполненным свойством — ревизиты
Процедура Ледокол_ПоказатьСкрытьПересчитатьИтоги(ТекФорма, ИсточникСписок, КоманднаяПанель, ИтоговыеПоля) Экспорт
#Если Клиент Тогда
КнопкаЛедоколКнопкаИтоги = КоманднаяПанель.Кнопки.ЛедоколКнопкаИтоги;
Если КнопкаЛедоколКнопкаИтоги.Пометка Тогда
КнопкаЛедоколКнопкаИтоги.Пометка = Ложь;
Кнопки = КоманднаяПанель.Кнопки;
Кнопки.Удалить(Кнопки.ЛедоколКнопкаПересчитатьИтоги);
ТекФорма.ЭлементыФормы.ДокументСписок.Подвал = Ложь;
Иначе
КнопкаЛедоколКнопкаИтоги.Пометка = Истина;
ЭлементыФормы = ТекФорма.ЭлементыФормы;
ДействиеЛедоколКнопкаДопСвойства = Новый Действие(«Ледокол_ДобавитьЭлементыВФормуСписка_ПересчитатьИтоги»);
КнопкаЛедоколКнопкаИтоги = КоманднаяПанель.Кнопки.Добавить(«ЛедоколКнопкаПересчитатьИтоги», ТипКнопкиКоманднойПанели.Действие, «Пересчитать», ДействиеЛедоколКнопкаДопСвойства);
КнопкаЛедоколКнопкаИтоги.Отображение = ОтображениеКнопкиКоманднойПанели.НадписьКартинка;
Попытка
КнопкаЛедоколКнопкаИтоги.Картинка = БиблиотекаКартинок.Ледокол_ОбновитьИтогиСписка;
Исключение
КнопкаЛедоколКнопкаИтоги.Отображение = ОтображениеКнопкиКоманднойПанели.Надпись;
КонецПопытки;
КнопкаЛедоколКнопкаИтоги.Пояснение = «Пересчитать итоги списка»;
КнопкаЛедоколКнопкаИтоги.Подсказка = «Пересчитать итоги списка»;
Ледокол_ПоПодпискамНаСобытия.Ледокол_ВывестиИтогиСписка(ИтоговыеПоля, Сред(СокрЛП(ТекФорма.ДокументСписок),Найти(СокрЛП(ТекФорма.ДокументСписок), «.»)+1), ИсточникСписок, ТекФорма);
КонецЕсли;
#КонецЕсли
КонецПроцедуры
// Процедура вызывается обработчиком обновляющий элементы формы списка
//ФормаИсточник — форма
//КоманднаяПанель — КоманднаяПанель на форме куда добавляются кнопки
//ПоказатьИтоги — признак отображения итогов
//ИмяДокумента — строка, например «ПриходнаяНакладная»
//ВидСписка — строка, имеет два значения «ДокументСписок» или «СправочникСписок»
Процедура Ледокол_ПередОткрытииФормыСписка(ФормаИсточник, КоманднаяПанель = Неопределено, ПоказатьИтоги = Ложь, ИмяДокумента = Неопределено, ВидСписка = Неопределено) Экспорт
#Если Клиент Тогда
Если (ПоказатьИтоги) И (НЕ КоманднаяПанель = Неопределено) Тогда
ЭлементыФормы = ФормаИсточник.ЭлементыФормы;
КоманднаяПанель.Кнопки.Добавить();
ДействиеЛедоколКнопкаДопСвойства = Новый Действие(«Ледокол_ДобавитьЭлементыВФормуСписка_Итоги»);
КнопкаЛедоколКнопкаИтоги = КоманднаяПанель.Кнопки.Добавить(«ЛедоколКнопкаИтоги», ТипКнопкиКоманднойПанели.Действие, «Итоги», ДействиеЛедоколКнопкаДопСвойства);
КнопкаЛедоколКнопкаИтоги.Отображение = ОтображениеКнопкиКоманднойПанели.Надпись;
КнопкаЛедоколКнопкаИтоги.Пояснение = «Показать (скрыть) итоги списка»;
КнопкаЛедоколКнопкаИтоги.Подсказка = «Показать (скрыть) итоги списка»;
КонецЕсли;
Если НЕ ИмяДокумента = Неопределено Тогда
Для Каждого Реквизит Из Метаданные.Документы[ИмяДокумента].Реквизиты Цикл
Если Лев(Реквизит.Имя,8) = «Ледокол_» Тогда
Список = ФормаИсточник.ЭлементыФормы[ВидСписка];
Колонка = Список.Колонки.Добавить(Реквизит.Имя, Реквизит.Синоним);
Колонка.Данные = Реквизит.Имя;
КонецЕсли;
КонецЦикла;
КонецЕсли;
#КонецЕсли
КонецПроцедуры
И еще!!! Данная доработка позволяет выводить в список (ДокументСписок, СправочникСписок) добавленные реквизиты программно. Допустим добавили вы реквизит в документ или справочник в типовой конфигурации, а менять форму списка неохота, то добавляете в название реквизита «Ледокол_» и он программно выведется на форме списка. «Ледокол_» в коде можно заменить на любой другой префикс если понадобится.
В дальнейшем могу выложить статью по работе (программной) с формой документа(справочника) (не формой списка, а формой документа или справочника).
В файле прикреплении будет cf-ник с общим модулем и картинкой и эта статья в Ворде.
Вот собственно и все. Буду рад если кому то пригодится.
А так же рад слышать комментарии(отзывы, замечания, предложения).