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

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

Переход с платформы 1С 7.7 на современные управляемые формы (УФ) часто вызывает вопросы у разработчиков из-за кардинального отличия в архитектуре. В 7.7 мы привыкли использовать вычисляемые формулы прямо в колонках табличных частей, однако в УФ такой подход не применим из-за разделения клиентской и серверной логики. Давайте разберем, как правильно реализовать отображение даты последней цены номенклатуры в документе.

Понимание архитектурных ограничений

Основная проблема при работе с табличными частями в управляемых формах заключается в производительности. Если вы попытаетесь вызывать серверную функцию для получения данных при каждом обращении к строке (например, в событии ПриАктивизацииСтроки), это приведет к лавине запросов к серверу. Это сделает интерфейс медленным и «дерганым».

Чтобы избежать подобных проблем, необходимо придерживаться принципа минимизации серверных вызовов. Мы не должны запрашивать данные «на лету» для каждой ячейки по отдельности.

Метод реализации через дополнительную колонку

Рассмотрим пошаговое решение задачи:

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

Пример кода для пакетного получения данных

Разберем, как получить дату цены сразу для всей номенклатуры, находящейся в ТЧ. Это позволит нам один раз обратиться к базе данных вместо десятков мелких запросов.


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

Почему это лучший подход?

Рассмотренный метод обеспечивает высокую производительность, так как:

Дополнительные рекомендации

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

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

← На главную