При интеграции торгового оборудования, например терминалов сбора данных (ТСД), разработчики часто используют готовые внешние обработки. В устаревших или специализированных решениях обмен данными часто реализуется через вызов системных утилит операционной системы с помощью строки Новый COMОбъект("Wscript.Shell"). Однако в современных версиях платформы «1С:Предприятие 8.3» этот код может внезапно перестать работать: отладка прекращается без сообщений об ошибках, либо система выдает предупреждение безопасности и закрывает обработку. Выясним причину такого поведения и разберем все способы решения этой проблемы.
Начиная с версии 8.3.9, в платформе «1С:Предприятие» появился встроенный механизм безопасности — «Защита от опасных действий». Его цель — защитить компьютеры пользователей и серверы от выполнения потенциально опасного кода без их ведома. Платформа перехватывает попытки взаимодействия с операционной системой и внешними программами.
К потенциально опасным действиям платформа относит:
WScript.Shell, Shell.Application и др.).ЗапуститьПриложение() или КомандаСистемы().Внешняя обработка ТСД пытается создать COM-объект WScript.Shell для работы с консольными командами Windows. По умолчанию платформа блокирует это действие, что и приводит к прекращению работы обработки.
Рассмотрим самый простой способ, который помог автору темы на форуме. Если обработка запускается под конкретным пользователем, мы можем отключить проверку безопасности лично для него.
Разберем этот процесс по шагам:
Этот способ отлично подходит для локального использования, когда с ТСД работает один или несколько конкретных сотрудников.
Если пользователей в базе много или обмен данными с ТСД должен происходить под разными учетными записями (включая служебные), ручная настройка каждого пользователя неудобна. В таком случае мы можем настроить глобальное исключение с помощью файла конфигурации conf.cfg.
Выясним, как это сделать:
C:\Program Files\1cv8\conf\ (или C:\Program Files (x86)\1cv8\conf\ для 32-разрядных версий). Если файла conf.cfg там нет, создайте обычный текстовый файл с таким именем.DisableUnsafeActionProtection=.*
DisableUnsafeActionProtection=ut_work_db;ut_test_db
Важно: При работе в клиент-серверном режиме файл conf.cfg необходимо изменять как на клиентских компьютерах пользователей, так и на самом сервере 1С:Предприятия.
Если у вас крупная база данных со множеством пользователей, администратор может отключить предупреждения безопасности программно для всех учетных записей сразу. Для этого достаточно выполнить в режиме «1С:Предприятие» (например, через консоль кода) следующий фрагмент кода:
Для Каждого ТекущийПользователь Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
Если ТекущийПользователь.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях Тогда
ТекущийПользователь.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;
Попытка
ТекущийПользователь.Записать();
Исключение
Сообщить("Не удалось обновить пользователя: " + ТекущийПользователь.Имя);
КонецПопытки;
КонецЕсли;
КонецЦикла;
Этот код обходит весь список зарегистрированных пользователей информационной базы и отключает вывод предупреждений безопасности, позволяя внешним обработкам беспрепятственно работать с COM-объектами.
Если политика безопасности вашей компании запрещает полное отключение защиты ИБ, вы можете разрешить выполнение опасных действий конкретно для доверенной обработки ТСД. При подключении внешней обработки программным способом (например, через механизмы БСП) можно явно указать параметры защиты.
Посмотрим на пример кода подключения внешней обработки:
ПараметрыЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ПараметрыЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
// Подключаем внешнюю обработку с отключенной защитой
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлуОбработки, , Ложь, ПараметрыЗащиты);
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяОбработки);
При таком подходе общая безопасность системы не пострадает, а выбранная обработка получит доступ к необходимым ресурсам операционной системы.
Использование COM-объекта Wscript.Shell сегодня считается устаревшим подходом по нескольким причинам:
В современных конфигурациях для выполнения внешних команд операционной системы рекомендуется использовать штатные функции платформы 1С или механизмы Библиотеки стандартных подсистем (БСП).
Рассмотрим замену вызова Wscript.Shell на кроссплатформенный метод ЗапуститьПриложение():
// Вместо небезопасного COM-вызова:
// хШелл = Новый COMОбъект("Wscript.Shell");
// хШелл.Run(КомандаЗапуска, 0, Истина);
// Используем встроенный метод платформы:
ЗапуститьПриложение(КомандаЗапуска, , Истина);
Если в вашей конфигурации интегрирована БСП, то для работы с файлами и запуска внешних программ лучше всего применять функции общего модуля ФайловаяСистемаКлиент. Посмотрим на пример кода:
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ДождатьсяЗавершения", Истина);
Результат = ФайловаяСистемаКлиент.ЗапуститьПрограмму("C:\TSD\exchange.exe", ПараметрыВыполнения);
Если Результат.КодВозврата <> 0 Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при обмене с ТСД!");
КонецЕсли;
Использование платформенных методов и БСП делает систему стабильной, избавляет от проблем с безопасностью и подготавливает вашу конфигурацию к работе в кроссплатформенных средах.