При работе с типовыми конфигурациями, такими как 1С:Управление торговлей 11 или BAS Управління торгівлею, программисты часто сталкиваются с задачей кастомизации стандартных механизмов подбора. Одной из популярных задач является изменение окна выбора характеристик номенклатуры — например, для отображения текущей себестоимости товара прямо в момент выбора. В этой статье мы подробно разберем, как найти нужные процедуры, перехватить создание формы и внедрить собственные данные.
Первая сложность, с которой мы сталкиваемся — это многоуровневая архитектура системы подбора. Процесс открытия форм в современных конфигурациях часто разбит на множество вызовов в общих модулях. Чтобы точно понять, какой участок кода отвечает за вывод окна характеристик, проанализируем ситуацию с помощью встроенных инструментов отладки.
Разберем алгоритм поиска нужной строки кода:
В появившемся списке будет огромное количество строк. Проанализируем их, используя поиск (Ctrl+F) по ключевым словам ОткрытьФорму или Характеристики. Обычно нас интересуют вызовы в модулях ПодборТоваровКлиент или ПодборТоваровСервер. Этот метод позволяет быстро найти точку входа, даже если стандартное событие Выбор в таблице ведет в глубокие недра типового кода.
В типовых решениях УТ 11 подбор работает не через стандартные формы справочников, а через вспомогательные формы обработки ПодборТоваровВДокумент. Рассмотрим, где именно происходит магия:
Как правило, создание параметров и вызов формы характеристик обрабатывается в общем модуле ПодборТоваровСервер в процедуре ПриСозданииФормыПодбораНаСервере. Однако само окно выбора характеристик часто является формой ВводКоличестваИХарактеристик той же обработки или динамически генерируемым окном.
Если нам нужно изменить состав колонок в этой форме, мы должны учитывать, что данные там часто выводятся через динамический список. Просто добавить поле в запрос не получится, если запрос строится программно. Выясним причину: система оптимизирует запросы, чтобы подбор работал быстро, и "лишние" соединения с таблицами себестоимости по умолчанию отсутствуют.
Лучшим способом внесения изменений является использование расширения конфигурации. Это позволит нам не снимать основную конфигурацию с поддержки. Проанализируем процедуру ОткрытьФормуВыбораХарактеристик (или аналогичную в вашей версии), которая находится в клиентском модуле обработки подбора.
Применим аннотацию &Вместо для подмены алгоритма открытия. Рассмотрим пример структуры кода в расширении:
&Вместо("ОткрытьФормуВыбораХарактеристик")
Процедура Расш_ОткрытьФормуВыбораХарактеристик(ПараметрыВыбора, ФормаВладелец)
// Здесь мы можем изменить параметры, передаваемые в форму
ПараметрыВыбора.Вставить("ОтображатьСебестоимость", Истина);
// Вызываем стандартную форму с нашими параметрами или свою собственную
ОткрытьФорму("Обработка.ПодборТоваровВДокумент.Форма.ВводКоличестваИХарактеристик", ПараметрыВыбора, ФормаВладелец);
КонецПроцедуры
Добавление себестоимости в форму выбора характеристик — это ресурсоемкая задача. Себестоимость в УТ 11 не хранится в реквизите справочника, она рассчитывается на основании движений по регистрам. Посмотрим на основные источники данных:
Поскольку расчет себестоимости требует привязки к организации, складу и периоду, нам необходимо передать эти данные в форму характеристик. В процедуре ПриСозданииНаСервере формы выбора характеристик мы можем программно добавить колонку в таблицу или динамический список. Рассмотрим пример получения данных:
Функция ПолучитьСебестоимостьНаСервере(Номенклатура, Характеристика, Склад)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(СебестоимостьТоваровОстатки.СтоимостьОстаток, 0) КАК Себестоимость
|ИЗ
| РегистрНакопления.СебестоимостьТоваров.Остатки(&Период, Номенклатура = &Номенклатура И Характеристика = &Характеристика И Склад = &Склад) КАК СебестоимостьТоваровОстатки";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Характеристика", Характеристика);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Себестоимость;
КонецЕсли;
Возврат 0;
КонецФункции
Важный нюанс: Если форма использует динамический список, для вывода себестоимости лучше использовать произвольный запрос в самом списке, добавив левое соединение с остатками регистра себестоимости. Однако помните, что это может замедлить работу подбора при большом количестве характеристик.
Если вы решили пойти по пути изменения события Выбор в основной таблице подбора (где список товаров), вам нужно найти обработчик СписокНоменклатураВыбор. В нем система проверяет, есть ли у товара характеристики. Если есть — вызывается форма их выбора.
Рассмотрим, как можно "вклиниться" в этот процесс:
Выбор для таблицы Список.Для оптимизации можно использовать механизм фонового расчета. При активации строки с товаром система может запускать фоновое задание для получения себестоимости по всем его характеристикам и кэшировать эти данные, чтобы при открытии окна выбора они уже были готовы.
Для успешного решения задачи мы рекомендуем следующую стратегию: не пытаться переписать весь механизм подбора, а точечно внедряться через расширения в процедуры ПодборТоваровКлиент.ОткрытьФормуВыбораХарактеристик. Сами данные о себестоимости лучше всего подтягивать в момент создания формы выбора характеристик на сервере, используя параметры склада и организации из владельца формы (документа продажи).
Такой подход сохранит обновляемость вашей конфигурации и обеспечит пользователей актуальной информацией для принятия решений при продаже товаров.