Как правильно считать и вывести часть табличного документа в 1С с сохранением форматирования?

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

При работе с внешними файлами формата MXL в 1С часто возникает задача вывести в реквизит формы не весь документ целиком, а только его определенную часть (например, начиная с конкретной строки или столбца). Многие разработчики на начальном этапе пытаются перебирать ячейки в цикле, считывая свойство Текст. Однако этот подход имеет существенный минус: при таком переносе теряется всё оформление — шрифты, цвета, рамки, размеры ячеек и их объединения. Давайте разберемся, как сделать это профессионально и эффективно.

Почему цикл по ячейкам — это не лучший выбор?

Когда мы используем конструкцию:


Для Строка = 1 по ТабДок.ВысотаТаблицы Цикл
    Для Колонка = 1 по ТабДок.ШиринаТаблицы Цикл
        // Чтение данных
    КонецЦикла;
КонецЦикла;

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

Решение задачи: используем метод ПолучитьОбласть

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

Рассмотрим по шагам, как это реализовать:

  1. Загружаем исходный файл в переменную типа ТабличныйДокумент.
  2. Определяем координаты необходимого фрагмента (номер начальной строки и колонки).
  3. С помощью метода ПолучитьОбласть извлекаем нужный диапазон ячеек.
  4. Выводим полученную область в целевой табличный документ методом Вывести.

Пример программного кода для реализации этого решения:


// Создаем объект для исходного файла
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Объект.Файл01);

// Получаем область, начиная с нужных координат до конца документа
// Параметры: ПерваяСтрока, ПерваяКолонка, ПоследняяСтрока, ПоследняяКолонка
Область = ТабДок.ПолучитьОбласть(ПерваяНужнаяСтрока, ПерваяНужнаяКолонка, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);

// Выводим область в наш реквизит формы ТД
ТД.Вывести(Область);

Обратите внимание: метод ПолучитьОбласть автоматически захватывает все настройки оформления, которые были применены к этому диапазону в исходном MXL файле. Это позволяет получить в реквизите формы ТД точную копию части макета без необходимости ручного восстановления рамок, объединений или высоты строк.

Дополнительный способ: метод удаления лишних областей

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

Для этого удобно использовать методы УдалитьСтроки и УдалитьКолонки:


// Удаляем лишние строки сверху
ТабДок.УдалитьСтроки(1, КоличествоУдаляемыхСтрок);

// Удаляем лишние колонки слева
ТабДок.УдалитьКолонки(1, КоличествоУдаляемыхКолонок);

// Теперь в переменной ТабДок остался только нужный нам диапазон
ТД = ТабДок;

Этот метод работает очень быстро и эффективно, так как платформа выполняет операцию удаления нативно, не прибегая к дорогостоящему перебору ячеек в цикле.

Рекомендации по оптимизации

Для создания надежных и поддерживаемых решений мы рекомендуем придерживаться следующих правил:

Теперь вы знаете, как быстро и аккуратно вырезать нужную часть документа MXL, сохранив при этом всё визуальное оформление. Применяйте предложенные методы в своих разработках, и вы увидите, насколько проще и быстрее станет ваш код!

← На главную