Почему тормозит справочник "Сотрудники" у одного пользователя в 1С:ЗУП 3.1 и как это исправить?

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

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

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

Глубинная техническая причина: почему это происходит?

Для того чтобы понять природу этой проблемы, нам необходимо заглянуть на уровень взаимодействия платформы 1С и СУБД (в частности, PostgreSQL). Справочник Сотрудники в современных конфигурациях построен на базе механизма ДинамическийСписок. Динамические списки считывают данные из базы порциями, формируя оптимальные SQL-запросы в реальном времени.

Однако ситуация кардинально меняется, когда в дело вступают два фактора:

  1. Ограничение доступа на уровне записей (RLS — Record Level Security). У пользователей с ограниченными правами (например, с ролями Кадровик или Табельщик) включен контроль доступа. При каждом обращении к базе данных платформа 1С автоматически модифицирует исходный SQL-запрос, накладывая на него сложные условия фильтрации (проверяются разрешенные организации, подразделения или группы доступа физических лиц).
  2. Пользовательская кастомизация интерфейса. Платформа 1С предоставляет пользователям гибкую возможность настраивать списки под себя через меню «Изменить форму» или «Настройка списка». Пользователи часто выводят в список дополнительные колонки, получая их «через точку» (например, Сотрудник.ТекущееПодразделение.Родитель или ФизическоеЛицо.ОсновноеУдостоверение), настраивают сложные отборы, группировки или сортировки по неиндексированным полям.

Когда эти два фактора объединяются, происходит следующее: транслятор 1С генерирует для СУБД PostgreSQL колоссальный по объему SQL-запрос со множеством левых соединений (LEFT JOIN) и тяжелых вложенных подзапросов, обеспечивающих проверку прав RLS. Из-за избыточной сложности запроса оптимизатор СУБД PostgreSQL ошибается при построении плана его выполнения. Вместо быстрого поиска по индексам (Index Scan) база данных переходит к последовательному чтению гигантских таблиц (Seq Scan) или неоптимальным вложенным циклам (Nested Loops). В результате простейший вывод списка на экран начинает занимать минуты, намертво блокируя рабочий процесс кадровика.

Поскольку у пользователей с полными правами (Администраторов) механизмы RLS отключены по умолчанию, СУБД мгновенно обрабатывает их запросы даже при наличии сложных пользовательских полей «через точку». Именно поэтому проблема носит исключительно индивидуальный характер.


Решение 1: Сброс настроек формы конкретного пользователя

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

  1. Зайдем в базу данных под учетной записью с правами администратора.
  2. Перейдем в раздел меню Администрирование, далее выберем пункт Настройки пользователей и прав.
  3. В открывшемся окне перейдем по гиперссылке Настройки пользователей.
  4. В появившемся списке выберем проблемного пользователя и нажмем кнопку Просмотреть настройки....
  5. В окне настроек перейдем на вкладку Внешний вид.
  6. Найдем в дереве настроек форму справочника сотрудников (обычно она находится по пути Справочник.Сотрудники.ФормаСписка или аналогичному названию формы списка сотрудников).
  7. Выделим эту строку и нажмем кнопку Очистить (или клавишу Del на клавиатуре).
  8. Аналогичную процедуру очистки рекомендуется провести на вкладках Настройки отчетов и Прочие настройки, если там содержатся записи, относящиеся к форме списка сотрудников.

После проведения данной процедуры при следующем открытии справочника у пользователя восстановится стандартный лаконичный вид формы, а все «тяжелые» соединения исчезнут из SQL-запроса. Справочник снова начнет открываться мгновенно.


Решение 2: Включение производительного режима RLS

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

  1. Перейдем в раздел Администрирование -> Настройки пользователей и прав.
  2. Развернем группу настроек Группы доступа.
  3. Убедимся, что установлен флаг Использовать производительный режим ограничений прав доступа.

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


Решение 3: Обновление статистики PostgreSQL

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

Для исправления ситуации системному администратору или администратору СУБД необходимо запустить принудительный сбор статистики. Выполним в консоли СУБД или через утилиту pgAdmin следующий запрос для проблемной базы данных:

ANALYZE;

Для более глубокой очистки и сбора статистики рекомендуется запустить комбинированную команду:

VACUUM ANALYZE;

Регулярное выполнение команды ANALYZE (желательно настроить регламентную задачу в планировщике СУБД на еженощный запуск) гарантирует, что PostgreSQL будет строить наиболее эффективные планы запросов, задействуя нужные индексы даже при сложных пользовательских настройках интерфейса.


Решение 4: Административное ограничение на изменение формы списков

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

Разберем, как запретить пользователям добавлять произвольные поля в список сотрудников:

  1. Откроем информационную базу в режиме Конфигуратор.
  2. Найдем справочник Сотрудники, откроем его свойства и перейдем на вкладку Формы.
  3. Откроем основную форму списка справочника.
  4. Выделим элемент формы типа Таблица (наш динамический список сотрудников).
  5. В панели свойств найдем категорию параметров Использование.
  6. Сбросим флаг у свойства Изменение состава (или установим его в значение Ложь).
  7. Сохраним и обновим конфигурацию базы данных.

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


Решение 5: Обслуживание индекса полнотекстового поиска

Если зависания справочника происходят преимущественно в момент ввода символов в строке быстрого поиска, корень проблемы может крыться в повреждении или неактуальности индекса полнотекстового поиска (ППД).

Проанализируем и исправим состояние индекса полнотекстового поиска через пользовательский интерфейс:

  1. Перейдем в раздел Администрирование -> Поддержка и обслуживание.
  2. В группе Регламентные операции найдем и откроем ссылку Полнотекстовый поиск.
  3. Посмотрим на статус индекса. Если он содержит предупреждения или долго не обновлялся, нажмем кнопку Очистить индекс.
  4. После очистки нажмем кнопку Обновить индекс для запуска фонового процесса переиндексации всех текстовых полей информационной базы.

Решение 6: Точечный анализ проблемы через Технологический журнал

В случаях, когда пользователю критически важно сохранить его индивидуальные настройки формы, и простой сброс неприемлем, мы можем выяснить, какая именно колонка ломает СУБД. Для этого воспользуемся механизмом Технологического журнала (ТЖ) 1С.

Создадим в каталоге установки шаблонов конфигурации ТЖ файл настройки logcfg.xml со следующим содержимым:


<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\v8_logs\slow_queries" history="24">
        <event>
            <eq property="Name" value="DBPOSTGRS"/>
            <gt property="Duration" value="5000000"/>
        </event>
        <property name="all"/>
    </log>
</config>

Этот файл настроит сбор логов по СУБД PostgreSQL (событие DBPOSTGRS) для всех запросов, длительность выполнения которых превышает 5 секунд (5 000 000 микросекунд). Запустим сессию под проблемным пользователем, откроем справочник Сотрудники и дождемся его прорисовки.

После этого откроем файл лога в каталоге C:\v8_logs\slow_queries. Мы увидим проблемный SQL-запрос, сгенерированный платформой. Изучив структуру соединений LEFT JOIN в тексте запроса, разработчик сможет легко понять, к какому именно реквизиту формы обращается система, и точечно удалить только эту проблемную колонку из настроек формы пользователя, сохранив все остальные его персональные отборы.

← На главную