В платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей вывода общей суммы по документам, отображаемым в журнале. На первый взгляд кажется естественным оббежать строки списка, видна на экране, и сложить значения нужной графы. Однако при реализации этой идеи возникают платформенные ограничения и проблемы с производительностью. Проанализируем, почему штатный обход визуальных строк журнала невозможно выполнить напрямую и какими способами корректно решить эту задачу.
Разберем архитектурные особенности работы списков в платформе 1С 7.7:
Наиболее правильный и производительный подход в рамках штатных средств — выполнять расчет сумм не на лету при прокрутке, а по нажатию специальной кнопки (например, «Рассчитать итог»).
Выясним, как реализовать этот вариант через выборку документов за установленный в журнале период:
Процедура РассчитатьИтог()
Перем СуммаИтого;
СуммаИтого = 0;
Док = СоздатьОбъект("Документ");
// Используем период, установленный в журнале
Док.ВыбратьДокументы(НачалоИнтервала(), КонецИнтервала());
Пока Док.ПолучитьДокумент() = 1 Цикл
// Проверяем проведенность и необходимый вид документа
Если Док.Проведен() = 1 Тогда
СуммаИтого = СуммаИтого + Док.Сумма;
КонецЕсли;
КонецЦикла;
Предупреждение("Итоговая сумма за период: " + СуммаИтого);
КонецПроцедуры
Если требуется учитывать установленные программные отборы или работать с крупными объемами данных, проанализируем использование объекта Запрос. Он выполняет агрегацию на стороне СУБД или движка базы данных намного быстрее:
Процедура РассчитатьИтогЗапросом()
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(СуммаЖурнала)
|Период с (НачалоИнтервала()) по (КонецИнтервала());
|Док = Документ.Чек.ТекущийДокумент;
|СуммаDoc = Документ.Чек.Сумма;
|Функция ИтогСумма = Сумма(СуммаDoc);
|Условие(Док.Проведен() = 1);
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Предупреждение("Итоговая сумма: " + Запрос.ИтогСумма);
КонецЕсли;
КонецПроцедуры
Если бизнес-требования жестко предписывают постоянное наличие итоговой строки и гибкую интерактивную работу с динамическим списком, рассмотрим альтернативный вариант — создание собственной формы на основе объекта ТаблицаЗначений.
Итог().Рассмотрим пример получения итога по колонке в таблице значений:
// Заполнение Таблицы Значений и получение итога
ТЗ.ВыгрузитьПустую();
// ... код заполнения ТЗ документами ...
ОбщаяСумма = ТЗ.Итог("Сумма");
Форма.НадписьИтог.Заголовок("Итого: " + ОбщаяСумма);
Посмотрим на решение ситуации без программирования. В платформе 1С 7.7 предусмотрен встроенный механизм суммирования выделенных ячеек:
Прямой обход строк журнала документов на экране в 1С 7.7 не предусмотрен разработчиками платформы. Для корректной и быстрой работы конфигурации следует использовать расчет по требованию с помощью методов ВыбратьДокументы() или Запрос, либо разрабатывать специализированные формы на базе объекта ТаблицаЗначений.