Как исправить некорректное отображение и дублирование дерева групп в справочнике «Номенклатура» в 1С

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

При работе в управляемых формах 1С (например, в конфигурации «Управление торговлей», редакция 11) пользователи иногда сталкиваются с крайне неприятным визуальным багом. При попытке раскрыть группы в справочнике Номенклатура (в режиме просмотра «Дерево») вместо списка подчиненных папок начинает бесконечно дублироваться корневая группа. Обычная очистка локального кэша пользователя помогает лишь на время, после чего проблема возвращается снова.

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

Выясняем глубинную причину бага: при чем здесь «демоническое» обновление?

Этот визуальный сбой напрямую связан с механизмами кэширования метаданных платформой 1С и тем, как она строит динамический список в режиме отображения «Дерево» на уровне СУБД. В 90% случаев первопричиной становится выполнение так называемого динамического (в народе — «демонического») обновления конфигурации базы данных без перезапуска активных сеансов пользователей.

При таком обновлении происходит рассинхронизация кэша метаданных на трех ключевых уровнях:

  1. На стороне локального клиента пользователя.
  2. На сервере приложений «1С:Предприятие».
  3. В самой базе данных (в СУБД).

Платформа 1С оптимизирует запросы динамических списков, кэшируя их структуру в специальных системных таблицах (таких как DBNameCache, Config и SICache). В момент сбоя кэша SQL-запрос, генерируемый платформой для построения иерархического дерева, начинает отрабатывать некорректно. Он ошибочно подставляет идентификатор (GUID) родительского элемента в качестве родителя для самого себя или ломает связь «ссылка — родитель». В результате при попытке раскрыть любую ветку дерево «зацикливается» на корневом элементе.

Способ 1. Перерегистрация информационной базы на сервере 1С

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

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

Выполним процедуру перерегистрации по шагам:

  1. Откроем консоль «Администрирование серверов 1С:Предприятия».
  2. Найдем в списке нашу проблемную информационную базу.
  3. Запишем (или скопируем) все параметры подключения к СУБД: имя сервера баз данных, имя базы данных на сервере СУБД, имя пользователя и пароль.
  4. Удалим информационную базу из списка кластера. Внимание! При удалении платформа спросит, что сделать с базой данных на сервере СУБД. Выбираем вариант «Оставить без изменений» (базу данных ни в коем случае не удаляем физически!).
  5. Добавим информационную базу в кластер заново, указав ранее сохраненные параметры подключения к СУБД.

Способ 2. Ручная очистка серверного кэша (без перерегистрации базы)

Перерегистрация базы — эффективный метод, но он неудобен, если в базе настроены сложные права доступа, регламентные задания, подключены внешние сервисы или настроено резервное копирование средствами 1С. В таком случае мы можем очистить серверный кэш вручную.

Проанализируем этот процесс по шагам:

  1. Остановим службу сервера «1С:Предприятие» (обычно она называется ragent или Агент сервера 1С:Предприятия) через диспетчер служб Windows или консоль.
  2. Перейдем в каталог служебных файлов сервера. По умолчанию он находится по пути: C:\Program Files\1cv8\srvinfo\reg_1541\ (путь может отличаться в зависимости от версии платформы и номера порта).
  3. Внутри этой директории найдем папку, имя которой соответствует GUID нашей проблемной информационной базы.
  4. Зайдем в эту папку и удалим каталоги кэша конфигурации (в частности, папку snccntry и временные файлы).
  5. Также настоятельно рекомендуется очистить временные файлы профиля операционной системы, под которым запускается служба сервера 1С (обычно это системный пользователь USR1CV8). Для этого перейдем в папку: C:\Users\USR1CV8\AppData\Local\Temp\ и очистим её содержимое.
  6. Запустим службу сервера 1С заново.

Способ 3. Способы решения и обхода проблемы на стороне клиента

Если у администратора нет возможности прямо сейчас остановить сервер или перерегистрировать базу, мы можем применить временные меры на стороне пользователей.

Использование параметра запуска /ClearCache

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

  1. Откроем окно запуска 1С.
  2. Выберем нужную информационную базу и нажмем кнопку «Изменить».
  3. Нажмем «Далее» до последней страницы настроек.
  4. В поле «Дополнительные параметры запуска» вставим команду: /ClearCache.
  5. Нажмем «Готово». Теперь при каждом старте программы кэш клиента будет обновляться принудительно.

Быстрый обход проблемы в интерфейсе программы

Если пользователь уже работает в программе и дерево «зависло», можно принудительно заставить динамический список перестроить SQL-запрос без перезапуска программы. Для этого в форме справочника Номенклатура выполним следующие действия:

  1. Нажмем на кнопку «Еще» в верхнем правом углу формы списка.
  2. Выберем пункт «Режим просмотра».
  3. Переключим режим с «Дерево» на «Список» или «Иерархический список».
  4. Повторим действие и вернем режим обратно на «Дерево». Динамический список принудительно обновит структуру запроса к СУБД.

Способ 4. Проверка доработок запросов и ограничений RLS

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

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


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    Номенклатура.Родитель КАК Родитель,
    Цены.Цена КАК Цена
ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
        ПО Номенклатура.Ссылка = Цены.Номенклатура

Если в регистре сведений ЦеныНоменклатуры по какой-то причине образуются дублирующие записи на одну и ту же дату для одной позиции номенклатуры, левое соединение (LEFT JOIN) вернет несколько строк для одной ссылки. В обычном списке это вызовет ошибку «Обнаружено дублирование ключевых значений», но в режиме «Дерево» из-за специфики иерархической группировки платформа может попытаться отобразить дублирующиеся строки как дочерние ветки, что приведет к визуальному эффекту «размножения» папок.

Для исправления этой ситуации необходимо переписать запрос динамического списка так, чтобы гарантировать уникальность поля Ссылка, либо использовать группировку.

Аналогичный сбой могут вызывать некорректно настроенные ограничения прав на уровне записей (механизм RLS). Если условия RLS ограничивают чтение родительских групп, но разрешают чтение дочерних элементов, платформа может не справиться с построением дерева и начать дублировать доступные корневые элементы.

Окончательное решение проблемы

Описанные выше способы очистки кэша и перерегистрации баз — это лишь борьба с симптомами. Чтобы полностью и навсегда избавиться от этой ошибки, выполним два ключевых правила:

  1. Обновление платформы 1С. Данный баг в работе динамических списков был официально признан разработчиками 1С и исправлен в более поздних релизах платформы (начиная с версий 8.3.12 и выше). Рекомендуется обновить платформу до актуального стабильного релиза.
  2. Отказ от динамического обновления. Настоятельно рекомендуем полностью отказаться от «демонического» обновления конфигурации базы данных. Любые изменения в структуру метаданных следует вносить исключительно в монопольном режиме, предварительно завершив сеансы всех пользователей. Для оперативного исправления программного кода в рабочее время используйте механизм Расширений конфигурации, так как их применение не приводит к разрушению кэша основной конфигурации.
← На главную