Почему документы не выгружаются повторно через Универсальный обмен данными XML и как это исправить

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

При работе с механизмом обмена данными в среде 1С программисты часто сталкиваются с ситуацией: первая выгрузка документов прошла успешно, но при попытке выполнить ее повторно (например, после исправления правил конвертации или из-за ошибки в базе-приемнике) файл оказывается «пустым», хотя документы в базе-источнике никуда не делись. Рассмотрим подробно, почему так происходит, как устроена внутренняя логика платформы 1С и какими инструментами мы можем вернуть объекты в поток выгрузки.

Разберем механизм регистрации изменений в планах обмена

Прежде всего, проанализируем, как 1С понимает, какие именно данные нужно выгружать. Когда мы используем обработку УниверсальныйОбменаДаннымиXML в режиме выгрузки по плану обмена, система опирается не на простое наличие документов в базе, а на специальные таблицы регистрации изменений.

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

Проанализируем жизненный цикл этой записи:

  1. Регистрация: Объект изменен, запись появилась в таблице изменений.
  2. Выгрузка: Обработка считывает данные, которым присваивается номер сообщения.
  3. Подтверждение (Снятие регистрации): Как только выгрузка завершена успешно, система (или программный алгоритм регламентного задания) дает команду «удалить регистрацию для этого номера сообщения».

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

Как проверить наличие регистрации изменений

Прежде чем что-то исправлять, нам необходимо убедиться в наших предположениях. Посмотрим на список зарегистрированных изменений. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем), таких как 1С:Бухгалтерия 3.0, существует встроенный инструмент.

Рассмотрим пошагово, как его найти и использовать:

  1. Перейдем в раздел Администрирование — Синхронизация данных.
  2. Найдем пункт Настройки синхронизации данных.
  3. Выберем нужную настройку обмена и нажмем кнопку Состав отправляемых данных (в некоторых версиях это иконка в виде листа с карандашом).
  4. Откроется форма Регистрация изменений для обмена.

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

Решение проблемы: ручная регистрация объектов

Чтобы документы снова попали в выгрузку, нам нужно принудительно добавить их в таблицу регистрации изменений. Рассмотрим два способа, как это сделать.

Способ 1: Использование стандартной обработки «Регистрация изменений для обмена»

Это самый простой и надежный метод. Выполним следующие действия:

  1. В открытой форме регистрации изменений выберем нужный тип документа в дереве слева.
  2. Нажмем кнопку Зарегистрировать.
  3. Здесь у нас есть выбор:
    • Все объекты выбранного типа: если нужно перегрузить вообще всё.
    • Объекты выбранного типа с отбором: если нужно выгрузить документы только за определенный период или по конкретной организации.
  4. После выбора критериев нажмем ОК. Количество объектов в колонке «Количество» изменится с нуля на число найденных документов.

Способ 2: Программная регистрация (через консоль кода)

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


// Определяем узел плана обмена, для которого нужно зарегистрировать изменения
УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("Бухгалтерия в УТ");

// Получаем ссылку на документ, который нужно перевыгрузить
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000001", ТекущаяДата());

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

Сообщить("Объект успешно зарегистрирован для узла: " + УзелОбмена);

После выполнения этого кода при следующем запуске регламентного задания или ручной выгрузки через обработку УниверсальныйОбменДаннымиXML, этот документ будет включен в файл обмена.

Особенности работы через регламентные задания

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

Если вы исправляли правила конвертации (файл .xml с правилами), убедитесь, что регламентное задание использует обновленный файл. Часто бывает так, что программист правит правила локально, а серверное задание продолжает брать старую версию из справочника НастройкиМетодовОбмена или из временной папки на сервере.

Дополнительная диагностика: Консоль запросов

Если визуальные средства не помогают, проанализируем ситуацию на уровне базы данных. Данные о регистрации изменений хранятся в виртуальных таблицах. Мы можем посмотреть их через консоль запросов, обратившись к таблице вида ПланОбмена.[ИмяПланаОбмена].Изменения.

Пример запроса для анализа регистраций:


ВЫБРАТЬ
    ТвояТаблицаИзменений.Ссылка КАК Объект,
    ТвояТаблицаИзменений.НомерСообщения КАК НомерСообщения
ИЗ
    ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Изменения КАК ТвояТаблицаИзменений
ГДЕ
    ТвояТаблицаИзменений.Узел = &ВыбранныйУзел

Если этот запрос не возвращает строк, значит, никакой механизм (ни автоматический, ни ручной) не подготовил данные для выгрузки. Если же строки есть, но файл все равно пустой — проблему нужно искать уже в самих правилах выгрузки (ПВД) или фильтрах, установленных непосредственно в узле плана обмена (например, ограничение по дате начала выгрузки или организации).

Подведем итоги

Мы выяснили, что «исчезновение» документов при повторной выгрузке — это штатное поведение платформы 1С, предназначенное для экономии трафика и исключения дублирования данных. Для успешного повторения выгрузки после исправления ошибок в правилах или коде ПослеЗагрузки, всегда используйте ручную регистрацию объектов через форму Состав отправляемых данных. Это гарантирует, что УниверсальныйОбменДаннымиXML «увидит» эти объекты и включит их в следующий сеанс обмена.

← На главную