Проанализируем ситуацию, с которой часто сталкиваются разработчики после обновления платформы 1С до версий 8.3.9 и выше (например, с 8.3.9.1850 на 8.3.9.2170). При попытке выполнить метод внешней обработки в фоновом задании, используя метод ВыполнитьПроцедуруМодуляОбъектаОбработки(), процесс падает. В журнале регистрации или конфигураторе фиксируется ошибка "Неверный формат хранилища данных ''", а само фоновое задание даже не стартует.
Выясним причину такого поведения. Как было установлено на практике, проблема часто воспроизводится именно в толстом клиенте, в то время как в тонком клиенте этот же код отрабатывает без ошибок. Разберем по шагам, почему это происходит и какие существуют пути решения.
Рассмотрим подробнее механизмы платформы, которые приводят к сбою. Начиная с релизов 1С:Предприятие 8.3.9, был внедрен механизм "Защита от опасных действий", предназначенный для предотвращения запуска вредоносного кода (например, вирусов-шифровальщиков). При программном открытии или подключении внешних обработок платформа пытается вывести пользователю диалоговое окно с предупреждением безопасности.
Так как фоновое задание выполняется на сервере, где пользовательский интерфейс отсутствует, платформа не может отобразить интерактивное окно. Это приводит к немедленному прерыванию процесса.
Вторая проблема заключается в особенностях передачи данных в архитектуре клиент-сервер при использовании толстого клиента. Двоичные данные внешней обработки помещаются во временное хранилище для передачи в фон. Из-за срабатывания защиты или жестких внутренних ограничений сериализации толстого клиента, процесс десериализации файла прерывается, хранилище возвращает пустой результат, что и вызывает исключение "Неверный формат хранилища данных ''".
Посмотрим на практические методы, которые помогут нам обойти данную ошибку. В зависимости от задачи и требований безопасности, мы можем выбрать один из следующих вариантов.
Если в коде используется менеджер внешних обработок, нам необходимо явно указать платформе, что мы доверяем данному файлу. При вызове метода Подключить() передадим дополнительный параметр ЗащитаОтОпасныхДействий со значением Ложь. Если же мы используем подсистему длительных операций из Библиотеки стандартных подсистем (БСП), то в структуру параметров задания добавим свойство БезопасныйРежим со значением Ложь.
Перейдем в режим Конфигуратора. В списке пользователей найдем того, под чьей учетной записью стартует фоновое (или регламентное) задание. Откроем его свойства и снимем флажок "Защита от опасных действий". Это позволит данному пользователю запускать внешние обработки без вывода блокирующих предупреждений.
Если мы полностью уверены в безопасности исполняемого кода и хотим глобально отключить этот механизм, воспользуемся конфигурационным файлом платформы. Откроем файл conf.cfg (он находится в каталоге conf установленной версии платформы) и добавим в него следующую строку:
DisableUnsafeActionProtection=.*
Важно: Это действие необходимо выполнить как на стороне сервера 1С:Предприятия, так и на клиентских рабочих местах.
Учитывая особенности платформы, метод ФоновыеЗадания.Выполнить() стабильно работает в тонком клиенте. По возможности откажемся от запуска подобных ресурсоемких операций из-под толстого клиента, так как в новых версиях платформы он имеет больше ограничений при сериализации данных.
Разберем наиболее надежный вариант, который позволит нам избежать подобных проблем в будущем. Самым правильным решением будет отказ от запуска методов внешней обработки в фоне. Рекомендуется перенести необходимую бизнес-логику в серверный общий модуль самой конфигурации или в расширение.
На встроенные объекты метаданных конфигурации (в отличие от внешних файлов) ограничения механизма защиты от опасных действий не распространяются. Фоновые задания будут создаваться и работать максимально стабильно. Кроме того, при вызове фоновых заданий всегда избегайте передачи сложных объектов или ссылок на файлы через временное хранилище. Передавайте параметры простой структурой, состоящей из примитивных типов данных, что исключит проблемы с форматом потока и сериализацией.