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