Как программно сформировать Оборотно-сальдовую ведомость по счету со своими отборами?

Программист 1С v8.3 (Обычные формы) 1С:ERP Управление предприятием Бухгалтерский учет Промышленность, строительство и АПК
← На главную

При автоматизации отчетности в конфигурациях, построенных на старых механизмах (таких как УПП), разработчики часто сталкиваются с ситуацией, когда программно вызванный отчет открывается с «хвостами» предыдущих настроек. Мы разберем, как правильно инициализировать отчет и передать параметры так, чтобы Оборотно-сальдовая ведомость формировалась именно с теми настройками, которые вам нужны.

Разбор проблемы инициализации

Основная сложность заключается в том, что при вызове ПолучитьФорму система 1С считывает из кэша или настроек пользователя последние параметры работы данного отчета. Если мы просто присваиваем ОСВ.Счет = ..., эти данные накладываются на уже существующие фильтры. Чтобы отчет заработал корректно, нам нужно выполнить принудительную очистку состояния ПостроителяОтчета.

Пошаговое решение: очистка и настройка

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

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

Посмотрим на пример кода, который решает эту задачу:


ОСВ = Отчеты.ОборотноСальдоваяВедомостьПоСчетуХозрасчетный.Создать();
ФормаОтчета = ОСВ.ПолучитьФорму();
ФормаОтчета.Открыть();

// Очистка отборов с конца коллекции, чтобы не нарушать индексы
КоличествоЭлементов = ОСВ.ПостроительОтчета.Отбор.Количество();
Для НомерЭлемента = 1 По КоличествоЭлементов Цикл
    ОСВ.ПостроительОтчета.Отбор.Удалить(КоличествоЭлементов - НомерЭлемента);
КонецЦикла;

// Сброс группировок, если нужно
ОСВ.ПостроительОтчета.ИзмеренияСтроки.Очистить();

// Установка параметров
ОСВ.Счет = ПланыСчетов.Хозрасчетный.Материалы;
ОСВ.Организация = Организация;

// Перечитываем настройки и обновляем результат
ОСВ.ЗаполнитьНачальныеНастройки();
ФормаОтчета.ОбновитьОтчет();

Почему важно удалять элементы с конца?

При работе с любыми коллекциями 1С, когда вы удаляете элементы в цикле, индексы оставшихся элементов сдвигаются. Если идти от первого к последнему, вы пропустите часть элементов или получите ошибку обращения к индексу. Использование обратного порядка или вычисление индекса КоличествоЭлементов - НомерЭлемента позволяет безопасно очистить всю коллекцию Отбор.

Альтернативный вариант цикла

Можно использовать более лаконичный вариант цикла для удаления, который часто встречается в типовых решениях. Суть остается прежней — мы последовательно удаляем элементы, пока коллекция не станет пустой:


КоличествоЭлементов = ОСВ.ПостроительОтчета.Отбор.Количество();
Для НомерЭлемента = -КоличествоЭлементов + 1 По 0 Цикл
    ОСВ.ПостроительОтчета.Отбор.Удалить(-НомерЭлемента);
КонецЦикла;

Рекомендации по дальнейшей оптимизации

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

Помните, что метод ЗаполнитьНачальныеНастройки — это важный инструмент, который восстанавливает структуру отчета к заводским параметрам. Однако, после его вызова ваши ручные установки (такие как ОСВ.Счет) могут быть частично сброшены, поэтому всегда устанавливайте фильтры и параметры после вызова очистки и перед вызовом ОбновитьОтчет.

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

← На главную