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

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

Многие разработчики при переходе на платформу 1С:Предприятие 8.3.20 и выше столкнулись с неприятной особенностью: при попытке ввода данных в поле выбора или просто при активации поля справочника интерфейс программы «замирает». Особенно остро эта проблема проявляется в справочниках с большим количеством элементов (от 100 000 и выше). Проанализируем причины этого поведения, разберем механизм работы платформы и найдем эффективные способы решения проблемы.

Выясним причину: механизм «Быстрого выбора»

Первым делом нам необходимо понять, почему платформа пытается получить представления сразу на весь справочник. Основным виновником такого поведения является свойство метаданных Быстрый выбор (Fast Choice). Когда этот режим включен, 1С стремится максимально упростить жизнь пользователю, предлагая выпадающий список элементов сразу при начале взаимодействия с полем, не дожидаясь ввода первых символов.

Рассмотрим, что происходит «под капотом»:

  1. Пользователь нажимает на поле ввода или пытается начать набор.
  2. Платформа видит включенную настройку Быстрый выбор.
  3. Система инициирует загрузку списка элементов справочника для формирования выпадающего списка.
  4. Если в модуле менеджера справочника определена процедура ОбработкаПолученияПредставления, платформа обязана вызвать её для каждого извлекаемого элемента, чтобы отобразить корректный текст в списке.

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

Проанализируем проблему «N+1» в обработчике

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


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // ОШИБКА: Обращение через точку к реквизитам, не входящим в состав «Данные»
    Представление = Данные.Наименование + " (" + Данные.Владелец.Код + ")";
КонецПроцедуры

В данном примере при обращении к Данные.Владелец.Код платформа может выполнить отдельный SQL-запрос к базе данных для получения владельца каждого элемента. При «Быстром выборе» это превращается в 100 000 дополнительных запросов к БД. В релизах 8.3.20 изменения в механизмах кэширования и предварительной выборки сделали эту проблему еще более заметной.

Способ 1: Корректная настройка метаданных (рекомендуемый)

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

Способ 2: Оптимизация кода обработчика

Если специфика бизнес-логики требует использования ОбработкаПолученияПредставления, необходимо максимально упростить этот код. Рассмотрим шаги по оптимизации:

  1. Используйте только доступные поля. В структуру Данные платформа по умолчанию передает базовые реквизиты (Код, Наименование и т.д.). Старайтесь формировать представление только на их основе.
  2. Проверка на пустую строку. В новых патчах платформы 8.3.20+ были внесены улучшения, позволяющие более эффективно отсекать вызовы, но надежнее всего минимизировать логику внутри самого обработчика.
  3. Избегайте запросов. Любой запрос или обращение через точку к ссылочным полям внутри этой процедуры — прямой путь к падению производительности.

Посмотрим на пример оптимизированного обработчика:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    // Используем только те данные, которые уже есть в структуре
    // Это предотвращает лишние обращения к серверу БД
    Если ЗначениеЗаполнено(Данные.Наименование) Тогда
        Представление = "Арт: " + Данные.Артикул + " | " + Данные.Наименование;
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры

Особенности взаимодействия с техподдержкой

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

Подведем итоги

Зависание в 20-м релизе при работе со справочниками чаще всего не является багом платформы в чистом виде. Это результат сочетания неудачной настройки метаданных и неоптимального кода. Платформа 8.3.20 стала более чувствительной к нагрузке на клиент-серверный канал связи. Для исправления ситуации достаточно отключить Быстрый выбор для тяжелых объектов и убедиться, что ОбработкаПолученияПредставления не выполняет скрытых запросов к базе данных.

← На главную