К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как заполнить таблицу значений в 1С

Как заполнить таблицу значений в 1С: создание колонок, добавление строк, заполнение из запроса и другой таблицы, примеры кода на встроенном языке и типичные ошибки.

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

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

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

Создание таблицы значений и описание колонок

Прежде чем заполнять таблицу, её нужно создать и описать структуру колонок. Колонки добавляются методом Колонки.Добавить(), где указывается имя колонки, тип данных и, при необходимости, заголовок. Тип задаётся через объект ОписаниеТипов.

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));

ТЗ.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)));

Явное указание типа важно по двум причинам. Во-первых, оно позволяет корректно сортировать и сравнивать значения — смешанные типы в одной колонке нередко ломают сортировку и свёртку. Во-вторых, типизированные колонки правильно отображаются при выводе таблицы на форму и в табличный документ.

Если тип заранее неизвестен или колонка должна хранить разнородные данные, можно создать составной тип, перечислив несколько типов через запятую в строке, например "СправочникСсылка.Номенклатура,СправочникСсылка.Контрагенты". Но злоупотреблять этим не стоит: составные типы замедляют работу и усложняют отладку.

Заполнение таблицы построчно в цикле

Базовый способ — добавление строк методом Добавить() и присвоение значений ячейкам по имени колонки. Метод возвращает ссылку на новую строку, которую удобно сохранить в переменную.

Для Каждого Элемент Из МассивДанных Цикл

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = Элемент.Ссылка;

НоваяСтрока.Количество = Элемент.Колво;

НоваяСтрока.Комментарий = "Загружено программно";

КонецЦикла;

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

Для заполнения строки из структуры с совпадающими именами ключей удобно использовать ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураДанных) — это короче и надёжнее ручного перечисления полей.

Заполнение таблицы значений из запроса

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Номенклатура КАК Номенклатура,

| СУММА(Товары.Количество) КАК Количество

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары КАК Товары

|ГДЕ

| Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

|СГРУППИРОВАТЬ ПО

| Товары.Номенклатура";

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));

ТЗ = Запрос.Выполнить().Выгрузить();

У этого способа есть важное ограничение: структуру колонок нельзя задать вручную — она полностью определяется запросом. Если нужна дополнительная вычисляемая колонка, её добавляют после выгрузки и заполняют в цикле по строкам таблицы.

При больших объёмах данных запрос работает существенно быстрее построчного заполнения, потому что выборка выполняется на сервере СУБД одним обращением. Если в результате нужны не все поля, перечисляйте в запросе только необходимые — это сокращает расход памяти.

Если таблица нужна только для обхода данных один раз и дальнейшая работа со строками не требуется, вместо Выгрузить() используйте Выбрать() с обходом выборки — это экономит память, так как вся таблица не материализуется целиком.
ПЗ
Практическое замечание

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

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

МетодЧто делаетКогда применять
ТЗ2 = ТЗ1.Скопировать()Полная копия структуры и данныхНужна независимая копия для изменений
ТЗ2 = ТЗ1.Скопировать(Отбор)Копия строк, удовлетворяющих отборуНужно отфильтровать часть данных
ТЗ2 = ТЗ1.СкопироватьКолонки()Копия только структуры без строкНужна пустая таблица той же структуры
ТЗ.ЗагрузитьКолонку(Массив, "Имя")Заполнение колонки из массиваЗначения одной колонки уже собраны
Массив = ТЗ.ВыгрузитьКолонку("Имя")Выгрузка колонки в массивДля передачи в запрос как параметр

Пример копирования с отбором по структуре:

Отбор = Новый Структура("Склад", СкладОтгрузки);

ТЗПоСкладу = ОбщаяТЗ.Скопировать(Отбор);

Для табличной части документа или справочника есть метод Выгрузить(), который превращает её в таблицу значений: ТЗ = Объект.Товары.Выгрузить();. Обратное действие — Объект.Товары.Загрузить(ТЗ) — заполняет табличную часть из таблицы значений, полностью заменяя существующие строки. Это стандартная пара для задач «прочитал — обработал — записал обратно».

Свертка, сортировка и поиск после заполнения

Заполненная таблица редко используется «как есть». Три типовые операции подготовки данных — свёртка, сортировка и поиск строк.

Метод Свернуть("Номенклатура", "Количество") группирует строки по указанным колонкам и суммирует числовые. Это заменяет группировку запросом, когда данные уже собраны из разных источников. Учтите: колонки, не указанные ни в группировке, ни в суммируемых, после свёртки удаляются.

Сортировка выполняется методом Сортировать("Количество Убыв, Номенклатура Возр"). Для поиска конкретной строки используйте Найти(Значение, "ИмяКолонки") — он возвращает первую найденную строку или Неопределено. Для выборки всех подходящих строк применяется НайтиСтроки(СтруктураОтбора), возвращающий массив строк.

Типовой порядок работы с таблицей значений
  1. 1
    Создайте таблицу и опишите колонки с типами
  2. 2
    Заполните строки: из запроса, циклом или копированием
  3. 3
    Выполните свёртку и сортировку под задачу
  4. 4
    Проверьте количество строк и итоги по колонкам
  5. 5
    Передайте таблицу дальше: в табличную часть, отчёт или на форму

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

Чтобы показать таблицу пользователю на управляемой форме, её помещают в реквизит формы типа «ТаблицаЗначений» с заранее созданными колонками и вызывают ЗначениеВРеквизитФормы(ТЗ, "ИмяРеквизита"). На обычной форме достаточно связать элемент «ТабличноеПоле» с данными.

Для печати или просмотра без формы таблицу выводят в табличный документ методом ПостроительОтчета либо вручную через области макета. Простой вариант без макета — отчёт на СКД, где таблица значений передаётся как внешний набор данных через КомпоновщикМакета и ПроцессорКомпоновкиДанных.

Типичные ошибки при заполнении таблицы значений

Типичные ошибки
01
Обращение к колонке, которая не была добавлена — ошибка «Поле объекта не обнаружено» при первом же присвоении
02
Смешение типов в одной колонке — некорректная сортировка, свёртка и сравнение значений
03
Использование Скопировать() там, где достаточно ссылки на исходную таблицу — лишний расход памяти на больших данных
04
Загрузка таблицы в табличную часть методом Загрузить() без очистки расчётных полей — перезапись данных, введённых пользователем
05
Поиск через Найти() в цикле вместо НайтиСтроки() или индекса — квадратичное время работы на больших таблицах

Отдельно стоит упомянуть индексы. Если по таблице часто выполняется поиск по одной и той же колонке, добавьте индекс: ТЗ.Индексы.Добавить("Номенклатура"). Это заметно ускоряет Найти() и НайтиСтроки() на больших объёмах.

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

Контрольные точки

Как проверить результат

Количество строк после заполнения
Норма

ТЗ.Количество() совпадает с ожидаемым числом записей источника

Тревожный признак

Строк меньше — потеряны данные из-за отбора или свёртки

Итог по числовой колонке
Норма

ТЗ.Итог("Количество") сходится с контрольной суммой источника

Тревожный признак

Итог расходится — дубли строк или пропущенные записи

Типы значений в колонках
Норма

Все значения колонки одного типа, сортировка работает корректно

Тревожный признак

Смешанные типы, сортировка «скачет»

Заполненность обязательных полей
Норма

Нет пустых ссылок и Неопределено в ключевых колонках

Тревожный признак

Пустые значения приведут к ошибкам при записи в базу

FAQ

Чем таблица значений отличается от табличной части документа?

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

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

Метод Вставить(0) добавляет строку в указанную позицию. Учтите, что частая вставка в начало большой таблицы работает медленно — при необходимости проще добавлять строки в конец и затем отсортировать таблицу по нужной колонке.

Можно ли заполнить таблицу значений из файла Excel или CSV?

Да, но штатного метода «загрузить из файла» у таблицы значений нет. Данные читают через табличный документ (метод Прочитать() для Excel) или построчное чтение текстового файла для CSV, а затем заполняют таблицу в цикле. В типовых конфигурациях часто есть готовые механизмы загрузки из табличного документа.

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

Используйте свёртку по всем колонкам без суммируемых полей: ТЗ.Свернуть("Колонка1,Колонка2,Колонка3") — останутся только уникальные комбинации. Если нужна сумма по числовым полям, укажите их вторым параметром.

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

Напрямую объект ТаблицаЗначений между клиентом и сервером не передаётся. Стандартный путь — поместить таблицу в реквизит формы через ЗначениеВРеквизитФормы() на сервере, после чего данные доступны на клиенте. Альтернатива — преобразование в массив структур, если реквизит формы не подходит.

Что быстрее: заполнение циклом или выгрузка запроса?

Выгрузка запроса практически всегда быстрее, так как данные отбираются на стороне СУБД одним обращением. Цикл оправдан, когда каждую строку нужно предварительно обработать, проверить или когда источник данных — не база 1С, а файл, массив или внешний сервис.

Итог

Что важно запомнить

Таблица значений создаётся конструктором, колонки описываются с типами, строки добавляются методом Добавить(). Для данных из базы используйте Выгрузить() результата запроса, для готовых наборов — Скопировать() и Загрузить(). Следите за типами колонок, проверяйте количество строк и итоги, а при больших объёмах избегайте лишней материализации данных в памяти.