Почему не все документы регистрируются для обмена УТ 10.3 -> БП 3.0 и как это исправить

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

При настройке и эксплуатации типового одностороннего обмена данными между конфигурациями "Управление торговлей" (редакция 10.3) и "Бухгалтерия предприятия" (редакция 3.0) технические специалисты часто сталкиваются со странным поведением системы: некоторые документы (например, «Поступление товаров и услуг») упорно не регистрируются на узле плана обмена при создании, хотя другие аналогичные документы за то же число выгружаются без проблем. При этом, если зайти в «проблемный» документ, заново выбрать того же самого контрагента и провести его — документ моментально регистрируется в плане обмена и успешно уходит в базу-приемник при следующем сеансе синхронизации.

В этой статье мы подробно разберем, по каким скрытым причинам может происходить выборочный сбой автоматической регистрации документов в УТ 10.3, как устроен механизм подписок на события и правила регистрации объектов (ПРО), и как раз и навсегда решить эту проблему.

Как работает авторегистрация в обмене УТ 10.3 -> БП 3.0

Для того чтобы понять природу сбоя, рассмотрим механизм регистрации изменений. В УТ 10.3 для обмена с БП 3.0 используется план обмена ОбменУправлениеТорговлей103БухгалтерияПредприятия30. Авторегистрация у большинства документов в самом плане обмена отключена — это сделано для того, чтобы не забивать базу лишними транзакциями и регистрировать объекты «умным» способом через подписки на события и Правила регистрации объектов (ПРО).

Когда пользователь или внешняя обработка записывает и проводит документ, срабатывает подписка на событие (например, ПередЗаписьюДокументаДляРегистрацииВОбмене или ПриЗаписиДокументаДляРегистрацииВОбмене). Внутри обработчика подписки вызывается специальный программный модуль, который считывает правила регистрации, выполняет запросы и проверяет соответствие документа установленным отборам.

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


ИспользоватьКэш = Ложь;
// Получаем значение параметра СкладДокумента из текущей версии объекта
Если ТипЗнч(Объект.СкладОрдер) = Тип("ДокументСсылка.ПриходныйОрдерНаТовары") Тогда
    Склад = Объект.СкладОрдер.Склад;
Иначе
    Склад = Объект.СкладОрдер;
КонецЕсли;
ПараметрыЗапроса.Вставить("СкладДокумента", Склад);

ТекстЗапроса = "
|ВЫБРАТЬ
|    РАЗЛИЧНЫЕ ПланОбменаОсновнаяТаблица.Ссылка КАК Ссылка
|ИЗ
|    ПланОбмена.ОбменУправлениеТорговлей103БухгалтерияПредприятия30 КАК ПланОбменаОсновнаяТаблица
|ЛЕВОЕ СОЕДИНЕНИЕ
|    ПланОбмена.ОбменУправлениеТорговлей103БухгалтерияПредприятия30.Склады КАК ПланОбменаСклады
|ПО
|    ПланОбменаОсновнаяТаблица.Ссылка = ПланОбменаСклады.Ссылка
|ГДЕ
|    (
|        ПланОбменаОсновнаяТаблица.ДатаНачалаВыгрузкиДокументов <= &СвойствоОбъекта_Дата
|        И (ПланОбменаСклады.Склад = &СвойствоОбъекта_СкладДокумента ИЛИ ПланОбменаОсновнаяТаблица.ИспользоватьОтборПоСкладам = Ложь)
|    )
|    И ПланОбменаОсновнаяТаблица.Ссылка <> &ОбменУправлениеТорговлей103БухгалтерияПредприятия30ЭтотУзел
|    И НЕ ПланОбменаОсновнаяТаблица.ПометкаУдаления
|[УсловиеОтбораПоРеквизитуФлагу]
|";

Если все условия выполняются, объект регистрируется на узле плана обмена. Если хотя бы одно условие нарушено, запись в таблицу регистрации изменений не вносится. Теперь проанализируем четыре основные причины, почему документ может «пролетать» мимо регистрации при первоначальном создании.

Причина №1: Использование флага "ОбменДанными.Загрузка = Истина" при программном создании

Выясним причину, связанную с тем, как документы попадают в базу УТ 10.3. Очень часто документы «Поступление товаров и услуг» создаются не вручную, а автоматически. Это может быть импорт из внешних файлов (Excel, XML), интеграция с личным кабинетом поставщика, загрузка через EDI-системы или сервисы электронного документооборота (1С-ЭДО, Контур.Диадок).

При написании обработок загрузки разработчики массово используют стандартный прием оптимизации скорости записи объектов:


НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
// ... заполнение реквизитов документа ...
НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

Установка свойства ОбменДанными.Загрузка = Истина сообщает платформе «1С:Предприятие», что объект загружается из внешнего источника и проверять его бизнес-логику не требуется. В результате:

  1. Блокируется выполнение кода в обработчиках событий ПередЗаписью и ПриЗаписи в модуле документа.
  2. Полностью игнорируются подписки на события, отвечающие за автоматическую регистрацию изменений на узлах планов обмена.

Документ создается в базе абсолютно корректным и проведенным, но план обмена о нем "не знает". Как только бухгалтер открывает этот документ интерактивно, перевыбирает контрагента (или любой другой реквизит) и нажимает «Провести», документ записывается в обычном режиме (параметр Загрузка равен Ложь). Подписки успешно срабатывают, и документ мгновенно регистрируется к выгрузке. Это объясняет, почему ручное перепроведение решает проблему.

Причина №2: Несоответствие вида договора контрагента

Проанализируем структуру данных документа. В УТ 10.3 правила регистрации объектов жестко завязаны на аналитику. Для документа «Поступление товаров и услуг» ключевым аналитическим разрезом является реквизит ДоговорКонтрагента.

В типовых правилах обмена стоит жесткий отбор: договор, указанный в документе поступления, должен иметь вид договора «С поставщиком» или «С комитентом». Если документ создается программно или вводом на основании (например, на основании некорректно заполненного Заказа поставщику), в поле договора может попасть:

При первой записи такого документа правила регистрации проверяют вид договора, видят несоответствие правилам и отказывают в регистрации на узле обмена.

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

Причина №3: Специфика флага "Отражать в бухгалтерском учете"

Обратим внимание на настройки обмена, указанные в условиях задачи: "Документы выгружаются только отраженные в бухгалтерском учете". За это поведение отвечает булев реквизит документа ОтражатьВБухгалтерскомУчете (флажок "БУ" на форме документа в УТ 10.3).

Если документ создается пользователем вручную, значение этого флажка по умолчанию берется из персональных настроек текущего пользователя (меню Сервис -> Настройки пользователя -> Отражать в бухгалтерском учете). Если у конкретного оператора, заводившего накладную, эта галочка в настройках была снята:

  1. Документ создается без установленного флага БУ.
  2. При проведении правила регистрации проверяют флаг ОтражатьВБухгалтерскомУчете. Так как он равен Ложь, регистрация отклоняется.
  3. Бухгалтер или старший оператор открывает документ, видит ошибку, устанавливает флаг БУ вручную (или он устанавливается автоматически при смене контрагента из-за кастомных доработок формы) и перепроводит документ. Изменение зафиксировано, документ уходит в БП 3.0.

Причина №4: Исключения при незаполненных реквизитах на момент первой записи

Иногда правила регистрации содержат программные проверки в обработчиках «Перед обработкой» или «При обработке». Если в правилах написан кастомный код, проверяющий реквизиты документа, но при этом отсутствует проверка на заполнение (например, ожидается, что подразделение или склад всегда заполнены), при первой транзакционной записи документа происходит скрытая программная ошибка:


// Пример ошибочного кода в ПРО без проверки на заполненность
ИмяСклада = Объект.СкладОрдер.Наименование; // Если СкладОрдер пуст, вызов метода вызовет исключение

Платформа перехватывает это исключение внутри механизма регистрации обмена, запись в план обмена прерывается, однако проведение самого документа в транзакции базы данных завершается успешно. Пользователь не видит ошибки на экране. Когда же документ открывают повторно, дозаполняют все пустые поля и проводят — код в ПРО отрабатывает без ошибок, и регистрация проходит штатно.

Как быстро локализовать проблему

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

Шаг 1. Анализ Журнала регистрации. Обязательно отфильтруйте Журнал регистрации в УТ 10.3 по метаданным документа поступления в момент его первоначального создания. Посмотрите:

Шаг 2. Проверка настроек пользователей. Проверьте настройки тех пользователей, чьи документы не выгрузились:

  1. Перейдите в меню Сервис -> Настройки пользователя.
  2. Найдите флаг "Отражать в бухгалтерском учете" и убедитесь, что он включен.

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

Как решить проблему программно без отключения оптимизации загрузки: Чтобы не терять скорость загрузки объектов и при этом регистрировать их в плане обмена, добавьте в код обработки загрузки принудительную регистрацию на узле обмена сразу после записи документа:


НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
// Заполнение полей документа...
НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

// Принудительно регистрируем объект на узлах обмена
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, НовыйДокумент.Ссылка);

Как помочь бухгалтеру прямо сейчас (без перепроведения документов)

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

Рассмотрим, как зарегистрировать документы к выгрузке с помощью стандартных средств платформы:

  1. Откройте обработку "Регистрация изменений для обмена" (в УТ 10.3 её можно открыть через меню Сервис -> Прочие обмены данными -> Регистрация изменений для обмена или через все функции/функции для технического специалиста).
  2. Выберите узел обмена ОбменУправлениеТорговлей103БухгалтерияПредприятия30, на который выполняется выгрузка в БП 3.0.
  3. В дереве объектов найдите ветку Документы -> Поступление товаров и услуг.
  4. Нажмите правой кнопкой мыши по нужному типу документа и выберите пункт "Зарегистрировать изменения объекта" (или добавьте конкретные документы списком, используя отбор по дате или контрагенту).

После этого все выбранные документы будут помечены платформой к выгрузке и перенесутся в БП 3.0 при первом же запуске регламентного задания обмена без необходимости их перепроведения и ручной модификации.

← На главную