Многие разработчики при переходе на платформу 1С:Предприятие 8.3.20 и выше столкнулись с неприятной особенностью: при попытке ввода данных в поле выбора или просто при активации поля справочника интерфейс программы «замирает». Особенно остро эта проблема проявляется в справочниках с большим количеством элементов (от 100 000 и выше). Проанализируем причины этого поведения, разберем механизм работы платформы и найдем эффективные способы решения проблемы.
Первым делом нам необходимо понять, почему платформа пытается получить представления сразу на весь справочник. Основным виновником такого поведения является свойство метаданных Быстрый выбор (Fast Choice). Когда этот режим включен, 1С стремится максимально упростить жизнь пользователю, предлагая выпадающий список элементов сразу при начале взаимодействия с полем, не дожидаясь ввода первых символов.
Рассмотрим, что происходит «под капотом»:
Быстрый выбор.ОбработкаПолученияПредставления, платформа обязана вызвать её для каждого извлекаемого элемента, чтобы отобразить корректный текст в списке.Проблема заключается в том, что если в справочнике 100 000 элементов, платформа попытается выполнить этот обработчик 100 000 раз в один момент. Даже если сама процедура выполняется быстро, суммарные накладные расходы на вызовы и передачу данных между сервером и клиентом приводят к длительному зависанию (фризу) интерфейса.
Ситуация значительно усугубляется, если внутри процедуры ОбработкаПолученияПредставления допускаются ошибки проектирования. Разберем типичный пример неоптимального кода:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// ОШИБКА: Обращение через точку к реквизитам, не входящим в состав «Данные»
Представление = Данные.Наименование + " (" + Данные.Владелец.Код + ")";
КонецПроцедуры
В данном примере при обращении к Данные.Владелец.Код платформа может выполнить отдельный SQL-запрос к базе данных для получения владельца каждого элемента. При «Быстром выборе» это превращается в 100 000 дополнительных запросов к БД. В релизах 8.3.20 изменения в механизмах кэширования и предварительной выборки сделали эту проблему еще более заметной.
Самым эффективным и правильным решением является отключение режима быстрого выбора для больших объемов данных. Проанализируем рекомендации фирмы «1С»:
Быстрый выбор крайне не рекомендуется.Быстрый выбор в Не использовать.Ввод по строке. В этом случае поиск и формирование представлений будут происходить только для тех элементов, которые соответствуют введенным символам.Если специфика бизнес-логики требует использования ОбработкаПолученияПредставления, необходимо максимально упростить этот код. Рассмотрим шаги по оптимизации:
Данные платформа по умолчанию передает базовые реквизиты (Код, Наименование и т.д.). Старайтесь формировать представление только на их основе.Посмотрим на пример оптимизированного обработчика:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Используем только те данные, которые уже есть в структуре
// Это предотвращает лишние обращения к серверу БД
Если ЗначениеЗаполнено(Данные.Наименование) Тогда
Представление = "Арт: " + Данные.Артикул + " | " + Данные.Наименование;
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Как отмечают участники обсуждения, при возникновении подобных проблем в новых релизах платформы часто требуется предоставить доказательства ошибки в техподдержку 1С. Разберем алгоритм действий:
Зависание в 20-м релизе при работе со справочниками чаще всего не является багом платформы в чистом виде. Это результат сочетания неудачной настройки метаданных и неоптимального кода. Платформа 8.3.20 стала более чувствительной к нагрузке на клиент-серверный канал связи. Для исправления ситуации достаточно отключить Быстрый выбор для тяжелых объектов и убедиться, что ОбработкаПолученияПредставления не выполняет скрытых запросов к базе данных.