Как программно открыть форму выбора документа с отбором по организации и периоду

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

При разработке внешних обработок, помощников заполнения табличных частей и специализированных рабочих мест часто возникает задача предоставить пользователю возможность выбора документов, заранее отфильтрованных по заданным критериям — например, по конкретной организации и диапазону дат. Разберем по шагам, как правильно наложить отбор на открываемую форму выбора документа или журнала, выясним частые ошибки и рассмотрим корректные конструкции кода.

Особенности установки отбора в обычных формах (толстый клиент)

При работе в обычном интерфейсе разработчики нередко сталкиваются с ошибкой «Поле объекта недоступно для записи» при попытке прямого присвоения значения элементу отбора: ФормаВыбора.Отбор.Организация = НужнаяОрганизация;. Это происходит потому, что свойство Отбор содержит коллекцию элементов типа ЭлементОтбора, каждый из которых имеет свои свойства и методы.

Рассмотрим, как правильно настроить отбор по реквизиту на точное совпадение (например, по организации). Проанализируем два рабочих варианта реализации.

Вариант 1: Поэлементная настройка свойств отбора

Обратите внимание на последовательность строк: крайне важно сначала задать ВидСравнения, а затем заполнять Значение и включать Использование. В противном случае платформа может сгенерировать ошибку несоответствия типов данных для текущего вида сравнения.


ФормаВыбора = Документы.ПоступлениеТоваровУслуг.ПолучитьФормуВыбора();
ФормаВыбора.МножественныйВыбор = Истина;

// Сначала указываем вид сравнения
ФормаВыбора.Отбор.Организация.ВидСравнения = ВидСравнения.Равно;
// Затем устанавливаем значение
ФормаВыбора.Отбор.Организация.Значение = НужнаяОрганизация;
// Активируем отбор
ФормаВыбора.Отбор.Организация.Использование = Истина;

ВыбранныеЗначения = ФормаВыбора.ОткрытьМодально();

Вариант 2: Использование встроенного метода «Установить»

Для быстрого и безопасного наложения простого отбора на равенство без риска нарушить порядок заполнения свойств у объекта ЭлементОтбора предусмотрен встроенный метод Установить:


ФормаВыбора = Документы.ПоступлениеТоваровУслуг.ПолучитьФормуВыбора();
ФормаВыбора.МножественныйВыбор = Истина;

// Метод Установить принимает значение и флаг использования
ФормаВыбора.Отбор.Организация.Установить(НужнаяОрганизация, Истина);

ВыбранныеЗначения = ФормаВыбора.ОткрытьМодально();

Установка отбора по интервалу дат (периоду)

Посмотрим на пример установки отбора по периоду. Когда необходимо ограничить список документов диапазоном дат (например, за текущий день или выбранный интервал), прямое присвоение значения не подходит. Для этого используется вид сравнения ВидСравнения.ИнтервалВключаяГраницы (или ВидСравнения.Интервал) и специальные свойства ЗначениеС и ЗначениеПо.


ФормаВыбора = Документы.ПоступлениеТоваровУслуг.ПолучитьФормуВыбора();
ФормаВыбора.МножественныйВыбор = Истина;

// 1. Настройка отбора по организации
ФормаВыбора.Отбор.Организация.ВидСравнения = ВидСравнения.Равно;
ФормаВыбора.Отбор.Организация.Значение = Объект.Организация;
ФормаВыбора.Отбор.Организация.Использование = Истина;

// 2. Настройка отбора по периоду документа
ФормаВыбора.Отбор.Дата.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;
ФормаВыбора.Отбор.Дата.ЗначениеС = НачалоДня(Объект.Дата);
ФормаВыбора.Отбор.Дата.ЗначениеПо = КонецДня(Объект.Дата);
ФормаВыбора.Отбор.Дата.Использование = Истина;

ВыбранныеЗначения = ФормаВыбора.ОткрытьМодально();

Ограничение изменения отбора пользователем

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


ФормаВыбора.ЭлементыФормы.ДокументСписок.НастройкаОтбора.Организация.Доступность = Ложь;
ФормаВыбора.ЭлементыФормы.ДокументСписок.НастройкаОтбора.Дата.Доступность = Ложь;

Особенности наложения отбора в журналах документов

Если открывается форма общего журнала документов (через менеджер ЖурналыДокументов), а не конкретного вида документа, важно учитывать правила платформы 1С:

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

Реализация аналогичной задачи в управляемых формах (1С 8.3)

Проанализируем ситуацию, когда разработка ведется на управляемом интерфейсе. Механизмы модальности и прямая коллекция Отбор формы в тонком клиенте больше не используются. Разберем два подхода.

1. Передача простых отборов через параметры формы

Для отбора на точное равенство достаточно передать структуру в параметр Отбор:


ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Организация", Объект.Организация);

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
ПараметрыФормы.Вставить("МножественныйВыбор", Истина);

ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.ФормаВыбора", ПараметрыФормы, ЭтотОбъект);

2. Установка интервала дат в динамическом списке

Поскольку структура Отбор параметров формы поддерживает только проверку на точное равенство, для фильтрации по периоду дат накладывают условие на динамический список формы выбора — например, через компоновщик настроек в событии формы выбора ПриСозданииНаСервере или передавая ФиксированныеНастройки:


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

Также помните, что вызов ОткрытьМодально() в современных версиях платформы 1С 8.3 не рекомендуется и блокируется при включенном режиме «Запрещать модальные вызовы». Для получения результата выбора пользователя используйте параметр ЗакрыватьПриВыборе и обработку выбора через процедуру ОбработкаВыбора формы-владельца либо объект ОписаниеОповещения.

← На главную