Динамическое обновление конфигурации (так называемое обновление «на лету») — это удобный инструмент, позволяющий вносить изменения в программный код без выгона пользователей из базы. Однако этот механизм таит в себе серьезные риски. Ошибка в коде, неудачное сравнение/объединение или сбой сети в момент обновления могут привести к тому, что часть пользователей будет работать на старой версии конфигурации, а часть — на новой, либо база вовсе начнет выдавать критические ошибки. Разберем подробно, как можно исправить ситуацию и откатиться к стабильному состоянию.
Это самый надежный и безопасный способ, который рекомендует большинство опытных администраторов. Если у вас есть утренний бэкап или любая актуальная копия базы до внесения изменений, мы можем извлечь из нее «здоровую» конфигурацию и накатить ее поверх текущей. Проанализируем последовательность действий:
Конфигурация — Сохранить конфигурацию в файл.... Сохраним полученный .cf файл на диск.Конфигурация — Сравнить, объединить с конфигурацией из файла.....cf файл.Обновить конфигурацию базы данных (F7).Важно: Если изменения были масштабными (затрагивали структуру данных: новые реквизиты, таблицы), динамическое обновление может не сработать или потребовать монопольного доступа. В этом случае придется просить пользователей выйти из системы.
Если в вашей базе включен механизм ведения истории (доступно в платформе 8.3.11 и выше), задача существенно упрощается. Рассмотрим, как воспользоваться этой функцией:
Перейдем в меню Конфигурация — История конфигурации.... В открывшемся окне мы увидим список всех сохранений конфигурации с указанием времени и автора. Проанализируем список и найдем версию, которая предшествовала неудачному динамическому обновлению. Нажмем правую кнопку мыши на нужной версии и выберем пункт «Установить как основную конфигурацию». После этого останется только нажать F7 для применения изменений. Этот способ позволяет избежать манипуляций с бэкапами и SQL-таблицами.
Иногда динамическое обновление проходит некорректно, и база переходит в состояние «демонического обновления». При этом конфигуратор может выдавать ошибки при попытке любого действия. В таком случае мы можем попробовать очистить таблицы конфигурации непосредственно в SQL-менеджере. Посмотрим на структуру таблиц 1С в MS SQL Server.
Основная конфигурация хранится в таблице Config, а временные изменения для динамического обновления — в ConfigSave. Если обновление «зависло», нам нужно удалить информацию о незавершенной транзакции обновления. Выполним следующий скрипт (предварительно обязательно сделайте бэкап всей базы SQL!):
-- Очищаем таблицу временной конфигурации
DELETE FROM configsave;
-- Удаляем записи-маркеры о незавершенном обновлении
DELETE FROM config WHERE FileName = 'commit';
DELETE FROM config WHERE FileName = 'dynamicCommit';
DELETE FROM config WHERE FileName = 'dbStruFinal';
После выполнения этих команд база «забудет» о попытке динамического обновления и вернется к состоянию основной конфигурации, которая была зафиксирована в монопольном режиме. Внимание: этот метод помогает сбросить флаги обновления, но он не вернет программный код к состоянию «до объединения», если 1С уже успела перенести данные из ConfigSave в Config.
Даже если мы успешно вернули старую конфигурацию, пользователи могут продолжать видеть ошибки. Это происходит из-за того, что платформа кэширует формы и модули локально. Разберем, как гарантированно очистить кэш:
1C:Enterprise 8.3 Server Agent и очистить содержимое папки snacc (находится внутри каталога кластера серверов).%LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8.Для того чтобы не попадать в ситуацию, когда требуется экстренный откат, проанализируем альтернативные подходы к обновлению:
.cf для обновления основной базы.Подведем итог: если динамическое обновление уже «сломало» работу, не паникуйте. Оптимальный путь — извлечение .cf из утренней копии и повторное накатывание. Если же база заблокирована ошибками обновления — используйте SQL-скрипты для очистки системных таблиц Config.