При разработке или модификации отчетов в программе 1С:Зарплата и управление персоналом, редакция 3.1 программисты часто сталкиваются с ситуацией, когда типовой отчет (например, «Штатное расписание (Т-3)» или «Начисления штатного расписания»), сохраненный как внешний, отказывается работать. При попытке формирования выводится сообщение: «В настройку отчета Т-3 внесены критичные изменения. Отчет не будет сформирован. Метод объекта не обнаружен (НачислениеРайонныйКоэффициент)». При этом тот же самый отчет внутри конфигурации работает без нареканий.
В данной статье мы подробно разберем, почему возникает эта ошибка, как механизмы БСП (Библиотеки стандартных подсистем) влияют на работу внешних отчетов и какие шаги необходимо предпринять для успешного запуска отчета.
Для начала проанализируем текст ошибки. Сообщение о «критичных изменениях» не является стандартной системной ошибкой платформы «1С:Предприятие». Это программное исключение, которое генерируется внутри самого кода отчета, как правило, в процедуре ПриКомпоновкеРезультата модуля объекта. Разработчики фирмы 1С предусмотрели проверку, которая защищает сложные отчёты от некорректного исполнения, если структура данных или программный контекст не соответствуют ожидаемым.
Основная проблема кроется в методе НачислениеРайонныйКоэффициент. В типовой конфигурации ЗУП 3.1 этот метод часто определен в модуле менеджера Плана видов расчета (ПВР) «Начисления» или в специфических общих модулях. Когда отчет работает как встроенный, он имеет прямой доступ к контексту конфигурации. Однако при запуске внешнего отчета через Файл — Открыть или через механизм дополнительных отчетов и обработок, система может терять связь с некоторыми методами, если они вызываются через ЭтотОбъект или если срабатывают механизмы безопасного режима.
Рассмотрим основные причины конфликта:
Метод объекта не обнаружен часто возникает из-за того, что код отчета пытается обратиться к функциям, которые доступны только встроенному объекту метаданных.Как показывает практика практикующих разработчиков, самым быстрым и эффективным способом решения данной проблемы является полное переименование объекта. Выясним, как сделать это правильно:
Во-первых, откроем внешний отчет в конфигураторе и в окне свойств изменим Имя на уникальное, например, вместо ШтатноеРасписаниеНачисления укажем ШтатноеРасписаниеНачисления_Внешний. Важно, чтобы это имя не совпадало ни с одним объектом в основной конфигурации.
Во-вторых, необходимо выполнить глобальный поиск по тексту модуля объекта и модуля формы внешнего отчета. Нам нужно заменить все упоминания старого имени на новое. Особое внимание уделим коду, где происходит обращение к метаданным:
// Вместо старого кода:
Если ЭтотОбъект.Метаданные().Имя = "ШтатноеРасписаниеНачисления" Тогда
// какая-то логика
КонецЕсли;
// Используем новое имя:
Если ЭтотОбъект.Метаданные().Имя = "ШтатноеРасписаниеНачисления_Внешний" Тогда
// логика отработает корректно
КонецЕсли;
Если мы планируем подключать отчет через раздел «Администрирование — Печатные формы, отчеты и обработки», проанализируем функцию СведенияОВнешнейОбработке в модуле объекта. Проверим наличие и значение параметра ОпределитьНастройкиФормы.
Рассмотрим пример правильной структуры параметров регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет();
ПараметрыРегистрации.Наименование = "Штатное расписание (внешний)";
ПараметрыРегистрации.ИмяОбъекта = "ШтатноеРасписаниеНачисления_Внешний";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Важно для доступа к методам ПВР
ПараметрыРегистрации.ОпределитьНастройкиФормы = Истина;
// Добавление команд и вариантов...
Возврат ПараметрыРегистрации;
КонецФункции
Установка ПараметрыРегистрации.БезопасныйРежим = Ложь позволяет отчету обращаться к экспортным методам модулей менеджеров без ограничений, что часто исправляет ошибку Метод объекта не обнаружен.
Проанализируем ситуацию, когда даже после переименования ошибка сохраняется. Это может быть связано с тем, что в хранилище системных настроек «зависли» старые варианты отчета. Выполним следующие действия:
Чтобы точно выяснить, в какой момент происходит сбой, используем параметр запуска РежимОтладки. В коде процедуры ПриКомпоновкеРезультата найдем место вызова СкомпоноватьРезультат. Посмотрим, как это выглядит в типовых отчетах БСП:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Инициализация параметров
// ...
Попытка
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
ОтчетОбъект.СкомпоноватьРезультат(ДокументРезультат, ДанныеРасшифровки);
Исключение
// Здесь часто выводится текст "В настройку внесены критичные изменения"
Инфо = ИнформацияОбОшибке();
ВызватьИсключение НСтр("ru = 'Ошибка при формировании отчета:'") + " " + ПодробноеПредставлениеОшибки(Инфо);
КонецПопытки;
КонецПроцедуры
Если ошибка возникает на методе НачислениеРайонныйКоэффициент, проверьте, не используется ли в СКД (Схеме компоновки данных) в вычисляемых полях или выражениях параметров обращение к функциям, которые не вынесены в ОбщиеМодули. Если функция находится в модуле менеджера, к ней нужно обращаться через полное имя: ПланыВидовРасчета.Начисления.НачислениеРайонныйКоэффициент(), а не просто по имени метода.
Подводя итог, можно сказать, что ошибка «критичных изменений» — это следствие строгого контроля БСП за целостностью контекста исполнения отчета. Для ее решения:
Соблюдение этих правил позволит вам успешно адаптировать любой типовой отчет ЗУП 3.1 под ваши нужды в виде внешнего файла.