При разработке дополнительных печатных форм нередко возникает ситуация, когда при прямом открытии внешней обработки через меню «Файл — Открыть» печатная форма счета или другого документа с факсимиле формируется корректно, а после подключения в справочник «Дополнительные отчеты и обработки» возникает ошибка чтения данных.
В процессе выполнения кода генерируется исключение следующего вида:
{ОбщийМодуль.РаботаСФайлами.Модуль(73)}: Не удалось открыть файл:
Подпись.png
по причине: двоичные данные файла были удалены. Возможно, файл очищен как ненужный или удален антивирусной программой.
Обратитесь к администратору.
ВызватьИсключение РаботаСФайламиСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов(...)
Проанализируем механику работы платформы «1С:Предприятие 8.3», выясним первопричину такого поведения и разберем надежные варианты решения проблемы.
Рассмотрим, как подсистема «Работа с файлами» библиотеки стандартных подсистем (БСП) читает данные. Если в настройках системы включено хранение файлов в томах на диске, то в справочнике ВерсииФайлов или ПрисоединенныеФайлы сохраняется не сам файл, а путь к нему в каталоге тома. При формировании печатной формы типовой код пытается прочитать файл с диска через конструктор Новый ДвоичныеДанные(ПолныйПуть).
Основная причина ошибки заключается в том, что подключенные внешние обработки и дополнительные печатные формы по умолчанию регистрируются и выполняются в безопасном режиме (БезопасныйРежим = Истина).
В безопасном режиме платформа «1С:Предприятие» принудительно изолирует исполняемый контекст и накладывает строгие системные ограничения:
Новый ДвоичныеДанные, Новый ЧтениеТекста, методы КопироватьФайл, НайтиФайлы и чтение файлов по сетевым путям (UNC-пути вида \\server\share\file.png) немедленно блокируются платформой с генерацией исключения.УстановитьПривилегированныйРежим(Истина) игнорируется платформой и не снимает ограничения на работу с файловой системой.ХранилищеЗначения), обращение к нему шло через СУБД, что разрешено в безопасном режиме. Как только файл перемещается в том на диске, обращение начинает идти через файловую систему, что вызывает ошибку доступа.Разберем самый быстрый способ восстановления работоспособности. Если корпоративная политика безопасности позволяет отключить изоляцию для доверенной внешней печатной формы, укажем это явно в процедуре регистрации.
Откроем модуль объекта дополнительной печатной формы, найдем экспортную функцию СведенияОВнешнейОбработке() и зададим параметр БезопасныйРежим в значение Ложь:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Отключаем безопасный режим
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Счет на оплату (с факсимиле)'");
Команда.Идентификатор = "СчетЗаказФаксимиле";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Истина;
Команда.Модификатор = "ПечатьДокументов";
Возврат ПараметрыРегистрации;
КонецФункции
После внесения изменений обновим внешнюю печатную форму в справочнике «Дополнительные отчеты и обработки». Теперь платформа не будет блокировать вызовы к файловой системе, и метод Новый ДвоичныеДанные успешно считает файл подписи из сетевого тома.
Если в информационной базе используются профили безопасности кластера серверов или прямое отключение безопасного режима запрещено администратором, правильным подходом будет явный запрос прав на каталог тома хранения файлов.
Добавим в функцию СведенияОВнешнейОбработке() массив запрашиваемых разрешений:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.1";
ПараметрыРегистрации.БезопасныйРежим = Истина;
// Формируем список разрешений на доступ к сетевому каталогу томов
Разрешения = Новый Массив;
КаталогТома = "\\server-sql\doc2erp\";
Разрешения.Добавить(
РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(
КаталогТома,
Истина, // Разрешено чтение
Ложь, // Запрещена запись
НСтр("ru = 'Чтение файлов факсимиле из тома хранения'")
)
);
ПараметрыРегистрации.Вставить("Разрешения", Разрешения);
Возврат ПараметрыРегистрации;
КонецФункции
При обновлении файла обработки в режиме «1С:Предприятие» система автоматически покажет администратору окно с запросом разрешений на чтение указанного каталога, после подтверждения которого печать будет работать без полного отключения безопасного режима.
Разберем альтернативный архитектурный вариант, который полностью исключает зависимость дополнительной печатной формы от внешних каталогов и сетевых прав учетной записи USR1CV8.
Если факсимиле и подписи ответственных лиц меняются редко, их можно поместить непосредственно в состав самой внешней обработки в виде макетов с типом Двоичные данные. В таком случае получение данных в коде печати выглядит следующим образом:
МакетПодписи = ПолучитьМакет("ФаксимилеРуководителя");
Если ТипЗнч(МакетПодписи) = Тип("ДвоичныеДанные") Тогда
КартинкаПодписи = Новый Картинка(МакетПодписи);
РисунокТаблицы = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокТаблицы.Картинка = КартинкаПодписи;
КонецЕсли;
Такой подход обеспечивает полную автономность печатной формы: она сможет формироваться в любой базе, на любом сервере и в абсолютно любом режиме безопасности без обращения к внешним дискам.