Как реализовать множественный подбор номенклатуры в управляемых формах 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разбор основной проблемы

Рассмотрим ситуацию: разработчик пытается организовать подбор, но при выборе нескольких строк в документ попадает только одна, либо код вовсе выдает ошибку. Проанализируем причину. По умолчанию форма выбора справочника возвращает одиночную ссылку. Если мы хотим получить список, нам нужно явно указать платформе, что форма должна работать в режиме множественного выбора. Кроме того, важно помнить: как только мы включаем этот режим, возвращаемое значение меняет свой тип со Ссылки на Массив. Это требует изменения логики в обработчике выбора.

Шаг 1: Правильное открытие формы подбора

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

Рассмотрим пример кода для команды «Подбор»:


&НаКлиенте
Процедура Подбор(Команда)
    // Формируем структуру параметров для открываемой формы
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("МножественныйВыбор", Истина);
    ПараметрыВыбора.Вставить("ЗакрыватьПриВыборе", Ложь);
    ПараметрыВыбора.Вставить("РежимВыбора", Истина);
    
    // Открываем форму выбора справочника Номенклатура
    // В качестве владельца указываем элемент формы (таблицу), куда будут возвращаться данные
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыВыбора, Элементы.Номенклатура);
КонецПроцедуры

В данном примере мы используем метод ОткрытьФорму. Обратите внимание на третий параметр — Элементы.Номенклатура. Это «Владелец формы». Указывая его, мы сообщаем системе, что результат выбора должен вернуться в это поле или таблицу, что автоматически вызовет событие ОбработкаВыбора.

Шаг 2: Обработка выбранных данных

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

Разберем по шагам правильный алгоритм обработки:

  1. Проверить, является ли ВыбранноеЗначение массивом.
  2. Если это массив, организовать цикл по всем элементам.
  3. Для каждого элемента проверить, есть ли он уже в табличной части.
  4. Если элемент новый — добавить строку, если старый — увеличить количество.

Пример реализации обработчика:


&НаКлиенте
Процедура НоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    
    // Отключаем стандартную обработку, чтобы платформа не пыталась сама вставить значение
    СтандартнаяОбработка = Ложь;
    
    // При множественном выборе всегда возвращается Массив
    Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
        Для Каждого СсылкаИзСписка Из ВыбранноеЗначение Цикл
            ДобавитьТоварВТаблицу(СсылкаИзСписка);
        КонецЦикла;
    Иначе
        // На случай, если выбран один элемент (не массивом)
        ДобавитьТоварВТаблицу(ВыбранноеЗначение);
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьТоварВТаблицу(ЗначениеНоменклатуры)
    
    // Ищем, есть ли уже такая номенклатура в таблице документа
    ПараметрыОтбора = Новый Структура("Номенклатура", ЗначениеНоменклатуры);
    НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыОтбора);
    
    Если НайденныеСтроки.Количество() > 0 Тогда
        // Если нашли — увеличиваем количество в первой найденной строке
        ТекущаяСтрока = НайденныеСтроки[0];
        ТекущаяСтрока.Количество = ТекущаяСтрока.Количество + 1;
    Иначе
        // Если не нашли — добавляем новую строку
        НоваяСтрока = Объект.Товары.Добавить();
        НоваяСтрока.Номенклатура = ЗначениеНоменклатуры;
        НоваяСтрока.Количество = 1;
    КонецЕсли;
    
КонецПроцедуры

Оптимизация и важные нюансы

Рассмотрим подробнее несколько технических моментов, которые сделают ваш подбор профессиональным:

1. Использование метода НайтиСтроки(). В исходном коде из обсуждения автор использовал полный перебор таблицы Для Каждого внутри другого цикла. Это крайне неэффективно при больших списках товаров. Метод НайтиСтроки работает значительно быстрее, так как оптимизирован на уровне платформы.

2. Режим "ЗакрыватьПриВыборе = Ложь". Это именно то, что превращает "выбор" в "подбор". Пользователь может дважды кликнуть по товару в справочнике, товар добавится в документ, но окно справочника останется открытым для выбора следующей позиции. Это стандарт поведения в торговых решениях 1С.

3. Проверка типов. Всегда проверяйте ТипЗнч(ВыбранноеЗначение). Даже если вы установили множественный выбор, в определенных сценариях (например, при программном вызове из других мест) может прийти одиночная ссылка. Код должен быть устойчив к таким изменениям.

Альтернативный метод через ОповещениеОВыборе

Если вам требуется передать из формы выбора не просто массив ссылок, а более сложные данные (например, цены или остатки), можно рассмотреть механизм оповещений. Рассмотрим эту ситуацию:

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

Этот метод дает максимальную гибкость, но требует создания кастомной формы выбора для справочника Номенклатура.

Заключение

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

← На главную