Синхронизация данных между конфигурациями 1С:Управление торговлей 11 (УТ 11) и 1С:Бухгалтерия предприятия 3.0 (БП 3.0) — одна из наиболее распространенных задач в экосистеме 1С. При использовании современной технологии Enterprise Data (Конвертация данных 3.0) специалисты часто сталкиваются со следующей проблемой: документы, которые уже были загружены в базу-приемник (БП 3.0) и изменены или проведены бухгалтером, при повторном обмене снова перезаписываются данными из источника (УТ 11). Это приводит к потере ручных корректировок счетов учета, аналитики и других важных бухгалтерских правок.
В этой статье мы подробно разберем, как решить эту проблему, рассмотрим несколько практических методов — от настройки типовых правил регистрации до программного вмешательства в логику работы конвертации данных и использования расширений конфигурации.
Это самый экологичный и правильный с точки зрения архитектуры обмена способ, упомянутый в сообщениях форума. Вместо того чтобы блокировать запись уже в базе-приемнике, мы можем настроить систему так, чтобы измененные в УТ 11 документы просто не регистрировались к отправке повторно, если они уже один раз были успешно переданы и обработаны.
Давайте разберем по шагам, как это работает:
Этот метод позволяет разгрузить каналы связи и существенно ускорить сам процесс синхронизации, так как база-источник не будет пытаться выгружать "старые" документы.
Если нам необходимо жестко гарантировать, что ни один существующий в БП 3.0 документ не будет перезаписан данными из УТ 11, мы можем использовать возможности обработчиков событий в Конвертации данных 3.0. Для этого используется логика работы с правилами обработки данных (ПОД) на стороне приемника.
В обработчике «При загрузке» для конкретного объекта мы можем проверить, существует ли уже данный документ в базе данных, и если да — отменить его запись.
Проанализируем пример кода, который можно внедрить в обработчик:
// Проверяем, существует ли объект в базе данных (базе-приемнике)
Если ДанныеИБ <> Неопределено И НЕ ДанныеИБ.ЭтоНовый() Тогда
// Объект уже существует в информационной базе БП 3.0.
// Устанавливаем флаг Отказ, чтобы предотвратить перезапись старых данных.
Отказ = Истина;
КонецЕсли;
Рассмотрим подробнее, как работает этот механизм:
ДанныеИБ содержит состояние объекта, найденного в базе данных по уникальному идентификатору (GUID) или полям поиска. Если объект новый и в базе его еще нет, ДанныеИБ будет иметь значение Неопределено или метод ЭтоНовый() вернет значение Истина.Отказ = Истина в данном обработчике сообщает платформе о том, что этот конкретный объект записывать не нужно. При этом общая транзакция загрузки пакета обмена не прерывается, и все остальные (новые) документы успешно загружаются.Если перезапись документов является проблемой только для прошлых (закрытых) отчетных периодов, мы можем воспользоваться встроенным типовым механизмом защиты данных в БП 3.0 без изменения правил обмена и написания кода.
Выполним следующие настройки по шагам:
Это самый простой и надежный способ защитить закрытые периоды от случайных изменений со стороны операторов и менеджеров торговой базы.
Часто возникает ситуация, когда полностью запрещать перезапись документа нельзя (например, в УТ 11 могут измениться важные первичные данные: количество товара, цена или контрагент), но бухгалтер хочет защитить от затирания исключительно счета учета расчетов или счета учета номенклатуры, которые настраиваются непосредственно в БП 3.0.
В этом случае идеальным решением будет создание небольшого расширения конфигурации на стороне БП 3.0. Мы перехватим событие ПередЗаписью документа и выполним выборочное восстановление реквизитов, если запись инициирована обменом.
Рассмотрим пример реализации такого кода в расширении для документа ПоступлениеТоваровУслуг:
&ПередЗаписью
Процедура Ист_ПередЗаписьюПеред(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем, что запись происходит в режиме загрузки данных обмена
Если ОбменДанными.Загрузка Тогда
СсылкаНаДокумент = Ссылка;
Если НЕ СсылкаНаДокумент.Пустая() Тогда
// Получаем старые значения счетов учета из базы данных до перезаписи
СтарыеСчета = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаДокумент, "СчетУчетаРасчетовСПоставщиком, СчетУчетаРасчетовПоАвансам");
// Восстанавливаем оригинальные значения, настроенные бухгалтером
ЭтотОбъект.СчетУчетаРасчетовСПоставщиком = СтарыеСчета.СчетУчетаРасчетовСПоставщиком;
ЭтотОбъект.СчетУчетаРасчетовПоАвансам = СтарыеСчета.СчетУчетаРасчетовПоАвансам;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем этот код:
ОбменДанными.Загрузка принимает значение Истина только тогда, когда объект записывается платформой в процессе выполнения обмена. Это позволяет нам не вмешиваться в работу пользователей, когда они редактируют документ вручную.ОбщегоНазначения.ЗначенияРеквизитовОбъекта() мы быстро считываем старые значения нужных полей напрямую из базы данных, минуя кэш, и присваиваем их записываемому объекту. В итоге документ обновляется (меняются товары, цены), но критически важные для бухгалтера счета расчетов остаются нетронутыми.Выбор конкретного метода зависит от бизнес-требований вашей компании:
При загрузке в КД 3.0 с проверкой ДанныеИБ.ЭтоНовый().ОбменДанными.Загрузка.