Как исправить рассинхронизацию текстов модулей и конфигурации базы данных в 1С?

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

При разработке и сопровождении конфигураций на платформе 1С:Предприятие 8.3 разработчики нередко сталкиваются с неприятной ситуацией: в пользовательском режиме возникает ошибка времени выполнения (например, обращение к несуществующему реквизиту или несовпадение типов), но при попытке найти строку с ошибкой в конфигураторе оказывается, что текст модуля в конфигураторе не соответствует фактически исполняемому коду. При этом сравнение и объединение основной конфигурации с конфигурацией базы данных может показывать полное отсутствие различий.

Разберем подробнее, почему возникает этот рассинхрон и какими практическими методами можно полностью восстановить корректное состояние информационной базы.

Проанализируем ключевые причины возникновения проблемы:

  1. Динамическое обновление конфигурации базы данных. При частом применении изменений «на лету» без отключения пользователей в служебных таблицах базы данных (Config, ConfigSave, Params, ConfigCAS) накапливаются промежуточные версии структур и модулей. В результате конфигуратор и исполняющая среда читают разные срезы метаданных.
  2. Зависание кэша на стороне сервера 1С:Предприятия. Рабочие процессы кластера (rphost) кэшируют скомпилированный байт-код модулей. Если рабочий процесс не успел перечитать метаданные, для части сеансов продолжает выполняться устаревший код.
  3. Повреждение локального кэша клиента. Временные файлы на рабочем месте разработчика или пользователя могут содержать устаревшие описания метаданных и форм.

Способ 1. Полная очистка локального и серверного кэша

В первую очередь необходимо исключить влияние кэширования на всех уровнях. Разберем по шагам, как правильно выполнить полную очистку:

  1. Очистка клиентского кэша:

    Завершим все сеансы работы с 1С на рабочей станции. Перейдем в каталоги временных файлов операционной системы и удалим все подпапки с буквенно-цифровыми идентификаторами:

    %localappdata%\1C\1cv8

    %appdata%\1C\1cv8

    Также полезно удалить базу из списка в окне запуска и добавить ее заново — это заставит платформу создать для базы новую чистую локальную папку кэша.

  2. Запуск с ключом очистки:

    Для гарантированной очистки управляемых форм запустим клиент или конфигуратор с параметром командной строки /ClearCache.

  3. Очистка серверного кэша (для клиент-серверных баз):

    Остановим службу сервера 1С (ragent). В рабочем каталоге кластера (по умолчанию srvinfo\reg_1541) удалим кэш-папки процессов snccntx* и временные файлы сеансов, после чего снова запустим службу.

Способ 2. Пересборка метаданных методом выгрузки и сравнения конфигураций

Если простая очистка кэшей не помогла и в базе по-прежнему наблюдается несоответствие модулей, применим надежный метод принудительной синхронизации трех сущностей метаданных (основной конфигурации, конфигурации БД и конфигурации поставщика):

  1. Откроем конфигуратор и сохраним основную конфигурацию в отдельный файл: меню Конфигурация -> Сохранить конфигурацию в файл... (назовем его Config_Main.cf).
  2. Сохраним конфигурацию базы данных в отдельный файл: меню Конфигурация -> Конфигурация базы данных -> Сохранить конфигурацию БД в файл... (назовем его Config_DB.cf).
  3. Загрузим в основную конфигурацию файл конфигурации базы данных: меню Конфигурация -> Загрузить конфигурацию из файла... и выберем Config_DB.cf. Согласимся с предупреждением о полной замене конфигурации.
  4. Выполним сравнение и объединение с файлом основной конфигурации: меню Конфигурация -> Сравнить, объединить с конфигурацией из файла... и выберем Config_Main.cf. Отметим необходимые изменения и выполним объединение.
  5. Обновим конфигурацию базы данных в монопольном режиме (клавиша F7).

Способ 3. Пересборка информационной базы через файл выгрузки (.dt)

Выгрузка информационной базы в файл .dt с последующей загрузкой в чистую базу является одним из самых эффективных способов избавления от структурного «мусора», оставленного динамическими обновлениями. Выясним, как правильно это сделать:

  1. В конфигураторе выполним пункт Администрирование -> Выгрузить информационную базу... и создадим файл *.dt (или выполним выгрузку в командной строке через параметр /DumpIB).
  2. Создадим новую пустую базу данных на сервере 1С и СУБД.
  3. Зайдем в конфигуратор новой базы и выполним Администрирование -> Загрузить информационную базу... (/RestoreIB).

В процессе загрузки платформы служебные таблицы метаданных формируются заново, а все поврежденные версионные записи динамических обновлений отсекаются.

Способ 4. Тестирование и исправление целостности

Для устранения возможных логических и структурных нарушений в таблицах базы данных воспользуемся встроенными средствами платформы:

  1. В меню Администрирование -> Тестирование и исправление... установим флаги:
    • Реиндексация таблиц информационной базы;
    • Проверка логической целостности;
    • Проверка ссылочной целостности;
    • Реструктуризация таблиц информационной базы.
  2. Для файловых баз также обязательно выполним проверку утилитой chdbfl.exe (расположенной в папке bin установленной платформы) с включенной опцией «Исправлять обнаруженные ошибки».

Способ 5. Очистка служебных таблиц в СУБД (для продвинутых администраторов)

В критических случаях в клиент-серверных базах версионный след динамического обновления можно удалить напрямую через SQL-запросы к таблицам СУБД (обязательно предварительно сделав резервную копию базы):

  1. Очистим таблицу несохраненной конфигурации:

    DELETE FROM ConfigSave;

  2. Удалим записи о динамических обновлениях из таблицы системных параметров:

    DELETE FROM Params WHERE FileName LIKE '%dynamic%';

  3. Перезапустим службу сервера 1С:Предприятия и применим изменения через конфигуратор.

Рекомендации по предотвращению сбоев

Чтобы навсегда исключить подобные проблемы в рабочей среде, рекомендуется придерживаться следующих правил:

  1. Исключить регулярное динамическое обновление на рабочих базах. Обновления рабочей базы необходимо выполнять монопольно, предварительно заблокировав соединения пользователей и завершив все регламентные задания.
  2. Использовать механизм расширений. Если требуется оперативно исправить ошибку в коде или алгоритме без остановки пользователей, создадим и применим расширение конфигурации (*.cfe) — это абсолютно безопасно для основных таблиц метаданных базы.
  3. Использовать пакетный режим с явным запретом динамического обновления. При автоматизированном развертывании обновлений передадим конфигуратору параметр /UpdateDBCfg -Dynamic-.
← На главную