Таблица значений в 1С

Информация

Конспект статьи https://programmist1s.ru/rabota-s-tablitsami-znacheniy-v-1s/

 

Таблицу значений, как любую коллекцию, можно обойти циклом.

Для Каждого Строка Из Товары Цикл



Получить нужную строку можно по индексу. Индексы в таблице значений начинается с 0 (нуля).

Строка = ТаблицаЗначений[0];

 

Примеры использования свойства и методов объекта "Таблица значений"

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

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

далее добавление колонок, добавление строк.

или

- выгрузка результата запроса в таблицу значений

- или выгрузка из табличной части документа

 

Добавить колонки в таблицу значений. Рекомендуется указывать "тип данных".

 

ТаблицаТоваров.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблицаТоваров.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));

После создания колонок добавим несколько новых строк и заполним колонки

НоваяСтрока = ТаблицаТоваров.Добавить();

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Помидоры");

НоваяСтрока.Цена = 54;



НоваяСтрока = ТаблицаТоваров.Добавить();

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Помидоры желтые");

НоваяСтрока.Цена = 50;


Добавим еще одну колонку:

ТаблицаТоваров.Колонки.Добавить("ТовГруппа", Новый ОписаниеТипов("Строка"));



Заполнить колонку в таблице перебором строк

Для Каждого Строка Из ТаблицаТоваров.ТовГруппа Цикл
Строка.ТовГруппа = "Овощи";
КонецЦикла;

Заполнить колонку одинаковым значением

ТаблицаТоваров.ЗаполнитьЗначения("Овощи", "ТовГруппа");

 

Синтаксис:

ЗаполнитьЗначения(<Значение>, <Колонки>)

если колонки не указаны, то будут заполнены все колонки



Сообщим пользователю название первого элемента (индекс таблицы значений начинается с 0)

Сообщить(ТаблицаТоваров[0].Товар);

 

Скопировать строку таблицы значений, для примера — первую

ЗаполнитьЗначенияСвойств(ТаблицаТоваров.Добавить(), ТаблицаТоваров[0]);

 

Поиск в таблице значений с ценой помощью структуры

(если на вход подавать готовые структуры?)

МассивСтрок = ТаблицаТоваров.НайтиСтроки(Новый Структура("Цена", 54));

 

Сортировка строк таблицы по выбранному полю

ТаблицаТоваров.Сортировать("Цена");

 

Получить количество строк в таблице

ВсегоСтрок = ТаблицаТоваров.Количество();

 

Выгрузить колонку таблицы значений в массив

ТаблицаТоваров.ВыгрузитьКолонку("Товар");

 

Чтобы удалить строку в таблице значений, нужно передать саму строку или индекс в метод "Удалить".

Два варианта:

//по строке
ТаблицаТоваров.Удалить(ТаблицаТоваров[ВсегоСтрок  - 1]);

//по индексу
ТаблицаТоваров.Удалить(ВсегоСтрок  - 1);

 

Полностью скопировать таблицу значений можно так:

НоваяТаблицаТоваров = ТаблицаТоваров.Скопировать();

 

Просуммировать итог по колонке таблицы значений:

СуммаЦен = ТаблицаТоваров.Итог("Цена");

 

Свернуть таблицу можно так:

ТаблицаТоваров.Свернуть("Товар", "Цена");

При этом в таблице останутся только различные значения из колонки «Товар» с суммированными полями «Цена».

Синтаксис:

Свернуть(<КолонкиГруппировок>, <КолонкиСуммирования>)

Пример:

ТаблицаЦен.Свернуть("Товар, Валюта", "Цена");

 

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

ТаблицаТоваров.Очистить();

 

Удалить все колонки

ТаблицаТоваров.Колонки.Очистить();

 

­

­

Применение таблиц значений

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

Результат запроса можно выгрузить в таблицу значений

Табличную часть документа можно выгрузить в таблицу значений

Таблицу значений можно выгрузить в табличную часть документа

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



С ИТС инфа

https://its.1c.ru/db/pubqlang/content/74/hdoc

книга Язык запросов в 1С / Использование таблицы значений в качестве источника временной таблицы

 

 

Примеры из документации 1С (синтакс-помощник)

Элементы коллекции:

СтрокаТаблицыЗначений
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве аргумента передается индекс строки (нумерация с 0).

Свойства:

Индексы (Indexes)

Колонки (Columns)

 

Методы:

Вставить (Insert) вставить строку в таблицу значений

ВыбратьСтроку (ChooseRow)

ВыгрузитьКолонку (UnloadColumn)

Добавить (Add) - добавляет строку

ЗагрузитьКолонку (LoadColumn) — загружает значения из массива в колонку таблицы

ЗаполнитьЗначения (FillValues)

Индекс (IndexOf)

Итог (Total) - выводит итог по выбранной колонке

Количество (Count)

Найти (Find) - поиск строки в таблице, содержащих значение. Эффективно для поиска уникальных значений

НайтиСтроки (FindRows)-  выводим массив строк (ссылки на строки), отвечающих условиям.

Очистить (Clear)

Получить (Get) - получает значение по индексу

Свернуть (GroupBy)

Сдвинуть (Move) — сдвигается строки внутри таблицы

Скопировать (Copy)

СкопироватьКолонки (CopyColumns)

Сортировать (Sort)

Удалить (Delete)

 

 

ТаблицаЗначений (ValueTable)

 

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

ТаблицаЗначений = Новый ТаблицаЗначений;
// добавим в таблицу значений три колонки

ТаблицаЗначений.Колонки.Добавить("Отдел",,"Отдел");
ТаблицаЗначений.Колонки.Добавить("Сотрудник",,"Фамилия сотрудника");
ТаблицаЗначений.Колонки.Добавить("Оклад",,"Оклад");

// добавим строку
Стр=ТаблицаЗначений.Добавить();
Стр.Отдел="Отдел 1";
Стр.Сотрудник="Иванов";
Стр.Оклад=5600;

// добавим новую колонку
ТаблицаЗначений.Колонки.Добавить("Стаж",,"Стаж работы");

// ввод новой строки и данных по строке
ТекСтр = ТаблицаЗначений.Добавить();
ТекСтр.Отдел = "Отдел 2";  ТекСтр.Сотрудник = "Петров";  
ТекСтр.Оклад = 6700;  ТекСтр.Стаж = 22;

 

Пример поиск строки по значению:
НайденнаяСтрока = ТаблицаЦен.Найти(ВыбТовар, "Товар");
Если НайденнаяСтрока = Неопределено Тогда
Предупреждение(НСтр("ru = 'Товар не найден!';"
+ " en = 'Article not found!'"));
Иначе
ЦенаТовара = НайденнаяСтрока.Цена;
КонецЕсли;

 

Пример поиска всех строк, содержащих значение
// СписокРаботников - реквизит формы для представления информации

// о работниках (тип ТаблицаЗначений).

// В форме расположено табличное поле СписокРаботников, в котором

// показываются данные СписокРаботников.

// С помощью запроса выбирается информация о работниках.

Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ
// текст запроса
// ...
";
Запрос.Текст = ТекстЗапроса;
СписокРаботников = Запрос.Выполнить().Выгрузить();

Отбор = Новый Структура();
Отбор.Вставить("ФизЛицо",Справочники.ФизическиеЛица.ПустаяСсылка());

Строки = СписокРаботников.НайтиСтроки(Отбор);
Если Строки.Количество() > 0 Тогда
ЭлементыФормы.СписокРаботников.ТекущаяСтрока = Строки[0];
КонецЕсли;

 

См 30.04.23

В таблицу значений нельзя добавить колонку с типом Булево (чтобы использовать как флажок,пометку в формах)?

Вот по теме

https://www.cyberforum.ru/1c-standard/thread2550348.html

Вот так?

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

 ТЗ.Колонки.Добавить("Фамилия", Новый ОписаниеТипов("Строка"),"Фамилия");

 ТЗ.Колонки.Добавить("Флаг", Новый ОписаниеТипов("Булево"),"Флаг")

 

Смотри

https://koder.by/tablica_znachenij.php

 

Смотри https://luckyea77.livejournal.com/4323031.html

 

//проверка что есть колонка Товар

Если ТаблицаДокументов.Колонки.Найти("Товар") <> Неопределено Тогда

СтрочкаТабл.Товар = "Диван";

КонецЕсли;

 

К строкам таблицы значений можно обращаться через оператор индексации [ ].

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

//меняем значение в первой строке в колонке Товар
Стр[0].Товар = "Телевизор";

 

Расписывают два способа перебора таблицы значений и выборочного удаления строк

- просматривать таблицу значений с конца;

- выгружать ссылки на нужные строки в массив значений; и после, читая массив, удалить нужные строки.

- был вариант через "НайтиСтроки" (он описан на других сайтах).

Еще я делал топорным четвертым вариантом - перебирал строки по индексам, после каждого удаления пересчитывал количество элементов таблицы и номер текущей строки уменьшал на единицу.

 

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

Для поиска в таблице значений используются 2 метода: Найти и НайтиСтроки.

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

Метод НайтиСтроки возвращает массив найденных строк и может использоваться для поиска неуникальных значений.

 

Добавление индексов в таблицы значений (если сотни тысяч и миллионы строк, то индексы нужны).

/добавление индексов
ТаблицаДокументов.Индексы.Добавить("Товар");
ТаблицаДокументов.Индексы.Добавить("Сумма");
//будут созданы 2 индекса
//при поиске по колонке Товар или по колонке Сумма
//будет использоваться индекс
//если выполнить поиск сразу по двум колонкам
//методом НайтиСтроки, то индекс не будет использоваться
//Для этого нужен составной индекс
ТаблицаДокументов.Индексы.Добавить("Товар, Сумма");

 

 

 

РСА: В обработке УправлениеКассами, где контроль заполнения МРЦ, пример хитрого отбора, примененного к таблице значений

НулевыеСтроки = ТаблицаТоваров.НайтиСтроки(Новый Структура("ПризнакНенужнойСтроки", 1));
Для Каждого СтрокаТаблицы Из НулевыеСтроки Цикл
      ТаблицаТоваров.Удалить(СтрокаТаблицы);
КонецЦикла;