Работа со справочником Партнеры в конфигурации «Управление торговлей 11» (УТ 11) часто сопровождается существенными задержками, особенно если база данных работает в файловом режиме. Разработчики часто прибегают к радикальным мерам, таким как удаление свойства ОсновнаяТаблица в динамическом списке, чтобы ускорить его работу. Однако это приводит к побочному эффекту: форма выбора перестает возвращать выбранное значение. В этой статье мы подробно разберем, как восстановить работоспособность выбора и какими еще способами можно оптимизировать этот тяжелый справочник.
Когда у динамического списка заполнено свойство ОсновнаяТаблица, платформа 1С автоматически берет на себя управление стандартными командами: выбор значения, создание, удаление и редактирование. Как только мы очищаем это поле, список превращается в «произвольный набор данных». Платформа больше не знает, какое именно поле является ссылкой на объект, которую нужно вернуть в форму-владелец.
Для решения этой проблемы нам необходимо вручную прописать механизм возврата. Рассмотрим, как это сделать правильно.
Проанализируем ситуацию: если форма открыта как форма выбора, она ожидает, что будет вызвано событие выбора. Самый простой и эффективный способ вернуть значение — использовать процедуру ОповеститьОВыборе. Нам нужно перехватить стандартное действие пользователя при выборе строки.
Для этого выполним следующие шаги:
Выбор.Пример программного кода для реализации выбора:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отменяем стандартную обработку, так как мы берем управление на себя
СтандартнаяОбработка = Ложь;
// Получаем данные текущей строки
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Передаем ссылку в форму-владелец
ОповеститьОВыборе(ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он имитирует стандартное поведение платформы. Вызывающая форма (например, документ или другое поле ввода) получит это значение так, будто сработал штатный механизм 1С.
Если по каким-то причинам ОповеститьОВыборе не подходит, мы можем использовать метод Закрыть() с передачей параметра. Однако стоит помнить, что этот способ корректно работает, когда форма открыта модально или с блокировкой всего интерфейса, либо когда владелец формы явно ожидает описание оповещения.
Рассмотрим пример реализации в модуле формы выбора:
&НаКлиенте
Процедура КомандаВыбрать(Команда)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Закрываем форму и возвращаем ссылку
Закрыть(ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
Важный момент: убедитесь, что в свойствах формы установлено ЗакрыватьПриВыборе = Истина. Если это свойство сброшено, форма останется открытой даже после того, как данные будут отправлены.
Удаление основной таблицы — это «костыль», который ломает много штатных механизмов (поиск, фильтры, стандартные кнопки). Давайте проанализируем, почему справочник Партнеры тормозит изначально, особенно в УТ 11.
Основная нагрузка в этом справочнике ложится на событие ПриАктивизацииСтроки. В типовой конфигурации УТ 11 на это событие завязано обновление множества данных: контактной информации, остатков, связанных контрагентов и панелей навигации. В файловой базе каждый переход по строке вызывает серверный вызов, что и создает эффект «зависания» на 2-5 секунд.
Посмотрим на рекомендации по оптимизации:
ОбработатьАктивизациюСтрокиСписка, отзывчивость формы возрастает многократно. Часто пользователю не нужно видеть телефон и адрес каждого партнера мгновенно при прокрутке.Чтобы не снимать конфигурацию с поддержки, мы можем создать расширение и изменить поведение формы. Рассмотрим пример отключения тяжелого обновления данных:
&НаКлиенте
&Вместо("ОбработатьАктивизациюСтрокиСписка")
Процедура А_ОбработатьАктивизациюСтрокиСписка(ТаблицаФормы)
// Оставляем процедуру пустой или вызываем только критически важные действия
// Тем самым избавляемся от лишних серверных вызовов при каждом клике
КонецПроцедуры
Как отмечают пользователи на форумах, после отключения этого функционала работа становится комфортной даже на файловых базах с десятками тысяч записей. Это гораздо более правильный путь, чем удаление основной таблицы из динамического списка.
Подведем итоги нашего анализа:
Основную таблицу, используйте ОповеститьОВыборе(Ссылка) в событии выбора таблицы, чтобы вернуть значение.ПриАктивизацииСтроки.