Особенности редактирования значений произвольного типа в табличном поле

Обновлено: 20.03.2008

В некоторых случаях требуется организовать ввод данных произвольного типа в колонки табличного поля. Причем тип данных, которые будут вводиться в колонку табличного поля, заранее неизвестен. Например, пусть необходимо создать форму подбора, позволяющую выбирать значения произвольного типа. Причем тип выбираемого значения заранее неизвестен и выбирается из заранее сформированного списка доступных типов. Выбранные значения необходимо поместить в таблицу значений. Для решения данной задачи необходимо уметь выбирать тип из списка доступных типов и на основании выбранного типа динамически изменять тип редактируемого значения в элементе управления, расположенном в колонке табличного поля, отображающей выбранное значение. Особенность элементов управления, расположенных в колонках табличного поля, состоит в том, что тип редактируемого значения можно изменять только для колонок табличного поля, не связанных с данными. Поэтому реализация данной задачи имеет некоторые особенности.

Пусть существует форма подбора, содержащая табличное поле, состоящее из двух колонок: колонки Тип, содержащей тип выбираемого значения, и колонки Значение, содержащей значение указанного типа. Колонка Тип содержит индексы в массиве доступных типов, а колонка Значение не связана с данными, т. к. для элемента управления, расположенного в данной колонке, требуется изменять тип редактируемого значения.

Для реализации данной задачи, прежде всего, необходимо сформировать массив доступных типов. Для этого в модуле формы создается массив доступных типов, в который помещаются необходимые типы. В нашем случае это Число, Строка, Дата, Булево и ссылки на справочники и документы. На основании сформированного массива в элементе управления колонки Тип табличного поля Список формируется список значений, содержащий индексы типов в массиве доступных типов. Также в таблицу значений добавляется специальная колонка - Значение, в которой будет храниться значение выбранного типа.

Копировать в буфер обмена
// Заполняем массив доступных типов. Из этого массива будет выбираться тип редактируемого значения.
МассивДоступныхТипов = Новый Массив;
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой))));
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная)))); 
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)))); 
МассивДоступныхТипов.Добавить(Тип(Новый ОписаниеТипов("Булево")));

// Добавляем ссылки на справочники
Для Каждого ЭлементТипа Из Справочники.ТипВсеСсылки().Типы() Цикл

    МассивДоступныхТипов.Добавить(ЭлементТипа);

КонецЦикла; 

// Добавляем ссылки на документы
Для Каждого ЭлементТипа Из Документы.ТипВсеСсылки().Типы() Цикл

    МассивДоступныхТипов.Добавить(ЭлементТипа); 

КонецЦикла; 

// На основании массива доступных типов формируем список значений для поля ввода в колонке, отображающей тип.
// Значением является индекс типа в массиве доступных типов, а представлением - представление типа
Для ИндексЭлемента = 0 по МассивДоступныхТипов.Количество() - 1 Цикл

    ЭлементыФормы.Список.Колонки.Тип.ЭлементУправления.СписокВыбора.Добавить(ИндексЭлемента, МассивДоступныхТипов[ИндексЭлемента]);

КонецЦикла; 
// В таблицу значений (Список) добавляем колонку для хранения значения выбранного типа.
Список.Колонки.Добавить("Значение");

В обработчике события ПриИзменении элемента управления, расположенного в колонке Тип делается установка выбранного типа в элемент управления (в нашем случае это поле ввода) в колонке Значение.

Копировать в буфер обмена
Процедура СписокТипПриИзменении(Элемент)

    // Устанавливаем выбранный тип в поле ввода в колонке "Значение" 
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(МассивДоступныхТипов[Элемент.Значение]);
    ЭлементыФормы.Список.Колонки.Значение.ЭлементУправления.ТипЗначения = Новый ОписаниеТипов(МассивТипов);

КонецПроцедуры

При выборе значения в колонке Значение полученное значение необходимо сохранить в таблице значений, т.к. данная колонка не связана с данными. Для этого также используется обработчик события ПриИзменении поля ввода, расположенного в колонке Значение табличного поля.

Копировать в буфер обмена
Процедура СписокЗначениеПриИзменении(Элемент)

    // Сохраняем выбранное значение в таблице значений
    ЭлементыФормы.Список.ТекущиеДанные.Значение = Элемент.Значение;

КонецПроцедуры
 

Наконец для того, чтобы выбранные значения корректно отображались в табличном поле необходимо использовать обработчик события ПриВыводеСтроки, в котором текст для выбранного типа и значения. 

Копировать в буфер обмена
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

    ОформлениеСтроки.Ячейки.Тип.УстановитьТекст(МассивДоступныхТипов[ДанныеСтроки.Тип]);
    ОформлениеСтроки.Ячейки.Значение.УстановитьТекст(ДанныеСтроки.Значение);

КонецПроцедуры