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

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

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

Код 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Цвета.СеребристоСерый);

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

как программно добавлять строки(колонки) в таблицуЗначений?

Я
   altaykniga

13.05.15 — 18:50

Привет всем, уважаемые. Прошу помочь. Управляемые формы.

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

В процедуре формы получаю ТЗзапроса = Запрос.выполнить().выгрузить().

Как теперь мне ТЗзапроса запихать в таблицу значений формы (реквизит формы)?

  

Партнерская программа EFSOL Oblako

   Лодырь

1 — 13.05.15 — 18:51

Формы управляемые?

   1976vas

2 — 13.05.15 — 18:57

(1) Да

   Лодырь

3 — 13.05.15 — 19:05

(2) Не узнаю вас в гриме.

ЗначениеВРеквизитФормы или долго и нудно добавлять построчно.

   1976vas

4 — 13.05.15 — 19:07

(3) Это не ТС, просто внимательно прочитал (0) «Привет всем, уважаемые. Прошу помочь. Управляемые формы. » )

   Лодырь

5 — 13.05.15 — 19:08

(4) Ну вы батенька даете! надо же, внимательно читать то, что пишет топикстартер! Так и до чтения документации недалеко )

   1976vas

6 — 13.05.15 — 19:10

(5) И не лодырничать )

   altaykniga

7 — 13.05.15 — 19:12

(3) Сделал так:

ЗначениеВРеквизитФормы(ТЗзапроса, «ТаблицаЗначенийФормы»);

В итоге на форме ничего не отображается… или отображается пустая таблица значений, без колонок и строк

   Drac0

8 — 13.05.15 — 19:13

Код условный. Поудалл наспех лишнее:

Процедура ДобавитьКолонки(ТабЗначений, ТаблицаФормы)
        
    НужныйТип     = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,0));
    СтарыеКолонки = Новый Массив;
    НовыеКолонки  = Новый Массив;
    ЖирныйШрифт   = Новый Шрифт(,,Истина);
    
    ТекРеквизитыФормы = ПолучитьРеквизиты(ТаблицаФормы);
    Для каждого ТекРеквизит из ТекРеквизитыФормы Цикл
        Если Лев(ТекРеквизит.Имя, 1) = "_" Тогда
            СтарыеКолонки.Добавить(ТаблицаФормы+"."+ТекРеквизит.Имя);    
        КонецЕсли;    
    КонецЦикла;
    
    ОснГруппаЭлемент = Элементы.грПрограммныйхКОлонок;
    ШиринаКолонки    = 3;
    ПрефиксРек         = "_Рек_"; 

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

    ТекНом = 1;
    Для Каждого Стр Из Таб Цикл
        ИмяРеквизитаРП   = Стр.ИмяКолонки;    

                                 
        ТекЭлемент = Элементы.Добавить(ИмяРеквизитаРП, Тип("ПолеФормы"),ТекГруппа);
        ТекЭлемент.Вид                     = ВидПоляФормы.ПолеВвода;
        ТекЭлемент.ГоризонтальноеПоложение          = ГоризонтальноеПоложениеЭлемента.Право;
        ТекЭлемент.РастягиватьПоГоризонтали         = Ложь;
        ТекЭлемент.БыстрыйВыбор                     = Истина;
        ТекЭлемент.ТолькоПросмотр                 = Истина;
        ТекЭлемент.ОтображатьВШапке                 = Ложь;
        ТекЭлемент.Заголовок                     = "";
        ТекЭлемент.Шрифт                         = ЖирныйШрифт;
        ТекЭлемент.Ширина                           = ШиринаКолонки;
        ТекЭлемент.ОтображатьВПодвале             = Ложь;
        ТекЭлемент.ПутьКДанным                        = ТаблицаФормы +"."+ИмяРеквизитаРП;
        ТекНом = ТекНом+1;
    КонецЦикла;
    
КонецПроцедуры
   Лодырь

9 — 13.05.15 — 19:13

(7) Так вам на форме отображается или залить данные в таблицу — реквизит формы? Это знаете ли, разные задачи.

   Drac0

10 — 13.05.15 — 19:15

(8) суть простая: сначала создаешь реквизиты формы программно, потом создаешь элементы формы по ним. Можно еще условное оформление создавать по желанию.

   altaykniga

11 — 14.05.15 — 17:19

(9) вообще мне нужно отобразить на форме полученную ТЗзапроса, затем пользователь выберет нужную строку и программа начнет обрабатывать введенные пользователем данные дальше

   altaykniga

12 — 14.05.15 — 17:20

(11) я полагал, чтобы отобразить на форме таблицу значений с некоторыми данными, то сначала эти данные (ТЗзапроса) нужно залить в таблицуЗначений-реквизит формы.

   Drac0

13 — 14.05.15 — 17:21

(12) Тебе уже пример дал, чего не хватает для реализации?

   altaykniga

14 — 14.05.15 — 18:00

(12)

ТЗзапроса = Запрос.Выполнить().Выгрузить(); тут одна колонка ФизЛицо.

    НужныйТип     = Новый ОписаниеТипов(«СправочникСсылка.ФизическиеЛица»);

    НовыеКолонки = Новый Массив;

    НовыйРеквизитТЧ = Новый РеквизитФормы(«ФизЛицо», НужныйТип, ТаблицаЗначенийФормы,, Истина);

    НовыеКолонки.Добавить(НовыйРеквизитТЧ);    

ИзменитьРеквизиты(НовыеКолонки);

после этого кода выходит ошибка:

Ошибка при вызове метода контекста (ИзменитьРеквизиты)

    ИзменитьРеквизиты(НовыеКолонки);

по причине:

Недопустимый путь к реквизиту. Путь: «ДанныеФормыКоллекция»

   Гёдза

15 — 14.05.15 — 18:01

ТаблицаЗначенийФормы —  в кавычках нужно

   altaykniga

16 — 14.05.15 — 18:06

(15). исправил. Теперь создается на форме новый реквизит с заголовком «ФизЛицо», тип = «ПолеВвода». А мне нужно в реквизит формы «ТаблицаЗначенийФормы» добавить новый реквизит(колонку) «ФизЛицо», заполнить ее значениями из строк ТЗзапроса и отобразить на форме

   Drac0

17 — 14.05.15 — 18:13

(16) значит, где то ошибка. В моем примере происходит именно создание колонок таблицы.

   altaykniga

18 — 14.05.15 — 19:23

делаю так:

ТЗзапроса = Запрос.Выполнить().Выгрузить();

ЗначениеВРеквизитФормы(ТЗЗапроса , «ТаблицаЗначенийФормы»);

после этого ТаблицаЗначенийФормы.Количепство()=4, т.е. из ТЗЗапроса данные загрузились вроде как… Осталось как-то к этим данным обратиться и вывести их на форму. Как?

   altaykniga

19 — 14.05.15 — 20:20

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

   hhhh

20 — 14.05.15 — 20:42

(19) если одна колонка, то тупо ее создать у реквизита, не программно.

   altaykniga

21 — 14.05.15 — 20:44

(20) колонок будет несколько

   hhhh

22 — 14.05.15 — 20:46

если имена заранее известны, тупо все создайте и не парьтесь.

   altaykniga

23 — 14.05.15 — 20:50

(22) не известны имена заранее

  

Drac0

24 — 14.05.15 — 21:15

(19) саму таблицу размести на форме заранее. К новым реквизитам создавай элементы формы в этом элементе таблицы.

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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");
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

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

Таблицы состоят из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.

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

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

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

Создание таблицы значений

Как и большинство объектов встроенного языка, новая таблица значений может быть создана с помощью оператора Новый:

тз = Новый ТаблицаЗначений;

Колонки таблицы значений

Прежде чем начать работу с таблицей значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:

  1. Имя — идентификатор колонки (может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания);
  2. Заголовок — представление колонки в диалогах (может содержать произвольные символы);
  3. ТипЗначения — тип значения содержимого ячеек в этой колонке. Если тип не задан, в ячейке можно хранить значения произвольного типа;
  4. Ширина — ширина колонки в диалогах;

Доступ к колонкам производится через свойство Колонки объекта ТаблицаЗначений. Для добавления новой колонки используется метод Добавить():

тз.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
тз.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
тз.Колонки.Добавить("Свойство");//можно хранить произвольные данные

Для того, чтобы определить наличие колонки с нужным именем используется метод Найти():

найдКолонка = тз.Колонки.Найти("Наименование");
Если найдКолонка = Неопределено Тогда
	Сообщить("Колонка не найдена!");
КонецЕсли;

Перебор колонок выполняется следующим образом:

Для каждого Колонка Из тз.Колонки Цикл 
    Сообщить(Колонка.Имя); 
КонецЦикла;

Для удаления колонки используется метод Удалить():

найдКолонка = тз.Колонки.Найти("Свойство");
Если НЕ найдКолонка = Неопределено Тогда
	тз.Колонки.Удалить(найдКолонка);
КонецЕсли;

Свойства колонки таблицы значений

Имя Тип Описание
Имя Строка символьный идентификатор колонки, по которому к ней можно обращаться из кода
Заголовок Строка строковое представление колонки на форме
ТипЗначения ОписаниеТипов свойство органичивает пространство доступных значений, которые можно указать в данной колонке
Ширина Число ширина колонки на форме (выражается в количестве символов)

Методы коллекции колонок таблицы значений

Вставить() Вставляет новую колонку в указанную позицию коллекции
Добавить() Добавляет новую колонку в конец коллекции
Количество() Возвращает количество колонок в коллекции
Найти() Ищет колонку в коллекции по имени
Очистить() Удаляет все колонки из коллекции
Сдвинуть() Сдвигает колонку влево или вправо
Удалить() Удаляет колонку из коллекции

Строки таблицы значений

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

Добавление и удаление строк

Для добавления новой строки используется метод Добавить() объекта ТаблицаЗначений. Метод возвращает объект СтрокаТаблицыЗначений, с которым доступны дальнейшие манипуляции:

СтрокаТЧ = тз.Добавить();

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

СтрокаТЧ.Наименование = "Стул деревянный";
СтрокаТЧ.Количество = 1;
СтрокаТЧ.Свойство = ТекущаяДата();

Обратите внимание, что каждая СтрокаТаблицыЗначений ссылается на таблицу значений с помощью метода Владелец():

тз = СтрокаТЧ.Владелец();

Для удаления строки используется метод Удалить() объекта ТаблицаЗначений. Строку можно удалить либо передав методу непосредственно строку, либо ее индекс:

//непосредственное удаление строки
тз.Удалить(СтрокаТЧ);
//удаление строки по индексу
тз.Удалить(тз.Индекс(СтрокаТЧ));

Перебор строк таблицы значений

Для перебора строк удобнее всего использовать оператор цикла Для Каждого. В редких случаях оправдано применение цикла Для:

Для Каждого СтрокаТЧ Из тз Цикл
	ИндСтроки = тз.Индекс(СтрокаТЧ);
КонецЦикла;
//в редких случаях
Для ИндСтроки = 0 По тз.Количество() - 1 Цикл
	СтрокаТЧ = тз.Получить(ИндСТроки);
КонецЦикла;

Поиск строк

В отличие от платформы 1С:Предприятие 7.7 в 8-ке расширен функционал работы с таблицей значений. Поиск можно выполнять не только по значению в колонке (в этом случае будет возвращена первая найденная строка), но и по набору свойств (в этом случае возвращается массив строк):

//поиск первой строки
НайдСтрока = тз.Найти(Номенклатура, "Номенклатура");
//поиск набора строк
ПараметрыПоиска = Новый Структура("Номенклатура", Номенклатура);
мНайдСтроки = тз.НайтиСтроки(ПараметрыПоиска);

Все методы таблицы значений:

Вставить() Вставляет строку на указанное место
ВыбратьСтроку() Позволяет интерактивно выбрать строку в диалоговом окне
ВыгрузитьКолонку() Выгружает значения ячеек указанной колонки в массив значений
Добавить() Добавлет новую строку в таблицу значений
ЗагрузитьКолонку() Загружает значения в ячейки указанной колонки из массива
ЗаполнитьЗначения() Заполняет ячейки указанных колонок определенным значением
Индекс() Возвращает индекс строки таблицы значений
Итог() Возвращает просуммированный итог по колонке таблицы значений
Количество() Возвращает количество строк в таблице значений
Найти() Выполняет поиск строки по значению
НайтиСтроки() Выполняет поиск строк по указанным параметрам
Очистить() Очищает строки таблицы значений
Получить() Возвращает строку по ее индексу
Свернуть() Выполняет сжатие строк и колонок таблицы значений
Сдвинуть() Сдвигает строку вверх или вниз по таблице
Скопировать() Создает новую таблицу значений копированием текущей
СкопироватьКолонки() Создает новую пустую таблицу значений путем копирования колонок текущей таблицы
Сортировать() Выполняет сортировку строк таблицы значений по указанным колонкам
Удалить() Удаляет строку таблицы значений

Иерархию свойств и типов значений, связанных с таблицей значений, схематически можно представить в виде дерева:

Читайте также:

  1. Как объединить таблицы значений
  2. Как программно выгрузить таблицу значений
  3. Как правильно загрузить значений в колонку таблицы значений из массива

Поделиться страницей в соц.сетях

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

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

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

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

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

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

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

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

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

    Иначе

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

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

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

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

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

Справка

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

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

Параметры:

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

Описание:

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

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

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

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

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

Параметры:

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

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

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

Описание:

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

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

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

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

В данной статье описаны примеры программного создания объектов управляемой формы 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)

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

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

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

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

[wp_ad_camp_3]

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

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

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

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

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

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

[wp_ad_camp_3]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[wp_ad_camp_3]

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