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