При разработке расширений для конфигураций 1С программисты часто сталкиваются с необходимостью модификации печатных форм. Типичная задача: стандартная процедура формирования документа уже вывела определенную область (например, «Подвал»), а нам нужно заменить её своей собственной или вовсе убрать. Однако попытки использовать метод УдалитьОбласть часто приводят к тому, что в итоговом документе отображаются сразу обе области — и старая, и новая. Разберем подробно, почему так происходит и как правильно манипулировать областями табличного документа.
Первое и самое важное, что нам необходимо проанализировать — это различие между объектами, с которыми мы работаем. Рассмотрим типичную ошибку начинающего разработчика:
// Ошибочный код
ТабличныйДокумент.УдалитьОбласть(ОбластьПодвал.ТекущаяОбласть, ТипСмещенияТабличногоДокумента.ПоВертикали);
В данном примере переменная ОбластьПодвал, как правило, является результатом метода ПолучитьОбласть() из макета. Проблема заключается в том, что ОбластьПодвал — это «кирпичик», который еще не встроен в стену (в наш итоговый документ). Когда мы вызываем УдалитьОбласть и передаем туда ссылку на область макета, система не понимает, какую именно часть уже сформированного ТабличныйДокумент нужно стереть.
Для успешного удаления нам нужно обратиться к коллекции имен или конкретным координатам уже внутри результирующего документа. Выясним, как это сделать правильно.
Если при выводе области в макете или программно ей было назначено имя, мы можем обратиться к ней напрямую через коллекцию Области нашего табличного документа. Это самый надежный и читаемый способ.
Рассмотрим пример правильного удаления:
// Правильное удаление по имени области в итоговом документе
ИмяОбласти = "Подвал";
Если ТабличныйДокумент.Области.Найти(ИмяОбласти) <> Неопределено Тогда
ОбластьДляУдаления = ТабличныйДокумент.Области[ИмяОбласти];
ТабличныйДокумент.УдалитьОбласть(ОбластьДляУдаления, ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЕсли;
Важный нюанс: Чтобы этот код сработал, область в ТабличныйДокумент должна иметь имя. Если вы используете стандартный механизм Вывести(), имя области из макета не всегда автоматически переносится в результирующий документ как именованный диапазон. Убедитесь, что в свойствах ячеек макета заполнено поле «Имя» или вы назначаете имя области программно после вывода.
Иногда возникают ситуации, когда область не имеет четкого имени в итоговом документе. В этом случае мы можем вычислить координаты строк, которые нужно удалить. Предположим, мы знаем, что подвал всегда выводится в конце документа.
Проанализируем ситуацию, когда нам нужно удалить последние 5 строк документа:
ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы;
НачалоУдаления = ВсегоСтрок - 4; // Индексация начинается с 1
КонецУдаления = ВсегоСтрок;
ОбластьСписка = ТабличныйДокумент.Область(НачалоУдаления, , КонецУдаления, );
ТабличныйДокумент.УдалитьОбласть(ОбластьСписка, ТипСмещенияТабличногоДокумента.ПоВертикали);
Обратите внимание на использование пустых параметров в методе Область(). Конструкция Область(НачалоСтрок, , КонецСтрок, ) позволяет выделить строки целиком по всей ширине документа, что критически важно для корректного удаления с вертикальным смещением.
Разберем ситуацию из практики: в расширении после выполнения стандартного кода (аннотация &После) вы хотите заменить подвал. Хотя метод УдалитьОбласть рабочий, он не всегда является оптимальным.
Посмотрим на альтернативные варианты:
ТабличныйДокумент.Очистить(). Но помните, что УдалитьОбласть физически схлопывает пространство, а Очистить просто удаляет содержимое ячеек.При программном манипулировании строками в 1С следует учитывать несколько важных факторов, которые могут повлиять на итоговый результат:
1. Проблема смещения индексов. Если вы планируете удалить несколько разных областей в одном цикле, всегда делайте это «снизу вверх» (от больших номеров строк к меньшим). Когда вы удаляете верхнюю область с типом ТипСмещенияТабличногоДокумента.ПоВертикали, все нижние строки поднимаются, и их старые индексы становятся недействительными.
2. Объединенные ячейки. Это «подводный камень» табличных документов. Если ваша удаляемая область пересекает только часть объединенной ячейки, система может выдать ошибку. Проанализируем структуру макета перед удалением: убедитесь, что границы удаления не «разрезают» объединенные блоки пополам.
3. Метод ПроверитьВывод(). После того как вы удалили стандартную область и вывели свою, обязательно вызовите метод ПроверитьВывод(). Это позволит системе заново пересчитать переносы страниц. Удаление строк меняет высоту документа, и без этого вызова печатная форма может выглядеть некорректно при выводе на печать.
4. Использование ТипСмещенияТабличногоДокумента. Всегда указывайте ПоВертикали, если работаете со строками. Если оставить параметр пустым или указать НетСмещения, область может просто очиститься, но пустые строки останутся, что приведет к появлению ненужных разрывов страниц.
Подведем итог: для успешного удаления области в расширении необходимо четко понимать, обращаетесь ли вы к макету (шаблону) или к самому табличному документу (результату). Используйте коллекцию ТабличныйДокумент.Области для точного поиска нужного фрагмента и всегда следите за корректностью смещения строк.