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