В процессе работы с конфигурациями 1С, особенно в таких решениях как УАТ Стандарт или других старых версиях, разработчики часто сталкиваются с необходимостью ускорить ввод данных. Одной из самых востребованных функций является возможность выбрать не одну позицию номенклатуры за раз, а сразу несколько. Однако простого включения галочки в конфигураторе часто оказывается недостаточно. В этой статье мы подробно разберем, как правильно настроить форму подбора, чтобы пользователь мог выделять строки с помощью клавиш Shift и Ctrl, и как программно обработать этот выбор.
Проанализируем типичную ошибку начинающего разработчика: включение свойства МножественныйВыбор в свойствах динамического списка или табличного поля. Многие полагают, что этого достаточно для активации функционала. На самом деле, это свойство отвечает за возможность системы возвращать массив значений, но оно не управляет поведением самого интерфейса при клике мышкой.
Выясним причину, по которой строки не выделяются группами. Для того чтобы интерфейс позволил пользователю использовать стандартные системные сочетания клавиш для выделения, необходимо настроить свойство Режим выделения (SelectionMode). Рассмотрим два ключевых варианта этого свойства:
Shift (выделение диапазона) и Ctrl (выделение произвольных строк), а также сочетания Ctrl + A (выделить всё).Таким образом, первым шагом в решении нашей задачи будет установка свойства Режим выделения в значение Множественный в палитре свойств элемента формы (Табличного поля или Списка).
Представим ситуацию: пользователь выделил десять позиций номенклатуры и нажал кнопку «Выбрать». Если мы не напишем соответствующий код, система либо ничего не вернет, либо вернет только ту строку, на которой в данный момент стоит фокус (активную строку). Проанализируем, как правильно собрать все выделенные данные.
В 1С существует специальная коллекция ВыделенныеСтроки. Логика работы с ней зависит от типа используемых форм (Обычные или Управляемые).
Вариант для Обычных форм (характерно для старых конфигураций УАТ):
В обычных формах коллекция ВыделенныеСтроки табличного поля часто содержит сразу ссылки на объекты (например, ссылки на справочник Номенклатура). Мы можем перебрать их в цикле:
Для Каждого ТекущаяСсылка Из ЭлементыФормы.СправочникСписок.ВыделенныеСтроки Цикл
// Логика переноса каждой позиции в документ
ОповеститьОВыборе(ТекущаяСсылка);
КонецЦикла;
Вариант для Управляемых форм:
В управляемом интерфейсе коллекция ВыделенныеСтроки содержит не сами ссылки, а идентификаторы строк динамического списка. Чтобы получить данные, нам нужно обратиться к методу ДанныеСтроки(). Рассмотрим пример:
МассивВыбранныхТоваров = Новый Массив;
Для Каждого ИдентификаторСтроки Из Элементы.Список.ВыделенныеСтроки Цикл
ДанныеСтроки = Элементы.Список.ДанныеСтроки(ИдентификаторСтроки);
Если ДанныеСтроки <> Неопределено Тогда
МассивВыбранныхТоваров.Добавить(ДанныеСтроки.Ссылка);
КонецЕсли;
КонецЦикла;
// Передаем весь массив целиком
ОповеститьОВыборе(МассивВыбранныхТоваров);
Разберем еще один важный технический нюанс. Если у формы или элемента управления включено свойство РежимВыбора (ChoiceMode = Истина), 1С ожидает, что по двойному клику форма закроется и вернет одно значение. При реализации множественного подбора это поведение часто мешает.
Рекомендуется рассмотреть следующий подход: отключить стандартный режим выбора и добавить на форму собственную кнопку «Перенести в документ». Это позволит пользователю спокойно выделять товары, менять фильтры и группы, а завершить процесс осознанным нажатием кнопки. При этом в обработчике нажатия кнопки мы будем использовать ОповеститьОВыборе(), передавая туда массив ссылок.
Проанализируем ситуацию, когда пользователю нужно выбрать товары из разных групп справочника. При переключении между папками или изменении условий поиска выделение в динамическом списке может сбрасываться. Чтобы сделать процесс максимально удобным, профессиональные разработчики используют механизм «Корзины».
Посмотрим на шаги реализации этого механизма:
Такой подход исключает потерю выделенных данных при поиске и делает работу пользователя прозрачной. Рассмотрим пример кода для переноса выделенных строк в «Корзину»:
Для Каждого Идентификатор Из Элементы.СписокНоменклатуры.ВыделенныеСтроки Цикл
СтрокаИсточника = Элементы.СписокНоменклатуры.ДанныеСтроки(Идентификатор);
// Проверяем, нет ли уже такого товара в корзине
ПараметрыОтбора = Новый Структура("Номенклатура", СтрокаИсточника.Ссылка);
НайденныеСтроки = Объект.Корзина.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() = 0 Тогда
НоваяСтрока = Объект.Корзина.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника);
НоваяСтрока.Количество = 1;
КонецЕсли;
КонецЦикла;
Проанализируем важный аспект: что произойдет, если пользователь выделит 200–300 позиций одновременно? Если внутри цикла перебора строк мы будем делать запросы к базе данных для получения цен или остатков по каждому товару, интерфейс «зависнет» на длительное время.
Выясним, как этого избежать. Правильной практикой считается сначала собрать все ссылки выделенных строк в один массив, а затем одним запросом получить все необходимые дополнительные данные (цены, характеристики, остатки на складах). Это значительно ускоряет работу подбора и снижает нагрузку на сервер 1С.
Подведем итог: для реализации полноценного множественного выбора в 1С недостаточно одной настройки в конфигураторе. Необходимо сочетание правильной настройки свойств интерфейса (Режим выделения), понимание работы с коллекцией ВыделенныеСтроки и грамотная программная обработка результата, желательно с использованием промежуточного хранилища (корзины) для удобства пользователя.