При настройке и эксплуатации типового одностороннего обмена данными между конфигурациями "Управление торговлей" (редакция 10.3) и "Бухгалтерия предприятия" (редакция 3.0) технические специалисты часто сталкиваются со странным поведением системы: некоторые документы (например, «Поступление товаров и услуг») упорно не регистрируются на узле плана обмена при создании, хотя другие аналогичные документы за то же число выгружаются без проблем. При этом, если зайти в «проблемный» документ, заново выбрать того же самого контрагента и провести его — документ моментально регистрируется в плане обмена и успешно уходит в базу-приемник при следующем сеансе синхронизации.
В этой статье мы подробно разберем, по каким скрытым причинам может происходить выборочный сбой автоматической регистрации документов в УТ 10.3, как устроен механизм подписок на события и правила регистрации объектов (ПРО), и как раз и навсегда решить эту проблему.
Для того чтобы понять природу сбоя, рассмотрим механизм регистрации изменений. В УТ 10.3 для обмена с БП 3.0 используется план обмена ОбменУправлениеТорговлей103БухгалтерияПредприятия30. Авторегистрация у большинства документов в самом плане обмена отключена — это сделано для того, чтобы не забивать базу лишними транзакциями и регистрировать объекты «умным» способом через подписки на события и Правила регистрации объектов (ПРО).
Когда пользователь или внешняя обработка записывает и проводит документ, срабатывает подписка на событие (например, ПередЗаписьюДокументаДляРегистрацииВОбмене или ПриЗаписиДокументаДляРегистрацииВОбмене). Внутри обработчика подписки вызывается специальный программный модуль, который считывает правила регистрации, выполняет запросы и проверяет соответствие документа установленным отборам.
Рассмотрим фрагмент стандартного запроса из правил регистрации, проверяющего условия выгрузки документов по складам и датам начала обмена:
ИспользоватьКэш = Ложь;
// Получаем значение параметра СкладДокумента из текущей версии объекта
Если ТипЗнч(Объект.СкладОрдер) = Тип("ДокументСсылка.ПриходныйОрдерНаТовары") Тогда
Склад = Объект.СкладОрдер.Склад;
Иначе
Склад = Объект.СкладОрдер;
КонецЕсли;
ПараметрыЗапроса.Вставить("СкладДокумента", Склад);
ТекстЗапроса = "
|ВЫБРАТЬ
| РАЗЛИЧНЫЕ ПланОбменаОсновнаяТаблица.Ссылка КАК Ссылка
|ИЗ
| ПланОбмена.ОбменУправлениеТорговлей103БухгалтерияПредприятия30 КАК ПланОбменаОсновнаяТаблица
|ЛЕВОЕ СОЕДИНЕНИЕ
| ПланОбмена.ОбменУправлениеТорговлей103БухгалтерияПредприятия30.Склады КАК ПланОбменаСклады
|ПО
| ПланОбменаОсновнаяТаблица.Ссылка = ПланОбменаСклады.Ссылка
|ГДЕ
| (
| ПланОбменаОсновнаяТаблица.ДатаНачалаВыгрузкиДокументов <= &СвойствоОбъекта_Дата
| И (ПланОбменаСклады.Склад = &СвойствоОбъекта_СкладДокумента ИЛИ ПланОбменаОсновнаяТаблица.ИспользоватьОтборПоСкладам = Ложь)
| )
| И ПланОбменаОсновнаяТаблица.Ссылка <> &ОбменУправлениеТорговлей103БухгалтерияПредприятия30ЭтотУзел
| И НЕ ПланОбменаОсновнаяТаблица.ПометкаУдаления
|[УсловиеОтбораПоРеквизитуФлагу]
|";
Если все условия выполняются, объект регистрируется на узле плана обмена. Если хотя бы одно условие нарушено, запись в таблицу регистрации изменений не вносится. Теперь проанализируем четыре основные причины, почему документ может «пролетать» мимо регистрации при первоначальном создании.
Выясним причину, связанную с тем, как документы попадают в базу УТ 10.3. Очень часто документы «Поступление товаров и услуг» создаются не вручную, а автоматически. Это может быть импорт из внешних файлов (Excel, XML), интеграция с личным кабинетом поставщика, загрузка через EDI-системы или сервисы электронного документооборота (1С-ЭДО, Контур.Диадок).
При написании обработок загрузки разработчики массово используют стандартный прием оптимизации скорости записи объектов:
НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
// ... заполнение реквизитов документа ...
НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Установка свойства ОбменДанными.Загрузка = Истина сообщает платформе «1С:Предприятие», что объект загружается из внешнего источника и проверять его бизнес-логику не требуется. В результате:
ПередЗаписью и ПриЗаписи в модуле документа.Документ создается в базе абсолютно корректным и проведенным, но план обмена о нем "не знает". Как только бухгалтер открывает этот документ интерактивно, перевыбирает контрагента (или любой другой реквизит) и нажимает «Провести», документ записывается в обычном режиме (параметр Загрузка равен Ложь). Подписки успешно срабатывают, и документ мгновенно регистрируется к выгрузке. Это объясняет, почему ручное перепроведение решает проблему.
Проанализируем структуру данных документа. В УТ 10.3 правила регистрации объектов жестко завязаны на аналитику. Для документа «Поступление товаров и услуг» ключевым аналитическим разрезом является реквизит ДоговорКонтрагента.
В типовых правилах обмена стоит жесткий отбор: договор, указанный в документе поступления, должен иметь вид договора «С поставщиком» или «С комитентом». Если документ создается программно или вводом на основании (например, на основании некорректно заполненного Заказа поставщику), в поле договора может попасть:
При первой записи такого документа правила регистрации проверяют вид договора, видят несоответствие правилам и отказывают в регистрации на узле обмена.
Почему помогает перевыбор контрагента? Когда пользователь на форме документа интерактивно меняет или повторно выбирает поставщика, срабатывает стандартный обработчик изменения контрагента. Этот обработчик автоматически находит у нового контрагента основной договор с правильным видом («С поставщиком») и подставляет его в форму. При последующем проведении правила регистрации видят корректный договор и успешно регистрируют документ.
Обратим внимание на настройки обмена, указанные в условиях задачи: "Документы выгружаются только отраженные в бухгалтерском учете". За это поведение отвечает булев реквизит документа ОтражатьВБухгалтерскомУчете (флажок "БУ" на форме документа в УТ 10.3).
Если документ создается пользователем вручную, значение этого флажка по умолчанию берется из персональных настроек текущего пользователя (меню Сервис -> Настройки пользователя -> Отражать в бухгалтерском учете). Если у конкретного оператора, заводившего накладную, эта галочка в настройках была снята:
ОтражатьВБухгалтерскомУчете. Так как он равен Ложь, регистрация отклоняется.Иногда правила регистрации содержат программные проверки в обработчиках «Перед обработкой» или «При обработке». Если в правилах написан кастомный код, проверяющий реквизиты документа, но при этом отсутствует проверка на заполнение (например, ожидается, что подразделение или склад всегда заполнены), при первой транзакционной записи документа происходит скрытая программная ошибка:
// Пример ошибочного кода в ПРО без проверки на заполненность
ИмяСклада = Объект.СкладОрдер.Наименование; // Если СкладОрдер пуст, вызов метода вызовет исключение
Платформа перехватывает это исключение внутри механизма регистрации обмена, запись в план обмена прерывается, однако проведение самого документа в транзакции базы данных завершается успешно. Пользователь не видит ошибки на экране. Когда же документ открывают повторно, дозаполняют все пустые поля и проводят — код в ПРО отрабатывает без ошибок, и регистрация проходит штатно.
Для того чтобы точно выяснить, какая из причин имеет место в вашей системе, выполним несколько диагностических шагов по шагам.
Шаг 1. Анализ Журнала регистрации. Обязательно отфильтруйте Журнал регистрации в УТ 10.3 по метаданным документа поступления в момент его первоначального создания. Посмотрите:
Шаг 2. Проверка настроек пользователей. Проверьте настройки тех пользователей, чьи документы не выгрузились:
Шаг 3. Временное отключение "ОбменДанными.Загрузка" во внешних обработках. Если документы создаются внешней обработкой, найдите в ее коде строку ОбменДанными.Загрузка = Истина. Попробуйте временно закомментировать ее и протестировать создание документа. Если после этого документы начинают автоматически регистрироваться для обмена при создании, значит, дело было именно в этом параметре.
Как решить проблему программно без отключения оптимизации загрузки: Чтобы не терять скорость загрузки объектов и при этом регистрировать их в плане обмена, добавьте в код обработки загрузки принудительную регистрацию на узле обмена сразу после записи документа:
НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
// Заполнение полей документа...
НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
// Принудительно регистрируем объект на узлах обмена
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, НовыйДокумент.Ссылка);
Если у вас уже накопился пул документов, которые не попали в Бухгалтерию предприятия, не обязательно заходить в каждый документ, перезаполнять контрагента и перепроводить его вручную, рискуя сдвинуть границу последовательности или изменить котировки себестоимости.
Рассмотрим, как зарегистрировать документы к выгрузке с помощью стандартных средств платформы:
ОбменУправлениеТорговлей103БухгалтерияПредприятия30, на который выполняется выгрузка в БП 3.0.После этого все выбранные документы будут помечены платформой к выгрузке и перенесутся в БП 3.0 при первом же запуске регламентного задания обмена без необходимости их перепроведения и ручной модификации.