Как восстановить удаленный справочник «Подразделения» в БГУ после сбоя синхронизации с ЗУП 3?

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

Представим крайне неприятную ситуацию: после очередного сеанса синхронизации между конфигурациями «Зарплата и управление персоналом» (ЗУП 3) и «Бухгалтерия государственного учреждения» (БГУ) из базы БГУ бесследно исчез весь справочник Подразделения. На месте привычных названий отделов в документах, проводках и отчетах красуются пугающие надписи <Объект не найден>... с длинными наборами символов. С этой проблемой часто сталкиваются как начинающие специалисты, так и опытные администраторы 1С.

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

Выясняем причину: почему при синхронизации удаляются подразделения?

Для того чтобы эффективно бороться с последствиями сбоя, необходимо проанализировать ситуацию и понять механизмы интеграции между ЗУП и БГУ. Очистка справочника при обмене данными чаще всего происходит по нескольким техническим причинам:

  1. Различие в логике ведения учета в конфигурациях. В программе ЗУП справочник Подразделения является ключевым для кадрового учета, расчета заработной платы и формирования штатного расписания. В БГУ этот же справочник выступает в роли субконто (аналитического разреза) для ведения баланса и учета затрат. Из-за этого структура подразделений в базах часто ведется независимо и имеет разные уровни иерархии.
  2. Ошибки при первоначальном сопоставлении объектов. Если при первой настройке синхронизации сопоставление элементов справочников было выполнено некорректно или автоматически по неточным реквизитам (например, только по наименованию без учета структуры), правила обмена могут посчитать дублирующиеся элементы лишними и запустить процедуру их замещения или очистки.
  3. Регистрация изменений на удаление в базе-источнике. Если на стороне ЗУП была выполнена реорганизация структуры, слияние отделов или физическое удаление неиспользуемых элементов, эти действия регистрируются в планах обмена как «удаление объекта». При очередной синхронизации база БГУ получает пакет данных с командами на удаление соответствующих записей. Если у пользователя в БГУ достаточно прав, система беспрепятственно стирает справочник, оставляя битые ссылки в проведенных документах прошлых периодов.
  4. Сбой в работе переключателя ограничений выгрузки. В настройках синхронизации часто используется опция «Отправлять только используемые в документах подразделения». Если документы прошлых периодов на стороне ЗУП были распроведены, помечены на удаление или перенесены в архив, правила обмена могут посчитать ранее созданные подразделения неактуальными и инициировать их удаление в базе-приемнике.

Метод 1. Восстановление справочника через обработку «ВыгрузкаЗагрузкаДанныхXML.epf» (при наличии бэкапа)

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

Основное преимущество этого метода заключается в том, что стандартная обработка ВыгрузкаЗагрузкаДанныхXML.epf переносит данные с сохранением их уникальных идентификаторов (GUID). Это значит, что после загрузки справочника в рабочую базу все битые ссылки вида <Объект не найден> автоматически «склеятся» с восстановленными элементами, и вам не придется перепроводить или вручную редактировать документы.

Разберем этот процесс подробно по шагам:

  1. Создание копии текущей рабочей базы. Перед любыми манипуляциями обязательно сделайте архивную копию вашей текущей поврежденной базы БГУ. Это убережет вас от совершения критических ошибок.
  2. Развертывание вчерашнего бэкапа. Восстановите вчерашнюю (или последнюю актуальную) резервную копию базы данных под другим именем (например, «БГУ_Копия_Восстановление»). В этой копии справочник Подразделения должен быть в целости и сохранности.
  3. Запуск обработки выгрузки в копии базы. Откройте базу-копию в режиме «1С:Предприятие». Через меню «Файл» -> «Открыть» запустите внешнюю обработку ВыгрузкаЗагрузкаДанныхXML.epf (ее можно найти на диске ИТС или в каталоге установленных шаблонов конфигурации).
  4. Настройка выгрузки данных:
    • Перейдите на вкладку «Выгрузка».
    • В списке метаданных снимите галочки со всех объектов, кроме справочника Подразделения (полное имя объекта — СправочникСсылка.Подразделения или аналогичное в зависимости от версии БГУ).
    • Убедитесь, что сняты флажки выгрузки связанных документов и регистров, чтобы не перенести лишнюю информацию. Нам нужен только «чистый» справочник подразделений.
    • Укажите путь на локальном диске для сохранения XML-файла выгрузки.
    • Нажмите кнопку «Выгрузить данные».
  5. Загрузка данных в рабочую базу. Откройте вашу рабочую базу БГУ, где справочник был удален. Откройте ту же самую обработку ВыгрузкаЗагрузкаДанныхXML.epf, перейдите на вкладку «Загрузка», укажите путь к ранее созданному XML-файлу и нажмите кнопку «Загрузить данные».
  6. Проверка результата. Откройте справочник подразделений в рабочей базе — структура должна полностью восстановиться. Зайдите в любой документ, где ранее отображалась битая ссылка <Объект не найден>, и вы увидите, что ссылка снова указывает на корректное подразделение.

Метод 2. Программное воссоздание объектов по GUID (если резервная копия устарела)

Что делать, если свежего бэкапа нет, а резервная копия недельной или месячной давности не содержит недавно созданных подразделений? В этом случае можно воспользоваться программным методом воссоздания элементов справочника по их уникальным идентификаторам (GUID).

Каждая битая ссылка в интерфейсе программы выглядит примерно так: <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824). Набор символов в скобках — это внутреннее шестнадцатеричное представление уникального идентификатора удаленного элемента в базе данных. Если мы программно создадим новый элемент справочника и насильно присвоим ему этот GUID, система распознает его как «родной», и все битые ссылки мгновенно исчезнут.

Проанализируем алгоритм работы этого метода:

  1. Преобразование GUID. Нам необходимо перевести внутреннее представление ссылки 1С (например, 84:bf5600145e3710ab11dda4c605dbe824) в стандартный формат GUID (36 символов с дефисами). Существуют готовые универсальные обработки (например, «Поиск и замена дублей» или специализированные обработки по поиску битых ссылок), которые делают это автоматически. В нашем примере GUID в стандартном представлении будет выглядеть так: 05dbe824-a4c6-11dd-bf56-00145e3710ab.
  2. Создание внешней обработки. Мы пишем небольшой программный код, который создаст новые элементы справочника с жестко заданными уникальными идентификаторами. Посмотрим на пример кода:

// Создаем уникальный идентификатор из текстовой строки GUID
ИдентификаторGUID = Новый УникальныйИдентификатор("05dbe824-a4c6-11dd-bf56-00145e3710ab");

// Получаем ссылку на будущий элемент справочника "Подразделения"
СсылкаНаПодразделение = Справочники.Подразделения.ПолучитьСсылку(ИдентификаторGUID);

// Создаем непосредственно сам объект элемента справочника
НовыйОбъект = Справочники.Подразделения.СоздатьЭлемент();

// Устанавливаем объекту заранее подготовленную ссылку с нужным GUID
НовыйОбъект.УстановитьСсылкуНового(СсылкаНаПодразделение);

// Заполняем обязательные реквизиты
НовыйОбъект.Наименование = "Восстановленный отдел (АУП)";

// Записываем объект в базу данных
Попытка
    НовыйОбъект.Записать();
    Сообщить("Элемент успешно восстановлен: " + НовыйОбъект.Наименование);
Исключение
    Сообщить("Не удалось записать элемент: " + ОписаниеОшибки());
КонецПопытки;

Использование метода УстановитьСсылкуНового() позволяет записать элемент справочника именно с тем идентификатором, который содержался в битых ссылках документов. После выполнения этого кода все документы, ссылавшиеся на данный GUID, снова станут корректными.

Метод 3. Динамическое восстановление через COM-соединение (OLE)

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

При таком подходе алгоритм работы будет следующим:

  1. Обработка анализирует метаданные рабочей базы, находит все битые ссылки <Объект не найден> в справочнике Подразделения и собирает их уникальные идентификаторы (GUID).
  2. Программа устанавливает COM-соединение с резервной копией базы данных с помощью объекта V83.COMConnector.
  3. По каждому найденному GUID обработка делает запрос к базе-копии, считывает оттуда реальные наименования подразделений, их коды, иерархическую структуру и другие реквизиты.
  4. В рабочей базе программно создаются новые элементы с исходными GUID (методом УстановитьСсылкуНового()) и заполняются актуальными данными, полученными из резервной копии через COM.

Этот метод является наиболее продвинутым, так как он позволяет точечно восстановить только те подразделения, ссылки на которые действительно остались в документах, исключая перенос «мусорных» элементов.

Профилактика: как не допустить удаления данных при следующей синхронизации?

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

  1. Установите жесткий запрет на непосредственное удаление объектов. У обычных пользователей в базах БГУ и ЗУП должно быть полностью отобрано право на непосредственное физическое удаление данных (без контроля ссылочной целостности). Пользователи должны иметь право только помечать объекты на удаление. Окончательную очистку базы должен производить исключительно администратор системы через запуск стандартной обработки «Удаление помеченных объектов», которая физически не позволит стереть подразделение, если оно фигурирует хотя бы в одном документе.
  2. Настройте дату запрета загрузки данных. В рабочей базе БГУ обязательно перейдите в раздел «Администрирование» -> «Синхронизация данных» и включите опцию «Даты запрета загрузки». Настройте дату запрета таким образом, чтобы изменения из ЗУП не могли повлиять на уже закрытые отчетные периоды БГУ. Это предотвратит любое случайное изменение или удаление аналитики в старых документах.
  3. Отмените регистрацию изменений для справочника «Подразделения». Если вы хотите вести учет подразделений в БГУ полностью независимо от кадровой структуры ЗУП, зайдите в настройки узла обмена (как на стороне ЗУП, так и БГУ) через обработку «Регистрация изменений для обмена» и вручную отмените регистрацию изменений по справочнику подразделений. Теперь при синхронизации эти данные передаваться не будут.
  4. Скорректируйте правила конвертации объектов (ПКО). Если обмен настраивался индивидуально с помощью программы «Конвертация данных», перейдите в правила обмена и для справочника подразделений установите флажок «Не замещать существующие объекты в приемнике при загрузке, если они сопоставлены» или полностью отключите выгрузку полей, оставив только поиск по уникальному идентификатору при первом создании элемента.

Применяя данные методы восстановления и профилактики, вы сможете быстро реанимировать работоспособность базы данных БГУ и навсегда обезопасить систему от подобных сбоев при интеграции программных продуктов линейки 1С.

← На главную