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