Таблица значений в 1С 8.3 (1 часть)

Apr 03, 2022 14:00

Таблица значений - это универсальная коллекция 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 Тогда
//добавляем строки, которые будем удалять
МассивСтрок.Добавить(СтрочкаТабл);
КонецЕсли;
КонецЦикла;

//обходим массив строк
Для Каждого СтрочкаТабл Из МассивСтрок Цикл
//и удаляем строки
ТаблицаДокументов.Удалить(СтрочкаТабл);
КонецЦикла;

Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл
Сообщить(СтрочкаТабл.Товар);
КонецЦикла;
//в таблице остались
//диван
//кресло

Таблица значений в 1С 8.3 (2 часть)

Смотрите также:
Электронный учебник по по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Программное решение для сдачи и подготовки к экзаменам
Программирование в 1С 8.3 с нуля - краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

программирование

Previous post Next post
Up