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