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