Как перенести движения документа с ручной корректировкой через КД 2.1 в 1С:Бухгалтерия 3.0?

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

При настройке обмена данными между идентичными конфигурациями "1С:Бухгалтерия Предприятия 3.0" (или другими типовыми решениями на БСП) часто возникает проблема с документами, в которых включена "Ручная корректировка". Стандартные документы переносятся корректно, а документы с ручными проводками либо не загружают движения, либо выдают ошибки при попытке проведения.

Разберем эту ситуацию подробно, выясним причины такого поведения системы и рассмотрим проверенное решение с использованием настроек "Конвертации данных 2.1" (КД 2.1).

Суть проблемы

Рассмотрим сценарий, описанный в вопросе:

  1. Есть две базы БП 3.0. Настроен обмен через правила конвертации (КД 2.1).
  2. В базе-источнике есть документ (например, "Операция" или любой другой с включенным флагом ручной корректировки), где движения сформированы вручную.
  3. При выгрузке в XML-файл движения попадают корректно.
  4. При загрузке в базу-приемник документ создается, но движения не записываются. Система выдает предупреждение о невозможности актуализировать движения из-за установленной ручной корректировки.

Проблема кроется в механизме записи документа при загрузке. По умолчанию в Правилах Конвертации Объектов (ПКО) для документов обычно стоит режим "Проведение". Обработка обмена пытается провести документ методом Записать(РежимЗаписиДокумента.Проведение).

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

Решение: Изменение режима записи

Чтобы корректно перенести и сам документ, и его ручные движения, необходимо изменить подход к записи объекта в базе-приемнике. Нам нужно не "проводить" документ (запуская алгоритмы расчета), а просто "записать" его вместе с наборами записей регистров, которые пришли из файла.

Для этого в обработчиках событий ПКО необходимо переопределить стандартную переменную РежимЗаписи.

Алгоритм действий

Мы будем работать в конфигурации "Конвертация данных 2.0/2.1". Откройте ваши правила обмена и найдите ПКО соответствующего документа.

Наиболее надежный способ — изменить режим записи непосредственно перед загрузкой объекта в базу, проверив, стоит ли у него признак ручной корректировки.

Рассмотрим код, который необходимо разместить в обработчике события "Перед загрузкой" (BeforeLoad) в ПКО документа:


// Проверяем, есть ли у загружаемого объекта признак ручной корректировки.
// Важно: свойство должно быть уже прочитано из файла или передано как параметр.
// Обычно в БП 3.0 этот реквизит называется "РучнаяКорректировка".

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

В некоторых случаях, если свойство РучнаяКорректировка еще не доступно в объекте на этапе "Перед загрузкой" (зависит от порядка следования свойств в XML), можно использовать обработчик "После загрузки" (AfterLoad), но тогда придется управлять записью самостоятельно:


// Обработчик "После загрузки"
Если Объект.РучнаяКорректировка Тогда
    // Принудительно устанавливаем режим загрузки данных, чтобы отключить проверки
    Объект.ОбменДанными.Загрузка = Истина;
    
    // Записываем документ без проведения
    Объект.Записать(РежимЗаписиДокумента.Запись);
    
    // Явно записываем движения, которые пришли с объектом
    Для Каждого НаборЗаписей Из Объект.Движения Цикл
        Если НаборЗаписей.Количество() > 0 Тогда
            НаборЗаписей.ОбменДанными.Загрузка = Истина;
            НаборЗаписей.Записать();
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Важные нюансы

Обратите внимание на несколько моментов, которые помогут избежать ошибок:

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

Используя этот подход, вы сможете корректно синхронизировать документы с ручными правками, сохраняя идентичность данных между базами 1С.

← На главную