При анализе проводок документа или их ручной правке через специализированную обработку КорректировкаДвижений (используемую в конфигурациях на обычных формах, таких как «Бухгалтерия для Украины», «Бухгалтерия предприятия 2.0» или «Управление производственным предприятием») часто возникает задача вывести общую сумму всех проводок документа. Рассмотрим подробно, как реализовать подсчет итоговой суммы движений несколькими способами: с помощью запроса к базе данных, прямым суммированием данных формы, а также разберем вывод итога в стандартный подвал таблицы.
Классический подход заключается в выполнении запроса к таблице регистра бухгалтерии с фильтром по текущему документу (регистратору). Для этого обратимся к реальной ссылке документа, находящейся в переменной ДокументОбъект.Ссылка формы обработки.
Разберем готовый код обработчика кнопки, который формирует запрос, вычисляет сумму и выводит ее в элемент формы ЗагальнаСуммаДокументов:
Процедура ПодсчитатьСуммуДокументов()
// Проверим, что ссылка на документ существует и заполнена
Если Не ЗначениеЗаполнено(ДокументОбъект.Ссылка) Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(СУММА(Хозрасчетный.Сумма), 0) КАК ИтогоСумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор = &Регистратор
| И Хозрасчетный.Активность = ИСТИНА";
Запрос.УстановитьПараметр("Регистратор", ДокументОбъект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
МояСумма = Выборка.ИтогоСумма;
ЭлементыФормы.ЗагальнаСуммаДокументов.Заголовок = Формат(МояСумма, "ЧДЦ=2");
КонецЕсли;
КонецПроцедуры
Проанализируем ключевые моменты этого запроса:
РегистрБухгалтерии.Хозрасчетный (или имя вашего регистра, если конфигурация нестандартная).&Регистратор передается именно ссылка на документ через ДокументОбъект.Ссылка, а не сам объект и не контекст формы.ЕСТЬNULL гарантирует, что если у документа нет проводок, запрос вернет 0, а не пустое значение.Хозрасчетный.Активность = ИСТИНА исключает из расчета отключенные или неактивные проводки.Выясним важную особенность: при включенном режиме РучнаяКорректировка пользователь может изменить суммы в табличном поле на экране, но еще не нажать кнопку сохранения. Запрос к СУБД в этот момент вернет старые данные из базы, а не те, которые оператор видит в форме. Чтобы подсчитать сумму с учетом актуальных экранных данных, обратимся к набору записей табличного поля.
Рассмотрим вариант быстрого получения итога через выгрузку в таблицу значений:
Процедура ПодсчитатьСуммуСЭкрана()
// Получаем набор записей из табличного поля Хозрасчетный
НаборЗаписей = ЭлементыФормы.Хозрасчетный.Значение;
Если НаборЗаписей = Неопределено Тогда
Возврат;
КонецЕсли;
// Выгружаем набор в таблицу значений и мгновенно получаем сумму колонки
ТаблицаПроводок = НаборЗаписей.Выгрузить();
МояСумма = ТаблицаПроводок.Итог("Сумма");
ЭлементыФормы.ЗагальнаСуммаДокументов.Заголовок = "Всего: " + Формат(МояСумма, "ЧДЦ=2");
КонецПроцедуры
Также можно выполнить обход набора записей в цикле. Посмотрим на пример реализации:
Процедура ПодсчитатьСуммуЦиклом()
МояСумма = 0;
Для Каждого СтрокаПроводки Из ЭлементыФормы.Хозрасчетный.Значение Цикл
Если СтрокаПроводки.Активность Тогда
МояСумма = МояСумма + СтрокаПроводки.Сумма;
КонецЕсли;
КонецЦикла;
ЭлементыФормы.ЗагальнаСуммаДокументов.Заголовок = Формат(МояСумма, "ЧДЦ=2");
КонецПроцедуры
В платформе 1С на обычных формах можно сделать отображение общей суммы постоянным и автоматическим с помощью встроенного механизма подвала таблицы. Это избавляет пользователя от необходимости нажимать отдельную кнопку.
Разберем по шагам, как это настроить программно:
ПриОткрытии или при настройке колонок включаем видимость подвала:
ЭлементыФормы.Хозрасчетный.ОтображатьПодвал = Истина;
Процедура ОбновитьИтогПодвала()
СуммаИтог = 0;
Попытка
СуммаИтог = ЭлементыФормы.Хозрасчетный.Значение.Выгрузить().Итог("Сумма");
Исключение
СуммаИтог = 0;
КонецПопытки;
ЭлементыФормы.Хозрасчетный.Колонки.Сумма.ТекстПодвала = Формат(СуммаИтог, "ЧДЦ=2");
КонецПроцедуры
ОбновитьИтогПодвала() в конце процедуры ПриОткрытии, а также в событиях табличного поля ХозрасчетныйПриОкончанииРедактирования и ХозрасчетныйПослеУдаления.Такой подход обеспечивает постоянную актуальность суммы проводок при любых действиях пользователя в обработке корректировки движений.