Как настроить загрузку документов из КА в БП непроведенными и изменить нумерацию?

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

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

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

Анализ механизмов синхронизации через универсальный формат

Современный обмен данными в 1С строится на использовании EnterpriseData (универсальный формат обмена). Вся логика преобразования данных сосредоточена в общем модуле МенеджерОбменаЧерезУниверсальныйФормат. Процесс загрузки документа состоит из нескольких этапов: разбор XML (XDTO), сопоставление объектов и заполнение структуры ПолученныеДанные.

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

Решение 1. Изменение статуса проведения через расширение

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

Нам потребуется перехватить процедуру, отвечающую за получение данных конкретного документа. Рассмотрим по шагам:

  1. Создадим новое расширение в базе 1С:Бухгалтерия предприятия.
  2. Добавим в расширение общий модуль МенеджерОбменаЧерезУниверсальныйФормат.
  3. Найдем процедуру ПКО_Документ_ПоступлениеТоваровУслуг_Получение_ПриКонвертацииДанныхXDTO.
  4. Используем аннотацию &После для изменения логики.

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


&После("ПКО_Документ_ПоступлениеТоваровУслуг_Получение_ПриКонвертацииДанныхXDTO")
Процедура Расш1_ПКО_Документ_ПоступлениеТоваровУслуг_Получение_ПриКонвертацииДанныхXDTO(ДанныеXDTO, ПолученныеДанные)
    
    // Принудительно сбрасываем флаг проведения для всех входящих документов данного типа
    ПолученныеДанные.Проведен = Ложь;
    
    // Если требуется дополнительная проверка условий (например, только для определенной организации)
    // Если ПолученныеДанные.Организация = НужнаяОрганизация Тогда
    //     ПолученныеДанные.Проведен = Ложь;
    // КонецЕсли;

КонецПроцедуры

Важный нюанс: Иногда прямое присвоение ПолученныеДанные.Проведен = Ложь может не сработать, если в коде типового решения далее по стеку вызовов статус восстанавливается из XDTO. В таком случае рекомендуется использовать более универсальный перехватчик в процедуре ПриКонвертацииДанныхXDTO, где можно анализировать тип объекта через ТипЗнч(ДанныеXDTO).

Решение 2. Управление префиксами и нумерацией документов

Часто пользователи спрашивают: можно ли при загрузке присваивать документу номер приемника, а не источника? В формате EnterpriseData по умолчанию передается уникальный идентификатор (GUID) и номер объекта. Чтобы БП сгенерировала свой номер с собственным префиксом, нам нужно «очистить» входящий номер в процессе загрузки.

Разберем, как реализовать автоматическую нумерацию в приемнике:

  1. В той же процедуре расширения, которую мы создали выше, обратимся к полю Номер.
  2. Очистим значение номера, чтобы система при записи объекта не нашла старый номер и задействовала механизм автонумерации.

Пример кода для очистки номера:


&После("ПКО_Документ_ПоступлениеТоваровУслуг_Получение_ПриКонвертацииДанныхXDTO")
Процедура Расш1_ИзменитьНомерИПроведение(ДанныеXDTO, ПолученныеДанные)
    
    // Очищаем номер для назначения нового номера в базе БП
    ПолученныеДанные.Номер = "";
    
    // Отменяем автоматическое проведение
    ПолученныеДанные.Проведен = Ложь;
    
КонецПроцедуры

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

Нюансы отладки фоновых заданий синхронизации

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

Для успешной отладки выполните следующие действия:

  1. В конфигураторе перейдите в меню Отладка — Настройка отладки.
  2. Установите флажок «Отлаживать фоновые задания».
  3. Если база клиент-серверная, убедитесь, что на сервере разрешена отладка (параметр -debug).
  4. В файловом варианте можно временно запустить синхронизацию интерактивно через обработку «Выполнение синхронизации данных», но фоновое выполнение все равно может инициироваться системой автоматически.

Если отладка в фоне все равно не удается, используем старый проверенный метод записи в журнал регистрации:


ЗаписьЖурналаРегистрации("ОтладкаОбмена", УровеньЖурналаРегистрации.Информация, , , "Процедура ПКО вызвана для объекта.");

Альтернативный метод: Использование подписки на события

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

В обработчике подписки мы проверяем свойство ОбменДанными.Загрузка. Если оно равно Истина, значит документ пришел через синхронизацию. В этот момент мы можем изменить режим записи.


Процедура Расш1_ПередЗаписьюПоступления(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    Если Источник.ОбменДанными.Загрузка Тогда
        // Если документ пытаются провести при загрузке, меняем режим на обычную запись
        Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
             РежимЗаписи = РежимЗаписиДокумента.Запись;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Этот метод является наиболее надежным, так как он срабатывает непосредственно перед фиксацией данных в базе данных, независимо от того, какие правила конвертации или XDTO-пакеты использовались при подготовке данных.

Резюме

Мы рассмотрели несколько способов управления процессом загрузки данных. Наиболее корректным с точки зрения архитектуры является использование расширения для модуля МенеджерОбменаЧерезУниверсальныйФормат. Это позволяет не только отменять проведение, но и гибко управлять нумерацией объектов, очищая поле Номер для активации механизмов базы-приемника. Помните о настройках отладки фоновых заданий, чтобы иметь возможность контролировать процесс трансформации данных в реальном времени.

← На главную