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

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

При разработке отчетов или обработок в 1С часто возникает ситуация, когда пользователю выводится огромный табличный документ, который впоследствии требуется разбить на несколько отдельных или просто извлечь из него определенные строки (например, с 17-й по 50-ю). Давайте проанализируем, как корректно реализовать копирование части табличного документа программными средствами и с какими подводными камнями можно столкнуться.

Разберем проблему: почему метод ВставитьОбласть не работает

Начинающие (и не только) разработчики часто пытаются решить задачу "в лоб" с помощью метода ВставитьОбласть. Посмотрим на типичный пример кода, который приводит к ошибкам:


ТабДок2 = Новый ТабличныйДокумент;
ТабДок2.ВставитьОбласть(ТабДок.Область("R17C2:R50C20"), ТабДок2.Область("R17C2:R50C20"));

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

Метод ВставитьОбласть предназначен для внедрения одной области ячеек в строго определенное место другой (уже существующей) таблицы. При его использовании действует несколько жестких правил:

  1. Совпадение размеров: Фактические размеры области-источника и области-приемника должны полностью совпадать. Иначе 1С может просто обрезать переносимые данные.
  2. Физическое отсутствие строк: Когда мы создаем новый табличный документ через Новый ТабличныйДокумент, он абсолютно пуст. В нем физически еще не сформированы ни 1-я, ни 17-я строки. Попытка вставить данные сразу в 17-ю строку пустого документа приводит к неочевидному поведению и сбою границ.
  3. Смещение данных: Этот метод имеет параметры направления смещения ячеек. Он предназначен скорее для "раздвигания" существующих данных, а не для генерации новых отчетов с нуля.

Решение проблемы: используем метод Вывести

Рассмотрим правильный подход. Для переноса данных в новый документ предпочтительнее использовать метод Вывести. Он не требует точного указания координат для вставки. Платформа автоматически добавит переданную область в самый низ целевого документа, аккуратно сохранив все параметры форматирования, ширину колонок и высоту строк.

Правильный код для копирования области выглядит так:


ТабДок2 = Новый ТабличныйДокумент;
// Получаем нужную область из исходника и сразу выводим в новый документ
ТабДок2.Вывести(ТабДок.ПолучитьОбласть("R17C2:R50C20"));

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

Важный нюанс: Область() против ПолучитьОбласть()

Проанализируем еще одну частую ошибку разработчиков — путаницу между свойствами и методами получения диапазонов.

Метод Область() (например, ТабДок.Область("R1:R5")) возвращает лишь ссылку на диапазон ячеек внутри текущего табличного документа. Вы не можете просто так взять эту ссылку и корректно "вывести" ее в другой документ, так как она жестко привязана к исходнику.

Метод ПолучитьОбласть() делает совершенно другое. Он берет запрашиваемую область макета и возвращает ее как новый независимый табличный документ. Именно этот независимый кусок можно без проблем передавать в метод Вывести или Присоединить другого табличного документа.

Горизонтальное копирование: метод Присоединить

Рассмотрим ситуацию, когда нам нужно скопировать область и добавить ее не снизу, а справа от уже выведенных данных. Это часто нужно при формировании динамических колонок. При необходимости можно изучить пример обработки для вывода табличного документа в несколько колонок.

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


ТабДок2 = Новый ТабличныйДокумент;
// Выводим первую часть (слева)
ТабДок2.Вывести(ТабДок.ПолучитьОбласть("R1C1:R10C5"));
// Присоединяем вторую часть (справа от первой)
ТабДок2.Присоединить(ТабДок.ПолучитьОбласть("R17C6:R26C10"));

Альтернатива без программирования (для пользователей)

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

В 1С работают стандартные механизмы буфера обмена для табличных документов:

  1. Пользователь выделяет нужные строки (кликая по заголовкам строк слева с зажатой клавишей Shift или Ctrl).
  2. Нажимает сочетание клавиш Ctrl + Shift + C (копировать выделенные ячейки) или стандартное Ctrl + C.
  3. Создает новый документ (через Главное меню - Файл - Новый - Табличный документ) и вставляет данные через Ctrl + Shift + V или Ctrl + V.

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

← На главную