При разработке обработок в среде 1С:Предприятие 8 часто возникает задача предоставить пользователю возможность выбрать не один конкретный документ, а целый список объектов. Стандартный реквизит типа ДокументСсылка позволяет хранить только одну ссылку, что ограничивает функционал. В этой статье мы подробно разберем, как обойти это ограничение, какие инструменты платформы использовать и как правильно написать код для обработки множественного выбора. В качестве готовой альтернативы ручной разработке можно использовать обработку для группового выбора и изменения справочников и документов.
Существует три основных способа реализации множественного выбора, каждый из которых подходит для своих сценариев:
Проанализируем ситуацию: когда пользователь нажимает на кнопку выбора (три точки), платформа по умолчанию ожидает выбора одного элемента. Чтобы изменить это поведение, нам придется вмешаться в процесс открытия формы выбора и обработки результата.
Если мы решим использовать реквизит формы с типом СписокЗначений, нам необходимо правильно настроить его типы, иначе при выборе система будет постоянно спрашивать, какой тип данных мы хотим добавить. Рассмотрим подробнее, как ограничить выбор конкретным видом документа.
Для начала, при создании формы на сервере, нам нужно программно указать, элементы какого типа могут находиться в этом списке. Выясним причину, почему это важно: без явного указания типа СписокЗначений является составным, что усложняет жизнь пользователю.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Указываем, что в списке значений могут быть только ссылки на Приходный кассовый ордер
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ДокументСсылка.ПриходныйКассовыйОрдер"));
ОписаниеТ = Новый ОписаниеТипов(МассивТипов);
// Ограничиваем тип значений элементов списка
Объект.СписокДокументов.ТипЗначения = ОписаниеТ;
КонецПроцедуры
Теперь рассмотрим, как вызвать форму выбора так, чтобы в ней можно было выделить сразу несколько строк. Для этого используется параметр МножественныйВыбор.
&НаКлиенте
Процедура СписокДокументовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартное поведение
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("МножественныйВыбор", Истина);
ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь); // Позволяет делать подбор без закрытия формы
ОткрытьФорму("Документ.ПриходныйКассовыйОрдер.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Наиболее профессиональным и удобным для пользователя способом является использование табличной части. Это позволяет не только выбрать документы, но и сразу увидеть их список на форме, удалить лишние или просмотреть детали. Посмотрим на пример кода, который реализует заполнение табличной части при выборе нескольких объектов. При необходимости можно использовать универсальный инструмент для подбора и обработки объектов на управляемых формах.
В данном случае мы используем обработчик ОбработкаВыбора, который срабатывает, когда пользователь нажимает кнопку "Выбрать" в открытой форме списка. Важно помнить: при множественном выборе ВыбранноеЗначение всегда будет массивом.
&НаКлиенте
Процедура ТаблицаДокументовОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
// Проанализируем ситуацию: если выбрано несколько элементов, придет массив
Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда
Для Каждого ТекущийДокумент Из ВыбранноеЗначение Цикл
// Проверим, нет ли уже такого документа в нашей таблице, чтобы избежать дублей
ПараметрыПоиска = Новый Структура("Документ", ТекущийДокумент);
НайденныеСтроки = Объект.ТаблицаДокументов.НайтиСтроки(ПараметрыПоиска);
Если НайденныеСтроки.Количество() = 0 Тогда
НоваяСтрока = Объект.ТаблицаДокументов.Добавить();
НоваяСтрока.Документ = ТекущийДокумент;
КонецЕсли;
КонецЦикла;
Иначе
// Если выбран один элемент (не массив)
НоваяСтрока = Объект.ТаблицаДокументов.Добавить();
НоваяСтрока.Документ = ВыбранноеЗначение;
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее несколько важных моментов, которые сделают работу пользователя комфортнее:
1. Режим закрытия формы. Если мы установим ЗакрыватьПриВыборе = Ложь в параметрах открытия формы, пользователь сможет выделять документы и нажимать "Выбрать", при этом форма выбора не будет закрываться. Это называется режимом "Подбора". Это очень удобно, когда нужно выбрать 10-20 документов из разных частей списка.
2. Отображение списка. Если вы используете СписокЗначений, на форме его лучше представлять не как поле ввода, а как Поле списка. Это позволит пользователю сразу видеть все добавленные элементы, а не просто надпись "Список значений...".
3. Использование оповещений (Callback). В современной платформе 8.3 рекомендуется использовать ОписаниеОповещения. Это позволяет более гибко управлять логикой возврата данных из формы выбора, особенно в асинхронном режиме работы веб-клиента.
Проанализируем пример с использованием оповещения:
&НаКлиенте
Процедура ВыбратьДокументы(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораДокументов", ЭтотОбъект);
ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина);
ОткрытьФорму("Документ.ПриходныйКассовыйОрдер.ФормаВыбора", ПараметрыФормы, , , , , Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораДокументов(РезультатВыбора, ДополнительныеПараметры) Экспорт
Если РезультатВыбора <> Неопределено Тогда
// Обрабатываем массив выбранных ссылок
Для Каждого Ссылка Из РезультатВыбора Цикл
// Ваша логика добавления
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Часто программисты сталкиваются с тем, что метод Добавить() не обнаружен. Выясним причину: это происходит, если вы пытаетесь вызвать метод Добавить() у самого реквизита, который имеет тип ДокументСсылка (одиночная ссылка), а не у коллекции (Табличная часть или Список значений). Всегда проверяйте типы данных в окне свойств реквизита в конфигураторе.
Также важно помнить о свойстве Тип значения элементов. Если вы создаете список значений на форме программно, обязательно инициализируйте его описание типов, чтобы система знала, как обрабатывать визуальное представление ссылок (иконки документов, контекстное меню).
Подводя итог, можно сказать, что выбор нескольких документов — это комбинация правильно настроенного реквизита-коллекции и программного открытия формы выбора с флагом МножественныйВыбор. Выбирайте табличную часть для сложных задач и список значений для простых фильтров в отчетах или обработках.