Разница между этими понятиями Автор статьи: Волшебник | Редакторы: Rovan, acsent
Последняя редакция №5 от 11.08.06

Ключевые слова: составной, тип, реквизита, значения


Понятие "тип реквизита" отличается от понятия "тип значения"

Конкретное значение не может быть составного типа. Одно конкретное значение может быть только одного типа данных.

Реквизит может быть как одного типа, так и составного типа. В последнем случае его тип описывается объектом "ОписаниеТипов", т.е. список возможных типов, значения которых могут храниться в этой колонке. Например, СправочникСсылка.М1, СправочникСсылка.М2, Строка, Число, ДокументСсылка.Д1.

В каждой строке (элементе, записи) содержится какое-то свое значение, но каждое из них - одного типа. Например, "СправочникСсылка.М1". Если же в ячейке колонки, имеющей составной тип, даже не выбран (не назначен) тип значения, то оно содержит значение "Неопределено" (это значение и одновременно тип). Если же тип выбран (кнопкой Т или установлен программно), то ячейка содержит пустое значение этого типа, например, пустую ссылку на элемент справочника (см. v8: Пустые ссылки), пустую строку "" или 0.

Чтобы реквизиту составного типа установить конкретный тип, достаточно присвоить ему пустое значение этого типа.

Более подробное описание работы со составными типами
Взято с itland.ru


Вопрос:
Какие существуют особенности работы с составными типами данных.

Ответ
Этот вопрос имеет два стороны:
1) Сторона элемента формы.
Для элемента формы мы можем установить только ограничение на типы которые можно выбрать.
Т.е. с помощью кода:
Код 1c:
 МассивТипов=Новый Массив();
 МассивТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));
 ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);
Мы ограничиваем возможный типы только одним "СправочникСсылка.Контрагенты".
НО это не действует на значение которое хранится в источнике данных.
Поэтому если реквизит который связан с "ПолеВвода1" имеет "составной" тип, например Любая ссылка,
он будет неопределенного типа даже после "ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);"

2) Сторона источника данных.
Здесь ограничение на тип накладывается либо в конфигураторе, либо в момент создания этого элемента из языка.
Но если у реквизита установлен "составной" тип значение реквизита будет неопределенно до тех пор, пока ему не будет присвоено значение конкретного типа.
Присвоить конкретное значение можно либо из языка, либо выбрав это значение в форме.

Из выше описанного можно сделать вывод:
Если у реквизита установлен "Составной" тип данных, то даже при ограничении возможных типов у элемента формы до одного возможного, у пользователя будет запрошен тип который нужно будет присвоить реквизиту.
Если мы хотим оградить пользователя от лишних движений, т.е. выбора единственно возможного типа, нам нужно предварительно установить тип реквизита.
Сделать это можно следующим образом:
Код 1c:
//"Значение1" это реквизит связанный с "ПолеВвода1".
Значение1 = ЭлементыФормы.ПолеВвода1.ОграничениеТипа.ПривестиЗначение(Значение1);
Добавление от ezh (особенности при работе с элементами в табличном поле):
1.
Вместо этого:
Код 1c:
ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);
Пишем это:
Код 1c:
ЭлементыФормы.ИмяТабличнойЧасти.Колонки.ИмяКолонки.ЭлементУправления.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);
2.
Вместо этого:
Код 1c:
Значение1 = ЭлементыФормы.ПолеВвода1.ОграничениеТипа.ПривестиЗначение(Значение1);
Пишем это:
Код 1c:
ЭлементыФормы.ИмяТабличнойЧасти.ТекущаяСтрока.ИмяКолонки = ПривестиЗначение(ЭлементыФормы.ИмяТабличнойЧасти.ТекущаяСтрока.ИмяКолонки);
 
// можно так, а можно как в примере ниже...
Вот работающий пример:
Код 1c:
МассивТипов = Новый Массив();
 МассивТипов.Добавить(Тип("ПеречислениеСсылка."+Элемент.Значение));
 ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
 
 ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.ОграничениеТипа = ОписаниеТипов;
 // ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.ЗначениеПеречисления = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.ЗначениеПеречисления);
 ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.Значение = ОписаниеТипов.ПривестиЗначение(ЭлементыФормы.ТабличнаяЧасть1.Колонки.ЗначениеПеречисления.ЭлементУправления.Значение);