Разработка и Конфигурация · 12 мин
Как очистить параметры области макета в 1С
Как очистить параметры области макета в 1С: методы УстановитьПараметр, Заполнить, очистка через новую область, типовые ошибки и проверка результата при выводе печатных форм.
При программном формировании печатных форм в 1С разработчик получает область макета, заполняет её параметры и выводит в табличный документ. Проблема возникает, когда одна и та же область используется повторно в цикле: если параметр не заполнен новым значением, в документ попадают данные из предыдущей итерации. В результате в печатной форме дублируются суммы, наименования или контрагенты, хотя в коде ошибки как будто нет.
Ключевой момент, который нужно понимать: встроенного метода «ОчиститьПараметры» у объекта «ОбластьЯчеекТабличногоДокумента» нет. Очистка выполняется косвенными способами — через повторное получение области из макета, через явное присвоение пустых значений или через перезаполнение параметров коллекцией. Выбор способа зависит от того, как организован цикл вывода и откуда берутся данные.
Ниже разобраны рабочие приёмы очистки параметров области, типовые ошибки, из-за которых в табличный документ попадают «хвосты» предыдущих значений, и способы проверить результат перед выводом формы пользователю.
Как устроены параметры области макета и почему они «залипают»
Когда вы вызываете Макет.ПолучитьОбласть("СтрокаТовары"), платформа создаёт объект области, у которого есть коллекция Параметры. Каждый параметр соответствует ячейке макета, где в свойстве «Заполнение» указано «Параметр», а в тексте ячейки — имя параметра. Пока вы не присвоили параметру значение, он содержит Неопределено или пустую строку — в зависимости от того, как область получена.
Проблема появляется, когда область получена один раз до цикла, а внутри цикла заполняются не все параметры. Например, в макете есть параметры «Номенклатура», «Количество» и «Комментарий», но в некоторых строках данных комментария нет. Если разработчик пишет присвоение только при наличии значения, то в строках без комментария выводится комментарий из предыдущей строки — параметр сохранил старое значение, потому что объект области тот же самый.
Ещё одна причина «залипания» — использование метода Параметры.Заполнить(Выборка) с выборкой, в которой меньше полей, чем параметров в области. Заполняются только совпадающие по имени свойства, остальные параметры сохраняют прежние значения. Это штатное поведение платформы, а не ошибка, и его нужно учитывать при проектировании кода вывода.
Способ 1: получать область заново на каждой итерации
Самый простой и надёжный приём — не хранить область между итерациями, а вызывать ПолучитьОбласть() внутри цикла. Каждый вызов возвращает новый объект с параметрами в исходном состоянии, поэтому никакой отдельной очистки не требуется вовсе.
Для Каждого СтрокаТовара Из Товары Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТовары");
ОбластьСтрока.Параметры.Номенклатура = СтрокаТовара.Номенклатура;
ОбластьСтрока.Параметры.Количество = СтрокаТовара.Количество;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Такой подход решает проблему полностью: параметр, которому не присвоено значение, останется пустым, и в документ не попадут данные из предыдущей строки. Накладные расходы на повторное получение области для типовых печатных форм несущественны — это операция над объектом в памяти, а не обращение к базе данных.
Единственное исключение — очень большие отчёты с десятками тысяч строк, где разработчик сознательно кэширует область ради производительности. В этом случае переходите к способам с явной очисткой, описанным ниже.
- 1Перенесите вызов Макет.ПолучитьОбласть() внутрь цикла, перед заполнением параметров
- 2Убедитесь, что переменная области не объявлена и не переиспользуется вне цикла
- 3Заполните параметры текущей строки данных
- 4Выведите область через ТабДок.Вывести() и сформируйте форму для проверки
Способ 2: явное присвоение пустых значений параметрам
Если область по какой-то причине должна быть получена один раз, очистку выполняют вручную: в начале каждой итерации всем параметрам присваивают пустые значения. Это гарантирует, что незаполненные в текущей строке параметры не унаследуют старые данные.
ОбластьСтрока.Параметры.Номенклатура = "";
ОбластьСтрока.Параметры.Количество = 0;
ОбластьСтрока.Параметры.Комментарий = "";
Присваивать можно пустую строку, ноль, Неопределено или пустую дату — в зависимости от типа данных и формата ячейки. Учтите, что ноль для числового параметра и пустая строка визуально отличаются: если в пустой строке документа число не должно отображаться вообще, используйте пустую строку или настройте формат ячейки с подавлением нуля.
Главный недостаток способа — при добавлении нового параметра в макет разработчик должен не забыть добавить его очистку в код. Поэтому ручную очистку имеет смысл применять только для областей со стабильным небольшим набором параметров.
Способ 3: очистка через Заполнить() полной структурой
Метод Параметры.Заполнить(Источник) заполняет параметры из структуры, выборки или строки таблицы значений по совпадению имён. Чтобы использовать его как инструмент очистки, формируйте структуру с полным набором ключей области, где отсутствующие данные заменены пустыми значениями.
ПараметрыСтроки = Новый Структура("Номенклатура, Количество, Комментарий", "", 0, "");
ЗаполнитьЗначенияСвойств(ПараметрыСтроки, СтрокаТовара);
ОбластьСтрока.Параметры.Заполнить(ПараметрыСтроки);
Такой шаблон даёт двойной эффект: структура с пустыми значениями по умолчанию работает как очистка, а ЗаполнитьЗначенияСвойств переносит в неё реальные данные текущей строки. Если в строке товара нет комментария, в параметр попадёт пустая строка из структуры, а не значение предыдущей итерации.
Ограничение то же, что и у ручной очистки: список ключей структуры нужно поддерживать синхронно с макетом. При изменении макета полезно добавить в код комментарий-напоминание или проверку состава параметров.
Очистка параметров в расширенных сценариях
Секции с условным выводом
Когда часть параметров заполняется только при выполнении условия (скидка, серия, дополнительная характеристика), удобно сгруппировать их очистку в отдельной процедуре. Процедура принимает область и сбрасывает условные параметры, а основной код заполняет только постоянные. Это снижает риск забыть сбросить один из условных параметров при доработке.
Присоединение областей по горизонтали
При выводе через Присоединить() (например, колонки периодов) действует то же правило: каждая присоединяемая область должна быть свежей или очищенной. Типичная ошибка — получить область колонки один раз и присоединять её в цикле, заполняя только сумму. Все колонки, кроме последней, могут унаследовать промежуточные значения, если параметров несколько.
Очистка всего табличного документа
Если задача шире — очистить не параметры области, а весь сформированный табличный документ перед повторным выводом, используется метод ТабДок.Очистить(). Он удаляет все строки и ячейки результирующего документа, но не влияет на макет и ранее полученные области. Этот приём нужен, когда одна форма формирует несколько документов подряд, например печать по списку выбранных объектов.
Сравнение вариантов
Самый надёжный вариант, не требует очистки вообще. Подходит почти всегда; ограничение — микроскопические накладные расходы на гигантских отчётах.
Подходит при кэшировании области ради производительности. Требует синхронизации кода с макетом при каждом изменении.
Компактный код и очистка одновременно. Нужно поддерживать полный список ключей структуры.
Очищает не параметры области, а весь результат. Применяется при повторном формировании документа на той же форме.
Типичные ошибки и как их распознать
Самая частая ошибка — область получена до цикла, а внутри цикла заполняются не все параметры. Внешний признак: в печатной форме у строк без значения отображается значение соседней строки. Лечится переносом ПолучитьОбласть() внутрь цикла либо добавлением очистки.
Вторая ошибка — опечатка в имени параметра при очистке. Платформа не всегда сообщает об обращении к несуществующему параметру очевидным образом, поэтому очистка «молча» не срабатывает, а реальный параметр сохраняет старое значение. Проверяйте имена прямо в макете: откройте свойства ячейки и сверьте поле «Параметр».
Третья группа ошибок связана с Заполнить() из выборки запроса: в выборку не включено поле, которое есть в макете. Параметр с таким именем не очищается и не заполняется. Признак — параметр заполнен только в первой строке, где его успели присвоить вручную, либо дублируется из предыдущей итерации.
Как проверить результат после доработки
Минимальная проверка — сформировать печатную форму по документу, где строки табличной части различаются по заполненности: у одной строки есть комментарий или скидка, у следующей нет. Если после доработки вторая строка выводится с пустым значением, очистка работает. Если в ней повторяется значение первой строки — параметр не очищается.
Дополнительно проверьте вывод для первой строки: иногда разработчики «чинят» проблему лишним присвоением, и в первой итерации параметр оказывается не заполнен, потому что очистка выполняется после заполнения. Правильный порядок — сначала очистка (или получение новой области), затем заполнение, затем вывод.
Для форм с несколькими документами сформируйте печать пакетом и убедитесь, что шапка второго документа не содержит данных первого. Здесь помогает ТабДок.Очистить() перед формированием каждого следующего документа либо вывод в отдельный табличный документ.
Как проверить результат
Ячейка в печатной форме пустая
В ячейке значение из предыдущей строки
Все параметры заполнены данными первой строки
Часть параметров пуста — очистка выполняется после заполнения
Каждый документ содержит только свои данные
Шапка или подвал содержат данные предыдущего документа
Пустая ячейка или ноль по формату макета
Нули там, где по шаблону должна быть пустота
FAQ
Есть ли в 1С метод ОчиститьПараметры() у области макета?
Нет, у объекта «ОбластьЯчеекТабличногоДокумента» такого метода нет. Очистка выполняется косвенно: повторным получением области через ПолучитьОбласть(), присвоением параметрам пустых значений или заполнением из структуры с полным набором пустых ключей.
Почему в печатной форме дублируются данные из предыдущей строки?
Область получена один раз до цикла, а внутри цикла заполняются не все параметры. Незаполненный параметр сохраняет значение предыдущей итерации. Перенесите ПолучитьОбласть() внутрь цикла или добавьте явную очистку параметров в начале итерации.
Чем очистка параметров области отличается от ТабДок.Очистить()?
Очистка параметров касается одной области макета до её вывода. Метод ТабДок.Очистить() удаляет всё содержимое уже сформированного табличного документа и применяется при повторном формировании результата, например при печати следующего документа из списка.
Как очистить параметр, чтобы в форме была пустая ячейка, а не ноль?
Присвойте параметру пустую строку вместо нуля: Область.Параметры.Сумма = "". Либо оставьте числовой ноль, но настройте формат ячейки в макете с подавлением нулевого значения — тогда ноль не будет отображаться визуально.
Заполнить() из выборки очищает параметры, которых нет в выборке?
Нет. Метод Заполнить() переносит только совпадающие по именам значения, остальные параметры остаются без изменений. Если в выборке нет поля, соответствующего параметру макета, этот параметр нужно очищать отдельно или добавлять поле в запрос.
Влияет ли повторный вызов ПолучитьОбласть() на производительность?
Для типовых печатных форм влияние незаметно — это операция в памяти без обращения к базе данных. Заметный эффект возможен только при выводе десятков тысяч строк; в этом случае область кэшируют, а параметры очищают вручную или через структуру.
Что важно запомнить
Отдельного метода очистки параметров области в 1С нет. Надёжнее всего получать область заново внутри цикла — тогда очистка не нужна. При кэшировании области присваивайте всем параметрам пустые значения или заполняйте их полной структурой. Проверяйте результат на документе, где соседние строки различаются по заполненности необязательных параметров.