При работе с внешними файлами формата MXL в 1С часто возникает задача вывести в реквизит формы не весь документ целиком, а только его определенную часть (например, начиная с конкретной строки или столбца). Многие разработчики на начальном этапе пытаются перебирать ячейки в цикле, считывая свойство Текст. Однако этот подход имеет существенный минус: при таком переносе теряется всё оформление — шрифты, цвета, рамки, размеры ячеек и их объединения. Давайте разберемся, как сделать это профессионально и эффективно.
Когда мы используем конструкцию:
Для Строка = 1 по ТабДок.ВысотаТаблицы Цикл
Для Колонка = 1 по ТабДок.ШиринаТаблицы Цикл
// Чтение данных
КонецЦикла;
КонецЦикла;
Мы работаем исключительно с «сырыми» значениями. Платформа 1С при таком подходе не переносит настройки оформления ячеек. Кроме того, постоянное обращение к объекту Область в цикле является «тяжелой» операцией для движка платформы, что значительно замедляет выполнение кода на больших файлах.
Наиболее правильный и производительный способ работы с частями документа — это использование метода ПолучитьОбласть. Этот метод позволяет выделить «срез» исходного табличного документа, который включает в себя не только данные, но и все параметры форматирования.
Рассмотрим по шагам, как это реализовать:
ТабличныйДокумент.ПолучитьОбласть извлекаем нужный диапазон ячеек.Вывести.Пример программного кода для реализации этого решения:
// Создаем объект для исходного файла
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Объект.Файл01);
// Получаем область, начиная с нужных координат до конца документа
// Параметры: ПерваяСтрока, ПерваяКолонка, ПоследняяСтрока, ПоследняяКолонка
Область = ТабДок.ПолучитьОбласть(ПерваяНужнаяСтрока, ПерваяНужнаяКолонка, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
// Выводим область в наш реквизит формы ТД
ТД.Вывести(Область);
Обратите внимание: метод ПолучитьОбласть автоматически захватывает все настройки оформления, которые были применены к этому диапазону в исходном MXL файле. Это позволяет получить в реквизите формы ТД точную копию части макета без необходимости ручного восстановления рамок, объединений или высоты строк.
Если задача заключается в «обрезании» документа, то есть в удалении ненужных верхних строк или левых колонок, можно пойти и от обратного. Вместо получения области можно считать файл целиком и удалить то, что не требуется.
Для этого удобно использовать методы УдалитьСтроки и УдалитьКолонки:
// Удаляем лишние строки сверху
ТабДок.УдалитьСтроки(1, КоличествоУдаляемыхСтрок);
// Удаляем лишние колонки слева
ТабДок.УдалитьКолонки(1, КоличествоУдаляемыхКолонок);
// Теперь в переменной ТабДок остался только нужный нам диапазон
ТД = ТабДок;
Этот метод работает очень быстро и эффективно, так как платформа выполняет операцию удаления нативно, не прибегая к дорогостоящему перебору ячеек в цикле.
Для создания надежных и поддерживаемых решений мы рекомендуем придерживаться следующих правил:
MXL файла известна заранее, в Конфигураторе или редакторе макета создайте именованную область (например, «Шапка» или «Данные»). Тогда в коде достаточно будет написать ТабДок.ПолучитьОбласть("ИмяОбласти"). Это защитит ваш код от поломок, если кто-то изменит количество строк или столбцов в макете.ТабличныйДокумент, такими как Вывести, Присоединить или ПолучитьОбласть. Это стандарт индустрии разработки на 1С.Параметры. Вы можете заполнять данные в ячейки перед выводом: Область.Параметры.Цена = 100;. Это делает код чистым и профессиональным.Теперь вы знаете, как быстро и аккуратно вырезать нужную часть документа MXL, сохранив при этом всё визуальное оформление. Применяйте предложенные методы в своих разработках, и вы увидите, насколько проще и быстрее станет ваш код!