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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему ПостроительОтчета — не лучший выбор?

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

В результате, при попытке выгрузки, вы получаете «кашу» или пустые значения. ПостроительОтчета эффективно работает только с плоскими структурами данных, а не с визуальными макетами.

Альтернативный подход: работа с источниками данных

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

Вместо того чтобы извлекать данные из «последствий переработки» (готового отчета), вернитесь к моменту формирования. Сохраните результаты ваших запросов, МенеджерВременныхТаблиц или коллекции промежуточных данных. Это позволит вам работать с чистыми объектами 1С, а не с их графическим представлением в ячейках.

Как реализовать обход табличного документа в цикле?

Если же данные уже сформированы и у вас нет возможности переписать алгоритм, единственным надежным (хоть и трудоемким) способом является последовательный обход областей документа. Рассмотрим по шагам, как это сделать:

  1. Определите четкие границы области данных. Не пытайтесь анализировать весь документ целиком, если в нем есть «мусор» (шапки, подвалы, пустые ячейки).
  2. Используйте координаты Верх, Лево, Низ, Право для цикла.
  3. Обращайтесь к каждой ячейке по отдельности, так как свойство Текст у объекта Область не вернет массив данных для диапазона.

Посмотрим на пример базовой структуры такого обхода:


// Предположим, что данные начинаются со строки 5 и до конца документа
КрайняяСтрока = ТабличныйДокумент.ВысотаТаблицы;
Для НомерСтроки = 5 По КрайняяСтрока Цикл
    ОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки, 1, НомерСтроки, 3);
    
    // Получаем значения конкретных ячеек
    Номенклатура = ТабличныйДокумент.Область(НомерСтроки, 1).Текст;
    Цена = ТабличныйДокумент.Область(НомерСтроки, 2).Текст;
    Количество = ТабличныйДокумент.Область(НомерСтроки, 3).Текст;
    
    // Добавляем строку в нашу таблицу значений
    НоваяСтрока = ТЗДанные.Добавить();
    НоваяСтрока.Номенклатура = Номенклатура;
    НоваяСтрока.Цена = Цена;
КонецЦикла;

Важные советы по оптимизации

При работе с большими табличными документами учитывайте следующие моменты:

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

← На главную