Почему форма выбора не возвращает значение и как ускорить справочник Партнеры в УТ 11

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

Работа со справочником Партнеры в конфигурации «Управление торговлей 11» (УТ 11) часто сопровождается существенными задержками, особенно если база данных работает в файловом режиме. Разработчики часто прибегают к радикальным мерам, таким как удаление свойства ОсновнаяТаблица в динамическом списке, чтобы ускорить его работу. Однако это приводит к побочному эффекту: форма выбора перестает возвращать выбранное значение. В этой статье мы подробно разберем, как восстановить работоспособность выбора и какими еще способами можно оптимизировать этот тяжелый справочник.

Разберем причину: почему пропадает возврат значения

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

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

Способ 1. Использование метода ОповеститьОВыборе

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

Для этого выполним следующие шаги:

  1. Создадим на форме команду ВыбратьЗначение или воспользуемся событием таблицы Выбор.
  2. В обработчике события напишем код, который принудительно передает ссылку на выбранного партнера.

Пример программного кода для реализации выбора:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // Отменяем стандартную обработку, так как мы берем управление на себя
    СтандартнаяОбработка = Ложь;
    
    // Получаем данные текущей строки
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    
    Если ТекущиеДанные <> Неопределено Тогда
        // Передаем ссылку в форму-владелец
        ОповеститьОВыборе(ТекущиеДанные.Ссылка);
    КонецЕсли;

КонецПроцедуры

Этот метод хорош тем, что он имитирует стандартное поведение платформы. Вызывающая форма (например, документ или другое поле ввода) получит это значение так, будто сработал штатный механизм 1С.

Способ 2. Возврат через закрытие формы

Если по каким-то причинам ОповеститьОВыборе не подходит, мы можем использовать метод Закрыть() с передачей параметра. Однако стоит помнить, что этот способ корректно работает, когда форма открыта модально или с блокировкой всего интерфейса, либо когда владелец формы явно ожидает описание оповещения.

Рассмотрим пример реализации в модуле формы выбора:


&НаКлиенте
Процедура КомандаВыбрать(Команда)
    
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    
    Если ТекущиеДанные <> Неопределено Тогда
        // Закрываем форму и возвращаем ссылку
        Закрыть(ТекущиеДанные.Ссылка);
    КонецЕсли;
    
КонецПроцедуры

Важный момент: убедитесь, что в свойствах формы установлено ЗакрыватьПриВыборе = Истина. Если это свойство сброшено, форма останется открытой даже после того, как данные будут отправлены.

Выясним причину тормозов: как ускорить справочник без удаления основной таблицы

Удаление основной таблицы — это «костыль», который ломает много штатных механизмов (поиск, фильтры, стандартные кнопки). Давайте проанализируем, почему справочник Партнеры тормозит изначально, особенно в УТ 11.

Основная нагрузка в этом справочнике ложится на событие ПриАктивизацииСтроки. В типовой конфигурации УТ 11 на это событие завязано обновление множества данных: контактной информации, остатков, связанных контрагентов и панелей навигации. В файловой базе каждый переход по строке вызывает серверный вызов, что и создает эффект «зависания» на 2-5 секунд.

Посмотрим на рекомендации по оптимизации:

  1. Отключение серверных вызовов в ПриАктивизацииСтроки: Как показывает практика, если закомментировать код в процедуре ОбработатьАктивизациюСтрокиСписка, отзывчивость формы возрастает многократно. Часто пользователю не нужно видеть телефон и адрес каждого партнера мгновенно при прокрутке.
  2. Упрощение запроса динамического списка: Проанализируем текст запроса. Часто в динамический список «Партнеры» подтягиваются левыми соединениями (LEFT JOIN) данные из регистров сведений (контактная информация, дополнительные реквизиты). Если убрать эти соединения и оставить только необходимые поля самого справочника, скорость скроллинга увеличится.
  3. Проверка RLS: Если в базе настроены ограничения прав на уровне записей, 1С добавляет к каждому запросу огромные подзапросы для проверки прав. В файловом режиме это практически «убивает» производительность при 50 000+ записей.
  4. Полнотекстовый поиск: Если поиск включен, убедитесь, что индексы актуальны. Иногда помогает «Очистить» и «Обновить» индекс ПП в консоли администрирования.

Реализация оптимизации через расширение

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


&НаКлиенте
&Вместо("ОбработатьАктивизациюСтрокиСписка")
Процедура А_ОбработатьАктивизациюСтрокиСписка(ТаблицаФормы)
    // Оставляем процедуру пустой или вызываем только критически важные действия
    // Тем самым избавляемся от лишних серверных вызовов при каждом клике
КонецПроцедуры

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

Резюме

Подведем итоги нашего анализа:

← На главную