При работе с механизмом обмена данными в среде 1С программисты часто сталкиваются с ситуацией: первая выгрузка документов прошла успешно, но при попытке выполнить ее повторно (например, после исправления правил конвертации или из-за ошибки в базе-приемнике) файл оказывается «пустым», хотя документы в базе-источнике никуда не делись. Рассмотрим подробно, почему так происходит, как устроена внутренняя логика платформы 1С и какими инструментами мы можем вернуть объекты в поток выгрузки.
Прежде всего, проанализируем, как 1С понимает, какие именно данные нужно выгружать. Когда мы используем обработку УниверсальныйОбменаДаннымиXML в режиме выгрузки по плану обмена, система опирается не на простое наличие документов в базе, а на специальные таблицы регистрации изменений.
Для каждого плана обмена платформа создает скрытые таблицы. Как только бухгалтер или программный код создает или перезаписывает объект (например, ДокументОбъект.РеализацияТоваровУслуг), система проверяет, входит ли этот тип данных в состав выбранного плана обмена. Если входит, в таблицу регистрации записывается ссылка на этот объект и узел-получатель.
Проанализируем жизненный цикл этой записи:
Выясним причину проблемы автора: когда первая выгрузка была запущена через регламентное задание, обработка честно считала все зарегистрированные документы и сформировала XML. Даже если в самих правилах была логическая ошибка в обработчике ПослеЗагрузки, с точки зрения базы-источника данные были переданы. Следовательно, регистрация была очищена. При втором запуске таблица изменений пуста, и обработке просто нечего «подцепить» для выгрузки.
Прежде чем что-то исправлять, нам необходимо убедиться в наших предположениях. Посмотрим на список зарегистрированных изменений. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем), таких как 1С:Бухгалтерия 3.0, существует встроенный инструмент.
Рассмотрим пошагово, как его найти и использовать:
Регистрация изменений для обмена.В этой форме мы увидим дерево объектов. Если напротив интересующего нас документа (например, «Поступление товаров и услуг») стоит цифра «0», это подтверждает нашу теорию: объекты не зарегистрированы, поэтому файл выгрузки пустой. Обратите внимание, что эта форма показывает именно зарегистрированные изменения, а не список всех выгруженных ранее документов.
Чтобы документы снова попали в выгрузку, нам нужно принудительно добавить их в таблицу регистрации изменений. Рассмотрим два способа, как это сделать.
Способ 1: Использование стандартной обработки «Регистрация изменений для обмена»
Это самый простой и надежный метод. Выполним следующие действия:
Способ 2: Программная регистрация (через консоль кода)
Иногда требуется более тонкая регистрация. Проанализируем пример кода, который можно выполнить во внешней обработке или консоли кода для регистрации конкретного документа:
// Определяем узел плана обмена, для которого нужно зарегистрировать изменения
УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("Бухгалтерия в УТ");
// Получаем ссылку на документ, который нужно перевыгрузить
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000001", ТекущаяДата());
// Выполняем регистрацию изменения
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, СсылкаНаДокумент);
Сообщить("Объект успешно зарегистрирован для узла: " + УзелОбмена);
После выполнения этого кода при следующем запуске регламентного задания или ручной выгрузки через обработку УниверсальныйОбменДаннымиXML, этот документ будет включен в файл обмена.
Посмотрим на ситуацию, когда выгрузка идет в автоматическом режиме. В этом случае крайне важно понимать параметр Выгружать только зарегистрированные в настройках обработки. Если этот флаг установлен, то без наличия записей в плане обмена выгрузка всегда будет выдавать пустой результат.
Если вы исправляли правила конвертации (файл .xml с правилами), убедитесь, что регламентное задание использует обновленный файл. Часто бывает так, что программист правит правила локально, а серверное задание продолжает брать старую версию из справочника НастройкиМетодовОбмена или из временной папки на сервере.
Если визуальные средства не помогают, проанализируем ситуацию на уровне базы данных. Данные о регистрации изменений хранятся в виртуальных таблицах. Мы можем посмотреть их через консоль запросов, обратившись к таблице вида ПланОбмена.[ИмяПланаОбмена].Изменения.
Пример запроса для анализа регистраций:
ВЫБРАТЬ
ТвояТаблицаИзменений.Ссылка КАК Объект,
ТвояТаблицаИзменений.НомерСообщения КАК НомерСообщения
ИЗ
ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Изменения КАК ТвояТаблицаИзменений
ГДЕ
ТвояТаблицаИзменений.Узел = &ВыбранныйУзел
Если этот запрос не возвращает строк, значит, никакой механизм (ни автоматический, ни ручной) не подготовил данные для выгрузки. Если же строки есть, но файл все равно пустой — проблему нужно искать уже в самих правилах выгрузки (ПВД) или фильтрах, установленных непосредственно в узле плана обмена (например, ограничение по дате начала выгрузки или организации).
Мы выяснили, что «исчезновение» документов при повторной выгрузке — это штатное поведение платформы 1С, предназначенное для экономии трафика и исключения дублирования данных. Для успешного повторения выгрузки после исправления ошибок в правилах или коде ПослеЗагрузки, всегда используйте ручную регистрацию объектов через форму Состав отправляемых данных. Это гарантирует, что УниверсальныйОбменДаннымиXML «увидит» эти объекты и включит их в следующий сеанс обмена.