При сопровождении и обновлении распределенных информационных баз (РИБ) на платформе 1С:Предприятие 8.3 специалисты часто сталкиваются со следующей проблемой: при попытке применить изменения в периферийной базе данных система выдает сообщение «Ошибка разделенного доступа к базе данных. База данных заблокирована». Попытки повторного обмена и перезапуска не приносят результатов, а принудительный запуск обновления может вызвать сопутствующую ошибку: «Не удалось выполнить замену дублей идентификаторов объектов метаданных. Выполните действие в монопольном режиме».
В данной статье мы подробно проанализируем причины возникновения этой цепочки ошибок на примере конфигурации 1С:Розница (работающей под управлением Библиотеки стандартных подсистем — БСП) и разберем по шагам эффективные методы борьбы с ними в файловом варианте работы базы данных.
Для начала разберем природу этих неполадок. Почему платформа требует монопольный доступ и откуда берутся дубликаты идентификаторов?
1Cv8.1CD. Если в этот момент к базе подключен хотя бы один сеанс (включая скрытые сессии, веб-серверы, фоновые или регламентные задания), платформа блокирует операцию..1CL, .cdn или .lck), которые «обманывают» платформу, заставляя ее думать, что база кем-то занята. Кроме того, фоновые процессы операционной системы или зависшие в памяти процессы 1cv8.exe могут продолжать удерживать файл базы данных.ИдентификаторыОбъектовМетаданных. Если в подчиненном узле этот справочник поврежден или содержит некорректные записи, БСП пытается сопоставить новые объекты и устранить дубли. Однако эта операция требует жесткого монопольного режима. Если система не может его обеспечить, после 10 неудачных автоматических попыток процесс прерывается аварийно.Рассмотрим по шагам комплексное решение этой проблемы, двигаясь от простых административных мер к программным методам исправления структуры данных.
Прежде чем приступать к манипуляциям с метаданными, нам необходимо гарантировать, что файл базы данных действительно освобожден от всех сторонних процессов. Выполним следующие действия:
1cv8.exe, 1cv8c.exe или 1cv8s.exe. Если они есть — завершим их принудительно.*.1CL — файлы блокировок базы данных.*.cdn — файлы блокировки установки обновлений.*.lck — файлы локальных блокировок сеансов.1Cv8.1CD.
%userprofile%\AppData\Local\1C\1Cv8\%userprofile%\AppData\Roaming\1C\1Cv8\Если интерактивный запуск в режиме «Предприятие» сразу прерывается ошибкой разделенного доступа, мы можем заставить платформу выполнить процедуры обновления БСП в жестком монопольном режиме через командную строку. Это позволит обойти запуск стандартного интерфейса и сразу инициализировать обработчики.
Откроем командную строку (cmd) и выполним запуск 1С с параметром ЗапуститьОбновлениеИнформационнойБазы:
"C:\Program Files\1cv8\8.3.13.1865\bin\1cv8.exe" ENTERPRISE /F "C:\Put_K_Vashey_Baze" /N "ИмяАдминистратора" /P "Пароль" /C ЗапуститьОбновлениеИнформационнойБазы /UC КодРазрешения
Разберем подробнее используемые ключи запуска:
/F — путь к каталогу файловой базы данных./N и /P — имя и пароль пользователя с правами Администратора./C ЗапуститьОбновлениеИнформационнойБазы — специальный параметр запуска БСП, который заставляет систему не открывать основной интерфейс, а сразу начать выполнение процедур обновления в монопольном режиме./UC КодРазрешения — параметр, позволяющий обойти установленную административную блокировку соединений (если она была установлена ранее).Если принудительное обновление все равно сообщает об ошибке «Не удалось выполнить замену дублей...», это означает, что в базе-приемнике (периферийном узле) справочник идентификаторов метаданных сильно поврежден или содержит дублирующиеся записи, которые БСП не может сопоставить автоматически.
В этом случае нам поможет программный метод. Мы можем написать внешнюю обработку или выполнить код в консоли под полными правами в режиме Предприятия.
Рассмотрим алгоритм полного обновления справочника идентификаторов. Для этого вызовем штатный метод БСП с параметрами принудительной перезаписи данных:
ПараметрыОбновления = Новый Структура;
ПараметрыОбновления.Вставить("ЗапускатьВФоновомРежиме", Ложь);
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(Истина, Истина);
Переданные параметры (Истина, Истина) указывают системе на необходимость полной перезаписи справочника и автоматического слияния дублирующихся элементов.
Если это не помогло из-за жестких ссылок, применим более радикальный («хирургический») способ очистки. Проанализируем ситуацию: мы можем попытаться удалить все записи из справочника ИдентификаторыОбъектовМетаданных непосредственно. Те элементы, которые связаны с реальными документами или справочниками в базе данных, платформа удалить не позволит (сработает исключение), а «битые» и неиспользуемые дубликаты будут успешно стерты.
Выполним следующий код:
Выборка = Справочники.ИдентификаторыОбъектовМетаданных.Выбрать();
СистематическиеОшибки = 0;
Пока Выборка.Следующий() Цикл
Попытка
ОбъектИдентификатора = Выборка.ПолучитьОбъект();
ОбъектИдентификатора.Удалить();
Исключение
// Элемент используется реальными объектами базы данных, пропускаем его
СистематическиеОшибки = СистематическиеОшибки + 1;
КонецПопытки;
КонецЦикла;
// После удаления зависших дублей инициируем штатное заполнение справочника
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(Истина, Истина);
Этот способ позволяет точечно вычистить «мусорные» записи, которые мешали штатному механизму обновления БСП сопоставить метаданные.
Если проблема вызвана нарушением ссылочной целостности базы данных на физическом уровне (например, битые ссылки в регистрах или документах на удаленные метаданные), выполним тестирование и исправление базы данных через Конфигуратор.
В распределенных информационных базах справочник ИдентификаторыОбъектовМетаданных периферийной базы должен строго соответствовать аналогичному справочнику центральной базы. Если все вышеописанные методы не помогают, мы можем пойти по пути полной синхронизации этого справочника из ЦБ.
Для этого в периферийной базе с помощью обработки «Универсальный подбор и обработка объектов» полностью очищают справочник ИдентификаторыОбъектовМетаданных. После этого запускается сеанс обмена данными с центральной базой. Главная база в процессе обмена выгружает эталонные идентификаторы метаданных, которые принудительно записываются в чистый справочник подчиненного узла без конфликтов блокировки.
Используя предложенные инструкции последовательно, вы гарантированно решите проблему разделенного доступа и дублирования метаданных при обновлении файловых баз 1С.