Каждый администратор и разработчик 1С рано или поздно сталкивается с последствиями так называемого «демонического» (динамического) обновления конфигурации. Динамическое обновление — это крайне удобный инструмент, позволяющий вносить изменения в код модулей без необходимости выгонять пользователей из базы данных. Однако у этого механизма есть обратная, очень опасная сторона. При возникновении малейшего сбоя сети, отключения питания или зависания сеанса в момент применения изменений база данных может полностью заблокироваться. При этом пользователи и разработчик получают критическую ошибку: «При обновлении данных, после последней реструктуризации, произошла ошибка» или сопутствующее ей системное сообщение «Обнаружена незавершенная операция сохранения конфигурации». В этой ситуации войти в базу невозможно ни в режиме «Предприятие», ни в режиме «Конфигуратор».
В данной статье мы подробно разберем, почему возникает этот сбой, детально проанализируем структуру хранения конфигурации в СУБД и изучим пошаговые алгоритмы реанимации базы данных для различных СУБД (MS SQL Server, PostgreSQL), а также для файлового варианта работы.
Чтобы понять природу ошибки, рассмотрим внутреннее устройство хранения метаданных в 1С. Платформа использует специализированные системные таблицы для управления конфигурацией. Основными из них являются:
Config — таблица, в которой хранится текущая рабочая конфигурация базы данных. Именно с ней работают пользователи в режиме «1С:Предприятие».ConfigSave — таблица, в которую записываются промежуточные изменения, сделанные разработчиком в Конфигураторе до нажатия клавиши F7 (Обновить конфигурацию базы данных).Когда мы запускаем процесс обновления конфигурации базы данных, платформа инициирует транзакцию, в рамках которой данные из таблицы ConfigSave переносятся и перезаписывают записи в таблице Config. Для того чтобы контролировать целостность этого процесса, 1С использует систему маркеров (флагов). В поле FileName таблицы Config временно записываются служебные маркеры:
commit — сообщает системе о начале записи изменений и открытии транзакции.dynamicCommit — указывает на то, что выполняется именно динамическое обновление.dbStruFinal — отвечает за завершающую стадию реструктуризации таблиц данных.В штатном режиме после успешного завершения транзакции эти маркеры автоматически удаляются платформой. Но если в процессе записи произошел сбой (например, отключился сетевой сокет, аварийно завершился процесс rphost или SQL-сервер ушел в перезагрузку), транзакция прерывается, а маркеры «зависают» в таблице Config. При последующей попытке запуска платформы 1С считывает эти флаги, понимает, что предыдущая операция записи была прервана, и аварийно завершает работу, предотвращая дальнейшее разрушение данных.
Если ваша база данных развернута на сервере MS SQL Server, исправление ситуации займет не более нескольких минут. Нам потребуется среда администрирования SQL Server Management Studio (SSMS).
Выполним следующие шаги для восстановления работоспособности базы данных:
SELECT * FROM Config WHERE FileName IN ('commit', 'dynamicCommit', 'dbStruFinal');
Config. Выполним следующий SQL-запрос:
DELETE FROM Config WHERE FileName = 'commit';
DELETE FROM Config WHERE FileName = 'dynamicCommit';
DELETE FROM Config WHERE FileName = 'dbStruFinal';
ConfigSave, чтобы исключить попытки повторного наката битых изменений. Выполним команду:
DELETE FROM ConfigSave;
srvinfo) и на локальном компьютере пользователя. Это исключит ситуацию, когда платформа пытается запустить базу, используя старые закэшированные файлы метаданных.После проведения этих манипуляций попробуем запустить Конфигуратор. В 95% случаев база успешно откроется. Сразу после входа в Конфигуратор обязательно запустите процедуру «Тестирование и исправление» (меню «Администрирование» -> «Тестирование и исправление») с установленными флагами проверки логической и ссылочной целостности.
Иногда простое удаление флагов-маркеров не помогает. Это происходит в тех случаях, когда сбой случился на этапе глубокой реструктуризации таблиц, и сама структура метаданных в таблице Config записалась лишь частично, оказавшись поврежденной. При попытке зайти в базу платформа будет выдавать ошибки формата потока или другие системные исключения.
Если у вас есть архивная копия (пусть даже недельной давности), но вам крайне важно сохранить все документы и проводки, которые пользователи ввели за текущий день (как упоминалось в сообщении 6 на форуме), мы можем пойти путем перезаписи конфигурации. При этом физические данные таблиц документов и справочников не пострадают.
Разберем этот продвинутый метод восстановления по шагам:
base_backup.Config в нашей сломанной рабочей базе данных (пусть она называется base_broken):
USE [base_broken];
DELETE FROM [dbo].[Config];
INSERT INTO [base_broken].[dbo].[Config]
SELECT * FROM [base_backup].[dbo].[Config];
DELETE FROM [base_broken].[dbo].[ConfigSave];
base_broken. База должна успешно открыться, так как теперь в ней находится полностью корректная структура метаданных из архивной копии. При этом все документы, введенные за сегодняшний день, останутся на месте, так как таблицы данных (такие как _Document, _Reference и т.д.) мы не затрагивали.Если ваша база данных работает под управлением СУБД PostgreSQL, методология исправления остается абсолютно аналогичной, меняется лишь инструмент администрирования и слегка корректируется синтаксис (хотя стандартные запросы полностью идентичны).
Для работы с PostgreSQL рассмотрим использование утилиты pgAdmin:
config и configsave (обратите внимание, что в PostgreSQL имена таблиц и полей чаще всего хранятся в нижнем регистре).
DELETE FROM config WHERE filename IN ('commit', 'dynamicCommit', 'dbStruFinal');
DELETE FROM configsave;
Сложнее обстоит дело, если база данных файловая. В файловом варианте у нас нет возможности открыть консоль SQL-запросов и выполнить инструкции DELETE. Однако решение существует и здесь. Для этого нам понадобятся специализированная утилита для работы с файлами баз данных 1С — Tool_1CD (инструмент сторонних разработчиков для низкоуровневого редактирования таблиц файлов .1CD), а также штатная утилита конвертации базы из комплекта платформы.
Посмотрим на алгоритм спасения файловой базы по шагам:
1Cv8.1CD в отдельную папку. Это критически важно, так как при низкоуровневом редактировании файлов высок риск окончательно повредить базу.cnvdbfl.exe. Откроем командную строку Windows (cmd) и перейдем в каталог bin установленной платформы 1С:
cd "C:\Program Files\1cv8\8.3.22.1709\bin"
(замените версию платформы в пути на вашу актуальную).
cnvdbfl.exe -c -f 8.2.14 "C:\MyBases\BrokenBase\1Cv8.1CD"
CONFIG. Перейдем на вкладку просмотра данных этой таблицы.FileName и найдем строки со значениями commit, dynamicCommit и dbStruFinal. Удалим эти строки с помощью инструментов редактирования утилиты.CONFIGSAVE и полностью очистим все строки в ней.После прохождения всех этапов база будет успешно запущена, а незавершенная транзакция динамического обновления будет полностью устранена без потери накопленных за день данных.
Чтобы минимизировать риски возникновения подобных аварийных ситуаций, рекомендуем придерживаться нескольких простых правил при администрировании систем на базе 1С: