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

Программист 1С v8.3 (Управляемые формы)
← На главную

В процессе работы с управляемыми формами 1С 8.3, мы часто сталкиваемся с задачей отображения данных, которых нет напрямую в источнике, но которые можно получить путем расчета или анализа других полей. Одним из таких типовых сценариев является создание "вычисляемых" колонок, например, булева поля, значение которого зависит от условия, или колонки "Сумма", которая пересчитывается "на лету" при изменении цены и количества. Давайте вместе разберем, как эффективно решать эту задачу, используя различные подходы в зависимости от контекста – будь то динамический список или обычная табличная часть формы. Мы рассмотрим подробнее каждый из вариантов, выясним их особенности и предоставим примеры кода — для их реализации пригодится инструментарий разработчика для поиска по метаданным и проверки синтаксиса.

Вычисляемые поля в динамическом списке

Если мы работаем с динамическим списком, то есть отличные инструменты для создания вычисляемых полей. Динамический список сам по себе является мощным механизмом, который позволяет отображать данные из произвольного запроса к базе данных. Именно здесь мы и будем формировать наши вычисляемые колонки.

  1. Использование произвольного запроса. Самый распространенный способ – это модификация текста запроса динамического списка — для этого подойдёт набор инструментов разработчика с консолью запросов и редактором объектов. Мы можем добавить в него любое выражение SQL, которое будет рассчитывать необходимое значение. Рассмотрим пример, где нам нужно булево поле, показывающее, является ли источник 'Нашим'.

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

    
    ВЫБРАТЬ
        Конт.Ссылка КАК Ссылка,
        Конт.Наименование КАК Наименование,
        ВЫБОР КОГДА Конт.ВидИсточника = &ВидИсточникаНаш ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ЭтоНашИсточник
    ИЗ
        Справочник.Контрагенты КАК Конт
    

    После модификации запроса, нам останется добавить новое поле в список полей динамического списка и разместить его на форме как обычную колонку. Убедитесь, что добавляемое поле (в нашем случае ЭтоНашИсточник) существует в запросе, используемом для заполнения динамического списка.

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

    Для отображения булевых значений на форме, мы используем элемент Поле флажка. Мы можем настроить его вид (Флажок или Тумблер) и даже задать отображаемые названия для значений Истина и Ложь.

Работа с реквизитами формы в табличных частях

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

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

  2. Программное заполнении реквизита. После того как реквизит формы добавлен и связан с колонкой, нам нужно обеспечить его заполнение в обработчиках событий, таких как ПриИзменении, ПриОкончанииРедактирования или ПриСозданииНаСервере.

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

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

"На лету" пересчеты в табличных частях

Давайте теперь разберем, как реализовать "на лету" пересчеты, например, суммы строки, при изменении ее составляющих (цены, количества) в табличной части.

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

    
    // В модуле формы
    &НаСервере
    Процедура ТоварыКоличествоПриИзмененииНаСервере(Элемент)
        ПересчитатьСуммуСтрокиТабличнойЧасти(Элемент.ТекущиеДанные);
    КонецПроцедуры
    
    &НаСервере
    Процедура ТоварыЦенаПриИзмененииНаСервере(Элемент)
        ПересчитатьСуммуСтрокиТабличнойЧасти(Элемент.ТекущиеДанные);
    КонецПроцедуры
    
    &НаСервере
    Процедура ПересчитатьСуммуСтрокиТабличнойЧасти(СтрокаТабличнойЧасти)
        СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
    КонецПроцедуры
    
  2. Производительность при больших объемах данных. При работе с табличными частями следует быть внимательными к производительности. Мы рекомендуем кэшировать результаты, использовать один большой запрос вместо множества мелких и управлять видимостью ненужных колонок.

Общие рекомендации и особенности управляемых форм

Мы выяснили, что управляемые формы имеют свои особенности, которые отличают их от обычных форм.

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

  2. Типы связи элемента "Таблица". Полный набор свойств и методов доступен, когда таблица связана именно с ДинамическимСписком. При работе с другими типами функционал может быть более ограничен.

  3. Функциональные опции. Функциональные опции могут использоваться для управления видимостью реквизитов и колонок в зависимости от настроек системы.

  4. Модульность кода. Для обеспечения лучшей организации кода мы настоятельно рекомендуем выносить логику пересчета в общие модули.

Надеемся, что этот подробный разбор поможет вам эффективно создавать и управлять вычисляемыми колонками в управляемых формах 1С 8.3. Мы рассмотрели различные подходы, и теперь вы сможете выбрать наиболее подходящий для вашей конкретной задачи.

← На главную