Загрузка данных табличного документа в таблицу значений

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

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

Описание способа

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

2. На основе области ячеек табличного документа создаем описание источника данных.
  
ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
  

3. Создаем объект ПостроительОтчета, указываем источник данных вместо текста запроса и выполняем построение отчета.
  
ПостроительОтчета = Новый ПостроительОтчета; 
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
Результат чтения данных из источника после вызова метода Выполнить() находится в свойстве Результат. Данное свойство содержит объект типа РезультатЗапроса, объект такого же типа возвращается при выполнении запроса.

4. Выгрузим  результат в таблицу значений (см. рисунок 2), вызвав метод Выгрузить() объекта типа РезультатЗапроса.
  
ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
  
Рисунок 2. Таблица значений, созданная на основании табличного документа

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

Итоговый программный код
  
Функция ПреобразоватьТабличныйДокументВТаблицуЗначений(ТабДокумент)
ПоследняяСтрока = ТабДокумент.ВысотаТаблицы;
ПоследняяКолонка = ТабДокумент.ШиринаТаблицы;
ОбластьЯчеек = ТабДокумент.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);
// Создаем описание источника данных на основании области ячеек табличного документа.
ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
// Создаем объект для интеллектуального построения отчетов,
// указываем источник данных и выполняем построение отчета.
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
// Результат выгружаем в таблицу значений.
ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
Возврат ТабЗначений
КонецФункции
Обработку с реализацией данного способа можно скачать здесь.

Комментарии

  1. Спасибо за информацию!

    ОтветитьУдалить
  2. Шикарно! Спасибо)

    ОтветитьУдалить
  3. Спасибо!!! Полезно!

    ОтветитьУдалить
  4. Отлично!
    А еще возможно из Таблицы значений выгрузить данные в табличный документ через Построитель отчета

    ОтветитьУдалить
  5. ТекстЗапроса = "ВЫБРАТЬ * ИЗ Справочник.Пользователи";
    ЗапросаДанных = Новый Запрос(ТекстЗапроса);
    РезЗапроса = ЗапросаДанных.Выполнить();

    ТабДокумент = Новый ТабличныйДокумент;
    Построитель = Новый ПостроительОтчета;
    Построитель.ИсточникДанных=Новый ОписаниеИсточникаДанных(РезЗапроса);
    Построитель.ВыводитьЗаголовокОтчета = Ложь;
    Построитель.ВыводитьШапкуТаблицы = Ложь;
    Построитель.ВыводитьПодвалОтчета = Ложь;
    Построитель.ЗаполнениеРасшифровки = ВидЗаполненияРасшифровкиПостроителяОтчета.Расшифровка;
    Построитель.Вывести(ТабДокумент);
    ТабДокумент.ТолькоПросмотр = Истина;
    ТабДокумент.Показать("Пользователи");

    ОтветитьУдалить
  6. Лучшая Статья Что Я Видел !!!

    ОтветитьУдалить
  7. Описал все без пафоса. Все слова по делу. Снимаю перед тобой Шляпу. Молодцом !!!

    ОтветитьУдалить
  8. Гениально и очень полезно.
    Спасибо.

    ОтветитьУдалить
  9. Большое, прям огроменное спасибо! Сэкономила кучу времени!

    ОтветитьУдалить
  10. Интересно, меня удивляет почему до сих пор нет встроенной функции для этого. Хотя нет, знаю - потому что наплевать.

    ОтветитьУдалить
  11. У меня ругается - Ожидается выражение "ВЫБРАТЬ"... Не могу сообразить, в чем дело? Может, подскажет кто?

    ОтветитьУдалить
    Ответы
    1. Первая считываемая строка области должна быть не пустой!

      Удалить
  12. Благодарю. Выручили.

    ОтветитьУдалить
  13. Классно! Спасибо!

    ОтветитьУдалить
  14. Спасибо, пользуюсь уже 3 года, этой замечательной функцией!

    ОтветитьУдалить
  15. Круто!
    Спасибо!

    ОтветитьУдалить
  16. Очень помогло в работе!

    ОтветитьУдалить
  17. Полученная таким способом ТЗ будет иметь все колонки строкового типа. А есть ли возможность сделать так что бы типы были реальные (число, строка, дата)?

    ОтветитьУдалить
    Ответы
    1. Если ячейки колонки содержит значение, тогда колонка будет иметь тип значения ячеек этой колонки

      Удалить
  18. Невероятно полезный, компактный код. Спасибо огромное

    ОтветитьУдалить
  19. Супер! Моментально считывается

    ОтветитьУдалить

Отправить комментарий