Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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"); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
Таблица значений — это универсальная коллекция 1С, которая предназначена для хранения данных в табличном виде. Таблица значений хранит ссылки на объекты СтрокаТаблицыЗначений. Помимо строк у таблицы есть колонки. Таблицу значений нельзя создать на клиенте и нельзя передавать между клиентом и сервером.
Создание таблицы значений
Для создания таблицы значений используются конструктор:
//создание таблицы без колонок
ТаблицаДокументов = Новый ТаблицаЗначений;
В данной таблице не будет ни одной колонки и добавление в нее строк бессмысленно. Для добавления колонок нужно использовать свойство Колонки таблицы значений:
//добавление двух колонок
ТаблицаДокументов.Колонки.Добавить(«Товар»);
ТаблицаДокументов.Колонки.Добавить(«Цена»);
Теперь в таблицу можно добавить несколько строк. Добавление строк выполняется методом Добавить. Данный метод вернет строку таблицу значений. К именам колонок таблицы значений можно обращаться как к свойствам строки:
//строки добавляются методом Добавить
СтрочкаТабл = ТаблицаДокументов.Добавить();
//к колонкам можно обращаться через ее имя
СтрочкаТабл.Товар = «Диван»;
СтрочкаТабл.Цена = 1000;СтрочкаТабл.Товар = «Кресло»;
СтрочкаТабл.Цена = 500;
Типы колонок таблицы значений
В таблицу было добавлено 2 колонки. Тип не был определен и поэтому в эту колонку можно поместить любой тип данных, тип будет определяться в зависимости от типа данных значения в колонке. В примере выше тип колонки Товар — строка, а колонки Цена — число. Если добавить еще одну строку с другим типом, то тип колонки станет составным:
СтрочкаТабл.Товар = Истина;
СтрочкаТабл.Цена = Ложь;
//теперь каждая колонка составного типа
//Товар — строка и булево
//Цена — число и булево
Тип можно указать при добавлении новой колонки, тогда в нее можно будет помещать значения только данного типа, для всех остальных значений будет выполняться преобразование типа:
ТаблицаДокументов = Новый ТаблицаЗначений;
//колонка с типом Строка
ТаблицаДокументов.Колонки.Добавить(«Товар», Новый ОписаниеТипов(«Строка»));
//колонка с типом Число
ТаблицаДокументов.Колонки.Добавить(«Цена», Новый ОписаниеТипов(«Число»));СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = Истина; //в колонке будет строка «Истина»
СтрочкаТабл.Цена = Ложь; //в колонке будет 0
Работа с колонками таблицы значений
Для проверки наличия необходимой колонки в таблице можно выполнить поиск в коллекции колонок. Если такой колонки нет, то метод Найти вернет Неопределено:
ТаблицаДокументов = Новый ТаблицаЗначений; ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка")); ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число")); СтрочкаТабл = ТаблицаДокументов.Добавить(); //проверка что есть колонка Товар Если ТаблицаДокументов.Колонки.Найти("Товар") <> Неопределено Тогда СтрочкаТабл.Товар = "Диван"; КонецЕсли; //проверка что есть колонка Цена Если ТаблицаДокументов.Колонки.Найти("Цена") <> Неопределено Тогда СтрочкаТабл.Цена = 1000; КонецЕсли;
Колонку можно переименовать. При этом, значения в данной колонке сохранятся. Изменить тип колонки нельзя.
//получаем колонку КолонкаТовар = ТаблицаДокументов.Колонки.Найти("Товар"); Если КолонкаТовар <> Неопределено Тогда //меняем имя колонки КолонкаТовар.Имя = "Номенклатура"; КонецЕсли;
Колонки можно удалять, соответственно будут удалены и все значения в данной колонке:
//удаление колонки Цена
ТаблицаДокументов.Колонки.Удалить(«Цена»);//удаление всех колонок
ТаблицаДокументов.Колонки.Очистить();
Изменение значений в существующих строках
К строкам таблицы значений можно обращаться через оператор индексации [ ]. Индексация строк начинается с нуля, чтобы изменить значение в первой строке нужно использовать индекс 0:
//меняем значение в первой строке в колонке Товар
Стр[0].Товар = «Телевизор»;
Перебор строк таблицы значений
Перебрать все строки таблицы значений можно с помощью циклов Для Каждого и Для. При необходимости на каждой итерации цикла можно изменить значения колонок строки.
//через цикл Для Каждого Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл Сообщить(СтрочкаТабл.Товар); //можно менять значения колонок СтрочкаТабл.Цена = СтрочкаТабл.Цена * 1.1; КонецЦикла; //через цикл Для //метод Количество() вернет количество строк таблицы Для ё = 0 По ТаблицаДокументов.Количество()-1 Цикл Сообщить(ТаблицаДокументов[0].Товар); //можно менять значения колонок ТаблицаДокументов[0].Цена = ТаблицаДокументов[0].Цена * 1.1; КонецЦикла;
Удаление строк
Удалить строку из таблицы можно методом Удалить. Параметром можно передать индекс строки или саму строку. Для удаления всех строк таблицы можно воспользоваться методом Очистить.
//удаление первой строки
ТаблицаДокументов.Удалить(0);//параметром можно передать ссылку на строку
СтрочкаТабл = ТаблицаДокументов.Добавить();
ТаблицаДокументов.Удалить(СтрочкаТабл);//удаление всех строк
ТаблицаДокументов.Очистить();
Иногда нужно удалить несколько строк из таблицы по условию. Например, все строки, где цена меньше 100. На первый взгляд это можно сделать так:
//создаем таблицу ТаблицаДокументов= Новый ТаблицаЗначений; ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка")); ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число")); //добавим 4 строки СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Диван"; СтрочкаТабл.Цена = 1000; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Ручка"; СтрочкаТабл.Цена = 50; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Линейка"; СтрочкаТабл.Цена = 80; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Кресло"; СтрочкаТабл.Цена = 2000; Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл Если СтрочкаТабл.Цена < 100 Тогда ТаблицаДокументов.Удалить(СтрочкаТабл); КонецЕсли; КонецЦикла; Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл Сообщить(СтрочкаТабл.Товар); КонецЦикла; //в таблице остались //диван //линейка //кресло
Однако после удаления линейка осталась в таблице, хотя ее цена равна 80. Почему так произошло? При удалении строки, таблица как бы сжимается. То есть на первой итерации цикла мы получили первую строку с диваном, его цена больше 100, поэтому строка осталась. Получаем вторую строку с ручкой за 50. Так как цена меньше 100, строка была удалена. И после удаления все строки сдвинулись, третья строка переместилась на вторую позицию, четвертая на третью и т.д. На следующей итерации мы получаем третью строку, а там уже кресло за 2000. Линейка была пропущена, цикл даже не проверял ее цену.
Поэтому правильно удалять строки с конца таблицы. При удалении строки цикл может несколько раз пройти по одной строке, но точно не пропустит ни одну строку:
//создаем таблицу ТаблицаДокументов = Новый ТаблицаЗначений; ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка")); ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число")); //добавим 4 строки СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Диван"; СтрочкаТабл.Цена = 1000; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Ручка"; СтрочкаТабл.Цена = 50; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Линейка"; СтрочкаТабл.Цена = 80; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Кресло"; СтрочкаТабл.Цена = 2000; //получаем индекс максимальной строки Инд = ТаблицаДокументов.Количество() - 1; Пока Инд >= 0 Цикл //получаем строку по индексу и проверяем цену Если ТаблицаДокументов[Инд].Цена < 100 Тогда //удаляем строку ТаблицаДокументов.Удалить(Инд); КонецЕсли; //уменьшаем индекс Инд = Инд - 1; КонецЦикла; Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл Сообщить(СтрочкаТабл.Товар); КонецЦикла; //в таблице остались //диван //кресло
Другой способ — это сначала поместить все строки в массив, а потом обойти массив и удалить эти строки:
//создаем таблицу ТаблицаДокументов = Новый ТаблицаЗначений; ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка")); ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число")); //добавим 4 строки СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Диван"; СтрочкаТабл.Цена = 1000; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Ручка"; СтрочкаТабл.Цена = 50; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Линейка"; СтрочкаТабл.Цена = 80; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Кресло"; СтрочкаТабл.Цена = 2000; //массив для удаляемых строк МассивСтрок = Новый Массив; Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл Если СтрочкаТабл.Цена < 100 Тогда //добавляем строки, которые будем удалять МассивСтрок.Добавить(СтрочкаТабл); КонецЕсли; КонецЦикла; //обходим массив строк Для Каждого СтрочкаТабл Из МассивСтрок Цикл //и удаляем строки ТаблицаДокументов.Удалить(СтрочкаТабл); КонецЦикла; Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл Сообщить(СтрочкаТабл.Товар); КонецЦикла; //в таблице остались //диван //кресло
Групповое изменение значений в таблице
Можно загрузить значения из массива в одну из колонок таблицы значений, для этого используется метод ЗагрузитьКолонку:
//создаем таблицу ТаблицаДокументов = Новый ТаблицаЗначений; ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка")); ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число")); //добавим 4 строки, но без цены СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Диван"; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Ручка"; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Линейка"; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Кресло"; МассивЦен = Новый Массив; МассивЦен.Добавить(1000); МассивЦен.Добавить(50); МассивЦен.Добавить(80); МассивЦен.Добавить(2000); ТаблицаДокументов.ЗагрузитьКолонку(МассивЦен, "Цена"); //Диван = 1000 //Ручка = 50 //Линейка = 80 //Кресло = 2000
Методом ВыгрузитьКолонку можно выгрузить какую-то колонку в массив, значение из первой строки будет в первом элементе массива, второй строки во втором и т.д.
МассивТоваров = ТаблицаДокументов.ВыгрузитьКолонку(«Товар»);
С помощью метода ЗаполнитьЗначения можно заполнить какую-то колонку во всех строках одним значением:
ТаблицаДокументов.ЗаполнитьЗначения(300, «Цена»);
//цена во всех строках будет = 300
Сортировка таблицы значений
Для сортировки таблицы значений используется метод Сортировать:
//по возрастанию цены
ТаблицаДокументов.Сортировать(«Цена»);//по убыванию цены
ТаблицаДокументов.Сортировать(«Цена Убыв»);//сначала по возрастанию цены, потом по возрастанию наименованию товара
ТаблицаДокументов.Сортировать(«Цена, Товар»);
Итоги по таблице значений
Итоги можно получить по числовым колонкам таблицы. Для этого можно использовать методы Итог и Свернуть:
//создаем таблицу ТаблицаДокументов= Новый ТаблицаЗначений; ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка")); ТаблицаДокументов.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число")); //добавим 2 строки СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Диван"; СтрочкаТабл.Сумма = "1000"; СтрочкаТабл = ТаблицаДокументов.Добавить(); СтрочкаТабл.Товар = "Диван"; СтрочкаТабл.Сумма = "2000"; //Метод Итог вернет сумму по колонке Сумма = ТаблицаДокументов.Итог("Сумма"); //3000 //Метод свернуть свернет таблицу //первым параметром указывается список колонок группировки //вторым список колонок суммирования ТаблицаДокументов.Свернуть("Товар", "Сумма"); //в таблице будет одна строка //Товар = Диван //Сумма = 3000 //если какая-то колонка не указана, то она будет удалена //из результирующей таблицы ТаблицаДокументов.Свернуть("Товар"); //в таблице будет только одна колонка Товар //с одной строка Диван
Копирование таблицы значений
Для создания полной копии таблицы можно использовать метод Скопировать. Для создания новой пустой таблицы с такими же колонками — метод СкопироватьКолонки:
//создаем таблицу
ТаблицаДокументов = Новый ТаблицаЗначений;
ТаблицаДокументов.Колонки.Добавить(«Товар», Новый ОписаниеТипов(«Строка»));
ТаблицаДокументов.Колонки.Добавить(«Сумма», Новый ОписаниеТипов(«Число»));//добавим 2 строки
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = «Диван»;
СтрочкаТабл.Сумма = «1000»;СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = «Диван»;
СтрочкаТабл.Сумма = «2000»;//в Копия1 будет полная копия ТЗ
Копия1 = ТаблицаДокументов.Скопировать();//копирование только колонки Товар
Копия2 = ТаблицаДокументов.Скопировать(, «Товар»);//копирование определенных строк
ОтборСтрок = Новый Структура(«Сумма», 2000);
//в Копия3 будет только одна строка, где Сумма = 2000
Копия3 = ТаблицаДокументов.Скопировать(ОтборСтрок);//пустая копия таблицы с такими же колонками
НоваяТЗ = ТаблицаДокументов.СкопироватьКолонки();//можно указать список колонок для новой таблицы
НоваяТЗ = ТаблицаДокументов.СкопироватьКолонки(«Товар»);
Поиск в таблице значений
Для поиска в таблице значений используются 2 метода: Найти и НайтиСтроки. Метод Найти вернет первую строку с найденным значением, то есть если в таблице 2 строки с таким значением, то будет найдена только первая из них. Метод НайтиСтроки возвращает массив найденных строк и может использоваться для поиска неуникальных значений:
//создаем таблицу
ТаблицаДокументов = Новый ТаблицаЗначений;
ТаблицаДокументов.Колонки.Добавить(«Товар», Новый ОписаниеТипов(«Строка»));
ТаблицаДокументов.Колонки.Добавить(«Сумма», Новый ОписаниеТипов(«Число»));//добавим 3 строки
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = «Диван»;
СтрочкаТабл.Сумма = «1000»;СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = «Диван»;
СтрочкаТабл.Сумма = «2000»;СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = «Кресло»;
СтрочкаТабл.Сумма = «1500»;//1 параметр — что ищем
//2 параметр — список колонок для поиска
НайдСтр = ТаблицаДокументов.Найти(«Кресло», «Товар»);
//в НайдСтр будет 3 строка с креслом за 1500НайдСтр = ТаблицаДокументов.Найти(«Диван», «Товар»);
//в НайдСтр будет 1 строка с диваном за 1000НайдСтр = ТаблицаДокументов.Найти(«Комод», «Товар»);
//НайдСтр = Неопределено, ничего не найдено//ключ структуры — имя колонки
//значение структуры — значение для поиска
Отбор = Новый Структура(«Товар», «Диван»);
НС = ТаблицаДокументов.НайтиСтроки(Отбор);
//в НС будет массив с двумя первыми строками//можно искать сразу по нескольким колонкам
Отбор = Новый Структура;
Отбор.Вставить(«Товар», «Диван»);
Отбор.Вставить(«Сумма», 2000);
НС = ТаблицаДокументов.НайтиСтроки(Отбор);
//в НС будет массив с одной строкой, Диван за 2000Отбор = Новый Структура;
Отбор.Вставить(«Товар», «Комод»);
НС = ТаблицаДокументов.НайтиСтроки(Отбор);
//в НС будет пустой массив, ничего не найдено
Индексы таблицы значений
Если в таблице значений миллион строк, то поиск методами Найти и НайтиСтроки может выполняться очень долго. Для ускорения поиска можно использовать индексы. Индексы должны быть созданы по тем колонкам, по которым будет выполняться поиск. Если поиск выполняется сразу по нескольким колонкам, то должен быть создан составной индекс.
//добавление индексов
ТаблицаДокументов.Индексы.Добавить(«Товар»);
ТаблицаДокументов.Индексы.Добавить(«Сумма»);
//будут созданы 2 индекса
//при поиске по колонке Товар или по колонке Сумма
//будет использоваться индекс
//если выполнить поиск сразу по двум колонкам
//методом НайтиСтроки, то индекс не будет использоваться
//Для этого нужен составной индекс
ТаблицаДокументов.Индексы.Добавить(«Товар, Сумма»);
Смотрите также:
Электронный учебник по по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Программное решение для сдачи и подготовки к экзаменам
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки
В таблицах значений существуют строки и колонки. У каждой строки есть индекс, он начинается с нуля. Таблицу значений можно создавать с различными колонками и добавлять в нее строки. По строкам в таблице можно делать выборку и поиск, устанавливать и получать значения, сортировать, группировать и удалять строки.
Как можно создать новую таблицу значений?
// таблица значений с колонками «Код», «Номенклатура» и «Количество» ТаблицаЗначений = Новый ТаблицаЗначений(); ТаблицаЗначений.Колонки.Добавить("Код"); ТаблицаЗначений.Колонки.Добавить("Номенклатура"); ТаблицаЗначений.Колонки.Добавить("Количество");
Как добавить новую колонку с определенным типом и заголовком?
// добавляем колонку «Количество» с типом «Число», длиной в 9 символов и с точностью в 2 символа ФорматЧисла = Новый КвалификаторыЧисла(9, 2) ОписаниеТипа = Новый ОписаниеТипов("Число", ФорматЧисла); ТабЗначений.Колонки.Добавить("Количество", ОписаниеТипа, "Количество номенклатуры");
ТаблицаЗначений.Колонки.Добавить(Имя, Тип, Заголовок, Ширина)
Имя(необязательный, типСтрока, по умолчанию пустая строка). Имя колонки.Тип(необязательный, типОписаниеТипов). Объект, описывающий допустимые типы значений для колонки. Если параметр не указан, в колонке можно будет хранить значение любого типа.Заголовок(необязательный, типСтрока, по умолчанию пустая строка). Заголовок колонки таблицы значений. Используется при визуальном отображении таблицы значений.Ширина(необязательный, типЧисло, по умолчанию ноль). Ширина колонки в символах. Используется при визуальном отображении таблицы значений.
Как добавить новые строки?
ТаблицаЗначений = Новый ТаблицаЗначений(); ТаблицаЗначений.Колонки.Добавить("Код"); ТаблицаЗначений.Колонки.Добавить("Наименование"); ТаблицаЗначений.Колонки.Добавить("Количество"); // делаем выборку по номенклатуре Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл // добавляем новуй строку в таблицу значений НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока.Код = Выборка.Код; НоваяСтрока.Наименование = Выборка.Наименование; НоваяСтрока.Количество = 1; КонецЦикла;
Как выгрузить результат запроса в таблицу значений?
Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | СправочникНоменклатура.Ссылка КАК Ссылка, | СправочникНоменклатура.Код КАК Код, | СправочникНоменклатура.Наименование КАК Наименование |ИЗ | Справочник.Номенклатура КАК СправочникНоменклатура" ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
Как обойти в цикле все строки таблицы значений?
Для Каждого Строка Из ТаблицаЗначений Цикл Сообщить(Строка.Код + " " + Строка.Наименование); КонецЦикла;
КоличествоСтрок = ТаблицаЗначений.Количество(); Для Индекс = 0 По КоличествоСтрок - 1 Цикл Сообщить(ТаблицаЗначений[Индекс].Код + " " + ТаблицаЗначений[Индекс].Наименование); КонецЦикла;
Как сделать выборку строк в таблице значений с отбором?
// заполняем таблицу значений Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | СправочникНоменклатура.Ссылка КАК Ссылка, | СправочникНоменклатура.Код КАК Код, | СправочникНоменклатура.Наименование КАК Наименование |ИЗ | Справочник.Номенклатура КАК СправочникНоменклатура"; ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
// создаем отбор по ссылке на элемент справочника Отбор = Новый Структура(); Отбор.Вставить("Ссылка", Справочники.Номенклатура.НайтиПоКоду("000000003")); // ищем нужную строку Строка = ТаблицаЗначений.НайтиСтроки(Отбор); Если Строка.Количество() > 0 Тогда Сообщить(Строка[0].Код + " " + Строка[0].Наименование); КонецЕсли;
// создаем отбор по коду номенклатуры Отбор = Новый Структура(); Отбор.Вставить("Код", "000000003"); // ищем нужную строку Строка = ТаблицаЗначений.НайтиСтроки(Отбор); Если Строка.Количество() > 0 Тогда Сообщить(Строка[0].Код + " " + Строка[0].Наименование); КонецЕсли;
// создаем отбор по наименованию Отбор = Новый Структура(); Отбор.Вставить("Наименование", "трансформатор"); // ищем нужные строки Строки = ТаблицаЗначений.НайтиСтроки(Отбор); Для Каждого Строка Из Строки Цикл Сообщить(Строка.Код + " " + Строка.Наименование); КонецЦикла;
ТаблицаЗначений.НайтиСтроки(ПараметрыОтбора)
ПараметрыОтбора(обязательный, типСтруктура). Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры — искомое значение.
Осуществляет поиск строк таблицы значений, отвечающих заданным условиям поиска. Возвращает массив строк таблицы значений, соответствующих условиям поиска. Метод эффективно использовать для выборки неуникальных значений.
Массив хранит ссылки на строки таблицы значений, то есть при изменении строки в таблице, значение в массиве тоже будет измененным.
Как выполнить сортировку?
ТаблицаЗначений.Сортировать("Код Убыв, Наименование Возр");
Как вычислить итоги по колонке?
Количество = ТаблицаЗначений.Итог("Количество");
Как сделать копию таблицы значений?
Копия = ТаблицаЗначений.Скопировать();
Как свернуть таблицу значений по колонке и суммировать по количеству?
ТаблицаЗначений.Свернуть("Наименование", "Количество");
Метод Свернуть() сворачивает таблицу по колонке «Наименование» и суммирует колонку «Количество». Если существуют еще колонки, то они будут удалены.
ТаблицаЗначений.Свернуть(КолонкиГруппировок, КолонкиСуммирования)
КолонкиГруппировок(обязательный, типСтрока). Имена колонок, разделенные запятыми, по которым необходимо группировать строки таблицы значений.КолонкиСуммирования(необязательный, типСтрока). Имена колонок, разделенные запятыми, по которым необходимо суммировать значения в строках таблицы значений.
Осуществляет свертку таблицы значений по указанным колонкам группировки. Строки, у которых совпадают значения в колонках, указанных в первом параметре, сворачиваются в одну строку. Значения этих строк, хранящиеся в колонках, указанных во втором параметре, накапливаются.
Списки колонок не должны пересекаться. Колонки, не вошедшие ни в один из списков колонок, после выполнения метода удаляются из таблицы значений.
- Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу
Число. - Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип
Число, значения других типов будут игнорироваться. - Если в колонке несколько типов и среди них есть тип
Число, то в процессе суммирования будут принимать участие только значения, имеющие типЧисло, значения других типов будут игнорироваться. - Если в колонке несколько типов и среди них нет типа
Число, то результат суммирования будет 0, который будет присвоен в соответствующую колонку, где будет преобразован к значению по умолчанию для типа, установленного в колонке.
Как найти строку в таблице значений по значению?
НайденнаяСтрока = ТаблицаЗначений.Найти("000000003", "Код"); Если НайденнаяСтрока <> Неопределено Тогда Сообщить(НайденнаяСтрока.Код + " " + НайденнаяСтрока.Наименование); Иначе Сообщить("Ничего не найдено"); КонецЕсли;
ТаблицаЗначений.Найти(Значение, Колонки)
Значение(обязательный, типПроизвольный). Искомое значение.Колонки(необязательный, типСтрока, по умолчанию пустая строка). Список имен колонок, разделенных запятыми, по которым производится поиск. Если параметр не указан, поиск осуществляется по всей таблице значений.
Осуществляет поиск значения в указанных колонках таблицы значений. Возвращает строку таблицы значений, в которой содержится искомое значение. Если значение не найдено, то возвращается значение Неопределено. Метод эффективно использовать для поиска уникальных значений.
Как удалить строку или полностью очистить таблицу значений?
ТаблицаЗначений.Удалить(0); // удаляем первую строку по индексу ТаблицаЗначений.Очистить(); // полностью очищаем таблицу значений
Как получить отдельную строку?
// получаем строку таблицы значений по индексу ПерваяСтрока = ТаблицаЗначений.Получить(0);
Как вставить строку в таблицу?
// эта строка будет второй НоваяСтрока = ТаблицаЗначений.Вставить(1); Номенклатура = Справочники.Номенклатура.НайтиПоКоду("000000003"); НоваяСтрока.Ссылка = Номенклатура.Ссылка; НоваяСтрока.Код = Номенклатура.Код; НоваяСтрока.Наименование = Номенклатура.Наименование;
Дополнительные функции для работы с таблицей значений
// выгружаем колонку «Наименование» в массив Массив = ТаблицаЗначений.ВыгрузитьКолонку("Наименование"); // заполняем колонку «Количество» ТаблицаЗначений.ЗаполнитьЗначения(0, "Количество"); // получаем количество строк в таблице значений КоличествоСток = ТаблицаЗначений.Количество();
Поиск:
1С:Предприятие • Коллекция • Таблица значений • Типы данных
Объекты состоящие из нескольких однотипных элементов, такие как Массив, Структура, Список значений, Таблица значений, Соответствие, используются в программах 1С повсеместно. Рассмотрим основные приемы работы с такими объектами, по другому их можно назвать «коллекциями».
Таблица значений
&НаКлиенте
Процедура ПримерыСТЗ(Команда)
ПримерыСТЗНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПримерыСТЗНаСервере()
//Как создать таблицу значений в 1с 8.х
МояТаблица = Новый ТаблицаЗначений;
//Таблица создана, но в ней нет ни колонок ни строк, создадим колонки, затем добавим строки
//Как добавить колонки в таблицу значений в 1с 8.х
МояТаблица.Колонки.Добавить("Фамилия");
МояТаблица.Колонки.Добавить("Имя");
МояТаблица.Колонки.Добавить("Отчество");
МояТаблица.Колонки.Добавить("Возраст", Новый ОписаниеТипов("Число"), "Возраст лет"); //можно задать сразу тип и заголовок
//Как добавить строки в таблицу значений в 1с 8.х
Стр = МояТаблица.Добавить();
Стр.Фамилия = "Иванов";
Стр.Имя = "Иван";
Стр.Отчество = "Иванович";
Стр.Возраст = 21;
Стр = МояТаблица.Добавить();
Стр.Фамилия = "Петров";
Стр.Имя = "Сергей";
Стр.Отчество = "Сергеевич";
Стр.Возраст = 45;
//Как перебрать все строки в таблице значений в 1с 8.х
Для Каждого Стр Из МояТаблица Цикл
Сообщить(Стр.Фамилия + " " + Стр.Имя + " " + Стр.Отчество
+ ", возвраст: " + Стр.Возраст);
КонецЦикла;
//второй способ как перебрать все строки по индексам в таблице значений в 1с 8.х
Для ИндексСтроки=0 По МояТаблица.Количество()-1 Цикл
Стр = МояТаблица[ИндексСтроки]; //нумерация начиная с нуля
Сообщить(Стр.Фамилия + " " + Стр.Имя + " " + Стр.Отчество
+ ", возвраст: " + Стр.Возраст);
КонецЦикла;
//Как перебрать все колонки в таблице значений в 1с 8.х
Для Каждого Колонка Из МояТаблица.Колонки Цикл
Сообщить(Колонка.Имя);
КонецЦикла;
//Как выгрузить значения из колонки таблицы значений в массив в 1с 8.х
МассивФамилий = МояТаблица.ВыгрузитьКолонку("Фамилия");
//Как заполнить значения в колонке для всех строк таблицы
МояТаблица.ЗаполнитьЗначения(0, "Возраст");
//Как изменить значение в строке таблицы значений
МояТаблица[0].Возраст = 22;
МояТаблица[1].Возраст = 46;
//Как посчитать итог по колонке таблицы значений в 1с 8.х
Сообщить(МояТаблица.Итог("Возраст")); //68
//Как найти значение в таблице значений в 1с 8.х
НайденнаяСтрока = МояТаблица.Найти("Петров", "Фамилия"); //значение, колонка для поиска
Если НайденнаяСтрока <> Неопределено Тогда
Сообщить(НайденнаяСтрока.Имя+" = "+НайденнаяСтрока.Возраст); // Петров = 46
КонецЕсли;
//Как найти все строки в таблице значений по переданному значению
//добавим еще одну строку
НоваяСтрока = МояТаблица.Добавить();
НоваяСтрока.Фамилия = "Жарков";
НоваяСтрока.Возраст = 22;
Фильтр = Новый Структура("Возраст", 22);
НайденныеСтрокиМассив = МояТаблица.НайтиСтроки(Фильтр);
Для Каждого СтрокаТаблицы Из НайденныеСтрокиМассив Цикл
Сообщить(СтрокаТаблицы.Фамилия+" = "+СтрокаТаблицы.Возраст);
КонецЦикла;
//Как сдвинуть строку таблицы значений в 1с 8.х
//сдвигаем первую строку на одну позицию вперёд
СтрокаТаблицы = МояТаблица.Найти("Жарков");
МояТаблица.Сдвинуть(СтрокаТаблицы, -1); //положительное число вперед, отрицательное назад
//Как создать копию таблицы значений в 1с 8.х
КопияМояТаблица = МояТаблица.Скопировать();
//Как создать копию таблицы значений по нужным колонкам
// только две колонки будет Фамилия и Возраст
КопияМояТаблица = МояТаблица.СкопироватьКолонки("Фамилия, Возраст");
//Как создать копию таблицы значений с наложенным фильтром в 1с 8.х
Отбор = Новый Структура;
Отбор.Вставить("Возраст", 22);
//таблица будет содержать только строки с возрастом 22
КопияМояТаблица = МояТаблица.Скопировать(Отбор);
//Как свернуть таблицу значений по колонке в 1с 8.х
//свернём по возрасту с суммой ЗП
КопияМояТаблица.Колонки.Добавить("Зарплата");
КопияМояТаблица[0].Зарплата = 10000;
КопияМояТаблица[1].Зарплата = 23000;
КопияМояТаблица.Свернуть("Возраст", "Зарплата");
//Как отсортировать таблицу значений по колонке(ам) в 1с 8.х
МояТаблица.Сортировать("Возраст Убыв, Фамилия"); //колонки через запятую; необяз: Возр,Убыв, по умолчанию по возрастанию
//Как удалить строку из таблицы значений в 1с 8.3, 8.2
МояТаблица.Удалить(0); //передать индекс или строку таблицы
//Как быстро создать таблицу значений выбрав информацию из базы данных
//получить запрос, выполнить и выгрузить в таблицу значений
Запрос = Новый Запрос();
Запрос.Текст = "Выбрать ""Иванов"" КАК Фамилия, 35 КАК Возраст";
МояТаблицаВторая = Запрос.Выполнить().Выгрузить();
//Как создать и заполнить таблицу значений на форме
//1.получить таблицу значений любым способом из описанных выше
//2.создать реквизит формы
//3.создать новый элемент управления на форме
//4.конвертировать таблицу значений в реквизит формы
СоздатьТаблицуЗначенийНаФорме(МояТаблицаВторая,"ТаблицаЗначенийНаФорме", Неопределено);
//как добавить индексы в таблицу для ускорения поиска
МояТаблицаВторая.Индексы.Добавить("Фамилия");
КонецПроцедуры
&НаСервере
Процедура СоздатьТаблицуЗначенийНаФорме(ТЗ, ИмяРеквизитаТаблица, ГруппаЭлементовДляРазмещения)
// добавим таблицу: сначала саму таблицу, потом колонку.
Реквизиты = Новый Массив;
Реквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизитаТаблица, Новый ОписаниеТипов("ТаблицаЗначений")));
Для Каждого СтрокаТаблицы ИЗ ТЗ.Колонки Цикл
Реквизиты.Добавить(Новый РеквизитФормы(СтрокаТаблицы.Имя, СтрокаТаблицы.ТипЗначения, ИмяРеквизитаТаблица));
КонецЦикла;
// добавим реквизиты на форму
ИзменитьРеквизиты(Реквизиты);
// добавим элементы формы
Таб = Элементы.Добавить(ИмяРеквизитаТаблица, Тип("ТаблицаФормы"), ГруппаЭлементовДляРазмещения);
Таб.ПутьКДанным = ИмяРеквизитаТаблица;
// запретим менять положение строк и сами строки, отключим командную панель
//Таб.ИзменятьСоставСтрок = Ложь;
//Таб.ИзменятьПорядокСтрок = Ложь;
//Таб.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
Для Каждого СтрокаТаблицы ИЗ ТЗ.Колонки Цикл
Рек = Элементы.Добавить("Колонка" + СтрокаТаблицы.Имя, Тип("ПолеФормы"), Таб);
Рек.Вид = ВидПоляФормы.ПолеНадписи;
Рек.ПутьКДанным = ИмяРеквизитаТаблица + "." + СтрокаТаблицы.Имя;
Рек.Заголовок = СтрокаТаблицы.Заголовок;
КонецЦикла;
// заполним таблицу
ЗначениеВРеквизитФормы(ТЗ, ИмяРеквизитаТаблица);
КонецПроцедуры
Результат выполнения будет следующим:
You have no rights to post comments
