Как отключить отложенное проведение документов при обмене данными и сохранить движения

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

При настройке обмена данными между конфигурациями на базе 1С:Предприятие 8.3 (особенно в Бухгалтерии предприятия 3.0) специалисты часто сталкиваются с ситуацией, когда документы после загрузки в базу-приемник остаются непроведенными. Вместо этого они попадают в специальный регистр сведений ОтложенныеДвиженияДокументов. Это поведение обусловлено стандартными механизмами Библиотеки стандартных подсистем (БСП). Рассмотрим подробно, почему это происходит и как настроить систему так, чтобы документы загружались сразу с движениями или проводились автоматически в момент загрузки.

Почему 1С использует механизм отложенного проведения?

Прежде чем переходить к правке кода, разберем логику работы платформы. Механизм отложенного проведения был внедрен для решения трех основных задач:

  1. Производительность: Проведение сложного документа (например, реализации с расчетом себестоимости) занимает много времени. Если пакет обмена содержит тысячи документов, немедленное проведение каждого из них парализует работу базы.
  2. Блокировки: При проведении документов накладываются блокировки на регистры. При параллельной загрузке данных из нескольких источников это неизбежно ведет к конфликтам.
  3. Целостность данных: Документ может загрузиться раньше, чем справочник или другой документ, на который он ссылается. Отложенное проведение позволяет сначала загрузить все данные, а затем выполнить расчеты на уже полной информационной базе.

Однако в ситуациях, когда мы переносим документы вместе с движениями (регистрами) из базы-источника, перепроведение в приемнике часто не требуется и даже вредно (например, если в источнике были ручные корректировки). Проанализируем способы решения этой проблемы. При подготовке к переходу на другую конфигурацию стоит рассмотреть раздел с решениями для переноса данных БП, содержащий инструменты для миграции документов и остатков.

Способ 1. Проверка штатных настроек обмена

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

В настройках правил обмена (в конфигурации "Конвертация данных" или непосредственно в узле плана обмена) существует параметр Выполнять отложенные движения. Если этот флаг снят, система просто фиксирует необходимость проведения в регистре и завершает загрузку. Попробуем установить этот флаг в настройках узла обмена в базе-приемнике. Также обратим внимание на поле Количество ошибок для завершения. Если при загрузке первые 5–10 документов не смогли провериться из-за нехватки остатков, система может остановить процесс автоматического проведения для всех остальных объектов в пакете.

Способ 2. Программное изменение режима записи в обработке загрузки

Если штатные настройки не помогают, и система упорно игнорирует статус "Проведен" у документа, нам придется вмешаться в работу транспортного модуля обмена. В современных конфигурациях за это отвечает обработка КонвертацияОбъектовИнформационныхБаз (в более старых — ОбменДаннымиXML).

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

В процедуре ПрочитатьОбъект найдем участок кода, отвечающий за документы, и внесем изменения:


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

Важно помнить, что если вы изменяете этот код в типовой конфигурации, это сделает её "кастомной". В новых версиях БСП лучше использовать расширения для переопределения этой логики.

Способ 3. Использование обработчиков в правилах конвертации (ПКО)

Это более "чистый" метод, так как он не требует изменения кода самой конфигурации, а правится только в файле правил (xml). Нам необходимо передать в приемник информацию о том, что документ нужно просто записать, не инициируя механизм отложенных движений. Если настроенный таким образом обмен требуется выполнять регулярно по расписанию, целесообразно автоматизировать регулярный обмен данными между базами 1С с помощью специализированного софта.

Разберем шаги настройки в Конвертации данных 2.1:

  1. В ПКО нужного документа перейдем в обработчик ПередВыгрузкой.
  2. Установим значение параметра: РежимЗаписи = "Запись";. Это заставит выгрузить документ с этим флагом.
  3. В базе-приемнике, в ПКО документа в обработчике ПередЗагрузкой, добавим аналогичную строку: РежимЗаписи = "Запись";.

Проанализируем, что это дает: система увидит, что документ не требует проведения, запишет его и его движения (если вы их также выгружаете), но не создаст запись в регистре ОтложенныеДвиженияДокументов. Если в свежих версиях БСП заблокирована подгрузка кастомных правил в базу, для их использования подойдёт расширение для загрузки комплекта правил обмена XML.

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

Часто программисты сталкиваются с тем, что движения по регистрам (например, Хозрасчетный) не переносятся, если у документа стоит флаг РучнаяКорректировка. Выясним причину: при стандартном обмене через БСП система часто очищает наборы записей перед загрузкой или пытается их пересчитать по алгоритмам приемника.

Чтобы движения с ручной правкой переносились "один в один", необходимо:

Опасность использования "Отказ = Истина" в ПослеЗагрузки

В некоторых обсуждениях предлагается радикальный метод: в обработчике ПослеЗагрузки написать Объект.Записать(РежимЗаписиДокумента.Запись); Отказ = Истина;. Никогда не используйте этот метод для решения проблемы отложенных движений!

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

Резюме и рекомендации

Для корректного решения проблемы отложенных движений в современных базах на платформе 8.3 рекомендуется следующий алгоритм действий:

  1. Проверьте в настройках синхронизации (раздел "Администрирование"), не стоит ли запрет на проведение документов при загрузке.
  2. Если используется типовая синхронизация, попробуйте увеличить Количество ошибок проведения до максимума (например, 999999).
  3. Если вы пишете свои правила, используйте обработчик ПередЗагрузкой для установки РежимЗаписи = "Запись", но только в том случае, если вы уверены, что движения документа передаются вместе с ним в этом же пакете данных.
  4. Для массовых переносов (сотни тысяч объектов) рассмотрите возможность временного отключения итогов по регистрам в базе-приемнике. Это значительно ускорит процесс, даже если документы все-таки пойдут через механизм отложенного проведения.

Таким образом, мы выяснили, что механизм отложенных движений — это защитная функция 1С, которую можно и нужно настраивать под конкретные задачи интеграции, соблюдая баланс между скоростью загрузки и актуальностью данных в регистрах. Для поиска расхождений в проводках после завершения переноса или обмена применяется автоматическая сверка бухгалтерских и налоговых проводок между базами 1С.

← На главную