Как исправить ошибку «В настройку отчета внесены критичные изменения. Отчет сформирован не будет» в 1С

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

Кадровые и зарплатные отчеты в современных конфигурациях на платформе 1С:Предприятие 8.3 (таких как «1С:Зарплата и управление персоналом», «1С:ERP Управление предприятием» и «1С:Комплексная автоматизация») построены на сложной архитектуре Библиотеки стандартных подсистем (БСП) и специализированных кадровых модулей. Довольно часто при попытке доработки или адаптации типового кадрового отчета (например, «Унифицированная форма Т-2», «Личная карточка», «Штатное расписание» или «Расчетный листок») под специфику предприятия разработчики и пользователи сталкиваются со следующей системной ошибкой:

«В настройку отчета внесены критичные изменения. Отчет сформирован не будет. Установлен безопасный режим. Выполнение операции запрещено».

В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем внутренние механизмы защиты платформы и предоставим пошаговое руководство по исправлению этой проблемы для обычных пользователей и разработчиков.

Анатомия ошибки: почему программа маскирует реальную проблему

При формировании сложных регламентированных отчетов их компоновка и генерация табличного документа происходят программно в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Для предотвращения падения всей системы при некорректных пользовательских манипуляциях со схемой компоновки данных (СКД), разработчики фирмы «1С» обернули эту процедуру в блок обработки исключений Попытка...Исключение.

Рассмотрим, как это выглядит во внутреннем коде конфигурации:


Процедура ПриКомпоновкеРезультата(РезультатТабличныйДокумент, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Попытка
        СформироватьОтчетПрограммно(РезультатТабличныйДокумент, ДанныеРасшифровки);
    Исключение
        ВызватьИсключение НСтр("ru = 'В настройку отчета внесены критичные изменения. Отчет не будет сформирован.'") 
            + " " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;
КонецПроцедуры

Из-за такой структуры абсолютно любая внутренняя ошибка (нехватка прав доступа на таблицы СУБД, обращение к несуществующему реквизиту после обновления или сбой в запросе) перехватывается платформой и выводится пользователю под стандартной «маскировочной» формулировкой о критичных изменениях в настройках. Настоящая причина скрыта глубоко внутри стека вызовов, что сильно усложняет диагностику. Для проверки ролей и профилей при нехватке прав к конкретной таблице можно использовать обработку для анализа прав доступа к объекту.

Влияние безопасного режима и механизмов RLS

Выясним причину, по которой отчет без проблем формируется у пользователей с полными правами (например, под администратором), но выдает ошибку под обычными кадровиками или расчетчиками, у которых есть все необходимые роли.

В типовых решениях «1С» сбор данных по сотрудникам требует обращения к большому числу связанных регистров сведений и документов. Чтобы отчет формировался быстро и не спотыкался о сложные правила разграничения прав доступа на уровне записей (RLS), разработчики используют в коде метод:

УстановитьПривилегированныйРежим(Истина)

Этот метод временно отключает проверку ограничений RLS для текущего потока выполнения. Однако поведение платформы кардинально меняется, если отчет выполняется в безопасном режиме:

  1. В безопасном режиме вызов метода УстановитьПривилегированныйРежим(Истина) полностью игнорируется платформой «1С:Предприятие». Программа продолжает выполнять все запросы с включенными RLS-ограничениями текущего пользователя.
  2. Если у пользователя нет доступа к какому-либо служебному регистру данных, запрос аварийно прерывается ошибкой нарушения прав доступа.
  3. Эта ошибка перехватывается блоком Попытка и маскируется под сообщение «В настройку отчета внесены критичные изменения».

Ловушка интерактивного открытия внешних отчетов

Разберем, почему простой запуск файла отчета с расширением .erf через меню Файл -> Открыть приводит к ошибке у пользователей без полных прав.

Когда вы открываете внешний отчет напрямую из файла, платформа «1С» в целях безопасности вашей системы принудительно включает безопасный режим для этого сеанса работы с файлом. Даже если внутри модуля объекта в функции СведенияОВнешнейОбработке прописана строка:

ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

Платформа проигнорирует эту настройку, так как она считывается только при официальной регистрации отчета в справочнике дополнительных обработок. Таким образом, интерактивный запуск внешнего кадрового или расчетного отчета под обычным пользователем всегда будет приводить к ошибке RLS и безопасному режиму.

Решение проблемы: правильная настройка и подключение отчета

Проанализируем пошагово процесс подготовки и корректного подключения измененного отчета в информационную базу.

Шаг 1. Настройка программного модуля внешнего отчета в Конфигураторе

Откроем наш внешний отчет в режиме Конфигуратора, перейдем в модуль объекта и найдем функцию регистрации СведенияОВнешнейОбработке. Нам необходимо убедиться, что для параметра безопасного режима установлено значение Ложь. Это позволит системе запускать отчет с привилегированными правами.

Пример корректного кода функции регистрации:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
    ПараметрыРегистрации.Вставить("Наименование", "Унифицированная форма Т-2 (модифицированная)");
    ПараметрыRegistratii.Вставить("Версия", "1.0.3");
    
    // Отключаем безопасный режим для корректной работы привилегированного режима и RLS
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    ПараметрыРегистрации.Вставить("Информация", "Модифицированная форма Т-2 для кадровой службы");
    
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Унифицированная форма Т-2 (модифицированная)", "ВнешнийОтчетТ2", "ОткрытиеФормы");
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    Возврат ПараметрыРегистрации;
КонецФункции

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

Сохраним изменения в файле отчета.

Шаг 2. Регистрация отчета в справочнике дополнительных обработок

Теперь подключим отчет в систему стандартным способом:

  1. Запустим программу «1С:Предприятие» под пользователем с правами администратора.
  2. Перейдем в раздел Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки.
  3. Нажмем кнопку Добавить из файла, согласимся с предупреждением безопасности и укажем путь к нашему сохраненному файлу внешнего отчета.
  4. Обратим внимание на поле Режим управления или предупреждение безопасности при загрузке. Убедимся, что отчет загрузился с отключенным безопасным режимом (система доверяет источнику).
  5. Настроим разделы интерфейса (например, «Кадры» или «Зарплата»), в которых данный отчет будет отображаться для конечных пользователей, и определим список пользователей с доступом к нему.
  6. Нажмем кнопку Записать и закрыть.

При таком способе запуска подсистема БСП использует специальный метод платформы ВнешниеОтчеты.Подключить(), который корректно отключает безопасный режим и позволяет отчету использовать весь свой внутренний привилегированный функционал обхода RLS.

Сброс кэша и пользовательских настроек

Если после правильного подключения отчета через дополнительные обработки проблема сохраняется, возможно, у пользователя остались старые кэшированные настройки структуры отчета. Выполним следующие действия для очистки:

  1. Откроем отчет в режиме пользователя.
  2. В правом верхнем углу панели управления отчетом нажмем кнопку Еще (три точки или кнопка с шестеренкой).
  3. Выберем пункт меню Установить стандартные настройки. Это сбросит кэш настроек компоновщика СКД к исходным значениям, заложенным разработчиком.
  4. Если это не помогло, закроем программу и произведем стандартную очистку локального кэша информационной базы (путем удаления базы из списка запуска «1С» и добавления ее заново).

Совет разработчику: как увидеть реальную ошибку

Если все настройки выполнены верно, но отчет все равно упорно выдает ошибку о критичных изменениях, значит в самом программном коде или макете СКД присутствует логическая ошибка, не связанная с безопасным режимом. Это может быть обращение к удаленному реквизиту после обновления конфигурации.

Чтобы отключить маскировку и увидеть реальную причину падения отчета, выполним отладку:

  1. Откроем внешний отчет в Конфигураторе.
  2. Перейдем в модуль объекта и найдем процедуру ПриКомпоновкеРезультата.
  3. Временно закомментируем конструкцию Попытка...Исключение, оставив только полезный код формирования:

Процедура ПриКомпоновкеРезультата(РезультатТабличныйДокумент, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Временно комментируем Попытку для отладки реальной ошибки
    // Попытка
        СформироватьОтчетПрограммно(РезультатТабличныйДокумент, ДанныеРасшифровки);
    // Исключение
    //     ВызватьИсключение "В настройку отчета внесены критичные изменения...";
    // КонецПопытки;
КонецПроцедуры
  1. Запустим «1С:Предприятие» в режиме отладки и сформируем отчет под проблемным пользователем.
  2. Платформа не сможет замаскировать ошибку, прервет выполнение кода на проблемной строке и покажет подробный стек вызовов с реальной причиной (например, Поле объекта не обнаружено (РабочееМестоСотрудника)).

Используя этот подход, мы сможем быстро локализовать несовместимость кода с текущим релизом конфигурации и внести необходимые корректировки.

← На главную