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