База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить ошибку «Действие недоступно в безопасном режиме» при записи докуме › Ответ в теме: Как исправить ошибку «Действие недоступно в безопасном режиме» при записи докуме
Ошибка означает, что внешняя обработка ITC_ЗагрузкаПоступлений_Розница.epf выполняется в безопасном режиме, а в обработчике ПередЗаписью используется действие, запрещенное этим режимом.
По стеку видно:
|
1 2 3 4 |
ВнешняяОбработка.ITC_ЗагрузкаПоступлений_Розница.МодульОбъекта Ошибка при вызове метода контекста (Записать) Ошибка при выполнении обработчика - 'ПередЗаписью' Действие недоступно в безопасном режиме |
То есть обработка пытается записать документ, но во время записи срабатывает обработчик ПередЗаписью, внутри которого выполняется запрещенная операция.
## Вариант 1. Отключить безопасный режим для обработки
Если файл обработки получен из доверенного источника, нужно изменить функцию регистрации обработки.
Откройте файл .epf в конфигураторе:
1. Файл → Открыть.
2. Выберите ITC_ЗагрузкаПоступлений_Розница.epf.
3. Откройте Модуль объекта.
4. Найдите функцию:
|
1 |
Функция СведенияОВнешнейОбработке() Экспорт |
5. Найдите строку:
|
1 |
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); |
6. Замените ее на:
|
1 |
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); |
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; ПараметрыРегистрации.Вставить( "Наименование", "Загрузка поступлений в Розницу"); ПараметрыРегистрации.Вставить( "Версия", "1.0"); ПараметрыРегистрации.Вставить( "БезопасныйРежим", Ложь); Возврат ПараметрыРегистрации; КонецФункции |
После изменения:
1. Сохраните .epf.
2. В базе удалите старую зарегистрированную обработку.
3. Добавьте исправленный файл заново.
4. Полностью перезапустите 1С.
5. Повторите загрузку.
Простого изменения файла на диске может быть недостаточно, если обработка уже зарегистрирована в информационной базе. В базе могли сохраниться старые параметры регистрации.
## Вариант 2. Если обработка уже зарегистрирована в базе
В типовых конфигурациях обычно используется раздел:
НСИ и администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки
Далее:
1. Найдите ITC_ЗагрузкаПоступлений_Розница.
2. Откройте карточку обработки.
3. Удалите ее.
4. Добавьте исправленный файл .epf.
5. Проверьте, чтобы обработка была зарегистрирована заново.
В некоторых конфигурациях после повторной загрузки есть флаг вроде:
— Безопасный режим;
— Использовать безопасный режим;
— Разрешить небезопасные действия;
— Доверенная внешняя обработка.
Если такой параметр доступен, для доверенной обработки его нужно отключить.
## Важно: изменение параметра может не решить проблему
Строка:
|
1 |
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); |
только сообщает конфигурации, что обработка должна выполняться без безопасного режима. Но ошибка может остаться, если запрещенное действие находится не в самой внешней обработке, а в вызываемом общем модуле или обработчике объекта.
Например, в ПередЗаписью может использоваться:
|
1 |
УстановитьПривилегированныйРежим(Истина); |
или:
|
1 |
ЗапуститьПриложение(...); |
или:
|
1 |
Новый COMОбъект(...); |
или:
|
1 |
Выполнить(ТекстКода); |
или работа с файлами, интернетом, внешними компонентами.
Такие действия нужно либо выполнять в разрешенном контексте, либо переделывать код.
## Как найти точную запрещенную строку
В тексте ошибки нет номера строки, поэтому нужно включить остановку отладчика на исключениях.
### В конфигураторе
1. Запустите базу в режиме отладки.
2. Откройте Отладка → Подключение.
3. Подключите текущий сеанс.
4. Включите остановку по исключениям.
5. Повторите загрузку.
Отладчик должен остановиться на конкретной строке обработчика ПередЗаписью.
Также можно открыть модуль внешней обработки и выполнить поиск по следующим словам:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
УстановитьПривилегированныйРежим ЗапуститьПриложение Новый COMОбъект Выполнить НачатьПолучениеФайла ПоместитьФайл ПолучитьФайл Записать ЧтениеТекста ЗаписьТекста HTTPСоединение FTPСоединение ВнешниеКомпоненты |
Особенно внимательно проверьте код, который вызывается из ПередЗаписью.
## Почему ошибка появляется именно при Записать
Метод:
|
1 |
Документ.Записать(); |
сам по себе не обязательно является причиной ошибки.
При записи объекта 1С автоматически выполняет обработчики:
|
1 2 3 4 |
ПередЗаписью ПриЗаписи ОбработкаПроведения ОбработкаПроверкиЗаполнения |
В вашем случае ошибка возникает внутри ПередЗаписью. Поэтому сообщение указывает на:
|
1 |
Ошибка при вызове метода контекста (Записать) |
а реальная причина находится в коде обработчика:
|
1 |
ПередЗаписью |
Например:
|
1 2 3 4 5 |
Процедура ПередЗаписью(Отказ) УстановитьПривилегированныйРежим(Истина); КонецПроцедуры |
В безопасном режиме такой код завершится ошибкой:
|
1 |
Действие недоступно в безопасном режиме |
## Если обработка должна работать в безопасном режиме
В этом случае нельзя просто отключать безопасность. Нужно найти запрещенную операцию и заменить ее.
Например, если используется:
|
1 |
УстановитьПривилегированныйРежим(Истина); |
то нужно проверить, действительно ли обработчику требуется привилегированный режим. Если он нужен только для чтения данных, запрос можно выполнять в общем серверном модуле с флагом Привилегированный.
Но для внешней обработки, выполняющей загрузку документов, часто требуется запись данных, доступ к регистрам, файлам или внешним сервисам. Безопасный режим в таком случае может быть принципиально несовместим с функциональностью обработки.
## Если обработка загружается программно
Если обработка подключается программно через ПодключаемыеКоманды, ДополнительныеОтчетыИОбработки или собственный механизм, проверьте параметр безопасности в месте регистрации.
Должно быть примерно так:
|
1 2 3 |
ПараметрыРегистрации.Вставить( "БезопасныйРежим", Ложь); |
Если параметр формируется в другой процедуре, найдите по конфигурации поиск:
|
1 |
БезопасныйРежим |
и проверьте все места, где внешняя обработка регистрируется.
## Что сделать в вашем случае
Для быстрого исправления:
1. Сделайте копию базы.
2. Откройте ITC_ЗагрузкаПоступлений_Розница.epf.
3. В СведенияОВнешнейОбработке() установите:
|
1 |
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); |
4. Сохраните файл.
5. Удалите старую обработку из списка дополнительных обработок.
6. Загрузите файл заново.
7. Перезапустите 1С.
8. Повторите загрузку поступления.
Если после этого ошибка останется, значит запрещенная операция выполняется в коде, который не зависит от параметра регистрации. Тогда нужно отлаживать обработчик ПередЗаписью и исправлять конкретную строку, на которой срабатывает ограничение безопасного режима.
Рекомендую посмотреть здесь:
https://helpf.pro/faq/view/1531.html