Имя: Пароль:
1C
1С v8
Создание Описания типов из метаданных реквизита документа
0 Родом из детства
 
21.07.21
14:11
Снова здравствуйте.
Сейчас работаю со следующим механизмом:
Обработка, которая меняет значения реквизитов документа. Список реквизитов для изменения может меняться. Для изменения реквизитов сделал ТЗ "ТЗ_ИзменениеРеквизитов". Она будет состоять из следующих колонок: ИмяРеквизита(скрыто пользователю, для обращения по нему к реквизиту документа), СинонимИмениРеквизита(Выводится для пользователя), Значение(Значение для изменения).
Однако, мы не знаем, какой тип будет у колонки "Значение"(он, естественно, будет составным). Изменять тип колонки нельзя. Можно только создавать новую, поэтому её будем создавать программно.
Итак, сначала заполняем массив имен реквизитов для изменения:

РеквизитыДляИзменения = новый Массив;
    РеквизитыДляИзменения.Добавить("Контрагент");
    РеквизитыДляИзменения.Добавить("Организация");
    РеквизитыДляИзменения.Добавить("ДоговорКонтрагента");
    РеквизитыДляИзменения.Добавить("ЛогистическаяНаценка");
    РеквизитыДляИзменения.Добавить("СкидкаПокупателя");

Далее, создаем массив ОписанияТипов и переменную с метаданными нашего документа:

ЗаказПокупателяРеквизиты = Метаданные.Документы.ЗаказПокупателя.Реквизиты;
ЗначениеМассивТипов = новый Массив;

Затем перебираем все элементы массива реквизитов для изменения, заполняя ими массив типов для колонки "Значения":

Для каждого ИмяРеквизитаДляИзменения из РеквизитыДляИзменения цикл
        новаяСтрокаТЗ_ИзменениеРеквизитов = ТЗ_ИзменениеРеквизитов.Добавить();
        новаяСтрокаТЗ_ИзменениеРеквизитов.ИмяРеквизита        = ИмяРеквизитаДляИзменения;
        новаяСтрокаТЗ_ИзменениеРеквизитов.СинонимРеквизита    = ЗаказПокупателяРеквизиты[ИмяРеквизитаДляИзменения].Синоним;
        ЗначениеМассивТипов.Добавить(ЗаказПокупателяРеквизиты[ИмяРеквизитаДляИзменения].Тип);
    КонецЦикла;

...и создаем эту колонку

    Если ЗначениеЗаполнено(ТЗ_ИзменениеРеквизитов.Колонки.Найти("Значение")) тогда
        ТЗ_ИзменениеРеквизитов.Колонки.Удалить("Значение");
        ЭлементыФормы.ТЗ_ИзменениеРеквизитов.Колонки.Удалить("Значение");
    КонецЕсли;
    ТЗ_ИзменениеРеквизитов.Колонки.Добавить("Значение", новый ОписаниеТипов(ЗначениеМассивТипов));

Добавляем её также в табличное поле, настраиваем её    
    
    ЭлементыФормы.ТЗ_ИзменениеРеквизитов.Колонки.Добавить("Значение");
    КолонкаЗначение = ЭлементыФормы.ТЗ_ИзменениеРеквизитов.Колонки.Значение;
    КолонкаЗначение.Данные = "Значение";
    КолонкаЗначение.ЭлементУправления.КнопкаВыбора = Истина;

Всё, вроде, нурм. Только есть одна проблема - Описание типов. Оно пустое. Скорее всего это из-за того, что Метаданные.Документы.ЗаказПокупателя.Реквизиты.Контрагент.Тип - возвращает описание типов "Контрагент", а нам нужно что-то типо "СправочникСсылка.Контрагенты".

Может, у кого-нибудь есть варианты получения составного типа из метаданных реквизитов документа?
1 Жан Пердежон
 
21.07.21
14:15
во-первых, обработок таких как грязи
во-вторых, в СП про конструктор ОписанияТипов() даже примеры есть
2 Родом из детства
 
21.07.21
14:19
(1) Примеры, по типу:
СписокТипов = Новый Массив;
СписокТипов.Добавить("Строка");
СписокТипов.Добавить("Структура");
СписокТипов.Добавить("СправочникСсылка.Контрагенты");
ОписаниеСоставногоТипа = Новый ОписаниеТипов(СписокТипов);
Или тоже самое, только добавляют не строки, а Тип("СправочникСсылка.Контрагенты")
Вопрос же про то, как массив реквизитов из метаданных преобразовать в описание типов составного типа данных. Такого в СП нет
3 RomanYS
 
21.07.21
14:23
(2) пример правильный, а у тебя в массиве не типы, а описания
В (0) замени
      ЗначениеМассивТипов.Добавить(ЗаказПокупателяРеквизиты[ИмяРеквизитаДляИзменения].Тип);
на
Для Каждого _Тип ИЗ ЗаказПокупателяРеквизиты[ИмяРеквизитаДляИзменения].Тип.Типы() Цикл
     ЗначениеМассивТипов.Добавить(_Тип );
КонецЦикла;
4 Родом из детства
 
21.07.21
14:26
(3) Да я согласен, что пример правильный:)
Спасибо, получилось