Настройка синхронизации между сложными конфигурациями, такими как 1С:ERP Управление предприятием 2 и 1С:Бухгалтерия предприятия 3.0 (БП), часто сопряжена с нюансами сопоставления данных. Одна из распространенных проблем, с которой мы можем столкнуться, касается передачи документов производства. Рассмотрим ситуацию, когда при выгрузке документа "Отчет переработчика" из ERP в БП создается документ "Поступление из переработки", но при этом теряются данные: табличная часть "Продукция" пуста, а поле "Склад" в шапке документа не заполнено, хотя в исходной базе все данные присутствуют. Для оперативного обнаружения подобных проблем на ранних этапах полезно внедрить мониторинг ошибок обмена с уведомлением на почту.
Разберем подробно причины такого поведения системы и предложим пошаговые методы решения проблемы, начиная от пользовательских настроек и заканчивая отладкой программного кода.
Прежде чем приступать к исправлению, давайте проанализируем, почему данные могут теряться. В основе обмена через универсальный формат (EnterpriseData) лежат правила конвертации, которые описывают, как объект одной системы превращается в объект другой. Часто корень проблемы кроется в различных функциональных опциях, поэтому перед глубокой отладкой стоит выполнить сравнение значений констант для поиска расхождений в настройках двух баз.
Null.Начнем с более простой проблемы — незаполненного склада. Как мы выяснили, если в ERP склад не задан явно в шапке документа или его тип не совпадает с ожидаемым в БП (например, используется кладовая цеха, которая не сопоставлена со складом БП), поле придет пустым. Также убедитесь, что корректно настроена регистрация объектов для обмена, чтобы изменения по нужным складам и организациям своевременно попадали в очередь выгрузки.
Чтобы избежать необходимости заполнять это поле вручную в каждом документе, воспользуемся штатными настройками синхронизации на стороне 1С:Бухгалтерия предприятия.
Выполним следующие действия:
После применения этой настройки, при следующей загрузке документа "Поступление из переработки", если поле склад в XML-файле не передано, БП автоматически подставит указанный нами склад. Это решит проблему ручного заполнению шапки документа.
Ситуация с пустой табличной частью "Продукция" более сложная и часто требует вмешательства на уровне правил конвертации или отладки. Если справочник Номенклатура синхронизирован корректно, и позиции есть в обеих базах, проблема кроется в алгоритме обработки входящих данных. В редких случаях причиной может стать некорректная сборка конфигурации, где требуется сравнение и замена GUID объектов метаданных в XML-выгрузках для восстановления связи между типами данных.
В ходе обсуждения выяснилось, что проблема часто заключается в механизме проверки существования документа. Если документ уже есть в базе приемника, процедура конвертации может принудительно прерывать заполнение таблиц, полагая, что данные уже актуальны или изменены вручную.
Чтобы убедиться в причине, нам потребуется запустить "1С:Бухгалтерия" в режиме конфигуратора и воспользоваться отладкой. Нас интересуют общие модули, связанные с обменом данными через универсальный формат. Обычно это модуль МенеджерОбменаЧерезУниверсальныйФормат.
В процедуре конвертации объекта (ПКО) для документа "Поступление из переработки" (имя метода похоже на ПКО_Документ_ПоступлениеИзПереработки_ПриКонвертацииДанныхXDTO или аналогичное) поставим точку останова перед записью объекта. Посмотрим, заполнены ли коллекции Объект.Продукция или ДанныеXDTO.Продукция.
Если мы обнаружим, что данные очищаются или не заполняются из-за проверки на существование ссылки, нам необходимо скорректировать логику. Важно: не рекомендуется менять типовой код конфигурации ("снимать с замка"), лучше использовать механизм Расширений.
Найдем в коде участок, отвечающий за проверку. Обычно он выглядит примерно так:
// Примерная логика, которую нужно найти и проанализировать
Если Не Объект.ЭтоНовый() И Объект.Проведен Тогда
// Система решает не перезаполнять данные, чтобы сохранить ручные правки
Возврат;
КонецЕсли;
Для решения проблемы нам нужно закомментировать или обойти это условие, чтобы принудительно обновить табличную часть данными из ERP. В рамках расширения мы можем использовать аннотацию &Вместо или &После для переопределения поведения метода конвертации.
Примерный алгоритм действий для программиста:
МенеджерОбменаЧерезУниверсальныйФормат.Рассмотрим пример кода, который часто становится причиной проблемы (основываясь на практике обмена EnterpriseData):
// Фрагмент, который может блокировать перезаполнение
// Если ЗначениеЗаполнено(Приемник.Ссылка) Тогда
// Возврат;
// КонецЕсли;
Если мы закомментируем подобную проверку, система будет каждый раз при обмене полностью перезаписывать табличную часть данными из источника. Это решит проблему пустой продукции, но следует помнить о побочном эффекте: любые ручные изменения, внесенные бухгалтером в этот документ в БП, будут затираться при следующем обмене.
Помимо описанных выше решений, давайте проверим еще несколько важных моментов, которые могут влиять на результат:
Убедитесь, что в настройках синхронизации в обеих базах (ERP и БП) выбрана одна и та же версия формата EnterpriseData. В разных версиях (например, 1.10 и 1.13) структура XML-файла может отличаться. Если ERP выгружает данные в новом формате, а БП пытается прочитать их старыми правилами, вложенные таблицы могут быть проигнорированы.
Компания 1С регулярно выпускает исправления ошибок (патчи). Проверьте список установленных исправлений для вашей версии БП и ERP. В баг-трекере 1С зафиксированы ошибки, связанные с давальческой схемой в версиях ERP 2.5, когда аналитика затрат или продукция не попадали в выгрузку при определенных условиях.
Чтобы убедиться, что все материалы и продукция отражены корректно после исправления обмена, рекомендуем использовать специализированную ведомость по материалам, переданным в переработку, которая поможет бухгалтеру контролировать остатки в базе БП 3.0.
Для устранения ошибки "пустых полей" при синхронизации:
МенеджерОбменаЧерезУниверсальныйФормат.Если Не Объект.ЭтоНовый()... в процедуре конвертации, чтобы разрешить перезапись табличных частей.Используя этот подход, мы обеспечиваем корректную передачу данных, минимизируя ручной труд пользователей и сохраняя целостность учетных данных в обеих системах.