При разработке отчетов или обработок в 1С часто возникает желание «забрать» готовые данные из уже сформированного ТабличныйДокумент, чтобы не переписывать сложную логику расчетов. Однако попытка использовать для этих целей ПостроительОтчета или иные автоматические средства часто приводит к ошибкам. Давайте разберемся, почему так происходит и как правильно организовать процесс передачи данных.
Использование объекта ПостроительОтчета для парсинга табличных документов — это попытка переложить задачу анализа визуального представления на инструмент, предназначенный для формирования отчетов из запросов. Основная проблема заключается в том, что табличный документ в 1С — это средство отображения информации. В нем могут присутствовать:
В результате, при попытке выгрузки, вы получаете «кашу» или пустые значения. ПостроительОтчета эффективно работает только с плоскими структурами данных, а не с визуальными макетами.
Если вы столкнулись с необходимостью получать данные для дальнейших расчетов, наиболее правильным архитектурным решением будет работа с источниками данных до момента вывода в табличный документ. Рассмотрим подробнее:
Вместо того чтобы извлекать данные из «последствий переработки» (готового отчета), вернитесь к моменту формирования. Сохраните результаты ваших запросов, МенеджерВременныхТаблиц или коллекции промежуточных данных. Это позволит вам работать с чистыми объектами 1С, а не с их графическим представлением в ячейках.
Если же данные уже сформированы и у вас нет возможности переписать алгоритм, единственным надежным (хоть и трудоемким) способом является последовательный обход областей документа. Рассмотрим по шагам, как это сделать:
Верх, Лево, Низ, Право для цикла.Текст у объекта Область не вернет массив данных для диапазона.Посмотрим на пример базовой структуры такого обхода:
// Предположим, что данные начинаются со строки 5 и до конца документа
КрайняяСтрока = ТабличныйДокумент.ВысотаТаблицы;
Для НомерСтроки = 5 По КрайняяСтрока Цикл
ОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки, 1, НомерСтроки, 3);
// Получаем значения конкретных ячеек
Номенклатура = ТабличныйДокумент.Область(НомерСтроки, 1).Текст;
Цена = ТабличныйДокумент.Область(НомерСтроки, 2).Текст;
Количество = ТабличныйДокумент.Область(НомерСтроки, 3).Текст;
// Добавляем строку в нашу таблицу значений
НоваяСтрока = ТЗДанные.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Цена = Цена;
КонецЦикла;
При работе с большими табличными документами учитывайте следующие моменты:
СтрокаТаблицы). В коде вы сможете получить эту область методом ПолучитьОбласть() и работать с именованными параметрами, что гораздо надежнее, чем обращение по индексам.Массив структур или ТаблицаЗначений. Это исключает необходимость парсинга документа в будущем.Подытожим: табличный документ предназначен для глаз пользователя, а не для программной обработки. Если вы вынуждены извлекать из него данные, делайте это осторожно, ограничивая область обхода и обращаясь к ячейкам напрямую, либо, что еще лучше, работайте с данными до того, как они превратились в визуальную таблицу.