Как настроить обновление даты документа в базе-приемнике при изменении в источнике

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

При настройке обмена данными между конфигурациями 1С часто возникает задача поддержания актуальности реквизитов. В частности, если в базе-источнике изменяется дата документа, она должна автоматически обновиться и у соответствующего документа в базе-приемнике. Разберем по шагам, где и какие настройки необходимо проверить в конфигурации «Конвертация данных» и механизмах обмена, а также рассмотрим альтернативные способы решения.

1. Настройка правила конвертации свойств (ПКС) для даты

В типовом сценарии обмена синхронизация реквизитов происходит через правила конвертации свойств (ПКС). Проанализируем базовую настройку:

  1. Откроем правило конвертации объектов (ПКО) нужного документа в конфигурации «Конвертация данных».
  2. В табличной части правил конвертации свойств найдем строку, где источник Дата соответствует приемнику Дата.
  3. Убедимся, что для данного ПКС снят флаг «Не замещать значение свойства у существующих объектов». Если этот флаг установлен, дата заполнится только при первичном создании документа в приемнике, а при последующих изменениях в источнике перезаписываться не будет.

2. Проверка полей поиска и сопоставления объектов

Одной из главных причин, почему дата не обновляется или вместо обновления создается дубль документа, является некорректная настройка идентификации объекта в базе-приемнике. Рассмотрим варианты сопоставления:

  1. Поиск по уникальному идентификатору (GUID): если в ПКО включен поиск по внутреннему идентификатору объекта, база-приемник безошибочно находит существующий документ и обновляет его реквизиты, включая измененную дату.
  2. Поиск по номеру и дате: если сопоставление выполняется по полям поиска, в список которых включена Дата (установлен флаг поиска в ПКС), то при изменении даты в источнике приемник не сможет найти старый документ и создаст новую копию. В таком случае флаг поиска для даты необходимо снять либо переопределить логику в обработчике Поля поиска.

3. Особенности проведения и режимы записи

Изменение даты у проведенного документа в базе-приемнике влечет за собой смещение движений по регистрам. Проанализируем сопутствующие настройки:

  1. Режим записи при загрузке: если документ должен перепроводиться при смене даты, в обработчике ПКО После загрузки или в настройках параметров обмена необходимо управлять режимом записи объекта.
  2. Граница запрета изменения данных: если новая или исходная дата документа попадает в закрытый период базы-приемника, загрузка завершится ошибкой. Для служебного пользователя, выполняющего регламентный обмен, следует настроить соответствующие права или исключения.

При необходимости принудительной установки даты или перепроведения объекта можно использовать обработчик ПКО После загрузки:


Если Не Объект.ЭтоНовый() Тогда
    // При необходимости обновляем дату и режим проведения
    Объект.Дата = ПараметрыОбъекта["ДатаИсточника"];
    РежимЗаписи = РежимЗаписиДокумента.Проведение;
КонецЕсли;

4. Регистрация изменений в планах обмена

Для того чтобы документ вообще попал в выгрузку после изменения даты в базе-источнике, он должен быть зарегистрирован на соответствующем узле плана обмена. Выясним причину, если документ не выгружается:

  1. Если дата документа меняется программно в обработках с отключенной авторегистрацией изменений, запись в таблицу изменений не попадает.
  2. В таких случаях требуется явная регистрация объекта к выгрузке с помощью вызова функции менеджера планов обмена:

ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, ДокументСсылка);

5. Альтернативный вариант: прямое обновление через COM-соединение

Если обмен выполняется не через регулярные файлы или планы обмена, а в режиме реального времени, можно выравнивать дату документа непосредственно в момент его проведения или записи в базе-источнике через внешнее подключение.

Посмотрим на пример установки соединения и обновления документа:


V83COM = Новый COMОбъект("V83.COMConnector");
Соединение = V83COM.Connect("Srvr=""ServerName"";Ref=""TargetBase"";Usr=""ExchangeUser"";Pwd=""Password"";");

// Поиск документа в приемнике по ГУИД
УИД = Строка(ЭтотОбъект.Ссылка.УникальныйИдентификатор());
ДокПриемник = Соединение.Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор", УИД));

ДокОбъект = ДокПриемник.ПолучитьОбъект();
Если ДокОбъект <> Неопределено Тогда
    ДокОбъект.Дата = ЭтотОбъект.Дата;
    ДокОбъект.Записать(Соединение.РежимЗаписиДокумента.Запись);
КонецЕсли;
← На главную