При обновлении конфигурации «Бухгалтерия предприятия» с релиза 3.0.105.45 на 3.0.106.101 (и последующие в этой ветке) многие пользователи столкнулись с критической проблемой: при выполнении синхронизации данных сеанс обрывается с сообщением «На сервере 1С:Предприятия произошла неисправимая ошибка». В журнале регистрации при этом фиксируется лишь лаконичная запись: «Аварийно завершился рабочий процесс фонового задания».
Рассмотрим подробно, почему это происходит и как программно обойти эту ошибку, если обновление платформы или установка патчей не помогают.
Проанализируем ситуацию: падение рабочего процесса (rphost) — это признак критической ошибки на уровне платформы 1С. В случае с релизом 3.0.106 проблема локализована в механизме записи документа ОперацияБух. При использовании нетиповых правил обмена (созданных в «Конвертации данных 2.1» или 3.0) загрузка этого документа вызывает конфликт памяти в платформе 8.3.17.х, 8.3.18.х и некоторых сборках 8.3.19.х.
Выясним, что именно провоцирует сбой. При стандартной загрузке данных через универсальный механизм обмена платформа пытается записать объект документа вместе с его наборами записей (движениями по регистру бухгалтерии Хозрасчетный) в одной транзакции с установленным флагом ОбменДанными.Загрузка = Истина. Именно этот сценарий в новых релизах БП стал приводить к «вылету» процесса без объяснения причин.
Прежде чем вносить изменения в код, проверим, на каком именно объекте происходит сбой. Для этого выполним следующие действия:
ДокументОбъект.ОперацияБух.Важно помнить, что релиз БП 3.0.106.101 предъявляет повышенные требования к технологической платформе. Проверим, соответствует ли ваша версия минимально допустимым:
Самый эффективный способ обойти ошибку — разделить процесс записи документа и процесс записи его проводок. Мы заставим систему сначала создать «пустой» документ (без движений), зафиксировать его в базе, а затем отдельным шагом записать набор записей регистра бухгалтерии.
Разберем, как реализовать это в правилах обмена (Конвертация данных). В ПКО (Правила конвертации объектов) для документа ОперацияБух в обработчике «После загрузки» пропишем следующий код:
Если РежимЗагрузкиДанныхВИнформационнуюБазу Тогда
// 1. Выгружаем загруженные движения во временную таблицу
ДвиженияХозрасчетный = Объект.Движения.Хозрасчетный.Выгрузить();
// 2. Очищаем движения в самом объекте перед основной записью
Объект.Движения.Хозрасчетный.Очистить();
// 3. Отключаем режим загрузки для корректной регистрации в базе, если нужно,
// но обычно оставляем Истина, если не хотим срабатывания лишних подписок.
// Однако здесь важно просто записать сам документ-контейнер.
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
// 4. Устанавливаем регистратор для каждой строки движений
Для Каждого Движение Из ДвиженияХозрасчетный Цикл
Движение.Регистратор = Объект.Ссылка;
КонецЦикла;
// 5. Загружаем движения обратно в набор записей и записываем их отдельно
Объект.Движения.Хозрасчетный.Загрузить(ДвиженияХозрасчетный);
Объект.Движения.Хозрасчетный.Записать();
КонецЕсли;
Важный момент: использование метода Объект.Движения.Хозрасчетный.Записать() после того, как сам Объект уже записан, позволяет платформе обработать транзакцию более стабильно, избегая критического сбоя памяти.
Если вы используете БСП (Библиотеку стандартных подсистем) и обмен идет через механизм КонвертацияОбъектовИнформационныхБаз, можно внести изменения в процедуру ЗаписатьОбъектВИБ. Это более «радикальный» метод, так как он затрагивает программный код конфигурации, но он гарантированно решает проблему для всех видов обмена (через прямое подключение, сетевой каталог или FTP).
Рассмотрим пример модификации кода:
Если ТипЗнч(Объект) = Тип("ДокументОбъект.ОперацияБух") Тогда
// Сохраняем проводки в переменную
Проводки = Объект.Движения.Хозрасчетный.Выгрузить();
// Очищаем движения перед записью документа
Объект.Движения.Хозрасчетный.Очистить();
Объект.Записать();
// Работаем напрямую с набором записей регистра
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);
НаборЗаписей.Загрузить(Проводки);
// Записываем движения отдельно
НаборЗаписей.Записать(Истина);
Иначе
// Стандартная логика для остальных объектов
Объект.Записать();
КонецЕсли;
Проанализируем еще несколько факторов, которые могут влиять на стабильность синхронизации в данных релизах:
%TEMP% на сервере 1С и на локальной машине пользователя.rphost при возникновении ошибки обращения к памяти. Попробуйте добавить rphost.exe в исключения DEP или временно отключить ее для проверки.Таким образом, разделение процесса записи документа и его бухгалтерских проводок является наиболее надежным способом восстановления работоспособности синхронизации в конфигурации БП 3.0.106. Применяйте предложенные фрагменты кода в ваших правилах обмена, и это позволит избежать аварийного завершения работы сервера.