Как прочитать и доработать код формы подбора товаров в типовой 1С:Управление торговлей

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

Разработка и модификация механизмов подбора товаров в типовых решениях на базе 1С:Предприятие 8.3 (таких как УТ 11, КА 2 или ERP) часто вызывает вопросы даже у опытных разработчиков. Это связано с многоуровневой архитектурой, использованием универсальных общих модулей и механизмов перетаскивания элементов. Рассмотрим подробно, как устроена логика подбора, откуда берутся данные при перетаскивании и как правильно добавить свои реквизиты в «корзину» подбора.

Механизм перетаскивания и объект ПараметрыПеретаскивания

Когда мы работаем с формой подбора, основной интерактив происходит при переносе товаров из списка (левая часть формы) в корзину (нижняя или правая часть). В управляемых формах этот процесс реализуется через механизм Drag-and-Drop. Проанализируем, как платформа передает данные в этот момент.

Объект ПараметрыПеретаскивания — это системный объект, который платформа автоматически предоставляет в обработчиках событий «ПроверкаПеретаскивания» и «Перетаскивание». Основным свойством здесь является Значение. Если пользователь перетаскивает строки из динамического списка, то в Значение будет содержаться массив ссылок на выбранные элементы номенклатуры. Если перетаскивание идет из таблицы значений или дерева, там будет массив идентификаторов строк.

Логическая цепочка вызовов обычно выглядит так:

  1. Клиентское событие СписокНоменклатураПеретаскивание.
  2. Вызов серверной процедуры, например, ПеретащитьВКорзинуНаСервере.
  3. Перебор массива полученных данных и формирование строк корзины.

Архитектура хранения данных: Структура ПараметрыТовара

В типовых конфигурациях 1С (УТ 11) данные о товаре не передаются «врассыпную». Для этого используется специальный «контейнер» — структура ПараметрыТовара. Рассмотрим пример того, как инициализируется такая структура. Это критически важный момент: если вы хотите добавить новый реквизит (например, Вес), его необходимо сначала объявить в этой структуре.

Проанализируем пример кода инициализации параметров:


Функция ПараметрыТовара(Номенклатура = Неопределено) Экспорт
    
    ПараметрыТовара = Новый Структура();
    ПараметрыТовара.Вставить("Номенклатура", ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка"));
    ПараметрыТовара.Вставить("Артикул", "");
    ПараметрыТовара.Вставить("Цена", 0);
    ПараметрыТовара.Вставить("Количество", 0);
    ПараметрыТовара.Вставить("Упаковка", ПредопределенноеЗначение("Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка"));
    // Сюда мы можем добавить свой реквизит
    ПараметрыТовара.Вставить("Вес", 0); 
    
    Возврат ПараметрыТовара;
КонецФункции

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

Разбор типичной ошибки: ПредопределенноеЗначение vs Реквизит

Часто начинающие разработчики пытаются получить значение реквизита справочника через функцию ПредопределенноеЗначение(), что приводит к ошибке «Предопределенный элемент не существует». Выясним причину этой ошибки.

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

Рассмотрим правильные способы получения данных на сервере:

  1. Через объект: НоменклатураСсылка.ВесЗнаменатель (допустимо, но может быть медленно при массовом подборе).
  2. Через запрос: Самый оптимальный вариант, особенно если нужно получить данные сразу для списка перетаскиваемых товаров.
  3. Через общие модули: Использование функции ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ВесЗнаменатель").

Как добавить свой реквизит в корзину подбора (на примере Веса)

Предположим, наша задача — отображать и суммировать общий вес товаров в корзине подбора. Разберем по шагам, как это реализовать:

Шаг 1. Модификация структуры. Найдем функцию, инициализирующую ПараметрыТовара, и добавим туда поле Вес (как было показано в примере выше).

Шаг 2. Заполнение данных. В процедуре, которая обрабатывает добавление товара (обычно это серверная процедура, вызываемая после перетаскивания), добавим код получения веса. Рассмотрим пример использования &НаСервереБезКонтекста для оптимизации:


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

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

Методики анализа чужого кода в 1С

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

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

← На главную