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


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

Каждый объект в 1С (например, справочник «Товары» или документ «Поступление») транслируется в одну или несколько таблиц СУБД. Данные сохраняются в этих таблицах автоматически, а разработчику обычно не нужно взаимодействовать с SQL напрямую: работа идёт через встроенный язык 1С и механизмы платформы.
Что такое таблица значений
ТаблицаЗначений — это временная структура, которая существует только в оперативной памяти во время выполнения кода. Это аналог обычной двумерной таблицы в памяти, который содержит колонки и строки.
ТаблицаЗначений позволяет собирать, сортировать, фильтровать и анализировать данные в оперативной памяти. После завершения процедуры (например, модуля или сеанса) она исчезает, но её содержимое можно вывести на печать или явно сохранить в постоянный объект: справочник, документ, регистр или внешний файл.
Обычно она используется:
- при формировании отчётов;
- для временного накопления данных перед записью;
- в обработках и обработчиках событий;
- для обмена данными между модулями;
- при подготовке информации к отображению на форме.
Теперь попробуем разобраться с таблицами на примере.
Где будем практиковаться
Создадим пустую конфигурацию, где будем тестировать свой код. Зайдём в раздел ОбщиеКоманды и добавим новую команду ОбщаяКоманда1 с синонимом Создание таблицы значений — это название отобразится в программе. Добавим команду в группу ПанельНавигации.Обычное. Там она будет находиться при запуске программы «1С:Предприятие».

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

В этой процедуре мы дальше разместим код.
Как создать таблицу значений
Вот код, который нужно разместить в процедуре ОбработкаКомандыНаСервере (), чтобы создать объект ТаблицаЗначений:
тСмартфоны = Новый ТаблицаЗначений;
Колонки добавляются методом Колонки.Добавить ().
Синтаксис этого метода:
Добавить (<Имя>, <Тип>, <Заголовок>, <Ширина>)
Где:
- Имя — это имя колонки таблицы. Это обязательный параметр.
- Тип — тип данных, которые будут храниться в колонке. По умолчанию — Строка.
- Заголовок — заголовок колонки, который увидит пользователь, если таблица будет создана программно на форме.
- Ширина — длина колонки, то есть количество символов в ней.
тСмартфоны.Колонки.Добавить("Модель");
тСмартфоны.Колонки.Добавить("Производитель");
Мы добавили две текстовые (строковые) колонки: Модель и Производитель. Тип данных в колонке мы не меняем — это Строка.
Зададим тип колонок:
ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(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С:Предприятие» и запустим команду на выполнение. В результате получим:

Точно так же мы можем вывести на печать названия всех колонок таблицы:
Для Каждого Колонка Из тСмартфоны.Колонки Цикл
Сообщить(Колонка.Имя);
КонецЦикла;
//Модель
//Производитель
//Цена
//Количество
Как посчитать итоги
Теперь добавим колонку «Сумма» и посчитаем сумму по каждому смартфону:
тСмартфоны.Колонки.Добавить("Сумма", ТипЧисло);
Для Каждого Стр Из тСмартфоны Цикл
Стр.Сумма = Стр.Цена * Стр.Количество;
КонецЦикла;
Выведем итоговую стоимость всех смартфонов:
Сообщить(тСмартфоны.Итог("Сумма")); // 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 Тогда
Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
Таблица.Колонки.Добавить(ЗначениеСтруктуры.Ключ);
КонецЦикла;
КонецЕсли;
// Добавляем данные в таблицу
НоваяСтрока = Таблица.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементМассива);
КонецЦикла;
Возврат Таблица;
КонецФункции
Как вывести таблицу значений на управляемую форму
Создадим в конфигураторе обработку, добавим на форму новый реквизит тРеквизит с типом ТаблицаЗначений и соответствующий ему элемент формы тРеквизитФорма.

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

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