Как программно добавить строку в регламентированный отчет в 1С:Свод отчетов ПРОФ 3.4

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Финансы и профессиональные услуги
← На главную

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

Понимание механизмов работы с данными отчета

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

Алгоритм добавления строки в таблицу раскрытия

Рассмотрим пошагово процесс добавления строки на примере группы раскрытия с кодом ГР9000. Проанализируем следующий программный код, который следует размещать в правиле обработки:


// Шаг 1. Подготавливаем кэш данных по всем группам раскрытия отчета
КешДанныхГруппРаскрытия = ПодготовитьКэшДанныхПоГруппамРаскрытия(); 

// Шаг 2. Находим нужную нам группу по её коду
СтрокаРасходы = КешДанныхГруппРаскрытия.Найти("ГР9000", "КодГруппыРаскрытия"); 

// Шаг 3. Извлекаем таблицу данных для этой группы
ТаблицаРасходы = ПолучитьТаблицуРаскрытия(СтрокаРасходы.ГруппаРаскрытия); 

// Шаг 4. Добавляем новую строку в таблицу
НовСтр = ТаблицаРасходы.Добавить(); 

// Шаг 5. Заполняем показатели (колонки) и аналитику
НовСтр.стр9000_гр1 = 100; // Пример заполнения числового показателя
НовСтр.Аналитика1 = ЗначениеДляАналитики1; // Установка ссылки на справочник или значения перечисления

// Шаг 6. Восстановление индексации (критически важный этап)
Индекс = 0; 
Для Каждого Строка Из ТаблицаРасходы Цикл 
    Строка.ID = Индекс; 
    Строка.Индекс = Индекс + 1; 
    Индекс = Индекс + 1; 
КонецЦикла; 

// Шаг 7. Применяем изменения обратно к отчету
ПрименитьТаблицуРаскрытия(СтрокаРасходы.ГруппаРаскрытия, ТаблицаРасходы, Ложь);

Важные нюансы при работе с индексацией и типами данных

Проанализируем шестой шаг нашего алгоритма. В таблицах раскрытия «Свода отчетов» поля ID и Индекс являются служебными. Если мы просто добавим строку методом Добавить(), но не обновим нумерацию во всей таблице, система может некорректно отобразить данные или «потерять» их при сохранении. Всегда перезаписывайте индексы циклом после любых манипуляций с составом строк.

Также обратите внимание на типы данных. При заполнении полей типа Аналитика1, Аналитика2 необходимо передавать объект того типа, который ожидается настройками бланка. Если в настройках указан справочник «Учреждения», а вы передадите строку с названием, данные не будут валидны и могут исчезнуть после пересчета отчета.

Почему изменения могут не отображаться в форме?

Если вы написали код, он выполняется без ошибок, но в экранной форме отчета ничего не меняется, выясним возможные причины:

  1. Событие выполнения кода: Убедитесь, что правило обработки вызывается в правильный момент. Рекомендуется использовать обработчик «После обработки показателей», чтобы стандартные алгоритмы очистки не затирали ваши программно созданные строки.
  2. Обновление формы: Иногда данные в объекте уже изменились, но визуальная форма требует обновления. Попробуйте переоткрыть отчет или нажать кнопку «Рассчитать».
  3. Неверный код группы: Проверьте, что ГР9000 — это именно код группы раскрытия, а не код строки или заголовка.

Различие между «Правилами обработки» и «Правилами заполнения» (БГУ)

Часто программисты сталкиваются с тем, что настроенное в «Своде отчетов» правило не работает в базе «1С:Бухгалтерия государственного учреждения» (БГУ) при нажатии кнопки «Заполнить». Выясним причину этой ситуации.

Правила обработки — это внутренний механизм «Свода», предназначенный для внутриформенных и межформенных расчетов внутри централизованной базы. В БГУ же используется механизм «Правил заполнения». Это разные объекты метаданных.

Чтобы ваше заполнение работало в БГУ, выполните следующие действия:

  1. Создайте «Правило заполнения» непосредственно в БГУ (или используйте типовое).
  2. Если требуется сложный алгоритм, используйте «Произвольный алгоритм» внутри этого правила в БГУ.
  3. Выгрузите настроенное правило из БГУ в файл (через меню «Еще» в списке правил).
  4. Загрузите этот файл в комплект отчетности в «Своде отчетов».
  5. При формировании комплекта для БГУ убедитесь, что правило привязано к бланку как «Правило заполнения по умолчанию».

Таким образом, для Свода мы используем Правила обработки, а для первичного сбора данных из учетных регистров БГУ — Правила заполнения. Понимание этого разделения сэкономит вам много времени при настройке взаимодействия между системами.

Работа с фиксированными таблицами

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

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

← На главную