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