Как реализовать отображение товаров текущего заказа в списке документов без открытия формы?

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

При работе в конфигурации 1С:Управление торговлей 11 пользователи часто сталкиваются с необходимостью быстро просмотреть состав «Заказа клиента», не заходя в сам документ. Это экономит время при поиске нужного заказа или проверке позиций. В этой статье мы подробно разберем, как реализовать механизм предварительного просмотра состава документа прямо в форме списка, используя различные подходы: от стандартных возможностей платформы до программной реализации с оптимизацией.

Метод 1. Использование связанных динамических списков (без кода)

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

Для реализации этого метода выполним следующие шаги:

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

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

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

Метод 2. Программная реализация через событие «ПриАктивизацииСтроки»

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

Разберем ситуацию: если мы будем выполнять тяжелый запрос к базе данных каждый раз, когда пользователь нажимает стрелку «вниз» на клавиатуре, интерфейс начнет «заикаться». Чтобы этого избежать, применим оптимизацию через обработчик ожидания.

Посмотрим на пример реализации в модуле формы:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    // Отключаем предыдущий обработчик, если пользователь продолжает листать
    ОтключитьОбработчикОжидания("ОбновитьСоставЗаказа");
    // Подключаем новый обработчик с задержкой 0.5 секунды
    ПодключитьОбработчикОжидания("ОбновитьСоставЗаказа", 0.5, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСоставЗаказа()
    ТекущийЗаказ = Элементы.Список.ТекущиеДанные;
    Если ТекущийЗаказ = Неопределено Тогда
        Объект.ТоварыПредпросмотр.Очистить();
        Возврат;
    КонецЕсли;
    
    ЗаполнитьСоставНаСервере(ТекущийЗаказ.Ссылка);
КонецПроцедуры

В данном коде мы используем метод ПодключитьОбработчикОжидания. Это позволяет системе «подождать», пока пользователь остановится на конкретном заказе, и только тогда выполнять запрос к серверу. Выясним, что происходит на сервере:


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

Метод 3. Визуализация через HTML-поле или Форматированную строку

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

Проанализируем, как сформировать наглядный список товаров. Вместо загрузки в таблицу, мы будем собирать строку текста с использованием оформления. Например, выделим сумму жирным шрифтом, а количество — курсивом.


&НаСервере
Функция СформироватьТекстПредпросмотра(СсылкаНаЗаказ)
    Данные = ПолучитьДанныеИзЗаказа(СсылкаНаЗаказ); // Функция получения данных запросом
    
    Результат = Новый ФорматированнаяСтрока("");
    Для Каждого Строка Из Данные Цикл
        ТекстСтроки = Новый ФорматированнаяСтрока(
            Строка.Номенклатура.Наименование + " - ", 
            Новый Шрифт(,,Истина), // Жирный для названия
            ЦветаСтиля.ПоясняющийТекст
        );
        Результат = Новый ФорматированнаяСтрока(Результат, ТекстСтроки, " " + Строка.Количество + " шт. " + Строка.Сумма + " руб." + Символы.ПС);
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Этот метод позволяет создать эффект «подсказки» или «карточки предпросмотра», которая органично вписывается в интерфейс УТ 11. Пользователю не нужно изучать колонки таблицы, он сразу видит итоговую информацию в текстовом блоке справа или снизу от основного списка.

Нюансы и рекомендации по производительности

При реализации данной задачи важно помнить о нескольких технических моментах:

  1. Объемы данных: Если в вашей базе заказы содержат сотни строк, использование обычной ТаблицыЗначений на форме может привести к передаче больших объемов данных между сервером и клиентом. В этом случае первый метод с ДинамическимСписком является приоритетным.
  2. Контекстные вызовы: При использовании ПриАктивизацииСтроки старайтесь минимизировать количество передаваемых данных. Не передавайте на сервер весь объект ЗаказКлиента, передавайте только Ссылка.
  3. Расширения: Чтобы не снимать типовую конфигурацию с поддержки, реализуйте этот функционал через Расширение конфигурации. Добавьте форму списка заказа в расширение и создайте необходимые элементы там.

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

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

← На главную