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

12.02.11

Задачи пользователя - Адаптация типовых решений

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

Скачать исходный код

Наименование Файл Версия Размер
ИтоговыеПоляВПодвале.cf
.cf 8,30Kb
69
.cf 8,30Kb 69 Скачать
ИтоговыеПоляВПодвале.doc
.doc 52,00Kb
21
.doc 52,00Kb 21 Скачать

 

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Текс модуля:

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4607    9    4    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3038    4    0    

19

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1646    dimanich70    8    

14

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Доработка типового отчета "Связанные документы" позволяет просто и быстро расширять состав объектов для построения структуры подчиненности документов, используя объекты основной конфигурации и любых расширений.

1 стартмани

27.10.2023    2089    18    avmartynov    12    

44

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2196    24    progmaster    7    

3
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. bogdan_sukonnov 57 20.06.13 10:14 Сейчас в теме
Тема интересная, спасибо. Но мысль донесена не очень доходчиво, во всяком случае для моего уровня. Не ясно:
1. Как учитываются отборы списков?
2. Я так понимаю это не будет работать в тонком клиенте на управляемых формах?
2. Tokiy 131 23.06.13 16:16 Сейчас в теме
(1) bogdan_sukonnov,
1) Отборы будут учитываться, так как передается "ИсточникДанных"
2) Для управляемых форм этот механизм не подойдет.
3. dyak84 05.01.15 09:55 Сейчас в теме
Автор подскажите, а как дела обстоят с производительностью про больших обемах даных не будет тормозов. Веди почемуто 1С типово суммы в журналах не посчитивает. Зарание спасибо за ответ
4. Tokiy 131 13.01.15 17:57 Сейчас в теме
(3) dyak84, При больших объемах обрабатывать данные лучше по кнопке, чтоб не было тормозов. Т.е. нажали кнопку "Пересчитать" - обновились суммы итогов и никаких тормозов не будет, только в момент пересчета от мгновения до нескольких секунд задержки, в зависимости от объема данных.
5. dyuha 49 13.01.15 18:24 Сейчас в теме
(3) dyak84,
1С суммы в журналах не подсчитывает, потому что это как бородатых мужиков на эскалаторе считать. Ни какой смысловой нагрузки не несет сумма в журнале документы контрагентов за июль 2014. А если нужны суммы, есть реестры документов, например.
6. dyak84 30.01.15 12:49 Сейчас в теме
(5)Позвольте не согласится смысл есть при нашей специфике работы + с нашими доработками.хотя и понимаю что смысл в ваших словах есть.
7. Ashaxm 20 31.01.15 18:41 Сейчас в теме
cf несовместим с 8.2 и 8.3
8. dyuha 49 15.02.15 21:17 Сейчас в теме
За получение показателей на основании документов на экзамене по спецу снимают баллы.
bogdan_sukonnov; +1 Ответить
9. bogdan_sukonnov 57 19.02.15 17:05 Сейчас в теме
(8) dyuha, согласен, так делать это неправильно. Но другая крайность известна - УПП. Иногда очень хочется найти того человека, кто сделал столько регистров.
10. Tokiy 131 13.03.15 01:02 Сейчас в теме
(8) dyuha, список документов как и журнал документов оперируют данными документов, а не регистров. Соответственно сумму документов логично брать именно из данных документов, а не регистров.
Оставьте свое сообщение