Как программно добавить реквизит формы таблица значений

Как создать на форме таблицу и сделать для неё подсветку содержимого колонки в строке по условию?

Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем массив добавляемых реквизитов, который будет называться МассивДобавляемыхРеквизитов.

Код 1C v 8.2 УП

 МассивДобавляемыхРеквизитов = Новый Массив; 
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("План", Новый ОписаниеТипов("ТаблицаЗначений")));

Обратите внимание, что элементы массива у нас типа РеквизитФормы. Дальше помимо таблицы значений, нам надо добавить колонки таблицы, например будем добавлять три колонки:

Код 1C v 8.2 УП

 МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"План" ,"Номенклатура")); 
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Регион", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,2)),"План" , "Регион"));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Разница", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,2)),"План" , "Осталось распределить"));

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

Код 1C v 8.2 УП

 ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);    

После изменения реквизитов у нас уже есть нужный нам реквизит формы «План» типа ТаблицаЗначений с тремя колонками. Если вам надо будет обратиться к значению реквизита, то вы можете это сделать используя ЭтаФорма[«План»]. Можно приступать к созданию элементов формы, для отображения данных. Сначала создадим элемент формы типа ТаблицаФормы.

Код 1C v 8.2 УП

 ТаблицаФормы = Элементы.Добавить("План", Тип("ТаблицаФормы"));
ТаблицаФормы.ПутьКДанным = "План";
ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
ТаблицаФормы.ФиксацияСлева = 3;
ТаблицаФормы.УстановитьДействие("ПередУдалением", "ПланПередУдалением");
ТаблицаФормы.УстановитьДействие("ПередНачаломДобавления", "ПланПередНачаломДобавления");

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

Код 1C v 8.2 УП

 НоваяКолонка = Элементы.Добавить("ПланНоменклатура", Тип("ПолеФормы"), Элементы.План); 
НоваяКолонка.Заголовок = "Номенклатура";
НоваяКолонка.ПутьКДанным = "План.Номенклатура";
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;

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

Теперь можно перейти ко второй части задачи про подсветку цветом колонки Номенклатура. Например условие у нас будет накладываться на колонку Разница и когда она будет равно 100 строку надо будет подсвечивать колонку Номенклатуры серым цветом.

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

Код 1C v 8.2 УП

 ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ПланНоменклатура");
ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("План.Разница");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = 100;
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СеребристоСерый);

Внешняя обработка, демонстрирующая создание таблицы значений программно — Скачивать файлы может только зарегистрированный пользователь!
Андрей Данилюк

Задача в том, чтобы отображать на форме таблицу значений, структура которой может меняться. К примеру в результате запроса к первой таблице мы получаем пять колонок, а в результате запроса ко второй таблице семь колонок. Соответственно при выполнении каждого из запросов, старые колонки нужно убрать, а новые добавить.

Создаем реквизит формы ДанныеТаблицы, тип ТаблицаЗначений, на форму его не выносим. И саму таблицу формы и ее колонки будем создавать программно. Для удобства тестирования добавим еще команду формы СоздатьТаблицу.

&НаКлиенте
Процедура СоздатьТаблицу(Команда)
    СоздатьТаблицуНаСервере();
КонецПроцедуры

&НаСервере
Процедура СоздатьТаблицуНаСервере()

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

&НаСервере
Функция СоздатьСлучайнуюТаблицуЗначений()

    Если НомерТаблицы = 0 Тогда

        ТаблицаЗначений = Новый ТаблицаЗначений();
        ТаблицаЗначений.Колонки.Добавить("Код");
        ТаблицаЗначений.Колонки.Добавить("Наименование");
        ТаблицаЗначений.Колонки.Добавить("Количество");

        // делаем выборку
        Выборка = Справочники.Номенклатура.Выбрать();
        Пока Выборка.Следующий() Цикл
            // добавляем новуй строку в таблицу значений
            НоваяСтрока = ТаблицаЗначений.Добавить();
            НоваяСтрока.Код = Выборка.Код;
            НоваяСтрока.Наименование = Выборка.Наименование;
            НоваяСтрока.Количество = 1;
        КонецЦикла;
        
        НомерТаблицы = 1

    Иначе

        ТаблицаЗначений = Новый ТаблицаЗначений();
        ТаблицаЗначений.Колонки.Добавить("Код");
        ТаблицаЗначений.Колонки.Добавить("Фамилия");

        // делаем выборку
        Выборка = Справочники.Сотрудники.Выбрать();
        Пока Выборка.Следующий() Цикл
            // добавляем новуй строку в таблицу значений
            НоваяСтрока = ТаблицаЗначений.Добавить();
            НоваяСтрока.Код = Выборка.Код;
            НоваяСтрока.Фамилия = Выборка.Наименование;
        КонецЦикла;
        
        НомерТаблицы = 0

    КонецЕсли;
    
    Возврат ТаблицаЗначений;

КонецФункции

Реквизит НомерТаблицы поочередно принимает значение нуля или единицы и нужен лишь для того, чтобы каждый раз получать другую таблицу значений.

Справка

УправляемаяФорма.ИзменитьРеквизиты()

УправляемаяФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты)

Параметры:

  • ДобавляемыеРеквизиты (необязательный, тип Массив). Массив, содержащий объекты типа РеквизитФормы. Добавлять можно реквизиты верхнего уровня и вложенные реквизиты, являющиеся колонками. К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект.
  • УдаляемыеРеквизиты (необязательный, тип Массив). Массив, содержащий строки, описывающие пути к удаляемым реквизитам. Удалять можно только ранее программно добавленные реквизиты.

Описание:

  • Изменяет структуру реквизитов формы. Сначала выполняется удаление реквизитов. Таким образом массивы добавляемых и удаляемых реквизитов могут содержать реквизиты с одинаковым путём.
  • Внимание! Действия добавления и удаления выполняются за один вызов. Следует учитывать, что операция изменения состава реквизитов является ресуркоемкой, поэтому операции изменения состава реквизитов формы выполняются пакетным образом.

Доступность:

  • Сервер, мобильное приложение (сервер).

ВсеЭлементыФормы.Добавить()

ВсеЭлементыФормы.Добавить(Имя, ТипЭлемента, Родитель) 

Параметры:

  • Имя (обязательный, тип Строка). Уникальное имя добавляемого элемента.
  • ТипЭлемента (обязательный, тип Тип). Тип добавляемого элемента.
  • Родитель (необязательный, тип: ГруппаФормы; ТаблицаФормы; УправляемаяФорма). Родитель для добавляемого элемента. Если не указан, то добавляется на верхний уровень.

Возвращаемое значение:

  • Тип: ДекорацияФормы; ГруппаФормы; КнопкаФормы; ТаблицаФормы; ПолеФормы.

Описание:

  • Добавляет элемент в коллекцию.

Доступность:

  • Сервер, мобильное приложение (сервер).

Поиск:
1С:Предприятие • Значение в реквизит формы • Изменить реквизиты • Реквизит формы в значение • Таблица значений • Управляемая форма • Элемент формы

Перейти в основной раздел:

Выводим на форму заполненную Таблицу значений в 1С 8.3:

&НаСервере
Процедура ПриОткрытииНаСервере()// Описание таблицы значений как реквизита
   
МассивТипа = Новый Массив;
   
МассивТипа.Добавить(Тип(«ТаблицаЗначений»));// Добавление ТаблицыЗначений в массив реквизитов
   
ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
   
МассивРеквизитовФормы = Новый Массив;
   
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(«ТаблицаСотрудников», ОписаниеТипа, «», «ТЗСотр»));// Создание ТаблицыЗначений с описанием колонок
   
КвалификаторыСтроки = Новый КвалификаторыСтроки(10);
   
ОписаниеСтроки_10 = Новый ОписаниеТипов(«Строка», ,КвалификаторыСтроки);ОписаниеСотрудника = Новый ОписаниеТипов(«СправочникСсылка.Сотрудники»);ТЗ = Новый ТаблицаЗначений;
   
ТЗ.Колонки.Добавить(«Код», ОписаниеСтроки_10);
   
ТЗ.Колонки.Добавить(«Сотрудник», ОписаниеСотрудника);
   
// ТЗ.Колонки.Добавить — можно и в цикле

    // Добавление в массив реквизитов колонок ТаблицыЗначений

Для Каждого Колонка Из ТЗ.Колонки Цикл
       
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, «ТаблицаСотрудников»));
    КонецЦикла;
// Удаление — если таблица существует
   
ЭлементТаблица = Элементы.Найти(«ТаблицаСотрудников»);
    Если
ЭлементТаблица <> Неопределено Тогда
       
Элементы.Удалить(ЭлементТаблица);
    Иначе
       
ИзменитьРеквизиты(МассивРеквизитовФормы);
    КонецЕсли;
// Добавление ТаблицыЗначений на форму
   
ТаблицаПолейВыбора = Элементы.Добавить(«ТЗСотр», Тип(«ТаблицаФормы»));
   
ТаблицаПолейВыбора.ПутьКДанным = «ТаблицаСотрудников»;
   
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
   
ТаблицаПолейВыбора.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; // Отключение командной панелиДля Каждого Колонка Из ТЗ.Колонки ЦиклНовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип(«ПолеФормы»), ТаблицаПолейВыбора);
       
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
       
НовыйЭлемент.ПутьКДанным = «ТаблицаСотрудников.» + Колонка.Имя;
       
НовыйЭлемент.Ширина = 10;

    КонецЦикла;

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

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

Обработка события Таблицы на форме в 1С 8.3:

//Для добавления обработчика события таблицы «Выбор»:
ТаблицаПолейВыбора.УстановитьДействие(«Выбор»,«ТЗВыбор»);//Для обработки данного события в форме процедуры прописывается отдельная процедура (НаКлиенте):
&НаКлиенте
Процедура ТЗВыбор(ТЗ, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
     
//Код для обработки обработчика
КонецПроцедуры

Чтение программно созданной Таблицы на форме в 1С 8.3:

// При обращении к реквизиту получите ошибку: Переменная не определена
// Для чтения реквизита, который создан программно, используется метод РеквизитФормыВЗначение
ТекущаяТаблица=РеквизитФормыВЗначение(«ТаблицаСотрудников»);

Copyright©, «Программист 1С в г.Минске», 27.04.2020

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

(1) + 1

СП Украли?

НоваяКолонка = Новый РеквизитФормы(«Колонка1»,     , ИмяРеквизита, );

РеквизитФормы (FormAttribute)

Основной

Синтаксис:

Новый РеквизитФормы(<Имя>, <Тип>, <Путь>, <Заголовок>, <СохраняемыеДанные>)

Параметры:

<Имя> (обязательный)

Тип: Строка.

Имя реквизита.

<Тип> (обязательный)

Тип: ОписаниеТипов.

Тип реквизита.

<Путь> (необязательный)

Тип: Строка.

Путь к создаваемому реквизиту. Не включает имя реквизита.

Значение по умолчанию: Пустая строка

<Заголовок> (необязательный)

Тип: Строка.

Содержит отображаемый текст реквизита.

Значение по умолчанию: Пустая строка

<СохраняемыеДанные> (необязательный)

Тип: Булево.

Реквизит содержит сохраняемые данные.

Истина — сохраняеый реквизит формы.

Значение по умолчанию: Ложь

Описание:

Создает описание реквизита управляемой формы на основе переданных параметров.

Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем массив добавляемых реквизитов, который будет называться МассивДобавляемыхРеквизитов.

МассивДобавляемыхРеквизитов = Новый Массив;

МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«План», Новый ОписаниеТипов(«ТаблицаЗначений»)));

Обратите внимание, что элементы массива у нас типа РеквизитФормы. Дальше помимо таблицы значений, нам надо добавить колонки таблицы, например будем добавлять три колонки:

[wp_ad_camp_3]

МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Номенклатура», Новый ОписаниеТипов(«СправочникСсылка.Номенклатура»),«План» ,«Номенклатура»));

МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Регион», Новый ОписаниеТипов(«Число»,Новый КвалификаторыЧисла(10,2)),«План» , «Регион»));

МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Разница», Новый ОписаниеТипов(«Число»,Новый КвалификаторыЧисла(10,2)),«План» , «Осталось распределить»));

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

ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

После изменения реквизитов у нас уже есть нужный нам реквизит формы «План» типа ТаблицаЗначений с тремя колонками. Если вам надо будет обратиться к значению реквизита, то вы можете это сделать используя ЭтаФорма[«План»]. Можно приступать к созданию элементов формы, для отображения данных. Сначала создадим элемент формы типа ТаблицаФормы.

[wp_ad_camp_3]

ТаблицаФормы = Элементы.Добавить(«План», Тип(«ТаблицаФормы»));

ТаблицаФормы.ПутьКДанным = «План»;

ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;

ТаблицаФормы.ФиксацияСлева = 3;

ТаблицаФормы.УстановитьДействие(«ПередУдалением», «ПланПередУдалением»);

ТаблицаФормы.УстановитьДействие(«ПередНачаломДобавления», «ПланПередНачаломДобавления»);

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

НоваяКолонка = Элементы.Добавить(«ПланНоменклатура», Тип(«ПолеФормы»), Элементы.План);

НоваяКолонка.Заголовок = «Номенклатура»;

НоваяКолонка.ПутьКДанным = «План.Номенклатура»;

НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;

НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;

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

Теперь можно перейти ко второй части задачи про подсветку цветом колонки Номенклатура. Например условие у нас будет накладываться на колонку Разница и когда она будет равно 100 строку надо будет подсвечивать колонку Номенклатуры серым цветом.

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

ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();

ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();

ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(«ПланНоменклатура»);

ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«План.Разница»);

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = 100;

ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(«ЦветФона», WebЦвета.СеребристоСерый);

[wp_ad_camp_3]

В данной статье описаны примеры программного создания объектов управляемой формы 1С — таблицы значений и динамического списка, и их программный вывод в элементы формы

Contents

  • 1 Введение в  управляемые формы 1С
  • 2 Создание реквизита типа таблица значений и вывод на форму
  • 3 Добавление условного оформления таблицы формы
  • 4 Создание реквизита типа динамический список с заданными настройками и вывод на форму
  • 5 Вывести динамический список в элементы управляемой формы 1С
  • 6 Обновление параметров динамического списка программно
  • 7 Полезные ссылки

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

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

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

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

Для запуска обработки в режиме предприятия необходимо наличие объектов «Справочники.Номенклатура», подчиненный ему «Справочники.ХарактеристикиНоменклатуры» и «РегистрыСведений.ЦеныНоменклатуры”.

Создание реквизита типа таблица значений и вывод на форму

&НаСервере
Процедура пр_СоздатьТаблицуЗначений()
    
    МассивДобавляемыхРеквизитов = Новый Массив;
    //добавить реквизит ТЗ
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ТаблицаЗначений", Новый ОписаниеТипов("ТаблицаЗначений")));
    
    //добавить каждую колонку как отдельный реквизит
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Период", Новый ОписаниеТипов("Дата",,,,,Новый КвалификаторыДаты(ЧастиДаты.Дата)),"пр_ТаблицаЗначений" ,"Период"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"пр_ТаблицаЗначений" ,"Номенклатура"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"),"пр_ТаблицаЗначений" ,"Характеристика"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ВидЦены", Новый ОписаниеТипов("СправочникСсылка.ВидыЦен"),"пр_ТаблицаЗначений" ,"Вид цены"));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Цена", Новый ОписаниеТипов("Число", ,,Новый КвалификаторыЧисла(15,2)), "пр_ТаблицаЗначений" ,"Цена"));
    
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
КонецПроцедуры

&НаСервере
Процедура пр_ВывестиТаблицуЗначений()
    
    пр_ВывестиТаблицуНаФорму(ЭтаФорма, "пр_ТаблицаЗначений", Элементы["пр_Страница2"], "Таблица цен");
    
КонецПроцедуры

&НаСервере
Процедура пр_ВывестиТаблицуНаФорму(Форма, ИмяТаблицы, Родитель, ЗаголовокТаблицы) Экспорт
    
    ТаблицаФормы = Форма.Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"), Родитель);
    ТаблицаФормы.ПутьКДанным = ИмяТаблицы;
    ТаблицаФормы.Заголовок = ЗаголовокТаблицы;
    ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх;
    ТаблицаФормы.ИзменятьПорядокСтрок = Ложь;
    ТаблицаФормы.ИзменятьСоставСтрок = Ложь;
    ТаблицаФормы.РазрешитьНачалоПеретаскивания = Ложь;
    
    СтруктураСвойств = Новый Структура();
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Период");    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Номенклатура");    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Характеристика");    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "ВидЦены");    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Цена", СтруктураСвойств);    
    
КонецПроцедуры

&НаСервере
Процедура пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, ИмяКолонки, СтруктураСвойств = Неопределено)
    
    НоваяКолонка = Форма.Элементы.Добавить(ИмяТаблицы+ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
    НоваяКолонка.Заголовок = ИмяКолонки;
    НоваяКолонка.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонки;
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;    
    Если НЕ СтруктураСвойств = Неопределено Тогда
        Для Каждого КлючЗначение Из СтруктураСвойств Цикл
            Попытка
                НоваяКолонка[КлючЗначение.Ключ] = СтруктураСвойств[КлючЗначение.Ключ];
            Исключение
            КонецПопытки;
        КонецЦикла;    
    КонецЕсли;
    
КонецПроцедуры

Добавление условного оформления таблицы формы

Создаем условное оформление для таблицы:

  • если реквизит формы Использование (тип булево) = Истина, тогда разрешаем изменять цену в строках таб. части;
  • если в строке таб части цена не заполнена, то выделять фон ячейки «Цена» розовым.
&НаСервере
Процедура пр_ДобавитьУОТаблицыФормы()
    
    //условное оформление формы
    //если реквизит Использование = Истина, то разрешать изменять цену
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();    
    
    // Создаем условие отбора в созданной группе:
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("пр_Использование"); // имя поля
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; // либо задаем свой    
    ЭлементОтбора.ПравоеЗначение = Ложь;
    ЭлементОтбора.Использование = Истина;
    
    // Установка значения элемента УО
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);
    ЭлементОформления.Использование = Истина;
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.КрасноФиолетовый);
    ЭлементОформления.Использование = Истина;

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

	// Создаем поля оформления
	//чтобы выделить всю строку, нужно добавить все ячейки строки, пока же выделим одну ячейку "Цена"
	ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
	ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначенийЦена");
	ПолеОформления.Использование = Истина;	
  
КонецПроцедуры

В процедуру команды добавим вызов серверной процедуры для заполнения таблицы цен в зависимости от выбранной номенклатуры и характеристики:

&НаКлиенте
Процедура пр_Команда1(Команда)
	
	пр_Команда1НаСервере();
	 
КонецПроцедуры

&НаСервере
Процедура пр_Команда1НаСервере()
	
	ЭтаФорма["пр_ТаблицаЗначений"].Очистить();
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Номенклатура", ЭтаФорма.пр_Номенклатура);
	Запрос.УстановитьПараметр("Характеристика", ЭтаФорма.пр_Характеристика);
	Запрос.Текст = "ВЫБРАТЬ
	               |	ЦеныНоменклатурыСрезПоследних.Период КАК Период,
	               |	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
	               |	ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
	               |	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
	               |	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
	               |ИЗ
	               |	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
	               |			,
	               |			Номенклатура = &Номенклатура
	               |				И Характеристика = &Характеристика) КАК ЦеныНоменклатурыСрезПоследних";
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		Стр = ЭтаФорма["пр_ТаблицаЗначений"].Добавить();
		ЗаполнитьЗначенияСвойств(Стр, Выборка);
	КонецЦикла;
	
КонецПроцедуры

Добавляем в процедуру ПриСозданииНаСервере процедуры:

&НаСервере
Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//установим заголовок формы 
	ЭтаФорма.Заголовок 		= "Шаблон для программной работы с реквизитами, командами и элементами формы";
	ЭтаФорма.АвтоЗаголовок 	= Ложь;
	
	пр_СоздатьГруппы();
	пр_СоздатьНовуюКоманду();
	пр_СоздатьДекорацию();
	пр_СоздатьРеквизиты();
	пр_УдалитьРеквизиты();
	пр_ВывестиРеквизитыНаФорму();
	
	пр_СоздатьТаблицуЗначений();
	пр_ВывестиТаблицуЗначений();
	пр_ДобавитьУОТаблицыФормы();

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

Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.

Создание реквизита типа динамический список с заданными настройками и вывод на форму

На странице 3 создадим динамический список с выводом всех цен выбранной номенклатуры и характеристики.
Добавим Условное Оформление дин. списка, отбор и сортировку программно.

&НаСервере
Процедура пр_СоздатьДинамическийСписок()
    
    //создать дин. список с произвольным запросом
    ТекстЗапроса = "ВЫБРАТЬ
                   |    ЦеныНоменклатуры.Период КАК Период,
                   |    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
                   |    ЦеныНоменклатуры.Характеристика КАК Характеристика,
                   |    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
                   |    ЦеныНоменклатуры.Цена КАК Цена,
                   |    ЦеныНоменклатуры.Регистратор КАК Регистратор
                   |ИЗ
                   |    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                   |ГДЕ
                   |    ЦеныНоменклатуры.Номенклатура = &Номенклатура
                   |    И ЦеныНоменклатуры.Характеристика = &Характеристика";
    
    МассивДобавляемыхРеквизитов = Новый Массив;    
    //создать реквизит дин. списка
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ДинамическийСписок", Новый ОписаниеТипов("ДинамическийСписок"),,,ЛОЖЬ));
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
    РеквизитДинамическийСписок = ЭтаФорма["пр_ДинамическийСписок"];
    //если запрос не произвольный, тогда используем следующий код:
    //РеквизитДинамическийСписок.ПроизвольныйЗапрос = Ложь;
    //РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры";
    
    РеквизитДинамическийСписок.ПроизвольныйЗапрос = Истина;
    РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры";
    РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
    РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Номенклатура", ЭтаФорма["пр_Номенклатура"]);
    РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Характеристика", ЭтаФорма["пр_Характеристика"]);
    
    //не будем выводить эту колонку в списке, но нужен к ней доступ всегда
    РеквизитДинамическийСписок.УстановитьОбязательноеИспользование("Регистратор", Истина);
        
КонецПроцедуры

&НаСервере
Процедура пр_ДобавитьОтборДинамическийСписок()
    
    ЭлементОтбора = ЭтаФорма["пр_ДинамическийСписок"].Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Период");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // больше или меньше и т.п.
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ПравоеЗначение = Дата('2015.01.01 00:00:00');     
    
КонецПроцедуры

&НаСервере
Процедура пр_ДобавитьУОДинамическийСписок()
    
    //если цена от 4000 до 5000, то выделять зеленым
    
    ЭлементОформления = ЭтаФорма["пр_ДинамическийСписок"].УсловноеОформление.Элементы.Добавить();    
    
    //сначала добавим группу И
    ГруппаОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
    ГруппаОформления.Использование  = Истина;
    ГруппаОформления.ТипГруппы  = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
    
    // Создаем условие отбора в созданной группе: цена > 4000
    ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // либо задаем свой    
    ЭлементОтбора.ПравоеЗначение = 4000;
    //правым значением может выступать ПолеКомпоновкиДанных формы или списка
    //ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ЭлементОтбора.Использование = Истина;
    
    //второй элемент отбора: цена < 5000
    ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; // либо задаем свой    
    ЭлементОтбора.ПравоеЗначение = 5000;
    ЭлементОтбора.Использование = Истина;
        
    
    // Установка значения элемента УО
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.ЗеленыйЛес);
    // Возможно обращение как по индексу так и установка через метод
    //Элемент = ЭлементОформления.Оформление.Элементы[0];
    //Элемент.Значение = Цвет;
    ЭлементОформления.Использование = Истина;
    
    // Создаем поля оформления
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    //чтобы выделить ячейку, нуджно указать ее имя поля
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Период");
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Характеристика");
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ВидЦены");
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Цена");
    ПолеОформления.Использование = Истина;    
    
КонецПроцедуры

&НаСервере
Процедура пр_ДобавитьСортировкуДинамическийСписок()
    
    ЭлементСортировки = ЭтаФорма["пр_ДинамическийСписок"].Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    ЭлементСортировки.Поле = Новый ПолеКомпоновкиДанных("Период");
    ЭлементСортировки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
    ЭлементСортировки.Использование = Истина;    
    
КонецПроцедуры

Вывести динамический список в элементы управляемой формы 1С

Для вывода дин. списка воспользуемся процедурами, которые использовали при выводе таблицы значений, так как это один тип — ДанныеФормыКоллекция.

&НаСервере
Процедура пр_ВывестиДинамическийСписок()
    
    пр_ВывестиДинамическийСписокНаФорму(ЭтаФорма, "пр_ДинамическийСписок", Элементы["пр_Страница3"], "Таблица цен");
    
КонецПроцедуры

Процедура пр_ВывестиДинамическийСписокНаФорму(Форма, ИмяТаблицы, Родитель, ЗаголовокТаблицы) Экспорт
    
    ТаблицаФормы = Форма.Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"), Родитель);
    ТаблицаФормы.ПутьКДанным = ИмяТаблицы;
    ТаблицаФормы.Заголовок = ЗаголовокТаблицы;
    ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх;

    СтруктураСвойств = Новый Структура("Вид",  ВидПоляФормы.ПолеНадписи); //если нужны какие-то специфические свойства колонки, то нужно их добавить в структуру свойств
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Период", СтруктураСвойств);    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Номенклатура", СтруктураСвойств);    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Характеристика", СтруктураСвойств);    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "ВидЦены", СтруктураСвойств);    
    пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Цена", СтруктураСвойств);    
    
КонецПроцедуры

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

Если в запросе дин. списка используются параметры, то их необходимо обновлять при изменении соответствующих реквизитов.

&НаСервере
Процедура пр_ОбновитьПараметрДинСписков(ИмяЭлемента, ТекСсылка)
    
    РеквизитДинамическийСписок = ЭтаФорма["пр_ДинамическийСписок"];
    
    РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(ИмяЭлемента, ТекСсылка);  
    
КонецПроцедуры

&НаКлиенте
Процедура пр_НоменклатураПриИзменении(Элемент)
    пр_ОбновитьПараметрДинСписков("Номенклатура", ЭтаФорма["пр_Номенклатура"]);        
КонецПроцедуры

&НаКлиенте
Процедура пр_ХарактеристикаПриИзменении(Элемент)
    пр_ОбновитьПараметрДинСписков("Характеристика", ЭтаФорма["пр_Характеристика"]);        
КонецПроцедуры

Добавляем в процедуру ПриСозданииНаСервере процедуры:

&НаСервере
Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//установим заголовок формы 
	ЭтаФорма.Заголовок 		= "Шаблон для программной работы с реквизитами, командами и элементами формы";
	ЭтаФорма.АвтоЗаголовок 	= Ложь;
	
	пр_СоздатьГруппы();
	пр_СоздатьНовуюКоманду();
	пр_СоздатьДекорацию();
	пр_СоздатьРеквизиты();
	пр_УдалитьРеквизиты();
	пр_ВывестиРеквизитыНаФорму();

	
	пр_СоздатьДинамическийСписок();
	пр_ДобавитьОтборДинамическийСписок();
	пр_ДобавитьСортировкуДинамическийСписок();
	пр_ДобавитьУОДинамическийСписок();
	пр_ВывестиДинамическийСписок();
	
КонецПроцедуры

Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.

Содержимое регистра сведений ЦеныНоменклатуры:

Динамический список на форме:

Полезные ссылки

1. Типовой механизм упрощенного изменения конфигурации в ERP 2.0 и УТ 11
2. Типовой функционал модификации конфигурации линейки ERP-решений (УТ 11, КА 2 и ERP 2)
3. 1С Управляемые Формы. Программное создание реквизитов , команд, элементов (Часть 1)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

&НаСервере
Процедура ВыполнитьКодНаСервере()
 
    /// Как создать таблицу значений в 1с 8.3, 8.2
 
    // с таблицей значений можно работать только на сервере 
    Таб = Новый ТаблицаЗначений;    
 
    /// Как добавить колонки в таблицу значений в 1с 8.3, 8.2
 
    Таб.Колонки.Добавить("Фрукт");
    Таб.Колонки.Добавить("Цвет");
    Таб.Колонки.Добавить("Вкус");
 
    /// Как добавить строки в таблицу значений в 1с 8.3, 8.2
 
    Стр = Таб.Добавить();
    Стр.Фрукт = "Яблоко";
    Стр.Цвет = "Зелёный";
    Стр.Вкус = "Кислый";
 
    Стр = Таб.Добавить();
    Стр.Фрукт = "Банан";
    Стр.Цвет = "Желтый";
    Стр.Вкус = "Сладкий";
 
    Стр = Таб.Добавить();
    Стр.Фрукт = "Слива";
    Стр.Цвет = "Синий";
    Стр.Вкус = "Терпкий"; 
 
    /// Как добавить в таблицу значений колонку с
    /// описанием типа и заголовка в 1с 8.3, 8.2
 
    ОписаниеВеса = Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(12, 3));
 
    Таб.Колонки.Добавить("ВесФрукта", ОписаниеВеса, "Вес фрукта");
    Таб[0].ВесФрукта = 100.005;
    Таб[1].ВесФрукта = 60.010;
    Таб[2].ВесФрукта = 25.000;
 
    /// Как перечислить все строки в таблице значений в 1с 8.3, 8.2
 
    Для Каждого Стр Из Таб Цикл
        Сообщить(Стр.Фрукт + " " + Стр.Цвет + " " + Стр.Вкус +
            " " + Стр.ВесФрукта);
    КонецЦикла;
 
    /// Как перечислить все колонки в таблице значений
    /// в 1с 8.3, 8.2
 
    Для Каждого Колонка Из Таб.Колонки Цикл
        Сообщить(Колонка.Имя);
    КонецЦикла; 
 
    /// Как выгрузить колонку таблицы значений в массив в 1с 8.3, 8.2
 
    // выгрузка названий фруктов в массив
    МассивФруктов = Таб.ВыгрузитьКолонку("Фрукт");
 
    // ничего не измениться, так как массив не менялся
    Таб.ЗагрузитьКолонку(МассивФруктов, "Фрукт");
 
    /// Как заполнить значения в колонке для всех строк таблицы 
    /// значений в 1с 8.3, 8.2
 
    // обнулим вес во всех строках
    Таб.ЗаполнитьЗначения(0, "ВесФрукта");
 
    // выставим новые веса
    Таб[0].ВесФрукта = 100;
    Таб[1].ВесФрукта = 60;
    Таб[2].ВесФрукта = 25;
 
    /// Как в таблице значений посчитать итог по колонке в 1с 8.3, 8.2
 
    Сообщить(Таб.Итог("ВесФрукта")); // 185
 
    /// Как найти строку в таблице значений по значению в 1с 8.3, 8.2
 
    // найдём строчку с яблоком и покажем его цвет
    НайденнаяСтрока = Таб.Найти( "Яблоко" );
    Если НайденнаяСтрока <> Неопределено Тогда
        Сообщить(НайденнаяСтрока.Цвет); // Зелёный
    КонецЕсли;
 
    /// Как найти строку в таблице значений поиском значения
    /// в определенных колонках в 1с 8.3, 8.2
 
    // будем искать по слову "Кислый" в колонках вкус и цвет
    НайденнаяСтрока = Таб.Найти("Кислый", "Вкус, Цвет");
    Если НайденнаяСтрока <> Неопределено Тогда
        Сообщить(НайденнаяСтрока.Фрукт); // Яблоко
    КонецЕсли;
 
    // добавим ещё один зелёный фрукт
    Стр = Таб.Добавить();
    Стр.Фрукт = "Киви";
    Стр.Цвет = "Зелёный";
    Стр.Вкус = "Сладкий";
    Стр.ВесФрукта = 30;
 
    /// Как искать в таблице значений неуникальные значения
    /// в 1с 8.3, 8.2
 
    Отбор = Новый Структура;
    Отбор.Вставить("Цвет", "Зелёный");
    Строки = Таб.НайтиСтроки(Отбор);
    Для Каждого Стр Из Строки Цикл
        Сообщить(Стр.Фрукт); // Яблоко Киви
    КонецЦикла;
 
    /// Как сдвинуть строку таблицы значений в 1с 8.3, 8.2
 
    // сдвигаем первую строку на одну позицию вперёд
    Таб.Сдвинуть(0, 1);
 
    // и возвращаем обратно
    Таб.Сдвинуть(1, -1);
 
    /// Как создать копию таблицы значений в 1с 8.3, 8.2
 
    // полная копия
    КопияТаб = Таб.Скопировать();
 
    /// Как создать копию таблицы значений по нужным колонкам
    /// в 1с 8.3, 8.2
 
    // только две колонки будет Фрукт и Цвет
    КопияТаб = Таб.СкопироватьКолонки("Фрукт, Цвет");
 
    /// Как создать копию таблицы значений по отбору в 1с 8.3, 8.2
 
    Отбор = Новый Структура;
    Отбор.Вставить("Фрукт", "Яблоко");
 
    // таблица будет содержать только строчку с яблоком
    КопияТаб = Таб.Скопировать(Отбор);
 
    // таблица будет содержать цвет и вес яблока
    КопияТаб = Таб.Скопировать(Отбор, "Цвет, ВесФрукта");
 
    /// Как свернуть таблицу значений по колонке в 1с 8.3, 8.2
 
    // свернём по вкусу, просуммируем по весу
    Таб.Свернуть("Вкус", "ВесФрукта");
 
    /// Как отсортировать таблицу значений по колонке в 1с 8.3, 8.2
 
    Таб.Сортировать("ВесФрукта Возр");
 
    /// Как отсортировать таблицу значений по нескольким колонкам
    /// в 1с 8.3, 8.2
 
    Таб.Сортировать("ВесФрукта Возр, Вкус Убыв");
 
    /// Как удалить строку из таблицы значений в 1с 8.3, 8.2
 
    // по индексу или по значению
    Таб.Удалить(0);
 
КонецПроцедуры
 
/// Как программно вывести таблицу значений на
/// форму в 1с 8.3, 8.2 
 
// см. примеры использования этой функции ниже
 
// ТабВКоде - таблица значений, созданная программно
// ТабРеквизит - имя реквизита формы типа ТаблицаЗначений
// ТабНаФорме - имя элемента формы, связанного с ТабРеквизит 
 
&НаСервере
Процедура ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, ТабРеквизит, ТабНаФорме)
 
    // реквизит ТабРеквизит и соответствующий
    // ему элемент формы ТабНаФорме уже созданы
    // нами в визуальном режиме
 
    // 1. добавляем колонки из ТабВкоде в реквизит ТабРеквизит
 
    НовыеРеквизиты = Новый Массив;
 
    Для Каждого Колонка Из ТабВКоде.Колонки Цикл
         НовыеРеквизиты.Добавить(
            Новый РеквизитФормы(
                Колонка.Имя, Колонка.ТипЗначения,
                ТабРеквизит
            )
         );
    КонецЦикла;
 
    ИзменитьРеквизиты(НовыеРеквизиты);
 
    // 2. добавляем колонки из ТабВКоде в элемент ТабНаФорме
 
    Для Каждого Колонка Из ТабВКоде.Колонки Цикл
 
        НовыйЭлемент = Элементы.Добавить(
            ТабРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТабНаФорме]
        );
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = ТабРеквизит + "." + Колонка.Имя;
    КонецЦикла;
 
    // 3. наконец, передаём данные из ТабВКоде в ТабРеквизит
 
    ЗначениеВРеквизитФормы(ТабВКоде, ТабРеквизит);
 
    // готово!    
 
КонецПроцедуры
 
&НаСервере
Процедура СоздатьТаблицуНаФормеНаСервере()
 
    // программно создаём таблицу значений ТабВКоде
 
    ТабВКоде = Новый ТаблицаЗначений;
 
    ОписаниеСтроки = Новый ОписаниеТипов("Строка");
    ОписаниеВеса = Новый ОписаниеТипов("Число",
        Новый КвалификаторыЧисла(12, 3));
 
    ТабВКоде.Колонки.Добавить("Фрукт", ОписаниеСтроки, "Имя фрукта");
    ТабВКоде.Колонки.Добавить("Цвет", ОписаниеСтроки, "Цвет фрукта");
    ТабВКоде.Колонки.Добавить("Вес", ОписаниеВеса, "Вес фрукта");
 
    Стр = ТабВКоде.Добавить();
    Стр.Фрукт = "Яблоко";
    Стр.Цвет = "Зелёный";
    Стр.Вес = 200;
 
    Стр = ТабВКоде.Добавить();
    Стр.Фрукт = "Банан";
    Стр.Цвет = "Желтый";
    Стр.Вес = 150;
 
    ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит1", "ТабНаФорме1");
 
КонецПроцедуры
 
/// Как программно вывести на форму результат запроса
/// в виде таблицы значений в 1с 8.3, 8.2
 
&НаСервере
Процедура ВывестиНаФормуРезультатЗапросаНаСервере()        
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Товары.Ссылка,
        |   Товары.ВерсияДанных,
        |   Товары.ПометкаУдаления,
        |   Товары.Код,
        |   Товары.Наименование,
        |   Товары.Цвет,
        |   Товары.ЕдиницаИзмерений,
        |   Товары.Предопределенный,
        |   Товары.ИмяПредопределенныхДанных
        |ИЗ
        |   Справочник.Товары КАК Товары";
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ТабВКоде = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой);   
 
    // функция ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме определена выше
    ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит2", "ТабНаФорме2");
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

Понравилась статья? Поделить с друзьями:
  • Как проехать в аэропорт внуково на машине в зону вылета
  • Как узнать об исполнительном производстве по реквизитам
  • Как проехать в екатеринбурге от жд вокзала до аэропорта
  • Как узнать полные реквизиты карты тинькофф в приложении
  • Как проехать в красноярске от автовокзала до онкоцентра