Почему не работает Новый ДвоичныеДанные во внешней печатной форме 1С и как это исправить

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

Каждый разработчик 1С рано или поздно сталкивается с ситуацией, когда код, идеально работающий во внешней обработке или в обычном отчете, наотрез отказывается выполнять простейшие файловые операции внутри внешней печатной формы (ВПФ). Типичный пример: попытка прочитать файл картинки или документа с сетевого диска с помощью конструкции Новый ДвоичныеДанные(ПолныйПуть) завершается аварийно. При этом система выдает крайне неприятную ошибку: «Установлен безопасный режим. Выполнение операции запрещено».

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

Выясняем причину: почему блокируется чтение файлов в ВПФ

Для начала проанализируем, почему внешняя печатная форма ведет себя иначе, чем обычный внешний отчет, запущенный через меню «Файл — Открыть». Дело здесь в механизмах безопасности платформы «1С:Предприятие» и логике Библиотеки стандартных подсистем (БСП). Источник проблемы кроется в двух основных факторах:

  1. Принудительный безопасный режим БСП. Начиная с версии БСП 2.2.2, алгоритмы регистрации внешних отчетов и обработок претерпели серьезные изменения. Даже если при регистрации печатной формы в справочнике «Дополнительные отчеты и обработки» вы явно указали ПараметрыРегистрации.БезопасныйРежим = Ложь, БСП может проигнорировать эту настройку. Если в системе используются профили безопасности или активна современная версия БСП, платформа автоматически запускает код ВПФ в безопасном режиме. А в безопасном режиме любые операции с локальной или сетевой файловой системой (кроме работы с временными файлами в специально отведенных каталогах) жестко блокируются на уровне платформы.
  2. Разница контекстов выполнения (Клиент против Сервера). Когда вы запускаете внешний отчет интерактивно, его код выполняется на стороне Клиента — под учетной записью текущего пользователя операционной системы Windows. У этого пользователя обычно есть права на сетевую папку вида \\SERVER\Share\file.jpg. Но когда запускается ВПФ, формирование печатной формы происходит на стороне Сервера приложения 1С. Здесь в силу вступают ограничения серверной службы (например, USR1CV8), которая по умолчанию не имеет доступа к сетевым ресурсам домена и не может авторизоваться на внешних файловых серверах.

Рассмотрим подробнее каждый из способов обхода и решения этой проблемы.

Решение 1. Быстрый обход через совместимость БСП

Если вам нужно срочно запустить печатную форму в работу, а времени на переписывание архитектуры передачи файлов нет, можно прибегнуть к хитрости. Мы можем заставить БСП применить старые алгоритмы обработки безопасного режима, которые корректно считывали флаг отключения безопасности.

Для этого в модуле объекта внешней печатной формы найдем экспортную функцию СведенияОВнешнейОбработке() и добавим в структуру регистрации указание версии совместимости БСП:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    // Указываем старую версию БСП для отключения жесткого контроля безопасности
    ПараметрыРегистрации.Вставить("ВерсияБСП", "2.1.3");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    // Остальные параметры регистрации вашей ВПФ...
    
    Возврат ПараметрыРегистрации;

КонецФункции

Этот метод заставит систему доверять коду обработки и действительно отключит безопасный режим при ее выполнении. Однако помните, что данный способ является обходным и может не поддерживаться в будущих версиях БСП.

Решение 2. Методологически верный путь — использование разрешений БСП

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

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


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработкеПервоначальноеЗаполнение();
    
    // Настраиваем базовые параметры
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидДополнительнойОбработкиПечатнаяФорма();
    ПараметрыРегистрации.БезопасныйРежим = Истина; // Оставляем безопасный режим включенным!
    
    // Создаем запрос на разрешение доступа к сетевому каталогу с картинками
    КаталогДоступа = "\\ARYKOV\Documents\1C\1CFiles\";
    Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(
        КаталогДоступа, 
        Истина, // Разрешить чтение данных
        Ложь    // Запретить запись/изменение данных
    );
    
    ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
    
    Возврат ПараметрыРегистрации;

КонецФункции

После того как вы загрузите эту ВПФ в справочник «Дополнительные отчеты и обработки», администратор системы при сохранении формы увидит стандартное окно с предложением предоставить доступ к указанному сетевому пути. После подтверждения платформа автоматически разрешит методу Новый ДвоичныеДанные читать файлы из этого каталога даже в безопасном режиме.

Решение 3. Архитектурный обход через Временное Хранилище

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

Рассмотрим этот алгоритм по шагам:

  1. На клиенте пользователь выбирает файл или система автоматически определяет его локальный/сетевой путь.
  2. Клиентский код считывает файл в двоичные данные и помещает их во временное хранилище платформы.
  3. Адрес временного хранилища передается серверной процедуре печати, которая без проблем извлекает данные и формирует документ.

Посмотрим на пример реализации клиент-серверного взаимодействия в форме управления печатью:


&НаКлиенте
Процедура ПодготовитьФайлДляПечати(ПолныйПутьКФайлу)

    // Данный код выполняется на клиенте, здесь безопасный режим сервера не действует
    Попытка
        ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПолныйПутьКФайлу);
        // Помещаем во временное хранилище текущего сеанса
        АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
        
        // Передаем адрес на сервер для формирования печатной формы
        СформироватьПечатнуюФормуНаСервере(АдресФайлаВХранилище);
    Исключение
        Предупреждение("Не удалось прочитать файл на клиенте: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

&НаСервере
Процедура СформироватьПечатнуюФормуНаСервере(АдресФайлаВХранилище)

    // На сервере в безопасном режиме извлекаем двоичные данные из временного хранилища
    // Эта операция полностью разрешена платформой
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);
    
    // Преобразуем двоичные данные в картинку для табличного документа
    КартинкаДляВывода = Новый Картинка(ДвоичныеДанные);
    
    // Дальнейший вывод в ТабличныйДокумент...

КонецПроцедуры

Используя этот подход, мы полностью исключаем конфликты прав доступа серверной службы USR1CV8 к сетевым ресурсам организации и обходим ограничения безопасного режима БСП.

Решение 4. Настройка прав системной службы Windows/Linux

Если файлы картинок номенклатуры хранятся в томах на сетевом диске, и серверная часть 1С обязана обращаться к ним напрямую в фоновом режиме (без участия клиента), необходимо настроить права самой операционной системы:

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

← На главную