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