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

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

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

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

Табличный документ в 1С — это объект, ориентированный на отображение и печать: ячейки, оформление, объединённые области. Таблица значений — структура данных для обработки: колонки, строки, типизированные значения. Задача «выгрузить табличный документ в таблицу значений» возникает при загрузке данных из Excel-файлов, при разборе макетов и при обработке отчётов, сформированных в табличный документ.

Главная сложность в том, что прямого универсального метода «ТабличныйДокументВТаблицуЗначений» в платформе нет. Разработчику доступны три рабочих подхода: построитель запроса по табличному документу, построчное чтение областей и ручной обход ячеек. Каждый подходит в своей ситуации и имеет ограничения по типам данных, объединённым ячейкам и производительности.

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

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

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

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

Способ 1: построитель запроса по области табличного документа

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

ОбластьДанных = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);

Построитель = Новый ПостроительЗапроса;

Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьДанных);

Построитель.Выполнить();

ТаблицаЗначений = Построитель.Результат.Выгрузить();

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

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

1c
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область(2, 1, ТабДок.ВысотаТаблицы, 5));
Построитель.Выполнить();
ТЗ = Построитель.Результат.Выгрузить();

Способ 2: построчное чтение областей

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

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

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

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

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

Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл

Наименование = ТабДок.Область(НомерСтроки, 1).Текст;

Если ПустаяСтрока(Наименование) Тогда

Продолжить;

КонецЕсли;

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

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

НоваяСтрока.Количество = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(ТабДок.Область(НомерСтроки, 2).Текст);

НоваяСтрока.Цена = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(ТабДок.Область(НомерСтроки, 3).Текст);

КонецЦикла;

Явное описание колонок с типами — главное преимущество подхода: вы сами решаете, как преобразовывать текст ячейки. Это позволяет корректно обрабатывать числа с разделителями, даты в разных форматах и пустые значения, не получая в результате «всё строками».

Способ 3: чтение значений из расшифровки

Если табличный документ сформирован отчётом (например, через СКД или Вывести() с расшифровкой), реальные типизированные значения лежат в параметре Расшифровка ячейки. Тогда вместо текста ячейки можно взять значение расшифровки и получить ссылки, даты и числа в исходных типах.

Для документов, сформированных программно через Вывести(Область) с заполненными параметрами, доступно и свойство Параметр области: ТабДок.Область(НомерСтроки, НомерКолонки).Параметр вернёт значение параметра макета. Это самый точный способ, но он работает только если документ создан в вашем коде с расшифровкой или параметрами — для загруженных из Excel файлов расшифровки нет.

Как выбрать способ под свою задачу

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

Маршрут решения

Как выбрать действие

Документ — плоская таблица с заголовками в первой строке, типы не критичныИспользуйте построитель запроса — минимум кода
Структура колонок известна, нужны строгие типы и пропуск служебных строкПострочный обход через Область().Текст с явным описанием колонок
Документ сформирован отчётом с расшифровкой, нужны ссылки и датыЧитайте значения из Расшифровка или Параметр ячеек
Есть объединённые ячейки или многоуровневая шапкаТолько ручной обход с явным указанием координат областей

Отдельно учитывайте объём. Построитель запроса и обход по областям работают приемлемо на документах в тысячи строк. На очень больших документах обращение к каждой ячейке через Область() заметно медленнее — в этом случае выгоднее получить область строки целиком и читать её ячейки.

Сравнение вариантов

Построитель запроса

Быстро и коротко. Ограничение: типы определяются автоматически, расшифровка игнорируется, нужна однородная область.

Обход областей

Полный контроль над типами и пропуском строк. Ограничение: больше кода, медленнее на больших документах.

Чтение расшифровки

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

Проверка результата после преобразования

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

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

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

Количество строк
Норма

ТЗ.Количество() равно числу строк данных в документе минус шапка

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

Строк больше или меньше — попали служебные строки или потеряны данные

Типы колонок
Норма

Числовые колонки имеют тип Число, суммы сходятся с документом

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

Числа хранятся строками, итоги по колонке не считаются

Пустые значения
Норма

Пустых ячеек в ключевых колонках нет или их число ожидаемо

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

Пропуски там, где в документе были данные — сбились координаты областей

Быстрый способ визуальной проверки — вывести полученную таблицу значений обратно в табличный документ через ПостроительОтчета или просто пройтись по строкам в отладчике и сравнить несколько случайных строк с исходным документом.

Типичные ошибки и ограничения

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

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

FAQ

Можно ли выгрузить табличный документ в таблицу значений одной командой?

Нет, штатного метода-конвертера в платформе нет. Ближайший по краткости вариант — построитель запроса по области документа: три-четыре строки кода, но с ограничениями по типам и структуре.

Почему после выгрузки числа стали строками?

Построитель определяет тип колонки по содержимому, а текст ячеек с неразрывными пробелами, разделителями групп или смешанным содержимым трактуется как строка. Решение — явное описание колонок и ручное преобразование через СтрокаВЧисло.

Как получить ссылки из табличного документа отчёта?

Если отчёт сформирован с расшифровкой, читайте свойство Расшифровка ячейки — там лежит типизированное значение, включая ссылки. Из текста ячейки ссылку восстановить нельзя, только поиском по представлению, что ненадёжно.

Что делать с объединёнными ячейками?

Значение объединения хранится в его левой верхней ячейке. При обходе читайте именно её координаты, а для остальных ячеек объединения либо дублируйте значение программно, либо пропускайте — в зависимости от логики загрузки.

Какой способ быстрее на больших документах?

Построитель запроса обычно быстрее, так как обрабатывает область целиком. Поштучное чтение ячеек через Область() на десятках тысяч строк заметно медленнее — там стоит брать область строки и работать с её ячейками.

Итог

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

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