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