Каталог решений - Итоговая сумма в формах с динамическими списками и программный вывод в эти же формы доп. реквизитов.

Итоговая сумма в формах с динамическими списками и программный вывод в эти же формы доп. реквизитов.

Итоговая сумма в формах с динамическими списками и программный вывод в эти же формы доп. реквизитов.

В наличии

Итоговая сумма в формах с динамическими списками с учетом текущего отбора. И программный вывод в этиже формы доп. реквизитов.

Категория:

Описание

 

Данная статья является продолжением и развитием этой статьи: //sale.itcity.ru/public/58224/

Данная доработка актуальна для динамических списков!

 

Возникла необходимость посчитать итоговые суммы в динамических списках (список документов, список справочников). Так как подсчет итогов «на лету» в больших списках довольно тормозное решение (сильно влияет на производительность системы), то повесил это все на кнопку. При этом была задача минимум изменений, для удобства дальнейшего сопровождения (обновления).

Итого добавлено 7 строчек в «ФормаСписка» объекта и добавлен новый общий модуль. И по желанию можно добавить новую Общую картинку.

Новые Общий модуль и Общая картинка на обновления не влияют, а код в форме списка всегда легко вернуть, если затерся обновлением.

Комментариями по передаваемым параметрам процедуры снабжены.

Итак в форму списка добавляем нижеследующий код:

Процедура Ледокол_ДобавитьЭлементыВФормуСписка_ПересчитатьИтоги()
   
Ледокол_ПоПодпискамНаСобытия.Ледокол_ВывестиИтогиСписка(Новый Структура(«СуммаДокумента»), Сред(СокрЛП(ЭтаФорма.ДокументСписок),Найти(СокрЛП(ЭтаФорма.ДокументСписок), «.»)+1), ДокументСписок, ЭтаФорма);
КонецПроцедуры
Процедура
Ледокол_ДобавитьЭлементыВФормуСписка_Итоги()
   
Ледокол_ПоПодпискамНаСобытия.Ледокол_ПоказатьСкрытьПересчитатьИтоги(ЭтаФорма, ЭтаФорма.ДокументСписок, ЭлементыФормы.ДействияФормы, Новый Структура(«СуммаДокумента»));
КонецПроцедуры

Процедура ПриОткрытии()
   
Ледокол_ПоПодпискамНаСобытия.Ледокол_ПередОткрытииФормыСписка(ЭтаФорма, ЭлементыФормы.ДействияФормы, Истина, Сред(СокрЛП(ЭтаФорма.ДокументСписок),Найти(СокрЛП(ЭтаФорма.ДокументСписок), «.»)+1), «ДокументСписок»);
КонецПроцедуры

Внимание! Процедура ПриОткрытии() должна быть связана с соответствующим событием формы. В обращении к процедуре Ледокол_ПоПодпискамНаСобытия.Ледокол_ВывестиИтогиСписка( в первый параметр и в обращении к процедуре Ледокол_ПоПодпискамНаСобытия.Ледокол_ПоказатьСкрытьПересчитатьИтоги( в последний параметр: Новый Структура(«СуммаДокумента»),можно включать несколько реквизитов которые необходимо просуммировать через запятую, например:

Новый Структура(«СуммаДокумента,НДСПоДокументу,ЕщеКакойТоРеквизит»)

Если реквизит имеет тип «Число» то по нему рассчитаются итоги в подвале.

Новый общий модуль « Ледокол_ПоПодпискамНаСобытия» (если не брать из cf-ника то вот его параметры):

Глобальный = ложь

Клиент = Истина

Внешнее содинение = Истина

Привилегированный = Ложь

Текс модуля:

//
//ВыводимыйРеквизит — структура с заполненным свойством — ревизиты
//ТипДокумента — строка с именем типа документа, например «ПриходнаяНакладная»
//ИсточникСписок — ДокументСписок или СправочникСписок
//ТекФорма — Форма
Процедура Ледокол_ВывестиИтогиСписка(ВыводимыйРеквизит, ТипДокумента, ИсточникСписок, ТекФорма) Экспорт
   
#Если Клиент Тогда
   
ПостроительЗапроса = Новый ПостроительЗапроса;
   
спВыводимыйРеквизит = Новый СписокЗначений;
    Для Каждого
Стр Из ВыводимыйРеквизит Цикл
        Если
ТекФорма.ЭлементыФормы.ДокументСписок.Колонки.Найти(Стр.Ключ) = Неопределено Тогда
            Продолжить;
        КонецЕсли;
       
спВыводимыйРеквизит.Добавить(Стр.Ключ);
    КонецЦикла;

    ТекстПостроителя = «ВЫБРАТЬ
                        |»
;
                        Для
Индекс = 0 По спВыводимыйРеквизит.Количество()-1 Цикл
                           
ТекстПостроителя = ТекстПостроителя + »    КассовоеПоступление.» + СокрЛП(спВыводимыйРеквизит[Индекс]) + » КАК » + СокрЛП(спВыводимыйРеквизит[Индекс]) + » «;
                            Если
спВыводимыйРеквизит.Количество()-1 <> Индекс Тогда
                               
ТекстПостроителя = ТекстПостроителя + «,»;
                            КонецЕсли;
                        КонецЦикла;
                       
ТекстПостроителя = ТекстПостроителя + «
                        |    ИЗ Документ.КассовоеПоступление КАК КассовоеПоступление
                        |ГДЕ
                        |   КассовоеПоступление.Проведен = ИСТИНА
                        |»
;
   
ТекстПостроителя = СтрЗаменить(ТекстПостроителя, «КассовоеПоступление», ТипДокумента);
   
ПостроительЗапроса.Текст = ТекстПостроителя;
   
ОписаниеИсточникаДанных= Новый ОписаниеИсточникаДанных(ИсточникСписок);
   
ПостроительЗапроса.ИсточникДанных = ОписаниеИсточникаДанных;

    ПостроительЗапроса.Выполнить();
    Если НЕ
ТекФорма.ЭлементыФормы.ДокументСписок.Подвал Тогда
       
ТекФорма.ЭлементыФормы.ДокументСписок.Подвал = Истина;
    КонецЕсли;

    тз = ПостроительЗапроса.Результат.Выгрузить();
    Для
Индекс = 0 По спВыводимыйРеквизит.Количество()-1 Цикл
       
СуммаПоТЗ = Формат(тз.Итог(СокрЛП(спВыводимыйРеквизит[Индекс])), «ЧЦ=14; ЧДЦ=2»);
       
ТекФорма.ЭлементыФормы.ДокументСписок.Колонки[СокрЛП(спВыводимыйРеквизит[Индекс])].ТекстПодвала = СокрЛП(СуммаПоТЗ);
    КонецЦикла;
   
#КонецЕсли
КонецПроцедуры

// Процедура вызывается обработчиком обновляющий элементы формы списка
//ТекФорма — Форма
//ИсточникСписок — ДокументСписок или СправочникСписок
//КоманднаяПанель — КоманднаяПанель на форме куда добавляются кнопки
//ИтоговыеПоля — структура с заполненным свойством — ревизиты
Процедура Ледокол_ПоказатьСкрытьПересчитатьИтоги(ТекФорма, ИсточникСписок, КоманднаяПанель, ИтоговыеПоля) Экспорт
   
#Если Клиент Тогда
   
КнопкаЛедоколКнопкаИтоги = КоманднаяПанель.Кнопки.ЛедоколКнопкаИтоги;
    Если
КнопкаЛедоколКнопкаИтоги.Пометка Тогда
       
КнопкаЛедоколКнопкаИтоги.Пометка = Ложь;

        Кнопки = КоманднаяПанель.Кнопки;
       
Кнопки.Удалить(Кнопки.ЛедоколКнопкаПересчитатьИтоги);
       
ТекФорма.ЭлементыФормы.ДокументСписок.Подвал = Ложь;
    Иначе
       
КнопкаЛедоколКнопкаИтоги.Пометка = Истина;

        ЭлементыФормы       = ТекФорма.ЭлементыФормы;
       
ДействиеЛедоколКнопкаДопСвойства = Новый Действие(«Ледокол_ДобавитьЭлементыВФормуСписка_ПересчитатьИтоги»);
       
КнопкаЛедоколКнопкаИтоги = КоманднаяПанель.Кнопки.Добавить(«ЛедоколКнопкаПересчитатьИтоги», ТипКнопкиКоманднойПанели.Действие, «Пересчитать», ДействиеЛедоколКнопкаДопСвойства);
       
КнопкаЛедоколКнопкаИтоги.Отображение = ОтображениеКнопкиКоманднойПанели.НадписьКартинка;
        Попытка
           
КнопкаЛедоколКнопкаИтоги.Картинка = БиблиотекаКартинок.Ледокол_ОбновитьИтогиСписка;
        Исключение
           
КнопкаЛедоколКнопкаИтоги.Отображение = ОтображениеКнопкиКоманднойПанели.Надпись;
        КонецПопытки;
       
КнопкаЛедоколКнопкаИтоги.Пояснение = «Пересчитать итоги списка»;
       
КнопкаЛедоколКнопкаИтоги.Подсказка = «Пересчитать итоги списка»;

        Ледокол_ПоПодпискамНаСобытия.Ледокол_ВывестиИтогиСписка(ИтоговыеПоля, Сред(СокрЛП(ТекФорма.ДокументСписок),Найти(СокрЛП(ТекФорма.ДокументСписок), «.»)+1), ИсточникСписок, ТекФорма);
    КонецЕсли;
   
#КонецЕсли
КонецПроцедуры

// Процедура вызывается обработчиком обновляющий элементы формы списка
//ФормаИсточник — форма
//КоманднаяПанель — КоманднаяПанель на форме куда добавляются кнопки
//ПоказатьИтоги — признак отображения итогов
//ИмяДокумента — строка, например «ПриходнаяНакладная»
//ВидСписка — строка, имеет два значения «ДокументСписок» или «СправочникСписок»
Процедура Ледокол_ПередОткрытииФормыСписка(ФормаИсточник, КоманднаяПанель = Неопределено, ПоказатьИтоги = Ложь, ИмяДокумента = Неопределено, ВидСписка = Неопределено) Экспорт
   
#Если Клиент Тогда
   
Если (ПоказатьИтоги) И (НЕ КоманднаяПанель = Неопределено) Тогда
       
ЭлементыФормы       = ФормаИсточник.ЭлементыФормы;
       
КоманднаяПанель.Кнопки.Добавить();
       
ДействиеЛедоколКнопкаДопСвойства = Новый Действие(«Ледокол_ДобавитьЭлементыВФормуСписка_Итоги»);
       
КнопкаЛедоколКнопкаИтоги = КоманднаяПанель.Кнопки.Добавить(«ЛедоколКнопкаИтоги», ТипКнопкиКоманднойПанели.Действие, «Итоги», ДействиеЛедоколКнопкаДопСвойства);
       
КнопкаЛедоколКнопкаИтоги.Отображение = ОтображениеКнопкиКоманднойПанели.Надпись;
       
КнопкаЛедоколКнопкаИтоги.Пояснение = «Показать (скрыть) итоги списка»;
       
КнопкаЛедоколКнопкаИтоги.Подсказка = «Показать (скрыть) итоги списка»;
    КонецЕсли;
    Если НЕ
ИмяДокумента = Неопределено Тогда
        Для Каждого
Реквизит Из Метаданные.Документы[ИмяДокумента].Реквизиты Цикл
            Если
Лев(Реквизит.Имя,8) = «Ледокол_» Тогда
               
Список  = ФормаИсточник.ЭлементыФормы[ВидСписка];
               
Колонка = Список.Колонки.Добавить(Реквизит.Имя, Реквизит.Синоним);
               
Колонка.Данные = Реквизит.Имя;
           
КонецЕсли;
        КонецЦикла;
    КонецЕсли;
   
#КонецЕсли
КонецПроцедуры

 

И еще!!! Данная доработка позволяет выводить в список (ДокументСписок, СправочникСписок) добавленные реквизиты программно. Допустим добавили вы реквизит в документ или справочник в типовой конфигурации, а менять форму списка неохота, то добавляете в название реквизита «Ледокол_» и он программно выведется на форме списка. «Ледокол_» в коде можно заменить на любой другой префикс если понадобится.

В дальнейшем могу выложить статью по работе (программной) с формой документа(справочника) (не формой списка, а формой документа или справочника).

В файле прикреплении будет cf-ник с общим модулем и картинкой и эта статья в Ворде.

Вот собственно и все. Буду рад если кому то пригодится.

А так же рад слышать комментарии(отзывы, замечания, предложения).

has been added to your cart:
Оформление заказа