При переходе на новые версии платформы 1С:Предприятие 8.3 (особенно при отключении режима совместимости с версией 8.2) разработчики часто сталкиваются с тем, что привычные механизмы работы интерфейса меняются. Одной из таких проблем является «исчезновение» кнопок выбора или отказ события НачалоВыбораИзСписка срабатывать при нажатии на стандартную «стрелочку» в поле ввода. Особенно остро это проявляется для полей с числовыми типами данных.
В этой статье мы подробно разберем, почему платформа меняет свое поведение, как правильно настраивать элементы формы в современном интерфейсе «Такси» и какой подход к работе со списками выбора считается наиболее верным с точки зрения производительности и методики 1С.
Давайте разберем ситуацию: когда мы поднимаем режим совместимости конфигурации до версии 8.3.6 и выше, платформа начинает использовать новую логику отрисовки и обработки событий управляемых форм. В старых режимах (совместимость с 8.2) многие события вызывались «по умолчанию», даже если свойства элемента управления были настроены не совсем полно. В актуальных версиях 8.3 логика стала более строгой и оптимизированной.
Рассмотрим основные причины, по которым событие может не срабатывать:
НачалоВыбораИзСписка в момент нажатия на кнопку — это лишний контекстный вызов сервера, который замедляет работу интерфейса, особенно в веб-клиенте или при медленном соединении.Число платформа по умолчанию предполагает использование кнопок регулирования (стрелки вверх/вниз для изменения значения на единицу), а не выпадающих списков.СписокВыбора не заполнено заранее, платформа может просто не считать нужным инициировать процесс выбора из списка, если не включены специфические флаги.Проанализируем наиболее правильный путь, который рекомендует методическая поддержка 1С. Вместо того чтобы пытаться «поймать» момент нажатия на кнопку и в этот момент формировать список, мы должны подготовить данные заранее. Это избавляет систему от необходимости ждать ответа сервера в момент, когда пользователь уже нажал на кнопку и ожидает мгновенного появления списка.
Разберем по шагам, как это реализовать. Нам необходимо перенести логику формирования списка в процедуру ПриСозданииНаСервере или в специализированную процедуру, которая обновляет интерфейс при изменении исходных данных.
Посмотрим на пример кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Находим элемент формы, для которого нужен список
ЭлементСписка = Элементы.ВашеЧисловоеПоле;
// Очищаем и заполняем список выбора заранее
ЭлементСписка.СписокВыбора.Очистить();
ЭлементСписка.СписокВыбора.Добавить(10, "Десять");
ЭлементСписка.СписокВыбора.Добавить(20, "Двадцать");
ЭлементСписка.СписокВыбора.Добавить(50, "Пятьдесят");
// Устанавливаем режим выбора из списка, чтобы поле вело себя как ComboBox
ЭлементСписка.РежимВыбораИзСписка = Истина;
КонецПроцедуры
При таком подходе событие НачалоВыбораИзСписка нам вообще не потребуется. Платформа увидит, что список уже заполнен, и при нажатии на кнопку выбора мгновенно отобразит его пользователю без задержек и дополнительных вызовов сервера.
Если по каким-то причинам нам все же крайне важно использовать именно событие НачалоВыбораИзСписка (например, список должен строиться на основе очень динамических данных, которые меняются каждую секунду), нам нужно заставить платформу «увидеть» эту потребность. Выясним, какие свойства на это влияют.
Для того чтобы событие начало отрабатывать в режиме без совместимости, выполним следующие настройки в палитре свойств элемента формы:
Да. Это вернет ту самую «треугольную стрелочку».Истина. Это критически важно: данное свойство сообщает платформе, что ввод произвольного значения не предполагается (или ограничен), и основным сценарием взаимодействия является именно выбор из коллекции.Из списка.Важный нюанс: Если вы используете числовое поле, убедитесь, что у вас отключена КнопкаРегулирования, так как она может конфликтовать с кнопкой списка выбора в визуальном плане интерфейса «Такси».
Проанализируем ситуацию, описанную участниками форума: замена кнопки выбора на кнопку «Лупа» (кнопка открытия) приводит к побочному эффекту. Кнопка «Лупа» остается активной, даже если само поле заблокировано (Доступность = Ложь или ТолькоПросмотр = Истина). Это особенность платформы, так как «Открыть» — это действие просмотра, а не изменения.
Чтобы избежать этой проблемы и сохранить консистентность интерфейса, рекомендуется:
КнопкаОткрытия = Да) там, где предполагается выбор значения из списка.ТолькоПросмотр = Истина для всего элемента формы, стандартная кнопка выбора будет блокироваться автоматически вместе с полем ввода.Элементы.ИмяПоля.КнопкаВыбора = Ложь;.Рассмотрим подробнее плюсы и минусы обоих подходов в современных конфигурациях 1С.
Метод с заполнением события (OnEditListChoice):
Плюсы: Позволяет формировать список «лениво», только в момент обращения.
Минусы: Создает визуальную задержку (фриз интерфейса) на время серверного вызова; часто игнорируется платформой в режиме «Такси» для числовых типов данных, если не включен РежимВыбораИзСписка.
Метод с предварительным заполнением (ChoiceList):
Плюсы: Максимальная скорость отклика интерфейса; полное соответствие стандартам разработки 1С; гарантированная работа во всех режимах совместимости и типах клиентов (веб, тонкий).
Минусы: Требует обновления списка при изменении связанных данных на форме.
Выясним причину окончательно: отказ события НачалоВыбораИзСписка в 1С 8.3 — это не ошибка платформы, а следствие изменения архитектуры взаимодействия клиента и сервера. Для исправления ситуации мы рекомендуем в первую очередь пересмотреть логику в пользу заполнения свойства СписокВыбора в процедуре ПриСозданииНаСервере.
Если же необходимо оставить обработку события, убедитесь, что у элемента включен РежимВыбораИзСписка. Это переведет поле в состояние, когда платформа ожидает работу со списком и начнет корректно транслировать нажатие кнопки в вызов соответствующего программного кода. При необходимости можно воспользоваться инструментом для редактирования свойств элементов открытых форм в режиме предприятия.