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