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