Почему не срабатывает программный отбор по дате при открытии формы выбора и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача открыть форму выбора документа или справочника с уже предустановленными фильтрами. Типичная ситуация: пользователю нужно подобрать документы только за определенный период или по конкретной хозяйственной операции. Однако иногда разработчики сталкиваются с тем, что передаваемые настройки «игнорируются» системой, и форма открывается без необходимых фильтров. Рассмотрим подробно, как правильно реализовать такой отбор, проанализируем типичные ошибки и разберем работающий программный код.

Разбор механизма установки отбора через параметры формы

Для того чтобы передать настройки отбора в открываемую форму, мы используем механизм Системы Компоновки Данных (СКД), так как современные динамические списки в управляемых формах работают именно на базе этой технологии. Основной способ жестко ограничить выборку — использовать параметр ФиксированныеНастройки.

Рассмотрим пошагово правильный алгоритм реализации отбора в модуле команды или обработчике нажатия кнопки:

  1. Создадим объект НастройкиКомпоновкиДанных, который будет хранить наши условия.
  2. Добавим элементы отбора в коллекцию Отбор.Элементы.
  3. Сформируем структуру параметров для открытия формы.
  4. Вызовем метод ОткрытьФорму, передав созданные настройки.

Проанализируем пример кода, который решает задачу фильтрации по хозяйственной операции и периоду (интервалу дат):


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

Почему отбор может не отображаться или не работать?

Выясним причины, по которым даже правильный с виду код может не давать результата. Рассмотрим основные технические нюансы, которые часто упускают из виду.

1. Особенности «Фиксированных настроек»
Важно понимать, что когда мы передаем параметр ФиксированныеНастройки, платформа накладывает их «поверх» динамического списка таким образом, что пользователь не может их изменить или отключить через стандартное окно настроек списка. Если вы открываете форму и не видите установленных флажков в интерфейсе «Настроить список», это не всегда означает, что отбор не сработал. Проверьте саму выборку документов: если список пуст или ограничен нужными рамками — код работает корректно.

2. Переопределение настроек внутри формы
Проанализируем ситуацию в модуле открываемой формы (например, ФормаВыбора документа). Очень часто в типовых конфигурациях (ERP, КА, УТ 11) в процедуре ПриСозданииНаСервере прописана логика, которая программно меняет настройки динамического списка. Если в коде формы есть вызовы типа ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка или прямая модификация Список.КомпоновкаДанных.Настройки, ваши переданные параметры могут быть просто затерты или дополнены конфликтующими условиями.

3. Точность времени в датах
В 1С тип Дата всегда включает время. Если вы устанавливаете отбор МеньшеИлиРавно по значение '20161231170000', а документ в базе данных записан со временем 17:00:01, он не попадет в выборку. Рекомендуем всегда использовать встроенные функции для формирования границ периода, такие как КонецДня() или КонецМинуты(), чтобы избежать подобных казусов.

Улучшенный подход: Использование вида сравнения «Интервал»

Вместо того чтобы создавать два отдельных элемента отбора для одной даты (больше или равно и меньше или равно), мы можем использовать более современный и компактный способ — ВидСравненияКомпоновкиДанных.Интервал. Это делает структуру настроек чище и понятнее.

Посмотрим на пример реализации такого отбора:


// Создаем интервал дат
ГраницаИнтервала = Новый СтандартныйПериод;
ГраницаИнтервала.ДатаНачала = НачалоДня(ДатаОтбора);
ГраницаИнтервала.ДатаОкончания = КонецДня(ДатаОтбора);

ЭлементОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ИнтервалВключаяГраницы;
ЭлементОтбора.ПравоеЗначение = ГраницаИнтервала;
ЭлементОтбора.Использование = Истина;

Как отладить проблему?

Если отбор все же не срабатывает, рекомендуем выполнить следующие действия:

  1. Точка останова в форме выбора: Перейдите в модуль формы, которую вы открываете, и поставьте точку останова в процедуре ПриСозданииНаСервере. Проверьте значение Параметры.ФиксированныеНастройки. Если они там есть, значит передача прошла успешно.
  2. Проверка доступности поля: Убедитесь, что поле Дата или ХозяйственнаяОперация доступно для отбора в самом динамическом списке формы (свойство «Настройка списка» в конфигураторе).
  3. Использование обычных «Настроек»: Если вам нужно, чтобы пользователь видел отбор и мог его корректировать, попробуйте передавать параметр Настройки вместо ФиксированныеНастройки, однако помните, что это потребует дополнительной обработки в коде формы выбора.

Таким образом, мы выяснили, что наиболее надежным способом программной фильтрации является использование ФиксированныхНастроек в связке с ПолеКомпоновкиДанных. В большинстве случаев «неработающий» отбор оказывается следствием либо невнимательности при указании времени в датах, либо наличием перекрывающего кода в самой форме выбора.

← На главную