В процессе работы с конфигурацией «1С:Свод отчетов ПРОФ 3.4» часто возникает необходимость автоматизировать заполнение сложных форм. Одной из наиболее востребованных задач является программное добавление новых строк в динамические разделы отчета (таблицы раскрытия). Рассмотрим подробно, как это реализовать с помощью механизмов «Правил обработки».
Прежде чем переходить к написанию кода, разберем, как система хранит данные в многострочных частях. В «Своде отчетов» данные динамических разделов организованы в виде групп раскрытия. Для оптимизации работы система не обращается к базе данных за каждой строкой отдельно, а использует специальный кэш. Поэтому наша работа будет состоять из трех этапов: получение данных в кэш, манипуляция строками и фиксация изменений.
Рассмотрим пошагово процесс добавления строки на примере группы раскрытия с кодом ГР9000. Проанализируем следующий программный код, который следует размещать в правиле обработки:
// Шаг 1. Подготавливаем кэш данных по всем группам раскрытия отчета
КешДанныхГруппРаскрытия = ПодготовитьКэшДанныхПоГруппамРаскрытия();
// Шаг 2. Находим нужную нам группу по её коду
СтрокаРасходы = КешДанныхГруппРаскрытия.Найти("ГР9000", "КодГруппыРаскрытия");
// Шаг 3. Извлекаем таблицу данных для этой группы
ТаблицаРасходы = ПолучитьТаблицуРаскрытия(СтрокаРасходы.ГруппаРаскрытия);
// Шаг 4. Добавляем новую строку в таблицу
НовСтр = ТаблицаРасходы.Добавить();
// Шаг 5. Заполняем показатели (колонки) и аналитику
НовСтр.стр9000_гр1 = 100; // Пример заполнения числового показателя
НовСтр.Аналитика1 = ЗначениеДляАналитики1; // Установка ссылки на справочник или значения перечисления
// Шаг 6. Восстановление индексации (критически важный этап)
Индекс = 0;
Для Каждого Строка Из ТаблицаРасходы Цикл
Строка.ID = Индекс;
Строка.Индекс = Индекс + 1;
Индекс = Индекс + 1;
КонецЦикла;
// Шаг 7. Применяем изменения обратно к отчету
ПрименитьТаблицуРаскрытия(СтрокаРасходы.ГруппаРаскрытия, ТаблицаРасходы, Ложь);
Проанализируем шестой шаг нашего алгоритма. В таблицах раскрытия «Свода отчетов» поля ID и Индекс являются служебными. Если мы просто добавим строку методом Добавить(), но не обновим нумерацию во всей таблице, система может некорректно отобразить данные или «потерять» их при сохранении. Всегда перезаписывайте индексы циклом после любых манипуляций с составом строк.
Также обратите внимание на типы данных. При заполнении полей типа Аналитика1, Аналитика2 необходимо передавать объект того типа, который ожидается настройками бланка. Если в настройках указан справочник «Учреждения», а вы передадите строку с названием, данные не будут валидны и могут исчезнуть после пересчета отчета.
Если вы написали код, он выполняется без ошибок, но в экранной форме отчета ничего не меняется, выясним возможные причины:
ГР9000 — это именно код группы раскрытия, а не код строки или заголовка.Часто программисты сталкиваются с тем, что настроенное в «Своде отчетов» правило не работает в базе «1С:Бухгалтерия государственного учреждения» (БГУ) при нажатии кнопки «Заполнить». Выясним причину этой ситуации.
Правила обработки — это внутренний механизм «Свода», предназначенный для внутриформенных и межформенных расчетов внутри централизованной базы. В БГУ же используется механизм «Правил заполнения». Это разные объекты метаданных.
Чтобы ваше заполнение работало в БГУ, выполните следующие действия:
Таким образом, для Свода мы используем Правила обработки, а для первичного сбора данных из учетных регистров БГУ — Правила заполнения. Понимание этого разделения сэкономит вам много времени при настройке взаимодействия между системами.
Важно помнить, что метод ТаблицаРасходы.Добавить() работает только для динамических разделов. Если вам нужно заполнить данные в фиксированной сетке отчета, где количество строк неизменно, используйте коллекцию ТаблицаПоказателей. В этом случае вы не добавляете новые строки, а находите существующие по кодам строки и графы и присваиваете им значения напрямую.
Используя предложенные методы, вы сможете гибко управлять структурой регламентированных отчетов, обеспечивая корректное заполнение даже самых сложных форм в автоматическом режиме.