Разработка и Конфигурация · 10 мин
Как табличный документ выгрузить в таблицу значений в 1С
Практические способы преобразовать табличный документ 1С в таблицу значений: через построитель запроса, чтение областей и обход ячеек. Примеры кода, ошибки, проверка результата.
Табличный документ в 1С — это объект, ориентированный на отображение и печать: ячейки, оформление, объединённые области. Таблица значений — структура данных для обработки: колонки, строки, типизированные значения. Задача «выгрузить табличный документ в таблицу значений» возникает при загрузке данных из Excel-файлов, при разборе макетов и при обработке отчётов, сформированных в табличный документ.
Главная сложность в том, что прямого универсального метода «ТабличныйДокументВТаблицуЗначений» в платформе нет. Разработчику доступны три рабочих подхода: построитель запроса по табличному документу, построчное чтение областей и ручной обход ячеек. Каждый подходит в своей ситуации и имеет ограничения по типам данных, объединённым ячейкам и производительности.
Ниже разобраны все три способа с кодом, критериями выбора, проверкой результата и типичными ошибками. Примеры написаны на встроенном языке 1С и работают как на сервере, так и на клиенте там, где это допустимо.
Чем табличный документ отличается от таблицы значений
Табличный документ хранит ячейки с оформлением: шрифты, цвета, границы, объединения, параметры расшифровки. Значение ячейки может быть текстом, а реальные типизированные данные (числа, даты, ссылки) лежат в параметре расшифровки, если отчёт формировался с расшифровкой. Поэтому «выгрузка» — это всегда интерпретация содержимого, а не механическое копирование.
Таблица значений — это плоская структура: набор колонок с именами и типами и набор строк. При преобразовании нужно заранее решить, какие колонки будут в результате, какие типы им присвоить и что делать с пустыми и объединёнными ячейками. От этих решений зависит, какой способ выбрать.
Способ 1: построитель запроса по области табличного документа
Самый короткий путь — использовать объект ПостроительЗапроса, указав в качестве источника данных область табличного документа. Построитель сам формирует колонки по первой строке области и возвращает результат запроса, который выгружается в таблицу значений методом Выгрузить().
ОбластьДанных = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьДанных);
Построитель.Выполнить();
ТаблицаЗначений = Построитель.Результат.Выгрузить();
Имена колонок берутся из текста ячеек первой строки области, поэтому первая строка должна содержать заголовки без спецсимволов, которые недопустимы в именах колонок (пробелы и дефисы построитель обычно заменяет, но полагаться на это не стоит). Все значения в результате будут строками или числами — типы определяются по содержимому ячеек, ссылки и даты из расшифровки так не восстановить.
Ограничение способа: область должна быть прямоугольной и однородной. Если в табличном документе есть шапка отчёта, итоговые строки или многоуровневые группировки, их придётся исключать, задавая область вручную по номерам строк.
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область(2, 1, ТабДок.ВысотаТаблицы, 5));
Построитель.Выполнить();
ТЗ = Построитель.Результат.Выгрузить();Способ 2: построчное чтение областей
Когда структура документа известна заранее (например, это макет загрузки из Excel с фиксированными колонками), надёжнее пройти по строкам и прочитать каждую ячейку через Область().Текст или Область().Параметр. Этот способ даёт полный контроль над типами и позволяет пропускать служебные строки.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Наименование = ТабДок.Область(НомерСтроки, 1).Текст;
Если ПустаяСтрока(Наименование) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = Наименование;
НоваяСтрока.Количество = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(ТабДок.Область(НомерСтроки, 2).Текст);
НоваяСтрока.Цена = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(ТабДок.Область(НомерСтроки, 3).Текст);
КонецЦикла;
Явное описание колонок с типами — главное преимущество подхода: вы сами решаете, как преобразовывать текст ячейки. Это позволяет корректно обрабатывать числа с разделителями, даты в разных форматах и пустые значения, не получая в результате «всё строками».
Способ 3: чтение значений из расшифровки
Если табличный документ сформирован отчётом (например, через СКД или Вывести() с расшифровкой), реальные типизированные значения лежат в параметре Расшифровка ячейки. Тогда вместо текста ячейки можно взять значение расшифровки и получить ссылки, даты и числа в исходных типах.
Для документов, сформированных программно через Вывести(Область) с заполненными параметрами, доступно и свойство Параметр области: ТабДок.Область(НомерСтроки, НомерКолонки).Параметр вернёт значение параметра макета. Это самый точный способ, но он работает только если документ создан в вашем коде с расшифровкой или параметрами — для загруженных из Excel файлов расшифровки нет.
Как выбрать способ под свою задачу
Выбор зависит от источника табличного документа и требований к типам данных. Простое правило: чем меньше вы контролируете структуру документа, тем ближе к ручному обходу ячеек стоит сместиться.
Как выбрать действие
Отдельно учитывайте объём. Построитель запроса и обход по областям работают приемлемо на документах в тысячи строк. На очень больших документах обращение к каждой ячейке через Область() заметно медленнее — в этом случае выгоднее получить область строки целиком и читать её ячейки.
Сравнение вариантов
Быстро и коротко. Ограничение: типы определяются автоматически, расшифровка игнорируется, нужна однородная область.
Полный контроль над типами и пропуском строк. Ограничение: больше кода, медленнее на больших документах.
Точные типы: ссылки, даты, числа. Ограничение: работает только для документов, сформированных с расшифровкой.
Проверка результата после преобразования
После выгрузки обязательно проверьте три вещи: количество строк, типы колонок и наличие пустых значений там, где их быть не должно. Самая частая неприятность — числа, попавшие в таблицу как строки, из-за чего последующие сравнения и итоги работают неверно.
Как проверить результат
ТЗ.Количество() равно числу строк данных в документе минус шапка
Строк больше или меньше — попали служебные строки или потеряны данные
Числовые колонки имеют тип Число, суммы сходятся с документом
Числа хранятся строками, итоги по колонке не считаются
Пустых ячеек в ключевых колонках нет или их число ожидаемо
Пропуски там, где в документе были данные — сбились координаты областей
Быстрый способ визуальной проверки — вывести полученную таблицу значений обратно в табличный документ через ПостроительОтчета или просто пройтись по строкам в отладчике и сравнить несколько случайных строк с исходным документом.
Типичные ошибки и ограничения
Ещё одно ограничение касается прав: код с построителем запроса и обходом табличного документа обычно выполняется на сервере в привилегированном контексте при загрузке файлов. Если обработка работает на тонком клиенте, убедитесь, что табличный документ доступен в том контексте, где выполняется преобразование, — передача большого табличного документа между клиентом и сервером может быть дорогой.
FAQ
Можно ли выгрузить табличный документ в таблицу значений одной командой?
Нет, штатного метода-конвертера в платформе нет. Ближайший по краткости вариант — построитель запроса по области документа: три-четыре строки кода, но с ограничениями по типам и структуре.
Почему после выгрузки числа стали строками?
Построитель определяет тип колонки по содержимому, а текст ячеек с неразрывными пробелами, разделителями групп или смешанным содержимым трактуется как строка. Решение — явное описание колонок и ручное преобразование через СтрокаВЧисло.
Как получить ссылки из табличного документа отчёта?
Если отчёт сформирован с расшифровкой, читайте свойство Расшифровка ячейки — там лежит типизированное значение, включая ссылки. Из текста ячейки ссылку восстановить нельзя, только поиском по представлению, что ненадёжно.
Что делать с объединёнными ячейками?
Значение объединения хранится в его левой верхней ячейке. При обходе читайте именно её координаты, а для остальных ячеек объединения либо дублируйте значение программно, либо пропускайте — в зависимости от логики загрузки.
Какой способ быстрее на больших документах?
Построитель запроса обычно быстрее, так как обрабатывает область целиком. Поштучное чтение ячеек через Область() на десятках тысяч строк заметно медленнее — там стоит брать область строки и работать с её ячейками.
Что важно запомнить
Универсального метода преобразования нет: для простых таблиц используйте построитель запроса, для строгих типов — обход областей с явным описанием колонок, для отчётов с расшифровкой — чтение значений из расшифровки. Всегда проверяйте количество строк, типы колонок и пустые значения перед использованием результата.