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

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    4453    9    4    

18

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

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

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

7200 руб.

02.08.2023    2956    4    0    

19

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

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

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

01.03.2024    1284    dimanich70    6    

13

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

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

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

1 стартмани

27.10.2023    1996    13    avmartynov    10    

43

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

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

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

2 стартмани

22.08.2023    2076    21    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, список документов как и журнал документов оперируют данными документов, а не регистров. Соответственно сумму документов логично брать именно из данных документов, а не регистров.
Оставьте свое сообщение