Представим крайне неприятную ситуацию: после очередного сеанса синхронизации между конфигурациями «Зарплата и управление персоналом» (ЗУП 3) и «Бухгалтерия государственного учреждения» (БГУ) из базы БГУ бесследно исчез весь справочник Подразделения. На месте привычных названий отделов в документах, проводках и отчетах красуются пугающие надписи <Объект не найден>... с длинными наборами символов. С этой проблемой часто сталкиваются как начинающие специалисты, так и опытные администраторы 1С.
В этой статье мы подробно разберем, почему происходит подобный сбой, рассмотрим по шагам классический метод восстановления данных из резервной копии, изучим альтернативные способы программного воссоздания элементов по уникальным идентификаторам (GUID), а также выясним, как настроить систему, чтобы полностью исключить повторение этой проблемы в будущем.
Для того чтобы эффективно бороться с последствиями сбоя, необходимо проанализировать ситуацию и понять механизмы интеграции между ЗУП и БГУ. Очистка справочника при обмене данными чаще всего происходит по нескольким техническим причинам:
Подразделения является ключевым для кадрового учета, расчета заработной платы и формирования штатного расписания. В БГУ этот же справочник выступает в роли субконто (аналитического разреза) для ведения баланса и учета затрат. Из-за этого структура подразделений в базах часто ведется независимо и имеет разные уровни иерархии.Это самый быстрый, надежный и наименее трудозатратный способ, который успешно применил автор темы на форуме. Он идеально подходит, если у вас есть резервная копия базы данных (бэкап) хотя бы за вчерашний день.
Основное преимущество этого метода заключается в том, что стандартная обработка ВыгрузкаЗагрузкаДанныхXML.epf переносит данные с сохранением их уникальных идентификаторов (GUID). Это значит, что после загрузки справочника в рабочую базу все битые ссылки вида <Объект не найден> автоматически «склеятся» с восстановленными элементами, и вам не придется перепроводить или вручную редактировать документы.
Разберем этот процесс подробно по шагам:
Подразделения должен быть в целости и сохранности.ВыгрузкаЗагрузкаДанныхXML.epf (ее можно найти на диске ИТС или в каталоге установленных шаблонов конфигурации).Подразделения (полное имя объекта — СправочникСсылка.Подразделения или аналогичное в зависимости от версии БГУ).ВыгрузкаЗагрузкаДанныхXML.epf, перейдите на вкладку «Загрузка», укажите путь к ранее созданному XML-файлу и нажмите кнопку «Загрузить данные».<Объект не найден>, и вы увидите, что ссылка снова указывает на корректное подразделение.Что делать, если свежего бэкапа нет, а резервная копия недельной или месячной давности не содержит недавно созданных подразделений? В этом случае можно воспользоваться программным методом воссоздания элементов справочника по их уникальным идентификаторам (GUID).
Каждая битая ссылка в интерфейсе программы выглядит примерно так: <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824). Набор символов в скобках — это внутреннее шестнадцатеричное представление уникального идентификатора удаленного элемента в базе данных. Если мы программно создадим новый элемент справочника и насильно присвоим ему этот GUID, система распознает его как «родной», и все битые ссылки мгновенно исчезнут.
Проанализируем алгоритм работы этого метода:
84:bf5600145e3710ab11dda4c605dbe824) в стандартный формат GUID (36 символов с дефисами). Существуют готовые универсальные обработки (например, «Поиск и замена дублей» или специализированные обработки по поиску битых ссылок), которые делают это автоматически. В нашем примере GUID в стандартном представлении будет выглядеть так: 05dbe824-a4c6-11dd-bf56-00145e3710ab.
// Создаем уникальный идентификатор из текстовой строки GUID
ИдентификаторGUID = Новый УникальныйИдентификатор("05dbe824-a4c6-11dd-bf56-00145e3710ab");
// Получаем ссылку на будущий элемент справочника "Подразделения"
СсылкаНаПодразделение = Справочники.Подразделения.ПолучитьСсылку(ИдентификаторGUID);
// Создаем непосредственно сам объект элемента справочника
НовыйОбъект = Справочники.Подразделения.СоздатьЭлемент();
// Устанавливаем объекту заранее подготовленную ссылку с нужным GUID
НовыйОбъект.УстановитьСсылкуНового(СсылкаНаПодразделение);
// Заполняем обязательные реквизиты
НовыйОбъект.Наименование = "Восстановленный отдел (АУП)";
// Записываем объект в базу данных
Попытка
НовыйОбъект.Записать();
Сообщить("Элемент успешно восстановлен: " + НовыйОбъект.Наименование);
Исключение
Сообщить("Не удалось записать элемент: " + ОписаниеОшибки());
КонецПопытки;
Использование метода УстановитьСсылкуНового() позволяет записать элемент справочника именно с тем идентификатором, который содержался в битых ссылках документов. После выполнения этого кода все документы, ссылавшиеся на данный GUID, снова станут корректными.
Если у вас есть старая резервная копия, но вы не хотите связываться с выгрузкой тяжелых XML-файлов и желаете автоматизировать процесс сопоставления «на лету», можно написать небольшую обработку, которая свяжет рабочую базу и базу-копию напрямую через COM-соединение.
При таком подходе алгоритм работы будет следующим:
<Объект не найден> в справочнике Подразделения и собирает их уникальные идентификаторы (GUID).V83.COMConnector.УстановитьСсылкуНового()) и заполняются актуальными данными, полученными из резервной копии через COM.Этот метод является наиболее продвинутым, так как он позволяет точечно восстановить только те подразделения, ссылки на которые действительно остались в документах, исключая перенос «мусорных» элементов.
Восстановить справочник — это только половина дела. Если не устранить первопричину сбоя, при следующем сеансе синхронизации справочник Подразделения может снова очиститься. Рассмотрим защитные меры, которые необходимо предпринять администратору системы:
Применяя данные методы восстановления и профилактики, вы сможете быстро реанимировать работоспособность базы данных БГУ и навсегда обезопасить систему от подобных сбоев при интеграции программных продуктов линейки 1С.