Как устранить ошибки синхронизации подразделений между ЗУП и БП и исправить передачу мутабельного значения

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

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

Проблема 1: Подмена подразделений при выгрузке документа

Рассмотрим ситуацию: в ЗУП и БП настроено соответствие подразделений по уникальным идентификаторам (GUID) через регистр сведений СоответствияОбъектовИнформационныхБаз. Однако при выгрузке документа Отражение зарплаты в бухучете подразделение «ААА» в табличной части внезапно заменяется на подразделение «БББ». Проанализируем причины этого поведения.

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


Если НомерВариантаПоиска = 1 Тогда
    Если ЗначениеЗаполнено(СвойстваПоиска["Родитель"]) Тогда
        СтрокаИменСвойствПоиска = "Владелец,Наименование,Родитель";
    Иначе
        СтрокаИменСвойствПоиска = "Владелец,Наименование";
    КонецЕсли;
Иначе
    // Второй вариант поиска без учета родителя
    СтрокаИменСвойствПоиска = "Владелец,Наименование";
КонецЕсли;

В данном случае, если в базе-приемнике (БП) существуют дубли подразделений или объекты с похожими именами в разных ветках иерархии, поиск по наименованию может «перебить» сопоставление по GUID. Важно помнить: для стабильной работы синхронизации по идентификаторам необходимо в первую очередь проверять наличие ссылки в СоответствияОбъектовИнформационныхБаз и только при её отсутствии переходить к поиску по полям. Также проверьте установку флага НеЗамещатьОбъектПриЗагрузке = Истина в обработчике «Перед выгрузкой» — это предотвратит перезапись реквизитов уже сопоставленных объектов.

Проблема 2: Ошибка передачи мутабельного значения

При выполнении обмена часто возникает ошибка: «Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода СверткаПодразделенийЗУППередЗаписью()». Эта проблема специфична для платформы 1С:Предприятие 8.3 при работе в тонком клиенте.

Выясним причину. Метод СверткаПодразделенийЗУППередЗаписью вызывается в модуле объекта документа Отражение зарплаты в бухучете в обработчике ПередЗаписью. Этот метод предназначен для агрегации строк документа. Ошибка возникает из-за того, что при записи объекта в процессе обмена (база-корреспондент пытается выполнить Объект.Записать()) контекст выполнения пытается передать на сервер объект типа ДокументОбъект, который является мутабельным (изменяемым).

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


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Если это не загрузка из обмена, вызываем типовую свертку
    ЗарплатаКадрыБазовый.СверткаПодразделенийЗУППередЗаписью(ЭтотОбъект);
    
КонецПроцедуры

Использование свойства ОбменДанными.Загрузка = Истина — это стандартный способ отключить тяжелые проверки и дополнительные манипуляции с данными при их автоматическом переносе. Это не только уберет ошибку мутабельности, но и значительно ускорит сам процесс обмена.

Оптимизация правил выгрузки данных (ПВД)

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

Проанализируем пример кода ПВД для агрегации начислений:


Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос.Текст = 
"ВЫБРАТЬ
|   НачисленнаяЗарплата.Подразделение КАК Подразделение,
|   НачисленнаяЗарплата.ВидОперации КАК ВидОперации,
|   НачисленнаяЗарплата.СпособОтраженияЗарплатыВБухучете КАК СпособОтраженияЗарплатыВБухучете,
|   СУММА(НачисленнаяЗарплата.Сумма) КАК Сумма,
|   ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка) КАК ФизическоеЛицо
|ИЗ
|   Документ.ОтражениеЗарплатыВБухучете.НачисленнаяЗарплатаИВзносы КАК НачисленнаяЗарплата
|ГДЕ
|   НачисленнаяЗарплата.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
|   НачисленнаяЗарплата.Подразделение,
|   НачисленнаяЗарплата.ВидОперации,
|   НачисленнаяЗарплата.СпособОтраженияЗарплатыВБухучете";

Результаты = Запрос.ВыполнитьПакет();
ОписаниеОбъекта = Новый Структура;
ЗаполнитьЗначенияСвойств(ОписаниеОбъекта, Объект); // Копируем шапку документа
ОписаниеОбъекта.Вставить("НачисленнаяЗарплатаИВзносы", Результаты[0].Выгрузить());
Объект = ОписаниеОбъекта;

При использовании такого подхода крайне важно, чтобы в структуре ОписаниеОбъекта поле Подразделение содержало ссылку на объект, а не строку или иной тип данных. Если вы вручную подменяете Объект структурой в ПВД, убедитесь, что в ПКО документа ОтражениеЗарплатыВБухучете для табличных частей не настроены дополнительные обработчики, которые могут ожидать полноценный ДокументОбъект.

Итоговые рекомендации

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

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

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

← На главную