Как запретить выгрузку Заказов клиента при синхронизации УТ 11 и БП 3.0, если они тянутся по ссылкам

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

При настройке типовой синхронизации между 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0 специалисты часто сталкиваются с ситуацией, когда определенные документы (например, Заказ клиента) не нужны в бухгалтерской базе. Казалось бы, достаточно просто убрать регистрацию этого типа объекта в составе отправляемых данных. Однако на практике выясняется, что заказы продолжают "приезжать" в БП 3.0 вместе с накладными (Реализация товаров и услуг), так как в них заполнены ссылки на заказы-основания.

В этой статье мы разберем, почему механизм регистрации не всегда спасает от выгрузки "лишних" документов, и проанализируем технические способы решения этой задачи в рамках формата Enterprise Data (КД 3.0).

Выясним причину: почему снятие с регистрации не помогает?

Проанализируем работу механизма обмена данными. В современных конфигурациях 1С используется формат Enterprise Data. Когда система готовит пакет данных для выгрузки, она проходит по всем зарегистрированным объектам (например, реализациям). Если в реализации заполнено поле Заказ, программный код формирования XDTO-пакета видит эту ссылку.

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

Способ 1: Программное удаление свойства из XDTO-структуры

Рассмотрим вариант, предложенный в обсуждении. Если мы используем обмен через универсальный формат (XDTO), основным местом для корректировок является модуль менеджера обмена. Нам необходимо найти событие ПриОтправкеДанных. Это событие вызывается непосредственно перед тем, как данные будут помещены в XML-файл сообщения обмена.

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


// В модуле менеджера обмена (или через расширение)
Процедура ПриОтправкеДанных(ДанныеXDTO, ГруппаОбъектов, НастройкиВыгрузки) Экспорт
    
    // Проверяем наличие свойства "Заказ" в структуре выгружаемого объекта
    Если ДанныеXDTO.Свойство("Заказ") Тогда
        ЗаказСсылка = ДанныеXDTO.Заказ;
        
        // Проверяем тип данных ссылки
        // В Enterprise Data типы могут быть представлены как XDTO-объекты
        Если ТипЗнч(ЗаказСсылка) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
            // Удаляем свойство из XDTO-пакета, чтобы оно не попало в файл
            ДанныеXDTO.Удалить("Заказ");
        КонецЕсли;
    КонецЕсли;

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

Важное замечание: При использовании метода Удалить() необходимо быть уверенным, что поле Заказ в схеме XSD (формате Enterprise Data) не является обязательным. Если схема требует обязательного наличия этого тега, выгрузка завершится с ошибкой валидации XML. В таких случаях лучше не удалять свойство, а устанавливать его в Неопределено или передавать пустую ссылку.

Способ 2: Очистка ссылок в документе-хозяине (Реализации)

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

Для этого в менеджере обмена (через расширение) нужно найти процедуру, отвечающую за выгрузку реализации (например, ПКО_Документ_РеализацияТоваровУслуг_Отправка_ПриВыгрузке), и добавить в нее логику очистки:


// Пример логики в обработчике ПриВыгрузке для ПКО Реализации
Если СвойствоВыгрузки.Имя = "ЗаказКлиента" Тогда
    // Устанавливаем значение в пустую ссылку или Неопределено
    Значение = Неопределено; 
КонецЕсли;

Этот метод считается более стабильным, так как он не нарушает структуру XML-пакета, а просто передает пустое значение в поле, которое мы хотим скрыть от бухгалтерии.

Способ 3: Использование Правил Обработки Данных (ПОД)

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

Чтобы это обойти, можно использовать обработчик ПередКонвертациейОбъекта для ПКО заказа. В нем мы можем прописать:


// В обработчике ПередКонвертацией для документа ЗаказКлиента
Отказ = Истина;

Однако будьте осторожны: если в БП 3.0 документ Реализация жестко ожидает ссылку на существующий в базе документ основания, использование Отказ = Истина может привести к появлению битых ссылок (объектов "Объект не найден") в бухгалтерской базе. Мы рекомендуем использовать Способ 2 (очистку ссылки в реализации), так как он гарантирует чистоту данных в приемнике.

Риски и последствия для учета

Перед тем как окончательно заблокировать выгрузку заказов, разберем, на что это может повлиять в 1С:Бухгалтерия предприятия:

  1. Аналитика расчетов: Если в БП ведется детализированный учет расчетов "По документам", и именно заказ должен выступать объектом оплаты, его отсутствие приведет к путанице в проводках и невозможности автоматического закрытия авансов.
  2. Счета на оплату: Часто в БП на основании заказов из УТ создаются Счета на оплату покупателю. Если заказы перестанут приходить, эта цепочка документов будет разорвана.
  3. Сверка данных: При отсутствии заказов в БП будет сложнее сопоставлять отчеты между двумя базами, так как один из ключевых разрезов аналитики будет утерян.

Подведем итог: если бизнес-требования жестко настаивают на отсутствии заказов в БП, наиболее правильным программным решением будет создание расширения для УТ 11, где в МенеджереОбменаЧерезУниверсальныйФормат будет переопределена выгрузка ссылок на заказы в документах реализации. Это позволит избежать лишних данных в обмене и сохранит работоспособность синхронизации.

← На главную