Что делать, если 1С вылетает при подключении внешней печатной формы или обработки?

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

При работе в конфигурациях на обычных формах (например, Управление торговлей 10.3, Зарплата и Управление Персоналом 2.5 или Бухгалтерия предприятия 2.0) разработчики и администраторы иногда сталкиваются со сбоем: при попытке подключить, запустить или напечатать внешнюю печатную форму программа «1С:Предприятие» экстренно завершает работу без понятных сообщений об ошибках.

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

Причина падения программы и код ошибки

Проанализируем ситуация подробнее. Ошибка проявляется при выполнении строки кода, в которой происходит программная инициализация внешней обработки по пути к файлу:

ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяФайлаВнешнейОбработки);

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

Причина кроется в ошибке платформы № 10182671. В некоторых релизах платформы (в частности, 8.3.10.2505) при вызове создания внешней обработки из толстого клиента обычного приложения в клиент-серверном режиме происходил сбой ядра платформы. Ниже приведены проверенные способы устранения этой проблемы.

Способ 1. Программный обход ошибки через получение формы

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

Разберем решение по шагам:

  1. Откроем внешнюю печатную форму или обработку в режиме Конфигуратора и убедимся, что в ней есть хотя бы одна форма (если формы нет — добавим обычную пустую форму).
  2. В конфигурации найдем место, где происходит подключение обработки (например, в справочнике внешних обработок или общем модуле УниверсальныеМеханизмы.НапечататьВнешнююФорму).
  3. Заменим запуск через конструктор на обращение к свойству ЭтотОбъект полученной формы.

Посмотрим на пример кода до и после изменений:


// Старый падающий код:
// ВнешняяОбработка = ВнешниеОбработки.Создать(ПолноеИмяФайлаОбработки);

// Исправленный код (обход проблемы):
ВнешняяОбработкаФорма = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаОбработки);

Если ВнешняяОбработкаФорма = Неопределено Тогда
    Сообщить("Не удалось получить форму внешней обработки. Убедитесь, что в обработку добавлена форма!");
    Возврат;
КонецЕсли;

ВнешняяОбработка = ВнешняяОбработкаФорма.ЭтотОбъект;

Этот метод позволяет корректно инициализировать модуль внешней обработки в памяти без вызова сбойного механизма платформы.

Способ 2. Обновление или откат версии платформы

Так как проблема связана с дефектом самой платформы «1С:Предприятие», кардинальным решением является смена релиза:

  1. Обновление: установим релиз платформы, в котором данная ошибка уже исправлена (версии 8.3.10.2561, 8.3.11 и выше).
  2. Даунгрейд: если переход на более новую ветку платформы пока не планируется, откатим платформу на стабильный предыдущий релиз (например, 8.3.10.2466 или 8.3.10.2299).

Способ 3. Проверка прав учетной записи службы «Агент сервера 1С»

Выясним еще одну частую причину, из-за которой инициализация внешних обработок в клиент-серверном режиме завершается ошибкой. При обработке вызова серверный процесс распаковывает и сохраняет файл во временный каталог на сервере.

Если служба «Агент сервера 1С:Предприятия» запущена от имени локальной учетной записи (например, NT AUTHORITY\LOCAL SERVICE или с ограничением прав на уровне ОС), у нее может не хватать разрешений на запись и чтение файлов в системных каталогах TEMP и TMP.

Для исправления выполним следующие действия:

  1. Откроем оснастку управления службами Windows (services.msc).
  2. Найдем службу «Агент сервера 1С:Предприятия».
  3. В свойствах службы на вкладке Вход в систему укажем учетную запись доменного или локального администратора с полными правами на каталоги сервера.
  4. Перезапустим службу Агента 1С.

Способ 4. Безопасная передача файла через временное хранилище

Напомним важный архитектурный момент: в клиент-серверном режиме сервер 1С не имеет прямого доступа к локальным дискам клиентского ПК. Если код пытается передать путь к файлу типа C:\Users\... напрямую на сервер, это приведет к ошибке доступа.

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


// Код на клиенте:
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлуНаКлиенте);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);

// Передаем АдресХранилища на сервер и вызываем:
ВременноеИмя = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
ОбработкаОбъект = ВнешниеОбработки[ВременноеИмя].Создать();

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

← На главную