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

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

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

Метод 1: Использование серверного события ПриПолученииДанныхНаСервере

Разберем основной аналог старого метода — событие ПриПолученииДанныхНаСервере. Это событие генерируется для таблиц, отображающих данные на форме. Его ключевое преимущество заключается в том, что оно срабатывает только для тех строк, которые в данный момент видны пользователю на экране. Это позволяет существенно экономить ресурсы сервера, не обрабатывая тысячи строк ТЧ документа при его открытии.

Рассмотрим пошагово, как реализовать заполнение через это событие:

  1. Создадим обработчик события для таблицы формы.
  2. В процедуру будет передан параметр ОформленияСтрок, который представляет собой коллекцию элементов оформления для отображаемых строк.
  3. Проанализируем пример кода, где мы заполняем колонку "Остаток" на основе данных из строки:

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, ОформленияСтрок)
    
    Для Каждого СтрокаОформления Из ОформленияСтрок Цикл
        // Получаем данные текущей строки
        ДанныеСтроки = СтрокаОформления.ДанныеСтроки;
        
        // Условие для заполнения нашей колонки
        Если ДанныеСтроки.Номенклатура.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Товар") Тогда
            // Записываем значение в ячейку оформления
            СтрокаОформления.Поля["ДополнительнаяКолонка"].УстановитьТекст("В наличии");
            СтрокаОформления.Поля["ДополнительнаяКолонка"].ЦветТекста = WebЦвета.Зеленый;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Важно помнить, что данная процедура выполняется в контексте &НаСервереБезКонтекста. Это означает, что мы не имеем доступа к реквизитам самой формы через ЭтаФорма. Если для расчетов нужны дополнительные данные, их следует получать через запросы внутри этой же процедуры или передавать заранее подготовленные массивы данных.

Метод 2: Условное оформление формы (декларативный подход)

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

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

  1. Откроем редактор формы и перейдем на закладку "Условное оформление".
  2. Добавим новый элемент оформления.
  3. В поле "Оформление" выберем свойство "Текст" и укажем нужное значение (например, "Требуется проверка").
  4. В поле "Условие" зададим правило (например, Объект.Товары.Количество < 0).
  5. В поле "Оформляемые поля" выберем нашу добавленную колонку.

Этот способ идеален, если логика заполнения колонки статична и зависит только от значений других реквизитов этой же строки.

Метод 3: Добавление реквизита в коллекцию формы

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

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

  1. Перейдем на закладку "Реквизиты" в редакторе формы.
  2. Найдем нужную табличную часть (например, Товары).
  3. Нажмем "Добавить реквизит" внутри этой ТЧ и назовем его СпецСтатус.
  4. Перетащим этот реквизит в элементы формы (в дерево таблицы).

Теперь мы можем обращаться к этой колонке напрямую в коде:


&НаСервере
Процедура ЗаполнитьСпецКолонку()
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        Если СтрокаТЧ.Цена > 1000 Тогда
            СтрокаТЧ.СпецСтатус = "Дорогой товар";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Проблема очистки данных после записи объекта

Рассмотрим важный нюанс, упомянутый опытными разработчиками: при записи документа или справочника в управляемом приложении происходит полное обновление объекта на форме. Данные считываются из базы данных заново, и все значения в реквизитах формы, которые были добавлены "вручную" (не являются реквизитами самого объекта в метаданных), очищаются.

Чтобы данные не пропадали, нам необходимо реализовать их повторное заполнение в обработчиках жизненного цикла формы:

Типичная ошибка новичков — заполнить колонки только при открытии ПриСозданииНаСервере. В результате после первой же записи пользователь видит пустые ячейки. Посмотрим на правильную структуру вызовов:


&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    // Вызываем общую процедуру заполнения
    ЗаполнитьДополнительныеРеквизитыФормы();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДополнительныеРеквизитыФормы()
    // Логика заполнения колонок, не хранящихся в БД
    Для Каждого Строка Из Объект.Товары Цикл
        Строка.МояДопКолонка = "Рассчитано " + ТекущаяДата();
    КонецЦикла;
КонецПроцедуры

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

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

Рассмотрим преимущества этого метода:

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

← На главную