Почему справочник «Партнеры» стал долго открываться после обновления 1С:КА и CRM и как это исправить?

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

После проведения масштабных обновлений в решениях на базе 1С, таких как 1С:Комплексная автоматизация (2.5.8.268) в связке с CRM 3 (3.1.24.7), технические специалисты часто сталкиваются с деградацией производительности. Одной из наиболее острых проблем является критическое замедление открытия справочника Партнеры (он же Клиенты). Ситуация, когда форма открывается 3 минуты вместо привычных 5 секунд, требует немедленного вмешательства.

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

Анализ исходной ситуации и первичная диагностика

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

Выясним причины такого поведения. Проанализируем несколько важных факторов:

  1. Механизм RLS (Access Level Restriction): В современных версиях 1С используется «Производительный» режим расчета прав. В этом режиме данные о доступе к объектам кэшируются в специальных таблицах — ключах доступа. После обновления конфигурации эти таблицы могут содержать неактуальные данные или требовать пересчета.
  2. Динамические списки: Форма справочника Партнеры построена на динамическом списке. Это сложный механизм, который генерирует SQL-запрос на лету, учитывая настройки пользователя: отборы, сортировки, группировки и условное оформление.
  3. Накопленные вызовы: Если при открытии формы в строке состояния отображается огромное количество вызовов (например, более 10 000), это явный признак того, что система выполняет циклические обращения к базе данных или сложную проверку прав для каждой строки списка.

Разберем по шагам: почему отчет работает быстро, а список — медленно?

Часто программисты замечают странную вещь: если скопировать текст запроса из динамического списка и выполнить его в консоли запросов или внешнем отчете под тем же пользователем, данные выводятся мгновенно. Почему же форма списка тормозит?

Проанализируем технологические различия:

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

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

Проблема скрытых настроек в SystemSettingsStorage

Одной из главных причин, почему стандартная кнопка «Очистить настройки» в интерфейсе не помогает, является структура хранения данных в 1С. Настройки форм сохраняются в системной таблице SystemSettingsStorage. При обновлении метаданных (особенно в тяжелых конфигурациях типа КА + CRM) структура объектов меняется. Старые настройки, сохраненные для конкретного пользователя, могут содержать ссылки на удаленные колонки, измененные типы данных или специфические условия оформления, которые визуально не отображаются, но продолжают участвовать в компоновке запроса.

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

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


// Очистка настроек конкретной формы списка для пользователя
КлючОбъекта = "Справочник.Партнеры.Форма.ФормаСписка/НастройкиПользователя";
Пользователь = "ИмяПользователя";
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, , Пользователь);

// Также стоит очистить настройки компоновщика данных
КлючКомпоновщика = "Справочник.Партнеры.Форма.ФормаСписка/НастройкиКомпоновщика";
ХранилищеСистемныхНастроек.Удалить(КлючКомпоновщика, , Пользователь);

Решение проблемы: Копирование настроек от «здорового» пользователя

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

Почему это работает? Копирование настроек на уровне системы полностью перезаписывает структуру данных в хранилище, заменяя «битые» или неоптимальные настройки корректными. Это эффективнее простой очистки, так как при очистке система может попытаться восстановить настройки из кэша или использовать значения по умолчанию, которые также могут быть повреждены.

Выполним следующие действия для исправления:

  1. Создадим нового «чистого» пользователя в базе или выберем того, у кого справочник открывается мгновенно.
  2. Перейдем в раздел Администрирование — Настройки пользователей и прав.
  3. Выберем пункт Копирование настроек.
  4. В поле «От кого» выберем эталонного пользователя.
  5. В поле «Кому» выберем всех проблемных пользователей.
  6. В списке настроек выберем только настройки формы списка справочника Партнеры.
  7. Нажмем «Скопировать и закрыть».

Дополнительные рекомендации по оптимизации RLS

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

Проанализируем выполнение регламентных заданий. Перейдем в список регламентных и фоновых заданий и найдем:

Если эти задания зависли или завершились с ошибкой, пользователи с ограниченными правами будут сталкиваться с тормозами. Для принудительного обновления ключей по конкретному справочнику можно воспользоваться типовой обработкой «Обновление доступа на уровне записей» (доступна в составе БСП в разделе «Обслуживание»).

Рассмотрим пример того, как можно инициировать пересчет прав для объекта программно (для администраторов):


// Инициация обновления ключей доступа для справочника Партнеры
ПараметрыОбновления = УправлениеДоступомСлужебный.ПараметрыОбновленияДоступа();
ПараметрыОбновления.СписокСписков = Новый Массив;
ПараметрыОбновления.СписокСписков.Добавить(Метаданные.Справочники.Партнеры);
УправлениеДоступомСлужебный.ОбновитьДоступ(ПараметрыОбновления);

Резюме

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

Ключевые выводы:

  1. Не доверяйте стандартной очистке кэша: Она не всегда затрагивает глубокие слои настроек динамических списков.
  2. Используйте копирование настроек: Это самый быстрый способ заменить некорректные данные в хранилище.
  3. Проверяйте RLS: В режиме «Производительный» всегда следите за актуальностью ключей доступа после обновлений конфигурации.
  4. Следите за расширениями: Если у вас установлена CRM как расширение или дополнение к КА, убедитесь, что все колонки, добавленные в справочник Партнеры, проиндексированы и корректно отображаются в динамическом списке.

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

← На главную