Как исправить аварийное завершение рабочего процесса 1С при синхронизации данных в Бухгалтерии предприятия 3.0

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

При обновлении конфигурации «Бухгалтерия предприятия» с релиза 3.0.105.45 на 3.0.106.101 (и последующие в этой ветке) многие пользователи столкнулись с критической проблемой: при выполнении синхронизации данных сеанс обрывается с сообщением «На сервере 1С:Предприятия произошла неисправимая ошибка». В журнале регистрации при этом фиксируется лишь лаконичная запись: «Аварийно завершился рабочий процесс фонового задания».

Рассмотрим подробно, почему это происходит и как программно обойти эту ошибку, если обновление платформы или установка патчей не помогают.

Анализируем причину падения rphost

Проанализируем ситуацию: падение рабочего процесса (rphost) — это признак критической ошибки на уровне платформы 1С. В случае с релизом 3.0.106 проблема локализована в механизме записи документа ОперацияБух. При использовании нетиповых правил обмена (созданных в «Конвертации данных 2.1» или 3.0) загрузка этого документа вызывает конфликт памяти в платформе 8.3.17.х, 8.3.18.х и некоторых сборках 8.3.19.х.

Выясним, что именно провоцирует сбой. При стандартной загрузке данных через универсальный механизм обмена платформа пытается записать объект документа вместе с его наборами записей (движениями по регистру бухгалтерии Хозрасчетный) в одной транзакции с установленным флагом ОбменДанными.Загрузка = Истина. Именно этот сценарий в новых релизах БП стал приводить к «вылету» процесса без объяснения причин.

Шаг 1: Локализация ошибки через ручную загрузку

Прежде чем вносить изменения в код, проверим, на каком именно объекте происходит сбой. Для этого выполним следующие действия:

  1. Запустим базу-приемник («Бухгалтерия предприятия») в режиме «Толстый клиент» или «Тонкий клиент» из-под Конфигуратора.
  2. Воспользуемся обработкой «Универсальный обмен данными в формате XML».
  3. Попробуем загрузить файл обмена вручную. Если сеанс «падает», значит, проблема действительно в данных или платформенном механизме их записи.
  4. Поочередно отключая выгрузку различных типов объектов в базе-источнике, определим проблемный объект. Как показывает практика, в 99% случаев это документ ДокументОбъект.ОперацияБух.

Шаг 2: Проверка требований к версии платформы

Важно помнить, что релиз БП 3.0.106.101 предъявляет повышенные требования к технологической платформе. Проверим, соответствует ли ваша версия минимально допустимым:

Шаг 3: Решение через модификацию правил обмена (обработчик «После загрузки»)

Самый эффективный способ обойти ошибку — разделить процесс записи документа и процесс записи его проводок. Мы заставим систему сначала создать «пустой» документ (без движений), зафиксировать его в базе, а затем отдельным шагом записать набор записей регистра бухгалтерии.

Разберем, как реализовать это в правилах обмена (Конвертация данных). В ПКО (Правила конвертации объектов) для документа ОперацияБух в обработчике «После загрузки» пропишем следующий код:


Если РежимЗагрузкиДанныхВИнформационнуюБазу Тогда
    // 1. Выгружаем загруженные движения во временную таблицу
    ДвиженияХозрасчетный = Объект.Движения.Хозрасчетный.Выгрузить();
    
    // 2. Очищаем движения в самом объекте перед основной записью
    Объект.Движения.Хозрасчетный.Очистить();
    
    // 3. Отключаем режим загрузки для корректной регистрации в базе, если нужно, 
    // но обычно оставляем Истина, если не хотим срабатывания лишних подписок.
    // Однако здесь важно просто записать сам документ-контейнер.
    Объект.ОбменДанными.Загрузка = Истина; 
    Объект.Записать();
    
    // 4. Устанавливаем регистратор для каждой строки движений
    Для Каждого Движение Из ДвиженияХозрасчетный Цикл
        Движение.Регистратор = Объект.Ссылка;
    КонецЦикла;
    
    // 5. Загружаем движения обратно в набор записей и записываем их отдельно
    Объект.Движения.Хозрасчетный.Загрузить(ДвиженияХозрасчетный);
    Объект.Движения.Хозрасчетный.Записать();
КонецЕсли;

Важный момент: использование метода Объект.Движения.Хозрасчетный.Записать() после того, как сам Объект уже записан, позволяет платформе обработать транзакцию более стабильно, избегая критического сбоя памяти.

Шаг 4: Альтернативное решение в общем модуле

Если вы используете БСП (Библиотеку стандартных подсистем) и обмен идет через механизм КонвертацияОбъектовИнформационныхБаз, можно внести изменения в процедуру ЗаписатьОбъектВИБ. Это более «радикальный» метод, так как он затрагивает программный код конфигурации, но он гарантированно решает проблему для всех видов обмена (через прямое подключение, сетевой каталог или FTP).

Рассмотрим пример модификации кода:


Если ТипЗнч(Объект) = Тип("ДокументОбъект.ОперацияБух") Тогда
    // Сохраняем проводки в переменную
    Проводки = Объект.Движения.Хозрасчетный.Выгрузить();
    
    // Очищаем движения перед записью документа
    Объект.Движения.Хозрасчетный.Очистить();
    Объект.Записать();
    
    // Работаем напрямую с набором записей регистра
    НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);
    НаборЗаписей.Загрузить(Проводки);
    
    // Записываем движения отдельно
    НаборЗаписей.Записать(Истина);
Иначе
    // Стандартная логика для остальных объектов
    Объект.Записать();
КонецЕсли;

Дополнительные рекомендации

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

Таким образом, разделение процесса записи документа и его бухгалтерских проводок является наиболее надежным способом восстановления работоспособности синхронизации в конфигурации БП 3.0.106. Применяйте предложенные фрагменты кода в ваших правилах обмена, и это позволит избежать аварийного завершения работы сервера.

← На главную