При автоматизации отчетности в конфигурациях, построенных на старых механизмах (таких как УПП), разработчики часто сталкиваются с ситуацией, когда программно вызванный отчет открывается с «хвостами» предыдущих настроек. Мы разберем, как правильно инициализировать отчет и передать параметры так, чтобы Оборотно-сальдовая ведомость формировалась именно с теми настройками, которые вам нужны.
Основная сложность заключается в том, что при вызове ПолучитьФорму система 1С считывает из кэша или настроек пользователя последние параметры работы данного отчета. Если мы просто присваиваем ОСВ.Счет = ..., эти данные накладываются на уже существующие фильтры. Чтобы отчет заработал корректно, нам нужно выполнить принудительную очистку состояния ПостроителяОтчета.
Чтобы избежать дублирования условий и влияния старых отборов, выполним действия в следующем порядке:
ПостроителеОтчета.Посмотрим на пример кода, который решает эту задачу:
ОСВ = Отчеты.ОборотноСальдоваяВедомостьПоСчетуХозрасчетный.Создать();
ФормаОтчета = ОСВ.ПолучитьФорму();
ФормаОтчета.Открыть();
// Очистка отборов с конца коллекции, чтобы не нарушать индексы
КоличествоЭлементов = ОСВ.ПостроительОтчета.Отбор.Количество();
Для НомерЭлемента = 1 По КоличествоЭлементов Цикл
ОСВ.ПостроительОтчета.Отбор.Удалить(КоличествоЭлементов - НомерЭлемента);
КонецЦикла;
// Сброс группировок, если нужно
ОСВ.ПостроительОтчета.ИзмеренияСтроки.Очистить();
// Установка параметров
ОСВ.Счет = ПланыСчетов.Хозрасчетный.Материалы;
ОСВ.Организация = Организация;
// Перечитываем настройки и обновляем результат
ОСВ.ЗаполнитьНачальныеНастройки();
ФормаОтчета.ОбновитьОтчет();
При работе с любыми коллекциями 1С, когда вы удаляете элементы в цикле, индексы оставшихся элементов сдвигаются. Если идти от первого к последнему, вы пропустите часть элементов или получите ошибку обращения к индексу. Использование обратного порядка или вычисление индекса КоличествоЭлементов - НомерЭлемента позволяет безопасно очистить всю коллекцию Отбор.
Можно использовать более лаконичный вариант цикла для удаления, который часто встречается в типовых решениях. Суть остается прежней — мы последовательно удаляем элементы, пока коллекция не станет пустой:
КоличествоЭлементов = ОСВ.ПостроительОтчета.Отбор.Количество();
Для НомерЭлемента = -КоличествоЭлементов + 1 По 0 Цикл
ОСВ.ПостроительОтчета.Отбор.Удалить(-НомерЭлемента);
КонецЦикла;
Хотя предложенный метод работает стабильно в УПП, при работе с современными отчетами (на базе СКД — системы компоновки данных) подходы меняются. Если ваша конфигурация использует СКД, старайтесь:
ПостроителемОтчета.КомпоновщикНастроек, через который можно управлять отборами более прозрачно.СкомпоноватьРезультат, если вам не требуется открывать форму пользователю, а нужно вывести результат в табличный документ программно.Помните, что метод ЗаполнитьНачальныеНастройки — это важный инструмент, который восстанавливает структуру отчета к заводским параметрам. Однако, после его вызова ваши ручные установки (такие как ОСВ.Счет) могут быть частично сброшены, поэтому всегда устанавливайте фильтры и параметры после вызова очистки и перед вызовом ОбновитьОтчет.
Следуя этим шагам, вы сможете гибко управлять поведением типовых отчетов и гарантировать, что пользователь всегда получит именно те данные, которые вы подготовили для него в коде.