При попытке сохранить сложный типовой отчет из конфигурации «Зарплата и управление персоналом 3» (например, ОтчетыПоСотрудникам) в виде внешнего отчета (файла с расширением .erf) разработчики часто сталкиваются с ситуацией, когда отчет успешно открывается, формируется без явных синтаксических ошибок платформы, однако результат компоновки оказывается абсолютно пустым. Разберем по шагам внутренние механизмы подсистем ЗУП 3 и Библиотеки стандартных подсистем (БСП), выясним причину такого поведения и рассмотрим рабочие способы адаптации отчета.
Проанализируем ситуацию изнутри. В конфигурациях линейки ЗУП 3 и других типовых решениях на базе БСП архитектура отчетов существенно отличается от классической схемы компоновки данных (СКД):
ВЫБРАТЬ ПЕРВЫЕ 0 ... или псевдозапрос к временным таблицам. Реальный текст запроса генерируется программно в момент компоновки при обращении к процедурам общих модулей (например, ЗарплатаКадрыОбщиеНаборыДанных).НастроитьВариантыОтчета(Настройки, НастройкиОтчета), БСП штатно ищет именно в модуле менеджера объекта конфигурации.ВнешнийОтчет.*) эта проверка возвращает отрицательный результат, из-за чего алгоритм инициализации схемы компоновки и вызова генерации запросов прерывается.Если требуется запустить именно отдельный внешний отчет без внесения изменений в основную конфигурацию, необходимо скопировать типовую форму и скорректировать логику инициализации БСП.
ФормаОтчета. Копируем ее целиком во внешний отчет и назначаем основной формой отчета.ПриСозданииНаСервере). В ней выполняется поиск настроек в кэше БСП. Выясним причину сбоя: подсистема пытается найти внешний отчет в коллекции зарегистрированных через вызов вида:
ВариантыОтчетовПовтИсп.Параметры().ОтчетыСНастройками.Найти(НастройкиОтчета.ОтчетСсылка)
НастройкиОтчета.ОтчетСсылка не является ссылкой на объект метаданных конфигурации. В результате условие не выполняется, и отчет не инициализирует свои параметры.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);
// Выполняем стандартную инициализацию и вывод СКД
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Рассмотрим еще одну распространенную проблему: разработчик изменяет макет печатной формы внутри внешнего отчета (например, макет личной карточки ПФ_MXL_Т2), но при формировании отчета в режиме «1С:Предприятие» изменения не отображаются.
Проанализируем код модуля объекта отчета. В типовом решении получение макетов часто реализовано через вызовы общей подсистемы печати по полному имени метаданных:
МакетГруппировки = УправлениеПечатью.МакетПечатнойФормы("Отчет.ОтчетыПоСотрудникам.ПФ_MXL_Т2");
В такой ситуации внешний отчет принудительно обращается к макету встроенного в конфигурацию отчета, игнорируя собственный макет. Чтобы макет считывался из самого внешнего файла, необходимо заменить обращение к УправлениеПечатью на метод текущего объекта:
МакетГруппировки = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_Т2");
Важно: проверьте все вхождения имени макета в модуле объекта — как правило, процедура вывода формирует шапку и строки в разных методах, поэтому вызов ПолучитьМакет должен быть скорректирован во всех местах формирования печатной формы.
Если нет жесткого требования использовать именно отдельный файл .erf, наиболее надежным решением является добавление копии отчета в основную конфигурацию или в расширение конфигурации (.cfe).
В отличие от внешнего отчета, объект в расширении сохраняет модуль менеджера и полноценно взаимодействует с подсистемами БСП. Однако при простом копировании отчета внутри конфигурации пользователи сталкиваются с тем, что у новой копии пропадают варианты отчетов. Разберем по шагам, как правильно зарегистрировать новый отчет:
НастроитьВариантыОтчета, где описаны ключи и наименования вариантов (например, ШтатныеСотрудники, ЛичныеДанныеСотрудников, УволенныеСотрудники).ЗарплатаКадрыОтчетыБазовый находим процедуру НастроитьВариантыОтчетов и добавляем вызов для нового отчета:
ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ОтчетыПоСотрудникамНовый);
ВариантыОтчетов. Простого добавления кода в модуль недостаточно — платформа должна обновить метаданные в информационной базе. Для этого необходимо запустить базу в режиме «1С:Предприятие» с ключом командной строки:
1cv8.exe ENTERPRISE /F "ПутьКБазе" /C ЗапуститьОбновлениеИнформационнойБазы
Либо выполнить программное обновление через внешнюю обработку или консоль кода вызовом:
ВариантыОтчетов.Обновить();
После обновления предопределенные варианты появятся в пользовательском интерфейсе.Если при попытке отладить код точки останова в модуле объекта или схемы компоновки не срабатывают, убедимся в правильности настроек отладчика: