При работе с распределенными информационными базами (РИБ) многие администраторы и программисты сталкиваются с ситуацией, когда обновление центрального узла проходит успешно, а при попытке применить изменения в периферийной базе возникают ошибки выполнения обработчиков обновления. Давайте разберем, почему это происходит и как правильно обновлять конфигурацию в территориально распределенных системах.
Основная причина заключается в механизме обработчиков обновления. Когда мы обновляем конфигурацию, 1С запускает специальные процедуры, которые преобразуют данные из старого формата в новый (например, объединяют справочники, переносят реквизиты или меняют структуру таблиц БД). Эти процедуры строго последовательны.
Если вы обновили центральный узел (ЦУ) на несколько версий вперед, минуя промежуточные релизы, и отправили файл синхронизации в периферийную базу (ПБ), то конфигурация в ПБ обновится мгновенно. Однако при запуске в режиме Предприятие система «понимает», что данные старые, а метаданные — новые, и пытается выполнить очередь накопившихся обработчиков. Если какой-то промежуточный релиз содержал специфическую обработку, которая ссылается на объект, удаленный в следующей версии, происходит ошибка, как, например, Неверные параметры для несуществующего реквизита или ссылки.
Это самый «чистый» и рекомендуемый вендором путь. Чтобы избежать конфликтов, необходимо:
Предприятие для выполнения обработчиков.Да, это трудозатратно, если версий накопилось много (например, 15 релизов), но это единственный метод, гарантирующий целостность данных в РИБ.
Если обновление периферийных баз «по цепочке» занимает слишком много времени, зачастую проще пересоздать узлы. Рассмотрим этот процесс по шагам:
Предприятие.Этот способ позволяет избежать борьбы с «битыми» обработчиками обновления, но требует тщательного контроля переноса данных, чтобы пользователи не потеряли результаты своей работы в промежутках между обменами.
В критических ситуациях, когда пересоздание невозможно, опытные программисты используют отладку. Если ошибка возникает в процедуре, которая не влияет на критически важные данные (например, на справочник банковских счетов, которым вы не пользуетесь), можно временно «обмануть» систему.
Разберем логику действий:
ОбработчикиОбновления (или его аналоге в вашей версии конфигурации).Внимание: это опасный метод. Мы не рекомендуем делать это без полного понимания того, что именно делает обработчик. Если вы пропустите процедуру, которая отвечает за критические бизнес-процессы (например, перенос остатков по регистрам), это приведет к расхождению данных между базами, которое будет крайне сложно исправить.
Иногда для проведения операций по обслуживанию требуется временно превратить периферийную базу в автономную. Для этого можно использовать параметры командной строки при запуске или обработку, позволяющую программно очистить главный узел:
// Пример логики отвязки от главного узла
ПланОбмена.УстановитьГлавныйУзел(Неопределено);
// После выполнения нужных обновлений:
ПланОбмена.УстановитьГлавныйУзел(СсылкаНаГлавныйУзел);
После отвязки вы сможете обновить конфигурацию файлом .cf, запустить обработку обновлений и затем вернуть связь с центральной базой.
Проанализировав ситуацию, мы рекомендуем придерживаться следующей стратегии:
Работа с РИБ требует дисциплины в обменах. Помните, что каждый узел — это полноценная база, которая должна корректно отрабатывать все изменения метаданных в строгом соответствии с версией конфигурации.