Как просуммировать документы или обходить строки в журнале документов 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей вывода общей суммы по документам, отображаемым в журнале. На первый взгляд кажется естественным оббежать строки списка, видна на экране, и сложить значения нужной графы. Однако при реализации этой идеи возникают платформенные ограничения и проблемы с производительностью. Проанализируем, почему штатный обход визуальных строк журнала невозможно выполнить напрямую и какими способами корректно решить эту задачу.

Особенности и ограничения журнала документов в 1С 7.7

Разберем архитектурные особенности работы списков в платформе 1С 7.7:

  1. Отсутствие доступа к визуальной таблице: Элемент формы «Журнал документов» не является обычным коллекционным объектом или таблицей значений. В программном коде 1С 7.7 нет методов для обхода элементов списка, видимых в данный момент на экране.
  2. Проблемы производительности при динамическом подсчете: Если разместить функцию подсчета непосредственно в формуле элемента формы или текстового поля, платформа будет вызывать ее при каждой перерисове экрана, скроллинге или перемещении курсора. Это приводит к постоянным обращениям к базе данных и существенному замедлению работы интерфейса.
  3. Интерактивные отборы: При использовании пользователем стандартных отборов по графе контекст фильтрации не всегда легко перехватить встроенным языком без использования сторонних расширений.

Способ 1. Расчет итоговых сумм по кнопке (Выборка или Запрос)

Наиболее правильный и производительный подход в рамках штатных средств — выполнять расчет сумм не на лету при прокрутке, а по нажатию специальной кнопки (например, «Рассчитать итог»).

Выясним, как реализовать этот вариант через выборку документов за установленный в журнале период:


Процедура РассчитатьИтог()
    Перем СуммаИтого;
    СуммаИтого = 0;
    
    Док = СоздатьОбъект("Документ");
    // Используем период, установленный в журнале
    Док.ВыбратьДокументы(НачалоИнтервала(), КонецИнтервала());
    
    Пока Док.ПолучитьДокумент() = 1 Цикл
        // Проверяем проведенность и необходимый вид документа
        Если Док.Проведен() = 1 Тогда
            СуммаИтого = СуммаИтого + Док.Сумма;
        КонецЕсли;
    КонецЦикла;
    
    Предупреждение("Итоговая сумма за период: " + СуммаИтого);
КонецПроцедуры

Если требуется учитывать установленные программные отборы или работать с крупными объемами данных, проанализируем использование объекта Запрос. Он выполняет агрегацию на стороне СУБД или движка базы данных намного быстрее:


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

Способ 2. Построение журнала на базе «ТаблицыЗначений»

Если бизнес-требования жестко предписывают постоянное наличие итоговой строки и гибкую интерактивную работу с динамическим списком, рассмотрим альтернативный вариант — создание собственной формы на основе объекта ТаблицаЗначений.

  1. На форму обработки или журнала помещается элемент «ТаблицаЗначений».
  2. При открытии формы или изменении фильтров (периода, контрагента, кассы) данные заполняются программой из базы данных.
  3. Для получения общей суммы по любой колонке используется встроенный высокоскоростной метод Итог().

Рассмотрим пример получения итога по колонке в таблице значений:


// Заполнение Таблицы Значений и получение итога
ТЗ.ВыгрузитьПустую();
// ... код заполнения ТЗ документами ...
ОбщаяСумма = ТЗ.Итог("Сумма");
Форма.НадписьИтог.Заголовок("Итого: " + ОбщаяСумма);

Способ 3. Использование штатного калькулятора

Посмотрим на решение ситуации без программирования. В платформе 1С 7.7 предусмотрен встроенный механизм суммирования выделенных ячеек:

  1. Пользователь выделяет нужную ячейку в журнале документов.
  2. Нажимает клавишу добавления в память калькулятора (кнопка «М+» на панели инструментов).
  3. При выделении следующих строк повторное нажатие «М+» суммирует значения в памяти, а вызвать итоговый результат можно открытием встроенного калькулятора.

Резюме

Прямой обход строк журнала документов на экране в 1С 7.7 не предусмотрен разработчиками платформы. Для корректной и быстрой работы конфигурации следует использовать расчет по требованию с помощью методов ВыбратьДокументы() или Запрос, либо разрабатывать специализированные формы на базе объекта ТаблицаЗначений.

← На главную