При настройке синхронизации между конфигурациями «1С:Управление торговлей» (УТ 11) и «1С:Бухгалтерия предприятия» (БП 3.0) специалисты часто сталкиваются с ситуацией, когда в базе бухгалтерии начинают появляться документы Счет на оплату, которые никто не создавал вручную. Самое странное в этой ситуации то, что в настройках состава отправляемых данных в УТ флажок на выгрузку счетов может быть снят, а сами документы прилетают в БП в «непотребном» виде: с незаполненными контрагентами, без сумм или с битыми ссылками. Рассмотрим подробно, почему так происходит, и разберем по шагам методы решения этой проблемы.
Проанализируем ситуацию с технической стороны. Основная причина кроется в архитектуре платформы 1С и механизме обмена данными через формат Enterprise Data. В системе существует понятие ссылочной целостности. Когда мы выгружаем документ Реализация товаров и услуг, в его структуре есть обязательное поле Документ-основание. Если в «1С:Управление торговлей» эта реализация была создана на основании документа Заказ клиента, то при выгрузке реализации система «тянет» за собой и объект-основание.
Даже если в настройках синхронизации вы явно запретили выгрузку заказов или счетов, программа считает, что для корректного отображения реализации в бухгалтерии ей необходима связь с основанием. В итоге происходит следующее:
Заказ клиента в документе реализации.Заказ клиента из УТ чаще всего конвертируется в Счет на оплату (согласно типовым правилам).Прежде чем приступать к программированию, рассмотрим самый простой способ — изменение настроек самой синхронизации. Если вам мешают пустые счета, возможно, стоит разрешить их полноценную загрузку. Рассмотрим этот сценарий: если в БП будут попадать полноценные заказы (счета), они перестанут выглядеть как «мусор» и будут содержать всю необходимую информацию о контрагенте и товарах. Для этого в УТ в настройках состава данных нужно вернуть флаг на документ Заказ клиента.
Однако, если ваша цель — полное отсутствие этих документов в бухгалтерской базе, этот метод не подойдет, и нам придется рассмотреть более радикальные меры.
Проанализируем программный метод решения. Самый безопасный способ вмешаться в типовой обмен, не снимая конфигурацию с поддержки — это создание расширения. Мы можем программно запретить создание документов Счет на оплату, если источником записи является механизм обмена данными.
Разберем пример кода, который можно разместить в модуле объекта документа Счет на оплату через расширение. Нам понадобится перехватить событие ПередЗаписью:
&После("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем, что запись происходит в режиме загрузки данных из другой базы
Если ОбменДанными.Загрузка Тогда
// Если это новый документ, который пытается создаться при обмене
Если ЭтоНовый() Тогда
// Проверяем условия, при которых мы хотим запретить создание.
// Например, если мы не хотим видеть счета, созданные «по ссылке»
Если НЕ ЗначениеЗаполнено(Контрагент) Тогда
// Устанавливаем Отказ, чтобы документ не записывался в базу
Отказ = Истина;
// Дополнительно можно зафиксировать это в журнале регистрации
ЗаписьЖурналаРегистрации("ОбменДанными.ОтказЗаписиСчета",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Заблокировано создание пустого счета по ссылке из УТ");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный момент: если вы просто установите Отказ = Истина, это может привести к ошибке всей транзакции загрузки пакета данных. Поэтому более изящным решением будет не отказ от записи, а очистка поля «Основание» в самой реализации в момент её загрузки, чтобы ссылка на счет просто исчезла.
Посмотрим на ситуацию со стороны «1С:Управление торговлей». Если мы не хотим, чтобы счета улетали в БП, мы можем программно «отвязать» их от реализаций перед отправкой. Это можно сделать с помощью обработки Групповое изменение реквизитов или через специализированные подписки на события.
Рассмотрим логику: если поле Заказ (или Документ-основание) в реализации будет пустым, механизму обмена не за что будет зацепиться, и пустые счета перестанут создаваться в БП. Однако помните, что это приведет к потере аналитической связи между заказом и отгрузкой в учетной системе.
Иногда проблема кроется в том, как 1С:Бухгалтерия интерпретирует входящие данные. Проанализируем настройки интерфейса:
Хотя снятие этого флага не всегда блокирует регистрацию объектов в базе на уровне платформы, в некоторых версиях типовых правил это может служить сигналом для системы игнорировать входящие объекты данного типа. Стоит проверить этот момент перед тем, как приступать к написанию кода.
Выясним еще одну важную техническую деталь. Фирма 1С постоянно дорабатывает формат Enterprise Data. В старых версиях формата (например, 1.3 или 1.5) зависимости объектов прописаны жестко. В более современных версиях (1.10 и выше) механизмы сопоставления работают корректнее.
Попробуйте выполнить следующие действия:
Подводя итог, можно сказать, что появление пустых счетов — это не ошибка программы, а следствие работы механизма поддержания ссылочной целостности данных. Чтобы решить проблему, мы рекомендуем использовать комбинированный подход: сначала убедиться, что в УТ не регистрируются лишние документы для обмена (через монитор состава отправляемых данных), а если это не помогает — внедрить небольшое расширение в БП, которое будет очищать ссылки на пустые основания при загрузке. Это позволит сохранить базу бухгалтерии в чистоте, не нарушая при этом логику типового обмена.