Как изменить форму выбора характеристик в подборе товаров УТ 11 и добавить в неё себестоимость?

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

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

Шаг 1: Локализация кода через замер производительности

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

Разберем алгоритм поиска нужной строки кода:

  1. Откройте конфигуратор и перейдите в меню Администрирование — Замер производительности.
  2. Перейдите в пользовательский режим (предприятие), откройте документ продажи и запустите форму подбора.
  3. Выполните действие, которое приводит к открытию окна характеристик (обычно это двойной клик по товару, имеющему характеристики).
  4. Сразу после появления окна вернитесь в конфигуратор и остановите замер производительности.

В появившемся списке будет огромное количество строк. Проанализируем их, используя поиск (Ctrl+F) по ключевым словам ОткрытьФорму или Характеристики. Обычно нас интересуют вызовы в модулях ПодборТоваровКлиент или ПодборТоваровСервер. Этот метод позволяет быстро найти точку входа, даже если стандартное событие Выбор в таблице ведет в глубокие недра типового кода.

Шаг 2: Анализ механизмов обработки выбора

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

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

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

Шаг 3: Перехват открытия формы через расширение

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

Применим аннотацию &Вместо для подмены алгоритма открытия. Рассмотрим пример структуры кода в расширении:


&Вместо("ОткрытьФормуВыбораХарактеристик")
Процедура Расш_ОткрытьФормуВыбораХарактеристик(ПараметрыВыбора, ФормаВладелец)
    // Здесь мы можем изменить параметры, передаваемые в форму
    ПараметрыВыбора.Вставить("ОтображатьСебестоимость", Истина);
    
    // Вызываем стандартную форму с нашими параметрами или свою собственную
    ОткрытьФорму("Обработка.ПодборТоваровВДокумент.Форма.ВводКоличестваИХарактеристик", ПараметрыВыбора, ФормаВладелец);
КонецПроцедуры

Шаг 4: Расчет и вывод себестоимости

Добавление себестоимости в форму выбора характеристик — это ресурсоемкая задача. Себестоимость в УТ 11 не хранится в реквизите справочника, она рассчитывается на основании движений по регистрам. Посмотрим на основные источники данных:

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


Функция ПолучитьСебестоимостьНаСервере(Номенклатура, Характеристика, Склад)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ЕСТЬNULL(СебестоимостьТоваровОстатки.СтоимостьОстаток, 0) КАК Себестоимость
        |ИЗ
        |	РегистрНакопления.СебестоимостьТоваров.Остатки(&Период, Номенклатура = &Номенклатура И Характеристика = &Характеристика И Склад = &Склад) КАК СебестоимостьТоваровОстатки";
    
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Характеристика", Характеристика);
    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("Период", ТекущаяДата());
    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Себестоимость;
    КонецЕсли;
    Возврат 0;
КонецФункции

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

Шаг 5: Использование события "Выбор" для подмены алгоритма

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

Рассмотрим, как можно "вклиниться" в этот процесс:

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

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

Резюме по реализации

Для успешного решения задачи мы рекомендуем следующую стратегию: не пытаться переписать весь механизм подбора, а точечно внедряться через расширения в процедуры ПодборТоваровКлиент.ОткрытьФормуВыбораХарактеристик. Сами данные о себестоимости лучше всего подтягивать в момент создания формы выбора характеристик на сервере, используя параметры склада и организации из владельца формы (документа продажи).

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

← На главную