Ситуация, когда пользователи внезапно теряют возможность открывать или отправлять по почте присоединенные файлы (особенно PDF), является критической для документооборота любой компании. Часто эта проблема носит избирательный характер: одни файлы открываются без проблем, а другие вызывают ошибку «К сожалению, возникла непредвиденная ошибка» или техническое сообщение «Значение данного типа невозможно преобразовать для передачи как файл (Неопределено)». Рассмотрим детально, почему это происходит и как восстановить работоспособность системы.
Прежде чем приступать к активным действиям, проанализируем условия возникновения ошибки. Как правило, проблема проявляется следующим образом:
Такое поведение однозначно указывает на сбой в механизмах передачи двоичных данных между сервером 1С и клиентом, либо на некорректную работу временных хранилищ.
Как показывает практика, наиболее частой причиной внезапного отказа при передаче файлов является «битый» серверный кэш метаданных и сеансовых данных. Обычная очистка кэша на стороне пользователя здесь не поможет — требуется манипуляция на сервере. Для безопасного анализа и автоматизации этой процедуры можно использовать инструмент для очистки рабочего каталога сервера 1С.
Разберем по шагам процесс глубокой очистки серверного кэша:
1C:Enterprise 8.3 Server Agent).C:\Program Files\1cv8\srvinfo (или иной путь, указанный при установке сервера с ключом -d).srvinfo найдем каталоги с именами вида reg_XXXX (где XXXX — номер порта, обычно 1541).snccntx (кэш метаданных расширений и конфигурации) и snccntrc. Также рекомендуется очистить временную папку службы (обычно это AppData\Local\Temp пользователя, под которым запущена служба usr1cv8).Если доступ к базе осуществляется через тонкий клиент по протоколу HTTP/HTTPS или через веб-браузер, ограничение в 1 Мб может быть продиктовано настройками самого веб-сервера. Когда файл превышает допустимый лимит, сервер обрывает передачу, и 1С получает пустой объект Неопределено.
Для Microsoft IIS:
Проверим параметр maxAllowedContentLength. Рассмотрим пример настройки через файл web.config, который находится в папке с публикацией базы:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="104857600" />
</requestFiltering>
</security>
</system.webServer>
В данном примере мы устанавливаем лимит в 100 Мб. Если этот параметр не задан, IIS может использовать стандартные жесткие ограничения, блокируя передачу PDF-документов большого объема.
Для Apache:
В файле конфигурации httpd.conf проанализируем директиву LimitRequestBody. Если она установлена в значение, близкое к 1048576 (1 Мб), ее следует увеличить или установить в 0 (без ограничений).
Проанализируем механизм открытия файла: сервер 1С считывает двоичные данные из базы или тома, помещает их во временное хранилище, а затем клиент скачивает их в свой локальный временный каталог для запуска внешним приложением (например, Adobe Reader).
Выясним причину возможного отказа через проверку прав:
usr1cv8 (или того, под которым запущен сервер 1С) есть полные права на чтение/запись в папку C:\Windows\Temp.C: сервера. Если места критически мало, создание временных копий файлов размером более 1 Мб может завершаться ошибкой, в то время как мелкие файлы будут «проскакивать» за счет буферизации в оперативной памяти.Если проблема сохраняется, стоит проверить, как именно вызывается файл в коде конфигурации. Ошибка «Значение данного типа невозможно преобразовать...» часто возникает при использовании устаревших методов работы с BinaryData. При необходимости можно использовать методику правильной работы с файлами в управляемых формах для приведения кода к современным стандартам платформы.
Посмотрим на пример правильного получения файла из хранилища на управляемых формах:
&НаСервере
Функция ПолучитьДанныеФайлаНаСервере(СсылкаНаФайл)
ДанныеХранилища = КатегорииОбъектов.ПолучитьДанные(СсылкаНаФайл);
Если ДанныеХранилища = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Возврат ПоместитьВоВременноеХранилище(ДанныеХранилища, ЭтаФорма.УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура ОткрытьФайл(СсылкаНаФайл)
Адрес = ПолучитьДанныеФайлаНаСервере(СсылкаНаФайл);
Если Адрес <> Неопределено Тогда
ПолучитьФайл(Адрес, "Документ.pdf", Истина);
КонецЕсли;
КонецПроцедуры
Если в коде используется метод ПолучитьФайл без указания пути (второй параметр), 1С пытается интерактивно сохранить файл. При сбоях в сетевом соединении или некорректном адресе временного хранилища (что бывает при «засоренном» кэше) система вернет ошибку типа данных.
Проанализируем ситуацию со стороны безопасности. Антивирусы на сервере часто проверяют исходящий трафик. При передаче потока BinaryData (особенно если это PDF, который может содержать исполняемые сценарии), антивирус может блокировать поток для глубокого сканирования. Если сканирование длится дольше установленного таймаута сеанса 1С, соединение разрывается.
Для исключения этой причины добавим в список исключений антивируса:
ragent.exe, rmngr.exe, rphost.exe..pdf для сканирования «на лету» в сетевых потоках (если политика безопасности компании это позволяет).Подводя итог, можно сказать, что «магический» предел в 1 Мб чаще всего связан с серверным кэшем или настройками лимитов веб-сервера. Если очистка папок snccntx не принесла результата, следует обратить внимание на параметры публикации базы и права доступа к системным Temp-папкам. Совместное применение этих мер гарантированно решает проблему с открытием присоединенных файлов в «1С:Предприятие».