Таблица значений в 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));
Для Каждого СтрокаТаблицы Из НулевыеСтроки Цикл
ТаблицаТоваров.Удалить(СтрокаТаблицы);
КонецЦикла;