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