Как отменить перезапись ранее загруженных документов при обмене УТ 11 и БП 3.0?

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

Синхронизация данных между конфигурациями 1С:Управление торговлей 11 (УТ 11) и 1С:Бухгалтерия предприятия 3.0 (БП 3.0) — одна из наиболее распространенных задач в экосистеме 1С. При использовании современной технологии Enterprise Data (Конвертация данных 3.0) специалисты часто сталкиваются со следующей проблемой: документы, которые уже были загружены в базу-приемник (БП 3.0) и изменены или проведены бухгалтером, при повторном обмене снова перезаписываются данными из источника (УТ 11). Это приводит к потере ручных корректировок счетов учета, аналитики и других важных бухгалтерских правок.

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

Метод 1. Настройка правил регистрации объектов (ПРО) на стороне источника

Это самый экологичный и правильный с точки зрения архитектуры обмена способ, упомянутый в сообщениях форума. Вместо того чтобы блокировать запись уже в базе-приемнике, мы можем настроить систему так, чтобы измененные в УТ 11 документы просто не регистрировались к отправке повторно, если они уже один раз были успешно переданы и обработаны.

Давайте разберем по шагам, как это работает:

  1. Анализ логики регистрации: По умолчанию при любом изменении документа в УТ 11 (например, менеджер зашел и поменял комментарий или статус) система регистрирует этот объект на узле обмена.
  2. Использование правил регистрации данных (ПРД): В Конвертации данных 3.0 правила регистрации выгружаются в виде отдельного XML-файла. Мы можем открыть эти правила в конфигураторе или специализированной обработке и настроить фильтры.
  3. Установка ограничений: Мы можем прописать условие, при котором документ снимается с регистрации или вообще не регистрируется повторно. Например, если в документе УТ 11 установлен определенный статус (например, "Согласован" или "Закрыт"), либо если с момента первой отправки прошло определенное количество времени.

Этот метод позволяет разгрузить каналы связи и существенно ускорить сам процесс синхронизации, так как база-источник не будет пытаться выгружать "старые" документы.

Метод 2. Программный запрет перезаписи в обработчике «При загрузке» (КД 3.0)

Если нам необходимо жестко гарантировать, что ни один существующий в БП 3.0 документ не будет перезаписан данными из УТ 11, мы можем использовать возможности обработчиков событий в Конвертации данных 3.0. Для этого используется логика работы с правилами обработки данных (ПОД) на стороне приемника.

В обработчике «При загрузке» для конкретного объекта мы можем проверить, существует ли уже данный документ в базе данных, и если да — отменить его запись.

Проанализируем пример кода, который можно внедрить в обработчик:


// Проверяем, существует ли объект в базе данных (базе-приемнике)
Если ДанныеИБ <> Неопределено И НЕ ДанныеИБ.ЭтоНовый() Тогда
    // Объект уже существует в информационной базе БП 3.0.
    // Устанавливаем флаг Отказ, чтобы предотвратить перезапись старых данных.
    Отказ = Истина;
КонецЕсли;

Рассмотрим подробнее, как работает этот механизм:

Метод 3. Настройка даты запрета загрузки в БП 3.0 (без программирования)

Если перезапись документов является проблемой только для прошлых (закрытых) отчетных периодов, мы можем воспользоваться встроенным типовым механизмом защиты данных в БП 3.0 без изменения правил обмена и написания кода.

Выполним следующие настройки по шагам:

  1. Перейдем в раздел Администрирование — Настройки синхронизации данных.
  2. Установим флаг Даты запрета загрузки.
  3. Перейдем по ссылке "Настроить" и укажем дату запрета загрузки данных. Мы можем настроить эту дату как для всех узлов обмена, так и персонально для узла обмена с нашей УТ 11.
  4. При попытке загрузить документ, дата которого меньше установленной даты запрета, система автоматически проигнорирует изменения этого документа, а в мониторе синхронизации зафиксирует предупреждение.

Это самый простой и надежный способ защитить закрытые периоды от случайных изменений со стороны операторов и менеджеров торговой базы.

Метод 4. Защита отдельных реквизитов через расширение конфигурации

Часто возникает ситуация, когда полностью запрещать перезапись документа нельзя (например, в УТ 11 могут измениться важные первичные данные: количество товара, цена или контрагент), но бухгалтер хочет защитить от затирания исключительно счета учета расчетов или счета учета номенклатуры, которые настраиваются непосредственно в БП 3.0.

В этом случае идеальным решением будет создание небольшого расширения конфигурации на стороне БП 3.0. Мы перехватим событие ПередЗаписью документа и выполним выборочное восстановление реквизитов, если запись инициирована обменом.

Рассмотрим пример реализации такого кода в расширении для документа ПоступлениеТоваровУслуг:


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

Проанализируем этот код:

  1. Свойство ОбменДанными.Загрузка принимает значение Истина только тогда, когда объект записывается платформой в процессе выполнения обмена. Это позволяет нам не вмешиваться в работу пользователей, когда они редактируют документ вручную.
  2. С помощью функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта() мы быстро считываем старые значения нужных полей напрямую из базы данных, минуя кэш, и присваиваем их записываемому объекту. В итоге документ обновляется (меняются товары, цены), но критически важные для бухгалтера счета расчетов остаются нетронутыми.

Выводы и рекомендации

Выбор конкретного метода зависит от бизнес-требований вашей компании:

← На главную