В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача открыть форму выбора документа или справочника с уже предустановленными фильтрами. Типичная ситуация: пользователю нужно подобрать документы только за определенный период или по конкретной хозяйственной операции. Однако иногда разработчики сталкиваются с тем, что передаваемые настройки «игнорируются» системой, и форма открывается без необходимых фильтров. Рассмотрим подробно, как правильно реализовать такой отбор, проанализируем типичные ошибки и разберем работающий программный код.
Для того чтобы передать настройки отбора в открываемую форму, мы используем механизм Системы Компоновки Данных (СКД), так как современные динамические списки в управляемых формах работают именно на базе этой технологии. Основной способ жестко ограничить выборку — использовать параметр ФиксированныеНастройки.
Рассмотрим пошагово правильный алгоритм реализации отбора в модуле команды или обработчике нажатия кнопки:
НастройкиКомпоновкиДанных, который будет хранить наши условия.Отбор.Элементы.ОткрытьФорму, передав созданные настройки.Проанализируем пример кода, который решает задачу фильтрации по хозяйственной операции и периоду (интервалу дат):
&НаКлиенте
Процедура ПодборВводаОстатков(Команда)
// 1. Создаем объект настроек
НастройкиКомпоновки = Новый НастройкиКомпоновкиДанных;
// 2. Группируем условия (необязательно, но полезно для сложной логики)
ГруппаОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
// 3. Добавляем отбор по Хозяйственной Операции
ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ХозяйственнаяОперация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ВводОстатковСобственныхТоваров");
// 4. Добавляем нижнюю границу даты (Больше или равно)
ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = '20161231000000'; // Начало дня
// 5. Добавляем верхнюю границу даты (Меньше или равно)
ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = '20161231170000'; // 17:00:00
// 6. Формируем параметры открытия
ПараметрыВыбора = Новый Структура;
ПараметрыВыбора.Вставить("ФиксированныеНастройки", НастройкиКомпоновки);
ПараметрыВыбора.Вставить("РежимВыбора", Истина);
// 7. Описываем оповещение о выборе
ОбработкаВыбора = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбора", ЭтаФорма);
// 8. Открываем форму
ОткрытьФорму("Документ.ВводОстатков.ФормаВыбора", ПараметрыВыбора, Элементы.СписокДокументов, , , , ОбработкаВыбора);
КонецПроцедуры
Выясним причины, по которым даже правильный с виду код может не давать результата. Рассмотрим основные технические нюансы, которые часто упускают из виду.
1. Особенности «Фиксированных настроек»
Важно понимать, что когда мы передаем параметр ФиксированныеНастройки, платформа накладывает их «поверх» динамического списка таким образом, что пользователь не может их изменить или отключить через стандартное окно настроек списка. Если вы открываете форму и не видите установленных флажков в интерфейсе «Настроить список», это не всегда означает, что отбор не сработал. Проверьте саму выборку документов: если список пуст или ограничен нужными рамками — код работает корректно.
2. Переопределение настроек внутри формы
Проанализируем ситуацию в модуле открываемой формы (например, ФормаВыбора документа). Очень часто в типовых конфигурациях (ERP, КА, УТ 11) в процедуре ПриСозданииНаСервере прописана логика, которая программно меняет настройки динамического списка. Если в коде формы есть вызовы типа ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка или прямая модификация Список.КомпоновкаДанных.Настройки, ваши переданные параметры могут быть просто затерты или дополнены конфликтующими условиями.
3. Точность времени в датах
В 1С тип Дата всегда включает время. Если вы устанавливаете отбор МеньшеИлиРавно по значение '20161231170000', а документ в базе данных записан со временем 17:00:01, он не попадет в выборку. Рекомендуем всегда использовать встроенные функции для формирования границ периода, такие как КонецДня() или КонецМинуты(), чтобы избежать подобных казусов.
Вместо того чтобы создавать два отдельных элемента отбора для одной даты (больше или равно и меньше или равно), мы можем использовать более современный и компактный способ — ВидСравненияКомпоновкиДанных.Интервал. Это делает структуру настроек чище и понятнее.
Посмотрим на пример реализации такого отбора:
// Создаем интервал дат
ГраницаИнтервала = Новый СтандартныйПериод;
ГраницаИнтервала.ДатаНачала = НачалоДня(ДатаОтбора);
ГраницаИнтервала.ДатаОкончания = КонецДня(ДатаОтбора);
ЭлементОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ИнтервалВключаяГраницы;
ЭлементОтбора.ПравоеЗначение = ГраницаИнтервала;
ЭлементОтбора.Использование = Истина;
Если отбор все же не срабатывает, рекомендуем выполнить следующие действия:
ПриСозданииНаСервере. Проверьте значение Параметры.ФиксированныеНастройки. Если они там есть, значит передача прошла успешно.Дата или ХозяйственнаяОперация доступно для отбора в самом динамическом списке формы (свойство «Настройка списка» в конфигураторе).Настройки вместо ФиксированныеНастройки, однако помните, что это потребует дополнительной обработки в коде формы выбора.Таким образом, мы выяснили, что наиболее надежным способом программной фильтрации является использование ФиксированныхНастроек в связке с ПолеКомпоновкиДанных. В большинстве случаев «неработающий» отбор оказывается следствием либо невнимательности при указании времени в датах, либо наличием перекрывающего кода в самой форме выбора.