Переход с обычных форм на управляемые часто вызывает вопросы у разработчиков, привыкших к событиям ПриВыводеСтроки или ПриПолученииДанных. В старой парадигме мы могли легко манипулировать свойством ОформлениеСтроки, чтобы вывести в колонку расчетные данные, которых нет в самой базе. В управляемом приложении механизмы изменились, так как платформа теперь разделяет клиентскую и серверную части. Проанализируем, как решать эту задачу современными методами 1С 8.3.
Разберем основной аналог старого метода — событие ПриПолученииДанныхНаСервере. Это событие генерируется для таблиц, отображающих данные на форме. Его ключевое преимущество заключается в том, что оно срабатывает только для тех строк, которые в данный момент видны пользователю на экране. Это позволяет существенно экономить ресурсы сервера, не обрабатывая тысячи строк ТЧ документа при его открытии.
Рассмотрим пошагово, как реализовать заполнение через это событие:
ОформленияСтрок, который представляет собой коллекцию элементов оформления для отображаемых строк.
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, ОформленияСтрок)
Для Каждого СтрокаОформления Из ОформленияСтрок Цикл
// Получаем данные текущей строки
ДанныеСтроки = СтрокаОформления.ДанныеСтроки;
// Условие для заполнения нашей колонки
Если ДанныеСтроки.Номенклатура.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Товар") Тогда
// Записываем значение в ячейку оформления
СтрокаОформления.Поля["ДополнительнаяКолонка"].УстановитьТекст("В наличии");
СтрокаОформления.Поля["ДополнительнаяКолонка"].ЦветТекста = WebЦвета.Зеленый;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важно помнить, что данная процедура выполняется в контексте &НаСервереБезКонтекста. Это означает, что мы не имеем доступа к реквизитам самой формы через ЭтаФорма. Если для расчетов нужны дополнительные данные, их следует получать через запросы внутри этой же процедуры или передавать заранее подготовленные массивы данных.
Выясним, всегда ли нужно писать код. В управляемых формах многие задачи визуализации решаются через Условное оформление. Этот механизм работает быстрее программного перебора строк и автоматически обрабатывается платформой. С его помощью можно не только менять цвет фона, но и выводить произвольный текст в колонку.
Посмотрим, как настроить вывод текста по условию без программирования:
Объект.Товары.Количество < 0).Этот способ идеален, если логика заполнения колонки статична и зависит только от значений других реквизитов этой же строки.
Иногда требуется, чтобы в колонке находились данные, которые пользователь может изменять или которые должны сохраняться между серверными вызовами в рамках одного сеанса работы с формой. В этом случае мы должны создать реквизит не просто на форме, а внутри объекта ДанныеФормыКоллекция (например, внутри Объект.Товары).
Проанализируем ситуацию: если вы просто добавите колонку как элемент формы (декорацию или поле), не привязав её к ПутьКДанным, система не сможет хранить в ней значения. Правильный алгоритм действий выглядит так:
Товары).СпецСтатус.Теперь мы можем обращаться к этой колонке напрямую в коде:
&НаСервере
Процедура ЗаполнитьСпецКолонку()
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Если СтрокаТЧ.Цена > 1000 Тогда
СтрокаТЧ.СпецСтатус = "Дорогой товар";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Рассмотрим важный нюанс, упомянутый опытными разработчиками: при записи документа или справочника в управляемом приложении происходит полное обновление объекта на форме. Данные считываются из базы данных заново, и все значения в реквизитах формы, которые были добавлены "вручную" (не являются реквизитами самого объекта в метаданных), очищаются.
Чтобы данные не пропадали, нам необходимо реализовать их повторное заполнение в обработчиках жизненного цикла формы:
ПриЧтенииНаСервере — срабатывает при открытии существующего объекта.ПослеЗаписиНаСервере — срабатывает сразу после нажатия кнопки "Записать".Типичная ошибка новичков — заполнить колонки только при открытии ПриСозданииНаСервере. В результате после первой же записи пользователь видит пустые ячейки. Посмотрим на правильную структуру вызовов:
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
// Вызываем общую процедуру заполнения
ЗаполнитьДополнительныеРеквизитыФормы();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДополнительныеРеквизитыФормы()
// Логика заполнения колонок, не хранящихся в БД
Для Каждого Строка Из Объект.Товары Цикл
Строка.МояДопКолонка = "Рассчитано " + ТекущаяДата();
КонецЦикла;
КонецПроцедуры
Если задача стоит заполнить колонку не в документе, а в списке (журнале, реестре), то оптимальным решением будет использование Динамического списка. В управляемых формах списки работают на базе системы компоновки данных (СКД). Мы можем добавить вычисляемое поле прямо в запрос или в настройки СКД.
Рассмотрим преимущества этого метода:
ПриПолученииДанныхНаСервере.ВЫБОР КОГДА... ТОГДА... КОНЕЦ.Таким образом, выбор метода зависит от конкретной задачи: для визуальных эффектов используем условное оформление, для сложных вычислений в ТЧ — серверные события, а для списков — возможности СКД.