Как реализовать вычисляемое поле на обычной форме списка в 1С

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

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

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

Подготовительный этап: настройка колонки на форме

Прежде чем переходить к написанию кода, подготовим саму форму. Выясним, как правильно добавить «пустую» колонку, которая будет служить контейнером для наших вычислений:

  1. Откроем форму списка в конфигураторе.
  2. Разместим новую колонку в элементе управления ТабличноеПоле.
  3. Важный момент: в свойствах новой колонки поле Данные должно оставаться пустым. Если попытаться привязать колонку к реквизиту объекта и записывать в неё данные программно в процессе отрисовки, платформа выдаст ошибку «Поле объекта не может быть записано».
  4. Зададим имя колонки (например, ОстатокТовара) и заголовок, который увидит пользователь.

Метод 1: Использование события ПриВыводеСтроки

Этот метод является наиболее простым в реализации и подходит для несложных вычислений, которые не требуют тяжелых запросов к базе данных. Событие ПриВыводеСтроки вызывается для каждой строки списка в момент её отрисовки на экране.

Проанализируем пример кода, где мы вычисляем итог по табличной части документа прямо «на лету»:


Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Проверяем, что данные строки доступны
    Если ДанныеСтроки = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Вычисляем значение (например, сумму по табличной части "ВозвратнаяТара")
    ЗначениеДляВывода = ДанныеСтроки.Ссылка.ВозвратнаяТара.Итог("Сумма");
    
    // Устанавливаем текст в нужную ячейку
    ОформлениеСтроки.Ячейки.ВозвратнаяТара.УстановитьТекст(Строка(ЗначениеДляВывода));
КонецПроцедуры

Рассмотрим подробнее ключевые объекты в этом обработчике. Параметр ДанныеСтроки содержит значения реквизитов текущей строки (ссылку, дату, номер и т.д.). Параметр ОформлениеСтроки позволяет управлять визуальным представлением: цветом, шрифтом и текстом ячеек. Использование метода УстановитьТекст() — это правильный способ отображения вычисленных данных, так как он не пытается изменить сами данные в базе.

Метод 2: Оптимизированный вывод через ПриПолученииДанных

Если для заполнения колонки требуется выполнение запроса к базе данных, использование первого метода приведет к серьезным задержкам (проблема «запроса в цикле»). В этом случае мы рекомендуем использовать событие ПриПолученииДанных.

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

  1. Сформируем массив ссылок на объекты, которые в данный момент видны пользователю в списке.
  2. Выполним один запрос к базе данных с условием ГДЕ Ссылка В (&МассивСсылок).
  3. Результаты запроса выгрузим в соответствие (ключ — ссылка, значение — наш результат).
  4. В цикле по коллекции ОформленияСтрок установим значения в ячейки, обращаясь к подготовленным данным в памяти.

Пример схемы кода для оптимизации:


Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    // Собираем ссылки видимых строк
    МассивСсылок = Новый Массив;
    Для Каждого Оформление Из ОформленияСтрок Цикл
        МассивСсылок.Добавить(Оформление.ДанныеСтроки.Ссылка);
    КонецЦикла;

    // Выполняем запрос (условно)
    // ТаблицаРезультатов = ВыполнитьЗапросПоДанным(МассивСсылок);

    // Заполняем ячейки
    Для Каждого Оформление Из ОформленияСтрок Цикл
        // Ищем данные по ссылке и устанавливаем текст
        // Оформление.Ячейки.МоеПоле.УстановитьТекст(НайденоеЗначение);
    КонецЦикла;
КонецПроцедуры

Критические ограничения и особенности

При использовании программного вычисления данных в списках необходимо учитывать несколько важных технических нюансов:

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

← На главную