Как добавить новое поле в форму подбора товаров УТ 11.4

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

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

Особенности архитектуры формы подбора в УТ 11.4

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

Основная логика формирования запроса вынесена в общий модуль ПодборТоваровСервер. Если вы просто измените запрос в конструкторе формы, ваши правки, скорее всего, будут перекрыты при открытии формы, когда сработает стандартный механизм пересборки текста запроса. Поэтому наиболее правильный путь — использование механизма расширений для вмешательства в процесс сборки запроса.

Способ 1. Программное изменение текста запроса через расширение

Разберем по шагам, как добавить колонку «В пути» с использованием расширения конфигурации. Нам необходимо добавить поле в схему запроса, чтобы данные подтягивались из регистров системы.

Во-первых, создадим расширение и добавим в него форму ФормаПодбораТоваров обработки ПодборТоваровТовары. Однако, вместо редактирования самой формы, мы сосредоточимся на процедуре ПриСозданииНаСервере или на методах общего модуля, формирующих запрос.

Во-вторых, рассмотрим пример кода, который можно разместить в расширении для формы подбора (метод &После("ПриСозданииНаСервере")):


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Получаем текущий текст запроса
    ТекстЗапроса = СписокТоваров.ТекстЗапроса;
    
    // Добавляем описание нового поля в текст запроса
    // В данном примере добавим пустую колонку, которую заполним позже,
    // либо сразу пропишем ЛЕВОЕ СОЕДИНЕНИЕ с нужным регистром.
    НовыйТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ ВЫРАЗИТЬ("""" КАК СТРОКА(100)) КАК ВПути, ");
    
    СписокТоваров.ТекстЗапроса = НовыйТекстЗапроса;
    
КонецПроцедуры

Однако просто добавить пустое поле недостаточно. Выясним причину, по которой прямое соединение в запросе может быть предпочтительнее. Если мы хотим видеть дату и количество, нам нужно обратиться к остаткам регистра ЗаказыПоставщикам.

Способ 2. Использование события ПриПолученииДанныхНаСервере

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

В этом случае на помощь приходит событие динамического списка ПриПолученииДанныхНаСервере. Выполним следующие действия:

  1. В расширении для формы подбора добавим обработчик события СписокТоваровПриПолученииДанныхНаСервере.
  2. Внутри обработчика переберем полученные строки и рассчитаем значение для колонки ВПути.

Посмотрим на пример реализации:


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

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

Способ 3. Источники данных для поля «В пути»

Разберем подробнее, откуда именно брать данные для реализации нашей задачи. В типовой конфигурации УТ 11.4 информация об ожидаемых товарах хранится в нескольких местах:

Чтобы получить наиболее полную картину, рекомендуется объединять данные из этих регистров, фильтруя их по текущему складу или организации.

Оптимизация производительности при выводе данных

Рассмотрим вопрос производительности. Если база данных содержит десятки тысяч позиций номенклатуры, динамическое вычисление поля «В пути» в коде ПриПолученииДанныхНаСервере станет «узким местом». Выясним, как этого избежать.

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

Альтернативный вариант: Использование Дополнительных сведений

Если задача стоит в выводе какой-то статической или редко обновляемой информации, рассмотрим вариант без доработки кода. В 1С:Предприятие 8.3 реализован мощный механизм Дополнительных сведений.

  1. Создайте дополнительное свойство для справочника Номенклатура с именем «Ожидаемое поступление».
  2. В форме подбора, в настройках списка (Еще -> Изменить форму), выведите это свойство в список.
  3. Обновляйте это свойство регламентным заданием раз в час или по событию проведения документов поступления/заказа.

Этот способ хорош тем, что он не требует изменения типовых запросов и работает максимально быстро, так как данные уже лежат в базе в готовом виде.

Резюме

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

← На главную