Как программно установить отбор в форме выбора документа «Регламентированный отчет» в 1С на обычных формах?

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

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

Выясняем причину сброса программного отбора

Давайте разберем типичную ситуацию. Разработчик пытается открыть форму выбора документов регламентированной отчетности и установить фильтр по конкретному отчету, например, по Декларации по НДС. Для этого пишется следующий код:


ФормаВыбора = Документы.РегламентированныйОтчет.ПолучитьФормуВыбора();
ФормаВыбора.ДокументСписок.Отбор.ИсточникОтчета.ВидСравнения = ВидСравнения.Равно;
ФормаВыбора.ДокументСписок.Отбор.ИсточникОтчета.Значение = "РегламентированныйОтчетДекларацияНДС";
ФормаВыбора.ДокументСписок.Отбор.ИсточникОтчета.Использование = Истина;
ФормаВыбора.ОткрытьМодально();

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

В момент инициализации вызываются процедуры специализированных общих модулей регламентированной отчетности. Эти процедуры выполняют следующие действия:

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

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


Анализ типов данных: Строка или Ссылка?

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

В конфигурациях УПП и УТП ключевые реквизиты документа РегламентированныйОтчет имеют следующие типы:

Поскольку реквизиты строковые, передавать в параметры отбора нужно именно строку. Передача ссылочного типа приведет к ошибке или к тому, что отбор просто не отработает.


Способ 1. Использование параметров формы и доработка события ПередОткрытием (Рекомендуемый)

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

Рассмотрим этот процесс по шагам.

Шаг 1. Вызов формы выбора с передачей параметров

В месте, откуда мы вызываем форму выбора (например, кнопка выбора в поле ввода другого документа или обработки), напишем следующий код:


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

// Получаем форму выбора, передавая структуру параметров в качестве третьего параметра
ФормаВыбора = Документы.РегламентированныйОтчет.ПолучитьФормуВыбора("ФормаВыбора", ЭтаФорма, ПараметрыФормы);

// Открываем форму в модальном режиме
ВыбранныйДокумент = ФормаВыбора.ОткрытьМодально();

Шаг 2. Прием параметров и установка отбора в форме выбора

Теперь откроем форму выбора документа РегламентированныйОтчет в конфигураторе, перейдем в ее модуль и найдем процедуру ПередОткрытием. В самом конце этой процедуры (после вызова всех типовых функций настройки отчетов) добавим обработку наших параметров:


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

КонецПроцедуры

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


Способ 2. Правильный синтаксис установки отбора «на лету»

Если вы хотите установить отбор по наименованию отчета, важно соблюдать корректный синтаксис платформы 1С:Предприятие 8. В обсуждениях часто встречается ошибочный вызов метода Установить() без скобок и параметров, что приводит к синтаксическим ошибкам или игнорированию команды платформой.

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


ФормаВыбора = Документы.РегламентированныйОтчет.ПолучитьФормуВыбора("ФормаВыбора");

// Вариант А: Использование метода Установить()
// Первый параметр - значение отбора (Строка), второй параметр - признак использования (Истина)
ФормаВыбора.ДокументСписок.Отбор.НаименованиеОтчета.Установить("Декларация по НДС", Истина);

// Вариант Б: Явное заполнение свойств элемента отбора
ОтборНаименование = ФормаВыбора.ДокументСписок.Отбор.НаименованиеОтчета;
ОтборНаименование.ВидСравнения = ВидСравнения.Равно;
ОтборНаименование.Значение = "Декларация по НДС";
ОтборНаименование.Использование = Истина;

ФормаВыбора.Заголовок = "Выберите документ ""Декларация по НДС""";
ВыбДок = ФормаВыбора.ОткрытьМодально();

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


Способ 3. Альтернативный обход с использованием Журнала отчетов

В типовых конфигурациях класса ERP, УПП и УТП пользователи редко работают с документами РегламентированныйОтчет напрямую через стандартные списки документов. Для этого существует специализированное рабочее место — обработка «Регламентированная и финансовая отчетность» (известная как Журнал отчетов).

Если перед вами стоит задача открыть форму, где пользователь должен работать с регламентированными отчетами, рассмотрите возможность программного открытия именно этой обработки с передачей в нее нужных параметров фильтрации. Для этого используются экспортные функции общих модулей подсистемы отчетности, например, функции модуля РегламентированнаяОтчетность. Это позволит избежать «велосипедов» с ручной установкой отборов в списках и предоставит пользователю привычный, полнофункциональный интерфейс для работы с отчетностью.

← На главную