Скидки до 55% и 3 курса в подарок 0 дней 09 :23 :01 Выбрать курс
Код
#статьи

Таблица значений в «1С»: руководство для новичков

Подробное руководство по таблице значений в «1С»: создание, добавление колонок, отбор, сортировка, поиск, группировка и не только.

Иллюстрация: Оля Ежак для Skillbox Media

Таблица значений в «1С:Предприятии» — один из самых часто используемых объектов при обработке данных в памяти. Она позволяет удобно хранить и обрабатывать табличную информацию без записи в базу данных.

В этой статье мы разберём, что такое таблица значений, как она устроена, как с ней работать и в каких случаях её использование наиболее эффективно.

Содержание


Кратко про «1С:Предприятие»

Прежде чем перейти к таблице значений, кратко расскажем про организацию данных в «1С:Предприятии».

В «1С:Предприятии» данные организованы через метаданные — структуру, описывающую объекты учёта (справочники, документы, регистры, планы и так далее). Логическая модель данных задаётся в конфигурации, а физическое хранение обеспечивается реляционной базой данных (PostgreSQL, Microsoft SQL Server, SQLite и другими).

Скриншот: «1С:Предприятие 8.3». Конфигуратор / Skillbox Media

Каждый объект в 1С (например, справочник «Товары» или документ «Поступление») транслируется в одну или несколько таблиц СУБД. Данные сохраняются в этих таблицах автоматически, а разработчику обычно не нужно взаимодействовать с SQL напрямую: работа идёт через встроенный язык 1С и механизмы платформы.

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

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

ТаблицаЗначений позволяет собирать, сортировать, фильтровать и анализировать данные в оперативной памяти. После завершения процедуры (например, модуля или сеанса) она исчезает, но её содержимое можно вывести на печать или явно сохранить в постоянный объект: справочник, документ, регистр или внешний файл.

Обычно она используется:

  • при формировании отчётов;
  • для временного накопления данных перед записью;
  • в обработках и обработчиках событий;
  • для обмена данными между модулями;
  • при подготовке информации к отображению на форме.

Теперь попробуем разобраться с таблицами на примере.

Где будем практиковаться

Создадим пустую конфигурацию, где будем тестировать свой код. Зайдём в раздел ОбщиеКоманды и добавим новую команду ОбщаяКоманда1 с синонимом Создание таблицы значений — это название отобразится в программе. Добавим команду в группу ПанельНавигации.Обычное. Там она будет находиться при запуске программы «1С:Предприятие».

Скриншот: «1С:Предприятие 8.3». Конфигуратор / Skillbox Media

Откроем модуль команды и добавим новую процедуру ОбработкаКомандыНаСервере ().

Скриншот: «1С:Предприятие 8.3». Конфигуратор / Skillbox Media

В этой процедуре мы дальше разместим код.

Как создать таблицу значений

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

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

Колонки добавляются методом Колонки.Добавить ().

Синтаксис этого метода:

Добавить (<Имя>, <Тип>, <Заголовок>, <Ширина>)

Где:

  • Имя — это имя колонки таблицы. Это обязательный параметр.
  • Тип — тип данных, которые будут храниться в колонке. По умолчанию — Строка.
  • Заголовок — заголовок колонки, который увидит пользователь, если таблица будет создана программно на форме.
  • Ширина — длина колонки, то есть количество символов в ней.
тСмартфоны.Колонки.Добавить("Модель");
тСмартфоны.Колонки.Добавить("Производитель");

Мы добавили две текстовые (строковые) колонки: Модель и Производитель. Тип данных в колонке мы не меняем — это Строка.

Зададим тип колонок:

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

Здесь:

  • Создаём тип данных Число с длиной «10» и двумя знаками после запятой. Теперь значения в колонке Цена будут числовыми, например: 54 990,00.
  • Добавляем колонки Цена и Количество с этим типом.

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

// iPhone 15
Стр = тСмартфоны.Добавить();
Стр.Модель = "iPhone 15";
Стр.Производитель = "Apple";
Стр.Цена = 99990;
Стр.Количество = 1;
// Galaxy S24
Стр = тСмартфоны.Добавить();
Стр.Модель = "Galaxy S24";
Стр.Производитель = "Samsung";
Стр.Цена = 89990;
Стр.Количество = 1;
// Xiaomi 13T 
Стр = тСмартфоны.Добавить();
Стр.Модель = "Xiaomi 13T";
Стр.Производитель = "Xiaomi";
Стр.Цена = 54990;
Стр.Количество = 2;
// Xiaomi 13T 
Стр = тСмартфоны.Добавить();
Стр.Модель = "Xiaomi 14T";
Стр.Производитель = "Xiaomi";
Стр.Цена = 74890;
Стр.Количество = 1;

Как перебрать строки и столбцы

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

Для Каждого Стр Из тСмартфоны Цикл
    Сообщить(Стр.Модель + " / " + Стр.Производитель + " -- " + Стр.Цена + " ₽ / "  + Стр.Количество + "шт.");
КонецЦикла;

Здесь:

  • Цикл проходит по всем строкам таблицы значений тСмартфоны.
  • На каждой итерации переменная Стр получает одну строку таблицы.
  • Команда Сообщить () выводит строку в окно сообщений 1С (в нижней части экрана).

Вот как это будет выглядеть в конфигураторе:

Скриншот: «1С:Предприятие 8.3». Конфигуратор / Skillbox Media

Обновим конфигурацию, перейдём в «1С:Предприятие» и запустим команду на выполнение. В результате получим:

Скриншот: «1С:Предприятие 8.3» / Skillbox Media

Точно так же мы можем вывести на печать названия всех колонок таблицы:

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

//Модель
//Производитель
//Цена
//Количество

Как посчитать итоги

Теперь добавим колонку «Сумма» и посчитаем сумму по каждому смартфону:

тСмартфоны.Колонки.Добавить("Сумма", ТипЧисло);
Для Каждого Стр Из тСмартфоны Цикл
   Стр.Сумма = Стр.Цена * Стр.Количество;
КонецЦикла;

Выведем итоговую стоимость всех смартфонов:

Сообщить(тСмартфоны.Итог("Сумма")); // 374 850

Как найти строку в таблице значений

Это можно сделать разными способами.

По индексу

Строки в таблице значений индексируются с 0 до номера последней строки в таблице, уменьшенного на единицу. Строку можно получить по номеру индекса. Но если такого индекса не существует, возникнет ошибка. Поэтому полезно сначала проверить, что заданный индекс меньше количества строк в таблице, например:

Если тСмартфоны.Количество() > 2 Тогда
    Строка = тСмартфоны.Получить(2);
    Сообщить(Строка.Модель);
 КонецЕсли; // Xiaomi 13T

По значению в колонке

В этом случае программа возвратит первую найденную строку с заданным значением:

//Поиск первой строки
НайденнаяСтрока = тСмартфоны.Найти("Galaxy S24", "Модель");
Сообщить(НайденнаяСтрока.Количество); // 1

Как удалить одну или несколько строк

Строки можно удалять с помощью метода Удалить (Индекс). Но удалять несколько строк нужно осторожно: если одновременно запустить прямой перебор и удалять индексы, индексы сместятся и программа удалит не то, что надо.

Разберём несколько способов удаления строк.

Удаление одной строки по индексу

Если вы точно знаете индекс (не забывайте вычитать из количества строк единицу):

//Перед удалением желательно проверить количество строк:
Если тСмартфоны.Количество() > 2 Тогда
	тСмартфоны.Удалить(2);
КонецЕсли;

Удаление первой строки, удовлетворяющей условию

Для Каждого Стр Из тСмартфоны Цикл
	Если Стр.Производитель = "Xiaomi" Тогда
		тСмартфоны.Удалить(тСмартфоны.Индекс(Стр));
		Прервать; // Чтобы удалить только первую подходящую строку
	КонецЕсли;
КонецЦикла;

Здесь мы находим в таблице первую строку, удовлетворяющую условию, определяем её индекс и удаляем с помощью метода Удалить ().

Удаление нескольких строк с конца — безопасный способ

Чтобы удалить все строки, соответствующие условию, лучше идти с конца таблицы: в этом случае индексы не смещаются:

Кол =  тСмартфоны.Количество() - 1;

Для Индекс = -Кол По 0 Цикл
	Стр = тСмартфоны.Получить(-Индекс);
	Если Стр.Производитель = "Xiaomi" Тогда
		тСмартфоны.Удалить(-Индекс);
	КонецЕсли;
КонецЦикла;

Это безопасный способ, если нужно удалить сразу несколько строк по условию.

Очистить всю таблицу

тСмартфоны.Очистить(); // Удаляет все строки

Этот метод удаляет из таблицы все строки, остаются одни пустые колонки.

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

В «1С:Предприятии» таблицу значений можно отсортировать по одной или нескольким колонкам с помощью метода Сортировать (). В качестве параметра используется строка с названиями колонок и направлениями сортировки — по возрастанию или убыванию.

тСмартфоны.Сортировать("Производитель Убыв, Модель Возр");
Для Каждого Стр Из тСмартфоны Цикл
	Сообщить(Стр.Производитель + " / " + Стр.Модель);
КонецЦикла;
//Xiaomi / Xiaomi 13T
//Xiaomi / Xiaomi 14T
//Samsung / Galaxy S24
//Apple / iPhone 15

Мы сортируем таблицу сначала по колонке Производитель — по убыванию, а затем по колонке Модель — по возрастанию. Результат выводим на экран.

Отбор строк

Чтобы отобрать строки, удовлетворяющие условию, нужно использовать структуру, содержащую название колонки и значение для отбора. В результате программа возвращает массив строк:

ПараметрыПоиска = Новый Структура("Производитель", "Xiaomi",);
НайденныеСтроки = тСмартфоны.НайтиСтроки(ПараметрыПоиска);
	
Для Каждого Элемент Из НайденныеСтроки Цикл
	Сообщить(Элемент.Модель);
КонецЦикла;
//Xiaomi 14T
//Xiaomi 13T

Здесь:

  • Сначала создаём структуру ПараметрыПоиска с ключом «Производитель» и значением «Xiaomi».
  • Команда НайтиСтроки (ПараметрыПоиска) отбирает из таблицы значений тСмартфоны строки и выгружает их в массив НайденныеСтроки.
  • Выводим значения этих строк на экран, используя оператор цикла Для Каждого.

Можно сделать отбор по нескольким колонкам:

Отбор = Новый Структура();
Отбор.Вставить("Производитель", "Xiaomi");
Отбор.Вставить("Количество", 1);
НайденныеСтроки = тСмартфоны.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() > 0 Тогда
	Для Каждого Элемент Из НайденныеСтроки Цикл
		Сообщить(Элемент.Модель);
	КонецЦикла;
КонецЕсли;
//Xiaomi 14T

Как скопировать таблицу

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

Копируем всю таблицу

ТЗКопия = тСмартфоны.Скопировать();

Здесь создаём новую таблицу, содержащую все строки и колонки исходной.

Копируем по отбору

ТЗОтбор = тСмартфоны.Скопировать(Новый Структура("Производитель", "Xiaomi"));

Здесь создаём новую таблицу, содержащую все колонки и отобранные строки исходной таблицы.

Копируем одну структуру, без строк

ТЗКолонки = тСмартфоны.СкопироватьКолонки();

Копируем только нужные колонки

ТЗКолонки = тСмартфоны.СкопироватьКолонки("Модель, Производитель");
	
Для Каждого Колонка Из ТЗКолонки.Колонки Цикл
        Сообщить(Колонка.Имя);
КонецЦикла; 

//Модель
//Производитель

Как свернуть таблицу значений

Чтобы свернуть таблицу значений по определённым группировкам используем метод Свернуть (КолонкиГруппировок, КолонкиСуммирования).

КолонкиГруппировок — это строка с перечнем имён колонок, по значениям которых нужно объединить строки.

КолонкиСуммирования — строка с именами колонок, в которых будут записаны суммы по сгруппированным строкам.

В результате строки с одинаковыми значениями сворачиваются в одну строку, а в колонки суммирования заносятся итоговые суммы по свёрнутым строкам. Колонки, не указанные в методе Свернуть (), удаляются.

тСмартфоны.Свернуть("Производитель", "Количество, Сумма");
	
Для каждого Строка ИЗ тСмартфоны Цикл
	Сообщить("" + Строка.Производитель + " " + Строка.Количество + "шт. на сумму " + Строка.Сумма + "₽");
КонецЦикла;

//Apple 1 шт. на сумму 99 990₽
//Samsung 1 шт. на сумму 89 990₽
//Xiaomi 3 шт. на сумму 184 870₽

Как добавить данные из другой таблицы

Создадим таблицу тСмартфоны1 с теми же колонками, что и тСмартфоны.

тСмартфоны1 = тСмартфоны.СкопироватьКолонки();

Добавим в неё строки:

// iPhone 16
Стр = тСмартфоны1.Добавить();
Стр.Модель = "iPhone 16 Plus";
Стр.Производитель = "Apple";
Стр.Цена = 116990;
Стр.Количество = 1;
// Galaxy А35
Стр = тСмартфоны1.Добавить();
Стр.Модель = "Galaxy A35";
Стр.Производитель = "Samsung";
Стр.Цена = 26190;
Стр.Количество = 2;

Нам нужно перенести строки из Смартфон1 в Смартфон. Это можно сделать, построчно добавляя новую строку в таблицу Смартфон и записывая в каждую колонку значения из соответствующей колонки Смартфон1:

Для каждого Стр Из тСмартфоны1 Цикл
		
	НоваяСтрока = тСмартфоны.Добавить();
	//Скопируем реквизиты строки
	НоваяСтрока.Модель = Стр.Модель;
	НоваяСтрока.Производитель = Стр.Производитель;
	НоваяСтрока.Цена = Стр.Цена;
	НоваяСтрока.Количество = Стр.Количество;
		
КонецЦикла;

У этого алгоритма есть недостаток: в коде приходится прописывать имена колонок. Поэтому лучше использовать функцию встроенного языка ЗаполнитьЗначенияСвойств ().

Для каждого Стр Из тСмартфоны1 Цикл
		
	НоваяСтрока = тСмартфоны.Добавить();
	ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
				
КонецЦикла;

Код стал намного короче и универсальнее.

Как выгрузить строки в массив структур и загрузить обратно

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

Это можно сделать с помощью функции:

Функция ТаблицаЗначенийВМассив(Таблица)
	
	Массив = Новый Массив();
	СтруктураСтрокой = "";
	НужнаЗапятая = Ложь;
	Для Каждого Колонка Из Таблица.Колонки Цикл
		Если НужнаЗапятая Тогда
			СтруктураСтрокой = СтруктураСтрокой + ",";
		КонецЕсли;
		СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
		НужнаЗапятая = Истина;
	КонецЦикла;
	Для Каждого Строка Из Таблица Цикл
		НоваяСтрока = Новый Структура(СтруктураСтрокой);
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
		Массив.Добавить(НоваяСтрока);
	КонецЦикла;
	Возврат Массив;

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

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

Функция МассивВТаблицуЗначений(Массив) 
	
	Таблица = Новый ТаблицаЗначений;
	
	Для Каждого ЭлементМассива Из Массив Цикл
		// Создаём колонки для таблицы
		Если Таблица.Колонки.Количество() = 0 Тогда
			Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл				                               
                          Таблица.Колонки.Добавить(ЗначениеСтруктуры.Ключ);



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

Как вывести таблицу значений на управляемую форму

Создадим в конфигураторе обработку, добавим на форму новый реквизит тРеквизит с типом ТаблицаЗначений и соответствующий ему элемент формы тРеквизитФорма.

Скриншот: «1С:Предприятие 8.3». Конфигуратор / Skillbox Media

Добавим команду ВывестиТаблицу и сгенерируем обработчик команды на клиенте и сервере. Привяжем команду к кнопке Вывести таблицу.

В процедуре ВывестиТаблицуНаСервере () создадим таблицу значений тСмартфоны и вызовем процедуру ВывестиТаблицуЗначенийНаФорму ():

&НаСервере
Процедура ВывестиТаблицуНаСервере()
	
	тСмартфоны = Новый ТаблицаЗначений;
	
	//Добавим колонки
	тСмартфоны.Колонки.Добавить("Модель", ,"Название модели");
	тСмартфоны.Колонки.Добавить("Производитель"); 	
	ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2)); 	
	тСмартфоны.Колонки.Добавить("Цена", ТипЧисло);
	тСмартфоны.Колонки.Добавить("Количество", ТипЧисло);  	
	// Добавим строки: 	
	// iPhone 15
	Стр = тСмартфоны.Добавить();
	Стр.Модель = "iPhone 15";
	Стр.Производитель = "Apple";
	Стр.Цена = 99990;
	Стр.Количество = 1;
	
	// Выведем ТЗ на управляемую форму
	ВывестиТаблицуЗначенийНаФорму(тСмартфоны, "тРеквизит", "тРеквизитФорма");


КонецПроцедуры

Сама процедура вывода таблицы значений на форму выглядит так:

&НаСервере
Процедура ВывестиТаблицуЗначенияНаФорму(ТЗ, ТРеквизит, ТРеквизитФорма)
    
        
    // 1. Добавляем колонки из ТЗ в реквизит тРеквизит
    
    МассивРеквизитов = Новый Массив;
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл
         МассивРеквизитов.Добавить(
            Новый РеквизитФормы(
                Колонка.Имя, Колонка.ТипЗначения,
                ТРеквизит
            )
         );
    КонецЦикла;
    
    ИзменитьРеквизиты(МассивРеквизитов);
    
    // 2. Добавляем колонки из ТЗ в элемент ТРеквизитФорма
    
    Для Каждого Колонка Из ТЗ.Колонки Цикл

        НовыйЭлемент = Элементы.Добавить(
            ТРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТРеквизитФорма]
        );
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = ТРеквизит + "." + Колонка.Имя;
    КонецЦикла;
    
    // 3. Наконец, передаём данные из ТабВКоде в ТабРеквизит

    ЗначениеВРеквизитФормы(ТЗ, ТРеквизит);

    // Готово!    

КонецПроцедуры

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

Скриншот: «1С:Предприятие 8.3» / Skillbox Media

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

Итог

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





Попробуйте бесплатно 4 топовых направления в IT

Переходите в Telegram и откройте доступ к бесплатным IT-курсам. Попробуйте себя в Python, Java, тестировании ПО, SQL и Excel. Определите, какое направление вам подходит, и получите подарки.

Пройти курс
Научитесь: Профессия 1С-программист Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована