Переход с платформы 1С 7.7 на современные управляемые формы (УФ) часто вызывает вопросы у разработчиков из-за кардинального отличия в архитектуре. В 7.7 мы привыкли использовать вычисляемые формулы прямо в колонках табличных частей, однако в УФ такой подход не применим из-за разделения клиентской и серверной логики. Давайте разберем, как правильно реализовать отображение даты последней цены номенклатуры в документе.
Основная проблема при работе с табличными частями в управляемых формах заключается в производительности. Если вы попытаетесь вызывать серверную функцию для получения данных при каждом обращении к строке (например, в событии ПриАктивизацииСтроки), это приведет к лавине запросов к серверу. Это сделает интерфейс медленным и «дерганым».
Чтобы избежать подобных проблем, необходимо придерживаться принципа минимизации серверных вызовов. Мы не должны запрашивать данные «на лету» для каждой ячейки по отдельности.
Рассмотрим пошаговое решение задачи:
ДатаЦены с типом Дата). Если данные не должны сохраняться в базе, установите свойство Сохраняемость в значение Не использовать.Разберем, как получить дату цены сразу для всей номенклатуры, находящейся в ТЧ. Это позволит нам один раз обратиться к базе данных вместо десятков мелких запросов.
&НаСервере
Процедура ПолучитьДатыЦенНаСервере()
// Собираем массив номенклатуры из ТЧ
СписокНоменклатуры = Объект.Товары.ВыгрузитьКолонку("Номенклатура");
// Создаем запрос к регистру сведений, где хранятся цены
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныСрезПоследних.Номенклатура КАК Номенклатура,
| МАКСИМУМ(ЦеныСрезПоследних.Период) КАК Период
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Номенклатура В (&СписокНоменклатуры)) КАК ЦеныСрезПоследних
|СГРУППИРОВАТЬ ПО
| ЦеныСрезПоследних.Номенклатура";
Запрос.УстановитьПараметр("СписокНоменклатуры", СписокНоменклатуры);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Заполняем колонку ТЧ полученными данными
Пока Выборка.Следующий() Цикл
Строки = Объект.Товары.НайтиСтроки(Новый Структура("Номенклатура", Выборка.Номенклатура));
Для Каждого Стр Из Строки Цикл
Стр.ДатаЦены = Выборка.Период;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Рассмотренный метод обеспечивает высокую производительность, так как:
ПриСозданииНаСервере.Если данных в таблице очень много, подумайте о том, стоит ли загромождать табличную часть лишними колонками. Альтернативой может быть использование отдельной области или информационной панели (Группы) на форме, в которой будет отображаться дата цены для той номенклатуры, на которой сейчас стоит курсор. В таком случае мы используем событие ПриАктивизацииСтроки, но только для одной записи, что также допустимо при грамотной оптимизации.
Помните, что в управляемых формах важно не то, как вы «вычисляете» значение, а то, как эффективно вы передаете его от сервера к клиенту. Используйте описанные методы, чтобы ваши формы оставались быстрыми и отзывчивыми.