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