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