Каждый разработчик 1С рано или поздно сталкивается с ситуацией, когда код, идеально работающий во внешней обработке или в обычном отчете, наотрез отказывается выполнять простейшие файловые операции внутри внешней печатной формы (ВПФ). Типичный пример: попытка прочитать файл картинки или документа с сетевого диска с помощью конструкции Новый ДвоичныеДанные(ПолныйПуть) завершается аварийно. При этом система выдает крайне неприятную ошибку: «Установлен безопасный режим. Выполнение операции запрещено».
Давайте подробно разберем эту ситуацию, проанализируем причины возникновения ошибки и рассмотрим несколько надежных практических способов ее решения — от быстрых обходных путей до методологически правильных подходов, соответствующих стандартам разработки фирмы «1С».
Для начала проанализируем, почему внешняя печатная форма ведет себя иначе, чем обычный внешний отчет, запущенный через меню «Файл — Открыть». Дело здесь в механизмах безопасности платформы «1С:Предприятие» и логике Библиотеки стандартных подсистем (БСП). Источник проблемы кроется в двух основных факторах:
ПараметрыРегистрации.БезопасныйРежим = Ложь, БСП может проигнорировать эту настройку. Если в системе используются профили безопасности или активна современная версия БСП, платформа автоматически запускает код ВПФ в безопасном режиме. А в безопасном режиме любые операции с локальной или сетевой файловой системой (кроме работы с временными файлами в специально отведенных каталогах) жестко блокируются на уровне платформы.\\SERVER\Share\file.jpg. Но когда запускается ВПФ, формирование печатной формы происходит на стороне Сервера приложения 1С. Здесь в силу вступают ограничения серверной службы (например, USR1CV8), которая по умолчанию не имеет доступа к сетевым ресурсам домена и не может авторизоваться на внешних файловых серверах.Рассмотрим подробнее каждый из способов обхода и решения этой проблемы.
Если вам нужно срочно запустить печатную форму в работу, а времени на переписывание архитектуры передачи файлов нет, можно прибегнуть к хитрости. Мы можем заставить БСП применить старые алгоритмы обработки безопасного режима, которые корректно считывали флаг отключения безопасности.
Для этого в модуле объекта внешней печатной формы найдем экспортную функцию СведенияОВнешнейОбработке() и добавим в структуру регистрации указание версии совместимости БСП:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
// Указываем старую версию БСП для отключения жесткого контроля безопасности
ПараметрыРегистрации.Вставить("ВерсияБСП", "2.1.3");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
// Остальные параметры регистрации вашей ВПФ...
Возврат ПараметрыРегистрации;
КонецФункции
Этот метод заставит систему доверять коду обработки и действительно отключит безопасный режим при ее выполнении. Однако помните, что данный способ является обходным и может не поддерживаться в будущих версиях БСП.
Правильный и безопасный подход, рекомендуемый фирмой «1С», заключается не в полном отключении безопасного режима, а в запросе точечного разрешения на доступ к конкретному сетевому или локальному каталогу. Таким образом, система останется защищенной, но печатная форма получит легитимное право читать файлы из нужного места.
Для реализации этого механизма мы должны использовать функции программного интерфейса БСП. В функции СведенияОВнешнейОбработке() необходимо зарегистрировать запрос на использование каталога файловой системы:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработкеПервоначальноеЗаполнение();
// Настраиваем базовые параметры
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидДополнительнойОбработкиПечатнаяФорма();
ПараметрыРегистрации.БезопасныйРежим = Истина; // Оставляем безопасный режим включенным!
// Создаем запрос на разрешение доступа к сетевому каталогу с картинками
КаталогДоступа = "\\ARYKOV\Documents\1C\1CFiles\";
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(
КаталогДоступа,
Истина, // Разрешить чтение данных
Ложь // Запретить запись/изменение данных
);
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
Возврат ПараметрыРегистрации;
КонецФункции
После того как вы загрузите эту ВПФ в справочник «Дополнительные отчеты и обработки», администратор системы при сохранении формы увидит стандартное окно с предложением предоставить доступ к указанному сетевому пути. После подтверждения платформа автоматически разрешит методу Новый ДвоичныеДанные читать файлы из этого каталога даже в безопасном режиме.
Если сервер 1С работает под системной учетной записью, которая физически не может получить доступ к сетевому каталогу вашего офиса (например, сервер находится в закрытом контуре или в облаке), чтение файлов непосредственно на сервере становится невозможным. В этом случае мы должны перенести операцию чтения файла на сторону Клиента, где у пользователя гарантированно есть доступ к файлу.
Рассмотрим этот алгоритм по шагам:
Посмотрим на пример реализации клиент-серверного взаимодействия в форме управления печатью:
&НаКлиенте
Процедура ПодготовитьФайлДляПечати(ПолныйПутьКФайлу)
// Данный код выполняется на клиенте, здесь безопасный режим сервера не действует
Попытка
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПолныйПутьКФайлу);
// Помещаем во временное хранилище текущего сеанса
АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
// Передаем адрес на сервер для формирования печатной формы
СформироватьПечатнуюФормуНаСервере(АдресФайлаВХранилище);
Исключение
Предупреждение("Не удалось прочитать файл на клиенте: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура СформироватьПечатнуюФормуНаСервере(АдресФайлаВХранилище)
// На сервере в безопасном режиме извлекаем двоичные данные из временного хранилища
// Эта операция полностью разрешена платформой
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище);
// Преобразуем двоичные данные в картинку для табличного документа
КартинкаДляВывода = Новый Картинка(ДвоичныеДанные);
// Дальнейший вывод в ТабличныйДокумент...
КонецПроцедуры
Используя этот подход, мы полностью исключаем конфликты прав доступа серверной службы USR1CV8 к сетевым ресурсам организации и обходим ограничения безопасного режима БСП.
Если файлы картинок номенклатуры хранятся в томах на сетевом диске, и серверная часть 1С обязана обращаться к ним напрямую в фоновом режиме (без участия клиента), необходимо настроить права самой операционной системы:
Агент сервера 1С:Предприятия (обычно это локальный пользователь USR1CV8 или ./1cv8).\\ARYKOV\Documents\ не сможет авторизовать его сессию.DOMAIN\Service1C) и предоставьте этой учетной записи права чтения на сетевой ресурс, где располагаются ваши файлы картинок.Выполнив одну из предложенных настроек или изменив архитектуру работы с файлами через временное хранилище, вы навсегда избавитесь от ошибок доступа при формировании внешних печатных форм в системе «1С:Предприятие».