Таблица значений в «1С»: руководство для новичков
2026-02-21 04:15 Diff

#статьи

  • 12 сен 2025
  • 0

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

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

Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.

Таблица значений в «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

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

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

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