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