Почему 1С замедлилась после включения RLS и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет
← К списку

После активации механизма RLS (Row-Level Security) в системе 1С многие пользователи сталкиваются с существенным замедлением работы. Это распространенная проблема, и мы с вами разберем, почему она возникает и как ее эффективно решить.

Суть проблемы заключается в том, что RLS добавляет дополнительные условия ограничения к каждому запросу, усложняя их выполнение на уровне СУБД. Представьте, что к каждому запросу теперь прилагается целый "список разрешений", который нужно проверить. Если пользователь имеет доступ к одной и той же таблице через несколько ролей, оптимизатор запросов СУБД может столкнуться с трудностями при их эффективной обработке, что значительно увеличивает время получения данных. Шаблоны RLS, особенно сложные, могут приводить к формированию большого количества соединений между таблицами (иногда сотни или даже тысячи), что часто вызывает неверные планы запросов и неэффективное использование индексов.

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

Комплексный подход к решению проблемы

Решение проблемы замедления работы 1С после включения RLS требует комплексного подхода. Нам предстоит рассмотреть как аппаратные аспекты, так и тонкости настройки программного обеспечения, включая саму СУБД и механизмы RLS в 1С. Мы разберем каждое направление по шагам.

1. Оптимизация аппаратного обеспечения: Железо – это фундамент

Начнем с аппаратной части, поскольку без адекватного "железа" все программные оптимизации могут оказаться недостаточными. Мы часто видим, что пользователи для 30+ человек используют устаревшие или недостаточно мощные серверы. Это одна из ключевых причин проблем с производительностью.

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

    • Выбираем процессор: Рекомендуем выбирать процессоры с высокой базовой тактовой частотой (желательно от 3.8–4.5 ГГц на ядро). Примерами подходящих процессоров являются Intel Xeon E-24XX, Xeon W, а также современные модели AMD Ryzen PRO или AMD EPYC с высокой производительностью на ядро.
    • Настройки BIOS: Для сервера с PostgreSQL рекомендуется отключать технологии HyperThreading (многопоточность) и режим энергосбережения (Energy Saving) в BIOS. Это поможет избежать непредсказуемых задержек и обеспечит стабильную производительность.
    • Лицензии 1С: Учитывайте, что тип вашей лицензии 1С может ограничивать количество используемых ядер процессора, что также влияет на общую производительность.
  2. Оперативная память (RAM): Достаточный объем оперативной памяти критичен для работы СУБД и сервера 1С. Для 30+ пользователей мы рекомендуем начинать с 64 ГБ ОЗУ. Для более крупных систем (70-100 пользователей) может потребоваться 96–128 ГБ и более.

  3. Дисковая подсистема: Скорость работы дисковой подсистемы напрямую влияет на производительность базы данных. Мы настоятельно рекомендуем размещать СУБД и саму базу данных на разных физических дисках. Обязательно используйте SSD-накопители, так как они значительно повышают скорость чтения/записи данных.

2. Тонкая настройка СУБД: PostgreSQL для 1С

Если в качестве СУБД используется PostgreSQL, его стандартные настройки часто не являются оптимальными для работы с 1С. Нам предстоит провести тщательную настройку.

  1. Выбор операционной системы: Мы выяснили, что PostgreSQL на Linux, как правило, демонстрирует лучшую производительность по сравнению с Windows при работе с 1С. Некоторые пользователи сталкивались с "невероятными тормозами" при использовании связки 1С 8.3 + PostgreSQL на Windows с включённым RLS. Современные версии платформы 1С полностью поддерживают работу как серверной, так и клиентской части в Linux, поэтому рассмотрите возможность перехода на эту ОС.

  2. Оптимизация файла `postgresql.conf`: Давайте внимательно изучим и настроим ключевые параметры этого файла.

    • max_connections: Этот параметр определяет максимальное количество одновременных подключений к базе данных. 1С рекомендует устанавливать от 500 до 1000 соединений.
    • shared_buffers: Объем памяти, выделяемый для кеша данных PostgreSQL. Рекомендуем выделять около 1/4 от общего объема оперативной памяти сервера.
    • work_mem: Лимит памяти для обработки одного запроса. Это индивидуальное значение для каждой сессии. Рекомендуется устанавливать, рассчитывая по формуле RAM/32..64 или из диапазона 32MB..128MB.
    • maintenance_work_mem: Лимит памяти для обслуживающих задач (сбор статистики, сборка мусора, создание индексов). Мы рекомендуем указывать либо по формуле RAM/16..32, либо значение work_mem * 4, либо из диапазона 256MB..4GB.
    • fsync: Отключение этого параметра может повысить производительность операций записи на диск, но требует обязательного использования многодисковых RAID-массивов с кэширующими RAID-контроллерами и источником бесперебойного питания (ИБП) для обеспечения консистентности данных. Будьте крайне осторожны с этим параметром!
    • effective_cache_size: Мы рекомендуем увеличить значение этого параметра, чтобы PostgreSQL более эффективно использовал системный кеш оперативной памяти.
  3. Особенности параллельного выполнения запросов: В отличие от MS SQL, PostgreSQL исторически не умеет распараллеливать выполнение одного запроса на несколько ядер процессора. Это может стать узким местом для тяжёлых запросов, даже при наличии мощного многоядерного CPU. Этот факт следует учитывать при проектировании и оптимизации запросов.

3. Оптимизация механизмов RLS в 1С

Теперь перейдем к оптимизации самого механизма RLS в конфигурации 1С. Здесь есть несколько ключевых подходов.

  1. Производительный режим RLS: Это наиболее рекомендуемый способ оптимизации RLS, особенно для больших объемов данных и сложной системы разграничения прав. Давайте разберем его подробнее.

    • Принцип работы: В производительном режиме права доступа (так называемые "ключи доступа") предварительно рассчитываются регламентным заданием и хранятся в базе данных. Это позволяет запросам использовать эти уже предрассчитанные ключи вместо вычисления ограничений "на лету" при каждом обращении. Такой подход значительно упрощает запросы и сокращает количество соединений.
    • Настройка: Внедрение производительного режима RLS осуществляется через подсистему "Управление доступом" "1С:Библиотеки стандартных подсистем" (БСП).
    • Доступность: Этот режим доступен начиная с платформы 8.3.18, где появился механизм оптимизации RLS, кеширующий результаты подзапросов, определяющих группы доступа пользователя, в оперативной памяти.
    • Регламентные задания: Сам процесс расчета и хранения ключей доступа может быть ресурсоемким и вызывать пиковую нагрузку. Поэтому крайне важно правильно настроить расписание регламентных заданий по обновлению ключей доступа, желательно в нерабочее время.
  2. Избегаем сортировки по полям с RLS-ограничением: Мы часто видим, что списки сортируются по полям, которые находятся под контролем RLS. Например, список заказов, который по умолчанию никак не менялся в коде, может быть отсортирован по такому полю.

    • Причина проблемы: СУБД вынуждена сначала применить все сложные RLS-фильтры, чтобы определить, какие записи доступны пользователю, и только потом может выполнить сортировку. Это замедляет процесс.
    • Решение: Избегайте сортировки по полям, на которые наложено RLS-ограничение. Вместо этого, по возможности, сортируйте данные по полям, не затронутым RLS, например, по дате или номеру документа. Это позволяет СУБД быстрее выполнять сортировку, не дожидаясь применения сложных RLS-фильтров.
  3. Оптимизация шаблонов RLS: Мы рекомендуем тщательно прорабатывать шаблоны RLS, чтобы они были максимально простыми и не приводили к избыточным соединениям. Чем проще шаблон, тем быстрее СУБД сможет его обработать.

  4. "Лакс" ограничение для справочников (WHERE ИСТИНА): Существует так называемый "лайфхак", который может помочь в некоторых случаях ускорить сортировку по представлению для справочников, ограниченных RLS.

    • Принцип работы: В некоторых случаях позволительно добавить дополнительное ограничение вида ГДЕ ИСТИНА на поля, используемые для представления (например, Ссылка, Наименование). Это может выглядеть как дополнительная строка в шаблоне RLS. Тогда сортировка по представлению снова будет работать быстро.
    • Пример концептуального шаблона RLS:
      
      #Если &ОграничениеПоОрганизациям
          ОБЪЕКТ.Организация В (&ДоступныеОрганизации)
      #КонецЕсли
      ИЛИ
      (ИСТИНА ГДЕ ОБЪЕКТ.Ссылка ЕСТЬ NULL) // Дополнительное условие для ускорения сортировки по представлению
      

      В этом примере второе условие (ИСТИНА ГДЕ ОБЪЕКТ.Ссылка ЕСТЬ NULL) является "лаксом" ограничением, которое может быть оптимизировано СУБД. Однако, будьте крайне осторожны!

    • Предостережения: Пользователь сможет увидеть ненужное в определенных сценариях, если не добавлены дополнительные проверки. Чтобы такого не произошло, мы рекомендуем в запросы добавлять, например, проверку на ПометкаУдаления. В динамических списках и подборах по строке это уже по дефолту есть, но речь идет о других местах, где может запрашиваться только наименование или только ссылка. Мы должны убедиться, что пользователь не получит доступ к данным, к которым он не должен иметь доступ, даже если это ускоряет работу.

4. Общие рекомендации и мониторинг

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

  1. Мониторинг: Регулярно отслеживайте состояние системы прав доступа и историю их выдачи. Используйте средства технологического журнала 1С для анализа производительности запросов.

  2. Аудит: Проведение технологического аудита производительности 1С может помочь выявить узкие места и предложить конкретные решения, адаптированные под вашу уникальную конфигурацию и нагрузку.

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

← К списку