При работе в управляемых формах 1С (например, в конфигурации «Управление торговлей», редакция 11) пользователи иногда сталкиваются с крайне неприятным визуальным багом. При попытке раскрыть группы в справочнике Номенклатура (в режиме просмотра «Дерево») вместо списка подчиненных папок начинает бесконечно дублироваться корневая группа. Обычная очистка локального кэша пользователя помогает лишь на время, после чего проблема возвращается снова.
В этой статье мы подробно разберем, почему возникает этот сбой, проанализируем его глубокие технические причины и рассмотрим пошаговые методы устранения проблемы как на уровне сервера, так и на уровне клиентских рабочих мест.
Этот визуальный сбой напрямую связан с механизмами кэширования метаданных платформой 1С и тем, как она строит динамический список в режиме отображения «Дерево» на уровне СУБД. В 90% случаев первопричиной становится выполнение так называемого динамического (в народе — «демонического») обновления конфигурации базы данных без перезапуска активных сеансов пользователей.
При таком обновлении происходит рассинхронизация кэша метаданных на трех ключевых уровнях:
Платформа 1С оптимизирует запросы динамических списков, кэшируя их структуру в специальных системных таблицах (таких как DBNameCache, Config и SICache). В момент сбоя кэша SQL-запрос, генерируемый платформой для построения иерархического дерева, начинает отрабатывать некорректно. Он ошибочно подставляет идентификатор (GUID) родительского элемента в качестве родителя для самого себя или ломает связь «ссылка — родитель». В результате при попытке раскрыть любую ветку дерево «зацикливается» на корневом элементе.
Самый быстрый и гарантированный способ сбросить зависший серверный кэш метаданных — перерегистрировать базу данных в консоли администрирования кластера серверов 1С. Рассмотрим, почему это работает.
При удалении базы из кластера и её повторном добавлении сервер приложений генерирует для неё новый уникальный внутренний идентификатор (GUID). Старый серверный кэш, жестко привязанный к прежнему GUID базы, автоматически становится недействительным и перестает использоваться. Сервер приложений вынужден построить всю структуру кэша метаданных заново с нуля.
Выполним процедуру перерегистрации по шагам:
Перерегистрация базы — эффективный метод, но он неудобен, если в базе настроены сложные права доступа, регламентные задания, подключены внешние сервисы или настроено резервное копирование средствами 1С. В таком случае мы можем очистить серверный кэш вручную.
Проанализируем этот процесс по шагам:
ragent или Агент сервера 1С:Предприятия) через диспетчер служб Windows или консоль.C:\Program Files\1cv8\srvinfo\reg_1541\ (путь может отличаться в зависимости от версии платформы и номера порта).snccntry и временные файлы).USR1CV8). Для этого перейдем в папку: C:\Users\USR1CV8\AppData\Local\Temp\ и очистим её содержимое.Если у администратора нет возможности прямо сейчас остановить сервер или перерегистрировать базу, мы можем применить временные меры на стороне пользователей.
Использование параметра запуска /ClearCache
Для того чтобы при каждом запуске клиентского приложения у пользователя автоматически очищался кэш (что предотвратит повторное появление ошибки до момента исправления на сервере), пропишем специальный параметр:
/ClearCache.Быстрый обход проблемы в интерфейсе программы
Если пользователь уже работает в программе и дерево «зависло», можно принудительно заставить динамический список перестроить SQL-запрос без перезапуска программы. Для этого в форме справочника Номенклатура выполним следующие действия:
Иногда зацикливание дерева может быть связано не только с системным кэшем, но и с ошибками в кодовой базе конфигурации, особенно если справочник дорабатывался программистами.
Посмотрим на пример некорректного произвольного запроса в динамическом списке, который может приводить к дублированию строк:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Родитель КАК Родитель,
Цены.Цена КАК Цена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ПО Номенклатура.Ссылка = Цены.Номенклатура
Если в регистре сведений ЦеныНоменклатуры по какой-то причине образуются дублирующие записи на одну и ту же дату для одной позиции номенклатуры, левое соединение (LEFT JOIN) вернет несколько строк для одной ссылки. В обычном списке это вызовет ошибку «Обнаружено дублирование ключевых значений», но в режиме «Дерево» из-за специфики иерархической группировки платформа может попытаться отобразить дублирующиеся строки как дочерние ветки, что приведет к визуальному эффекту «размножения» папок.
Для исправления этой ситуации необходимо переписать запрос динамического списка так, чтобы гарантировать уникальность поля Ссылка, либо использовать группировку.
Аналогичный сбой могут вызывать некорректно настроенные ограничения прав на уровне записей (механизм RLS). Если условия RLS ограничивают чтение родительских групп, но разрешают чтение дочерних элементов, платформа может не справиться с построением дерева и начать дублировать доступные корневые элементы.
Описанные выше способы очистки кэша и перерегистрации баз — это лишь борьба с симптомами. Чтобы полностью и навсегда избавиться от этой ошибки, выполним два ключевых правила: