Обновлено: 20.03.2008
В некоторых случаях требуется организовать ввод данных произвольного типа в колонки табличного поля. Причем тип данных, которые будут вводиться в колонку табличного поля, заранее неизвестен. Например, пусть необходимо создать форму подбора, позволяющую выбирать значения произвольного типа. Причем тип выбираемого значения заранее неизвестен и выбирается из заранее сформированного списка доступных типов. Выбранные значения необходимо поместить в таблицу значений. Для решения данной задачи необходимо уметь выбирать тип из списка доступных типов и на основании выбранного типа динамически изменять тип редактируемого значения в элементе управления, расположенном в колонке табличного поля, отображающей выбранное значение. Особенность элементов управления, расположенных в колонках табличного поля, состоит в том, что тип редактируемого значения можно изменять только для колонок табличного поля, не связанных с данными. Поэтому реализация данной задачи имеет некоторые особенности.
Пусть существует форма подбора, содержащая табличное поле, состоящее из двух колонок: колонки Тип, содержащей тип выбираемого значения, и колонки Значение, содержащей значение указанного типа. Колонка Тип содержит индексы в массиве доступных типов, а колонка Значение не связана с данными, т. к. для элемента управления, расположенного в данной колонке, требуется изменять тип редактируемого значения.
Для реализации данной задачи, прежде всего, необходимо сформировать массив доступных типов. Для этого в модуле формы создается массив доступных типов, в который помещаются необходимые типы. В нашем случае это Число, Строка, Дата, Булево и ссылки на справочники и документы. На основании сформированного массива в элементе управления колонки Тип табличного поля Список формируется список значений, содержащий индексы типов в массиве доступных типов. Также в таблицу значений добавляется специальная колонка - Значение, в которой будет храниться значение выбранного типа.
Копировать в буфер обмена// Заполняем массив доступных типов. Из этого массива будет выбираться тип редактируемого значения. МассивДоступныхТипов = Новый Массив; МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой)))); МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная)))); МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)))); МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Булево"))); // Добавляем ссылки на справочники Для Каждого ЭлементТипа Из Справочники.ТипВсеСсылки().Типы() Цикл МассивДоступныхТипов.Добавить(ЭлементТипа); КонецЦикла; // Добавляем ссылки на документы Для Каждого ЭлементТипа Из Документы.ТипВсеСсылки().Типы() Цикл МассивДоступныхТипов.Добавить(ЭлементТипа); КонецЦикла; // На основании массива доступных типов формируем список значений для поля ввода в колонке, отображающей тип. // Значением является индекс типа в массиве доступных типов, а представлением - представление типа Для ИндексЭлемента = 0 по МассивДоступныхТипов.Количество() - 1 Цикл ЭлементыФормы.Список.Колонки.Тип.ЭлементУправления.СписокВыбора.Добавить(ИндексЭлемента, МассивДоступныхТипов[ИндексЭлемента]); КонецЦикла; // В таблицу значений (Список) добавляем колонку для хранения значения выбранного типа. Список.Колонки.Добавить("Значение");
В обработчике события ПриИзменении элемента управления, расположенного в колонке Тип делается установка выбранного типа в элемент управления (в нашем случае это поле ввода) в колонке Значение.
Копировать в буфер обменаПроцедура СписокТипПриИзменении(Элемент) // Устанавливаем выбранный тип в поле ввода в колонке "Значение" МассивТипов = Новый Массив; МассивТипов.Добавить(МассивДоступныхТипов[Элемент.Значение]); ЭлементыФормы.Список.Колонки.Значение.ЭлементУправления.ТипЗначения = Новый ОписаниеТипов(МассивТипов); КонецПроцедуры
При выборе значения в колонке Значение полученное значение необходимо сохранить в таблице значений, т.к. данная колонка не связана с данными. Для этого также используется обработчик события ПриИзменении поля ввода, расположенного в колонке Значение табличного поля.
Копировать в буфер обменаПроцедура СписокЗначениеПриИзменении(Элемент) // Сохраняем выбранное значение в таблице значений ЭлементыФормы.Список.ТекущиеДанные.Значение = Элемент.Значение; КонецПроцедуры
Наконец для того, чтобы выбранные значения корректно отображались в табличном поле необходимо использовать обработчик события ПриВыводеСтроки, в котором текст для выбранного типа и значения.
Копировать в буфер обменаПроцедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) ОформлениеСтроки.Ячейки.Тип.УстановитьТекст(МассивДоступныхТипов[ДанныеСтроки.Тип]); ОформлениеСтроки.Ячейки.Значение.УстановитьТекст(ДанныеСтроки.Значение); КонецПроцедуры