Как сделать вычисляемую колонку в форме списка документов 1С

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При работе со списками документов часто возникает задача вывести расчетный показатель, которого нет в готовом виде в реквизитах шапки. Например, рассчитать сумму к оплате поставщику как разность между суммой приходной накладной и суммой возврата товаров. Разберем, как правильно реализовать такой расчет в зависимости от типа используемых форм и архитектуры конфигурации.

Определение типа приложения и формы

Прежде чем приступать к разработке, выясним, в каком режиме работает форма документа. В платформе 1С:Предприятие 8 подход к расчету значений в списках кардинально различается:

  1. Обычные формы (толстый клиент): список строится на базе элемента управления ТабличноеПоле с типом источника ДокументСписок. Расчет колонок выполняется программно в процедурах оформления строк формы.
  2. Управляемые формы (тонкий клиент): список формируется через ДинамическийСписок. В этом случае вычисляемые поля добавляются непосредственно в текст запроса списка (конструкция ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ или простая арифметическая операция над полями выборки).

Рассмотрим детально реализацию задачи для конфигураций на обычных формах (таких как линейка решений «Штрих-М: Торговое предприятие 5.2», «Управление торговлей 10.3» и других классических систем).

Настройка элементов формы в конфигураторе

Разберем по шагам, как подготовить элементы управления в редакторе форм:

  1. Откроем форму списка нужного документа в конфигураторе.
  2. Выделим элемент управления ТабличноеПоле, отображающий список документов.
  3. Перейдем в свойства табличного поля и откроем список колонок. Добавим новую колонку (например, с именем КОплате и заголовком «Итого к оплате»).
  4. Оставим свойство Данные у созданной колонки пустым. Если связать колонку с несуществующим реквизитом, возникнет ошибка. Колонка должна быть несвязанной (вычисляемой).
  5. Укажем в свойствах тип значения Число, чтобы включилось корректное форматирование чисел и выравнивание по правому краю ячейки.

Программный расчет значения: событие ПриПолученииДанных

Проанализируем распространенную ошибку начинающих разработчиков. Часто для расчета используют событие ПриВыводеСтроки. Если данные для расчета уже присутствуют в текущей строке списка, это допустимо. Однако, если для определения возврата требуется выполнять запрос к базе данных (поиск подчиненных документов расхода или возврата поставщику), использование ПриВыводеСтроки приведет к выполнению отдельного запроса на каждую строку на экране, из-за чего список начнет зависать при прокрутке.

Оптимальным решением является обработчик события ПриПолученииДанных. Платформа передает в него массив всех строк, которые в данный момент отображаются на экране. Это дает возможность собрать ссылки на документы, выполнить один пакетный запрос сразу по всем видимым строкам и быстро расставить расчетные значения.

Посмотрим на пример кода в модуле формы списка:


Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)

    // Если данные для расчета уже содержатся в колонках списка:
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        // Получаем значения из строки списка
        СуммаДокумента = ОформлениеСтроки.ДанныеСтроки.СуммаДокумента;
        
        // Предположим, что колонка СуммаВозврата уже выведена в список
        СуммаВозврата = 0;
        Если ОформлениеСтроки.Ячейки.Найти("СуммаВозврата") <> Неопределено Тогда
            СуммаВозврата = Число(ОформлениеСтроки.Ячейки.СуммаВозврата.Значение);
        КонецЕсли;
        
        // Рассчитываем разницу и выводим в ячейку расчетной колонки
        СуммаКОплате = СуммаДокумента - СуммаВозврата;
        ОформлениеСтроки.Ячейки.КОплате.УстановитьТекст(Формат(СуммаКОплате, "ЧДЦ=2; ЧГ=3,0"));
        ОформлениеСтроки.Ячейки.КОплате.Значение = СуммаКОплате;
    КонецЦикла;

КонецПроцедуры

Если же связь с возвратом не выведена в список, соберем массив ссылок из параметра ОформленияСтрок, выполним запрос к связанным документам возврата по реквизиту ДокументОснование, запишем результат во временную структуру или соответствие, после чего заполним ОформлениеСтроки.Ячейки.КОплате.Значение.

Ограничения платформы для вычисляемых колонок

Важно учитывать технические ограничения архитектуры обычных форм платформы 1С:

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

Вопросы обновления типовой конфигурации

Внесение изменений в типовую форму документа переводит объект на редактирование с сохранением поддержки. При последующих типовых обновлениях конфигурации необходимо аккуратно выполнять процедуру сравнения и объединения, чтобы типовые изменения поставщика не затерли пользовательские колонки и алгоритмы в модуле формы.

Альтернативные решения задачи

Если требуется избежать изменения типовой конфигурации, рассмотрим альтернативные варианты:

  1. Внешний отчет на СКД: наиболее универсальный способ. В отчете соединяются таблицы приходных накладных и документов возврата (по контрагенту, договору или документам-основаниям). На вкладке «Вычисляемые поля» прописывается формула разности. В таком отчете сразу работают группировки, сортировки, отборы и итоговые суммы.
  2. Внешняя обработка с таблицей значений: если необходим интерактивный журнал с возможностью выполнения команд, создается внешняя обработка (через меню конфигуратора «Файл» — «Новый» — «Внешняя обработка»). На форму выносится таблица значений, которая заполняется единым запросом с выводом всех необходимых колонок взаиморасчетов.
  3. Типовые отчеты по взаиморасчетам: в учетных решениях фактический долг перед поставщиком с учетом возвратов отслеживается через регистры накопления взаиморасчетов. Стандартная ведомость по расчетам с контрагентами с детализацией по документам движения показывает реальный остаток долга без необходимости доработки конфигурации.
← На главную