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