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