Почему автоматический обмен выгружает пустой файл при наличии зарегистрированных изменений и как это исправить

Программист 1С v8.3 (Обычные формы)
← На главную

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

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

Причина 1: Права доступа и механизм RLS (Record Level Security)

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

Если в базе настроены ограничения прав на уровне записей (RLS), система ведет себя следующим образом:

  1. Фоновое задание запускается под конкретным пользователем, указанным в настройках регламентного задания.
  2. При выполнении запроса на выборку данных для выгрузки механизм RLS отсекает все записи, на которые у этого пользователя нет прав.
  3. Если у «фонового» пользователя нет прав на чтение конкретных организаций, складов или подразделений, запрос вернет пустой результат.
  4. Процедура выгрузки считает, что данных для передачи нет, закрывает XML-пакет и обновляет номер сообщения.

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

Причина 2: Специфика секции ДанныеПоФоновомуОбмену

В структуре XML-файла, приведенной в проблеме, мы видим специфическую строку:

<ДанныеПоФоновомуОбмену ПланОбмена="" Кому="0" ОтКого="0" ... КоличествоОбъектовДляФоновогоОбмена="500" />

Этот механизм в старых редакциях конфигураций (УПП 1.3) позволяет разбивать выгрузку на части. Разберем подробнее, как это может мешать:

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

Рекомендация: Проверим в настройках обмена (форма элемента справочника Настройки обмена данными), не установлены ли флаги, разделяющие выгрузку на этапы, и попробуем установить значение Количество объектов в транзакции в стандартное значение (например, 1000), отключив специфические режимы фоновой подготовки.

Причина 3: Фильтры в настройках обмена данными

Важно понимать разницу между регистрацией изменений на узле и фильтрами в самой настройке обмена. Обработка Регистрация изменений показывает всё, что привязано к узлу ПланОбменаСсылка. Однако автоматический обмен запускается через конкретный элемент справочника Настройки обмена данными.

Разберем ситуацию по шагам:

  1. Зайдем в справочник Настройки обмена данными.
  2. Найдем ту настройку, по которой работает расписание.
  3. Проверим вкладку «Выгрузка данных». Часто там установлены фильтры по организации или периоду (например, «Выгружать документы только за текущий месяц»).
  4. При ручном запуске через другие обработки эти фильтры могут игнорироваться, а регламентное задание применяет их строго.

Если дата документов, зарегистрированных к обмену, не попадает в период, указанный в настройке, файл будет пустым.

Причина 4: Проблемы серверного кэша и сеансов

Иногда причиной становится «залипание» серверных вызовов или использование устаревшего кэша метаданных. Посмотрим на это с технической стороны: фоновое задание выполняется в контексте сервера, где могут быть недоступны некоторые экспортные процедуры, если они помечены префиксом &НаКлиенте или находятся в модулях с отключенным флагом «Сервер».

Порядок действий для диагностики:

  1. Очистим кэш сервера 1С (папки snccntx в каталоге сервера).
  2. Перезапустим службу 1С:Предприятие (если есть такая возможность).
  3. Убедимся, что в правилах конвертации (если обмен идет через Универсальный обмен данными в формате XML) не используются функции, требующие интерактивного взаимодействия с пользователем (диалоги, вопросы), так как в фоновом режиме они вызывают исключение, которое может молча подавляться обработчиком обмена.

Причина 5: Координация номеров сообщений

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

Интересный нюанс: если в коде обмена используется параметр УдалитьРегистрациюИзменений = true, то при первой же неудачной попытке (из-за ошибки прав или фильтра) регистрация может быть очищена, хотя данные фактически не ушли. Но в нашем случае автор указывает, что ручной запуск после автоматического находит данные. Это подтверждает, что автоматический запуск вообще не видит эти данные, а не просто очищает их.

Как провести окончательную диагностику через отладчик

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

  1. Включим режим отладки на сервере 1С (параметр -debug в строке запуска службы).
  2. В конфигураторе установим точку останова в процедуре выгрузки (обычно это модуль обработки ОбменДаннымиXML или специализированный модуль плана обмена, метод ВыполнитьВыгрузкуДанных).
  3. Подключимся к фоновому заданию через меню Отладка -> Подключение -> Автоматическое подключение -> Фоновые задания.
  4. Дождемся запуска обмена по расписанию.
  5. Когда отладчик «поймает» сеанс, проанализируем результат выполнения метода ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения). Если выборка пуста именно здесь — проблема на 100% в правах доступа (RLS) или в параметрах самого узла.

Резюме: В 90% случаев такая проблема в связке УПП-ЗУП решается проверкой прав пользователя, под которым работает серверный процесс, и проверкой дат/фильтров в справочнике Настройки обмена данными. Особое внимание уделите тому, чтобы пользователь фонового задания имел права на чтение всех объектов, участвующих в обмене, включая регистры сведений и константы настроек.

← На главную