При работе в конфигурациях на обычных формах (например, Управление торговлей 10.3, Зарплата и Управление Персоналом 2.5 или Бухгалтерия предприятия 2.0) разработчики и администраторы иногда сталкиваются со сбоем: при попытке подключить, запустить или напечатать внешнюю печатную форму программа «1С:Предприятие» экстренно завершает работу без понятных сообщений об ошибках.
Рассмотрим причины возникновения этой проблемы и разберем практические способы ее решения.
Проанализируем ситуация подробнее. Ошибка проявляется при выполнении строки кода, в которой происходит программная инициализация внешней обработки по пути к файлу:
ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяФайлаВнешнейОбработки);
В клиент-серверном варианте работы информационной базы этот вызов приводит к аварийному завершению рабочего процесса сервера 1С (rphost) или вылету клиентского приложения. При этом в файловом режиме аналогичная база может работать без сбоев.
Причина кроется в ошибке платформы № 10182671. В некоторых релизах платформы (в частности, 8.3.10.2505) при вызове создания внешней обработки из толстого клиента обычного приложения в клиент-серверном режиме происходил сбой ядра платформы. Ниже приведены проверенные способы устранения этой проблемы.
Если быстро обновить платформу на сервере и всех клиентских компьютерах нет возможности, изменим программный код подключения обработки. Вместо прямого вызова метода ВнешниеОбработки.Создать() задействуем метод получения формы.
Разберем решение по шагам:
УниверсальныеМеханизмы.НапечататьВнешнююФорму).ЭтотОбъект полученной формы.Посмотрим на пример кода до и после изменений:
// Старый падающий код:
// ВнешняяОбработка = ВнешниеОбработки.Создать(ПолноеИмяФайлаОбработки);
// Исправленный код (обход проблемы):
ВнешняяОбработкаФорма = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаОбработки);
Если ВнешняяОбработкаФорма = Неопределено Тогда
Сообщить("Не удалось получить форму внешней обработки. Убедитесь, что в обработку добавлена форма!");
Возврат;
КонецЕсли;
ВнешняяОбработка = ВнешняяОбработкаФорма.ЭтотОбъект;
Этот метод позволяет корректно инициализировать модуль внешней обработки в памяти без вызова сбойного механизма платформы.
Так как проблема связана с дефектом самой платформы «1С:Предприятие», кардинальным решением является смена релиза:
Выясним еще одну частую причину, из-за которой инициализация внешних обработок в клиент-серверном режиме завершается ошибкой. При обработке вызова серверный процесс распаковывает и сохраняет файл во временный каталог на сервере.
Если служба «Агент сервера 1С:Предприятия» запущена от имени локальной учетной записи (например, NT AUTHORITY\LOCAL SERVICE или с ограничением прав на уровне ОС), у нее может не хватать разрешений на запись и чтение файлов в системных каталогах TEMP и TMP.
Для исправления выполним следующие действия:
services.msc).Напомним важный архитектурный момент: в клиент-серверном режиме сервер 1С не имеет прямого доступа к локальным дискам клиентского ПК. Если код пытается передать путь к файлу типа C:\Users\... напрямую на сервер, это приведет к ошибке доступа.
Правильным решением при написании собственного функционала является загрузка файла во временное хранилище на клиенте и последующее подключение на сервере:
// Код на клиенте:
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлуНаКлиенте);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
// Передаем АдресХранилища на сервер и вызываем:
ВременноеИмя = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
ОбработкаОбъект = ВнешниеОбработки[ВременноеИмя].Создать();
Соблюдение этих правил и учет особенностей релизов платформы позволит избежать аварийного завершения работы программы при активном использовании внешних печатных форм и обработок.