Рассмотрим распространенную и крайне неприятную ситуацию, с которой часто сталкиваются разработчики при внедрении внешних обработок. Под учетной записью администратора обработка по загрузке или выгрузке данных в Microsoft Excel отрабатывает без нареканий. Однако при попытке запустить её под правами обычного пользователя система выдает ошибку: «Установлен безопасный режим. Выполнение операции запрещено». Попытки прописать в коде регистрации отключение безопасного режима не помогают, а при переносе в дополнительные обработки система и вовсе может аварийно завершить работу («вылететь»).
В этой статье мы подробно разберем, почему возникает данная ошибка, как устроены механизмы безопасности платформы «1С:Предприятие» и библиотеки БСП, а также рассмотрим по шагам несколько надежных способов решения проблемы.
Прежде чем переходить к настройкам, проанализируем, почему стандартные советы из интернета часто не работают. Очень часто разработчики путают два абсолютно разных механизма защиты платформы:
DisableUnsafeActionProtection в файле conf.cfg лишь убирает всплывающее диалоговое окно. Оно не снимает ограничения на выполнение операций в коде.Excel.Application), выполнение системных команд, доступ к локальной файловой системе сервера и сетевые запросы. Именно этот режим блокирует работу вашего кода.Почему ошибка возникает именно при интерактивном открытии через Файл — Открыть? При использовании Библиотеки стандартных подсистем (БСП) платформа принудительно запускает код интерактивно открываемых внешних обработок в безопасном режиме для всех пользователей, у которых нет административных прав. При этом любые параметры регистрации, указанные внутри обработки, полностью игнорируются, так как файл запускается «напрямую» в обход справочника дополнительных обработок.
Самый правильный и безопасный путь — оставить обработку работать в безопасном режиме, но явно запросить у системы разрешение на создание конкретного COM-класса. Это позволит сохранить общий высокий уровень безопасности системы, не отключая глобальные защитные механизмы платформы.
Разберем по шагам, как модифицировать код вашей обработки в функции СведенияОВнешнейОбработке для явного запроса прав на работу с Microsoft Excel:
Функция СведенияОВнешнейОбработке() Экспорт
// Задаем версию БСП, используемую в вашей конфигурации
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.5.132");
ПараметрыReg.Наименование = "Загрузка данных из Excel";
ПараметрыReg.Версия = "1.0";
ПараметрыReg.БезопасныйРежим = Истина; // Оставляем безопасный режим включенным!
// Создаем массив для хранения запрашиваемых разрешений
МассивРазрешений = Новый Массив;
// Запрашиваем точечное разрешение на создание COM-класса Excel
ProgID = "Excel.Application";
CLSID = "{00024500-0000-0000-C000-000000000046}";
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(ProgID, CLSID);
МассивРазрешений.Добавить(Разрешение);
// Вставляем массив разрешений в параметры регистрации
ПараметрыРегистрации.Вставить("Разрешения", МассивРазрешений);
Возврат ПараметрыРегистрации;
КонецФункции
После внесения этих изменений необходимо зайти в базу под правами администратора, открыть справочник Дополнительные отчеты и обработки, обновить вашу обработку из файла и нажать кнопку сохранения. Система автоматически распознает запрос на использование COM-объекта и предложит администратору утвердить предоставление этих разрешений. Обычные пользователи теперь смогут запускать обработку из интерфейса программы без каких-либо ошибок.
Если ваша база данных развернута в закрытом локальном контуре предприятия, требования к безопасности не так строги и вы не хотите детально настраивать разрешения для каждой обработки, контроль можно полностью отключить на уровне конкретной информационной базы.
Для этого выполним следующие действия:
Ложь), запишите изменения и перезапустите пользовательские сеансы.Иногда при попытке запустить обработку, добавленную в справочник дополнительных обработок, платформа 1С аварийно завершает работу без вывода диагностических сообщений. Это происходит из-за того, что вызов COM-объекта выполняется на стороне сервера 1С под системной учетной записью, у которой нет прав на запуск приложений Microsoft Office.
Чтобы исправить это поведение на сервере Windows, выполним настройку системных компонентов DCOM:
Win + R, введите dcomcnfg и нажмите Enter.{00024500-0000-0000-C000-000000000046}).USR1CV8 или сетевая служба NetworkService), и предоставьте ей полные права на локальный запуск и локальную активацию.Важная тонкость: Для корректной работы COM-объектов MS Office на сервере Windows под учетными записями служб обязательно должны существовать специальные системные папки рабочего стола. Создайте вручную следующие директории на сервере (в зависимости от разрядности операционной системы):
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop (для 64-битных версий Windows)Использование технологии COM постепенно уходит в прошлое из-за своей нестабильности, привязки к операционной системе Windows и жестких требований к установке пакета MS Office непосредственно на сервере 1С. Мы рекомендуем полностью отказаться от создания COMОбъект("Excel.Application") в пользу нативных платформенных методов работы с файлами .xlsx.
Современные версии платформы «1С:Предприятие 8.3» позволяют легко прочитать данные из любого файла Excel напрямую, не задействуя сторонние приложения и библиотеки. Посмотрим, как элегантно переписать процедуру чтения файла:
&НаСервере
Процедура ПрочитатьФайлExcelНаСервере(ПутьКФайлу)
ТабДок = Новый ТабличныйДокумент;
Попытка
// Чтение файла XLSX встроенными средствами платформы
ТабДок.Прочитать(ПутьКФайлу, СпособИмпортаТабличногоДокумента.XLSX);
Исключение
ВызватьИсключение "Не удалось прочитать файл. Ошибка: " + ОписаниеОшибки();
КонецПопытки;
// Обходим строки и колонки полученной таблицы
КоличествоСтрок = ТабДок.ВысотаТаблицы;
КоличествоКолонок = ТабДок.ШиринаТаблицы;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
// Получаем значение из конкретной ячейки
КодТовара = ТабДок.Область(НомерСтроки, 1).Текст;
Наименование = ТабДок.Область(НомерСтроки, 2).Текст;
Цена = ТабДок.Область(НомерСтроки, 3).Текст;
// Выполняем дальнейшую обработку полученных данных
КонецЦикла;
КонецПроцедуры
Применение встроенного метода Прочитать() объекта ТабличныйДокумент дает нам колоссальные преимущества: