В практике администрирования и разработки на платформе 1С:Предприятие 8.2 и 8.3 одной из самых коварных проблем является так называемое «виртуальное раздвоение» информационной базы. Эта ситуация часто возникает после динамического обновления (обновления «на лету»), когда часть пользователей продолжает видеть старую структуру метаданных, а другая часть — новую. Это приводит к неверному формированию отчетов, отсутствию колонок, ошибкам при проведении документов и некорректным остаткам.
В данной статье мы подробно разберем, почему возникает эта проблема, как программно сбросить настройки пользователей для восстановления работоспособности и какие системные действия необходимо предпринять на сервере для полной синхронизации конфигураций.
Проанализируем ситуацию: при выполнении динамического обновления система не вносит изменения в основную таблицу конфигурации сразу для всех активных сеансов. Вместо этого платформа создает временное состояние. Проблема заключается в десинхронизации основной конфигурации и конфигурации базы данных. В профессиональной среде это явление часто называют «кэшированием старых метаданных».
Когда мы добавляем реквизиты, новые справочники или изменяем структуру регистров динамически, платформа должна подменить объекты в памяти у пользователей. Однако из-за сбоев сети, особенностей работы серверных процессов rphost или специфики клиентского кэша, этот механизм срабатывает не для всех. В результате система «думает», что пользователь работает с актуальной версией, но фактически его сеанс обращается к объектам, которых уже не существует или которые были изменены.
Одним из наиболее эффективных способов «встряхнуть» пользовательские сеансы и заставить их перечитать структуру метаданных является использование встроенной функции ОчиститьНастройкиПользователя(). Рассмотрим, как реализовать массовую очистку настроек для всех пользователей информационной базы.
Разберем по шагам создание обработки для этой задачи. Нам потребуется получить список всех пользователей и в цикле вызвать процедуру очистки. Однако здесь есть важный нюанс: при написании кода часто возникает ошибка Поле объекта недоступно для записи (Пользователи). Это происходит из-за конфликта имен, когда переменная совпадает с именем реквизита формы или системным объектом.
Посмотрим на правильный вариант программного кода, который можно запустить во внешней обработке:
Процедура ВыполнитьСбросНастроек()
// Получаем полный список пользователей информационной базы
СписокПользователейИБ = ПользователиИнформационнойБазы.ПолучитьПользователей();
// Настроим индикатор прогресса для визуального контроля (если есть на форме)
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = СписокПользователейИБ.Количество();
КолвоОбработанных = 0;
Для каждого ТекущийПользователь Из СписокПользователейИБ Цикл
Попытка
// Выполняем очистку настроек по имени пользователя
ОчиститьНастройкиПользователя(ТекущийПользователь.Имя);
КолвоОбработанных = КолвоОбработанных + 1;
ЭлементыФормы.Индикатор1.Значение = КолвоОбработанных;
Исключение
Сообщить("Не удалось очистить настройки для: " + ТекущийПользователь.Имя);
КонецПопытки;
КонецЦикла;
Сообщить("Обработка завершена. Настройки сброшены для " + КолвоОбработанных + " пользователей.");
КонецПроцедуры
Важно понимать: использование метода ОчиститьНастройкиПользователя() удаляет персональные настройки форм, фильтров и отчетов. Это радикальный, но действенный метод, когда стандартная очистка кэша в папках AppData не приносит результата.
Если программный сброс настроек и удаление локальных папок 1cv8 на компьютерах пользователей не помогли, значит, проблема зафиксировалась на уровне сервера приложений 1С. В этом случае мы имеем дело с «демоном» динамического обновления, который удерживает старые описания типов в памяти процесса rphost.
Проанализируем алгоритм полной очистки серверного кэша:
C:\Program Files\1cv8\srvinfo\reg_1541\...).snccntx — здесь хранятся контексты сеансов, которые часто являются причиной ошибок после обновления.Внимание: Не удаляйте файлы конфигурации (папку config внутри `srvinfo`, если она там есть в некоторых версиях), если не уверены в своих действиях. Обычно достаточно очистки подпапок контекста сеансов.
Рассмотрим еще один эффективный прием. Если база «раздвоилась», нам нужно заставить систему заново пересчитать контрольные суммы метаданных. Посмотрим, как это сделать:
Войдем в конфигуратор в монопольном режиме. Внесем любое незначительное изменение, которое не влияет на логику, но меняет структуру модуля. Например, можно добавить пробел в комментарии любого общего модуля или модуля управляемого приложения. После этого нажмем «Обновить конфигурацию базы данных» (F7).
В отличие от динамического обновления, этот метод принудительно перезаписывает основную таблицу Config и синхронизирует ее с ConfigSave. Это действие часто устраняет «зависшие» изменения, которые не видели пользователи.
Если у вас большое количество пользователей (например, 30 и более), обходить каждый компьютер для удаления папок трудозатратно. Рассмотрим способ автоматизации очистки клиентского кэша. В окне запуска 1С для нужной информационной базы в поле «Дополнительные параметры запуска» можно прописать специальный ключ:
/ClearCache
Проанализируем работу этого ключа: при следующем запуске программа проигнорирует текущие локальные кэшированные данные метаданных и загрузит их заново с сервера. После одного успешного запуска этот параметр рекомендуется убрать, чтобы не замедлять последующие входы в систему.
Чтобы в будущем избежать ситуации с некорректным отображением данных и «раздвоением» базы, проанализируем рекомендации по обновлению:
Таким образом, мы рассмотрели комплексный подход к решению проблемы: от программного вызова ОчиститьНастройкиПользователя() до глубокой очистки серверных папок snccntx. Эти методы позволяют восстановить целостность системы без необходимости пересоздания учетных записей пользователей вручную.