Особенности редактирования данных в колонках табличного поля, отображающих значения составного типа

Обновлено: 15.11.2007

В некоторых случаях требуется организовать ввод данных в колонки табличного поля, отображающие значения составного типа. При этом один из типов составного типа может являться типом Null. Такая ситуация может возникнуть в случае, если табличное поле отображает данные из таблицы значений, полученные в результате выполнения какого-либо запроса. Редактирование значений в новых строках в таких табличных полях невозможен.

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

Поясним использование данного подхода на следующем примере. Пусть существует форма документа Приходная накладная и на его форме расположено табличное поле Состав, отображающее табличную часть Состав этого документа.

Данные, отображаемые в табличном поле, получены в результате выполнения запроса:

Копировать в буфер обмена
// Заполнить табличное поле Состав
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | ПриходнаяНакладнаяСостав.НомерСтроки КАК НомерСтроки,
               | ПриходнаяНакладнаяСостав.Номенклатура,
               | ПриходнаяНакладнаяСостав.Количество,
               | ПриходнаяНакладнаяСостав.Цена,
               | ПриходнаяНакладнаяСостав.Сумма,
               | ПриходнаяНакладнаяСостав.НДС
               |ИЗ
               | Документ.ПриходнаяНакладная.Состав КАК ПриходнаяНакладнаяСостав
               |ГДЕ
               | ПриходнаяНакладнаяСостав.Ссылка = &Ссылка
               |
               |УПОРЯДОЧИТЬ ПО
               | НомерСтроки";
Запрос.УстановитьПараметр("Ссылка", Ссылка); 
ЭлементыФормы.Состав.Значение = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.Состав.СоздатьКолонки();

При начале редактирования строки, в обработчике события ПриНачалеРедактирования, происходит анализ параметров НоваяСтрока и Копирование данного события и, если добавлена новая строка, то происходит анализ колонок табличного поля. Для каждой колонки табличного поля ищется соответствующая колонка таблицы значений. Затем, на основании описания типов колонки таблицы значений создается новое описание типов, содержащее все типы колонки таблицы значений, за исключением типа Null. В конце на основании нового описания типов создается значение по умолчанию, которое присваивается соответствующему элементу, содержащемуся в свойстве ТекущиеДанные табличного поля.

Копировать в буфер обмена
Процедура СоставПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

    // Если добавлена новая строка, то необходимо удалить Null-типы 
    Если НоваяСтрока И Не Копирование Тогда

        Для каждого КолонкаТП из Элемент.Колонки Цикл

            // Найти колонку таблицы значений по колонке табличного поля
            КолонкаТЗ = Элемент.Значение.Колонки.Найти(КолонкаТП.Данные);

            Если КолонкаТЗ <> Неопределено Тогда 

                // Создать новое описание типов на основании типов колоноки таблицы значений за исключением Null-типа
                НовОписаниеТипов = Новый ОписаниеТипов(КолонкаТЗ.ТипЗначения,,"Null");
                // Присвоить значение по умолчанию для указанной колонки
                Элемент.ТекущиеДанные[КолонкаТП.Данные] = НовОписаниеТипов.ПривестиЗначение();

            КонецЕсли;

        КонецЦикла;

    КонецЕсли;

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