К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как определить область в 1С

Как определить область в 1С: именованные области табличного документа, области кода в модуле, методы ПолучитьОбласть и НайтиОбласть, типичные ошибки и проверка результата.

Термин «область» в 1С используется в двух разных контекстах, и путаница между ними — частая причина ошибок у начинающих разработчиков. Первый контекст — область табличного документа: именованный диапазон ячеек, который используется при формировании печатных форм и отчётов. Второй — область кода в модуле: блок инструкций препроцессора #Область ... #КонецОбласти, который помогает структурировать программный модуль.

Под «определить область» обычно понимают одну из трёх задач: найти именованную область в макете или готовом табличном документе, выяснить, в какую область попадает конкретная ячейка, или разобраться с областями кода при чтении чужого модуля. Ниже разобраны все три сценария с конкретными методами встроенного языка.

Большинство операций выполняется в конфигураторе и не требует изменения конфигурации, поэтому работать можно на копии базы или даже в режиме предприятия через консоль кода. Изменения макетов и модулей делайте только после резервного копирования.

Что такое область в 1С и какие виды существуют

В табличном документе область — это одна ячейка или прямоугольный диапазон ячеек, которому присвоено имя. Именованные области лежат в основе механизма печатных форм: макет документа состоит из областей «Шапка», «Строка», «Подвал», и программный код последовательно получает их и выводит в результирующий документ.

Области бывают горизонтальными (несколько строк на всю ширину макета), вертикальными (диапазон колонок) и произвольными прямоугольными. Для вывода в печатную форму чаще всего используют горизонтальные области, потому что метод Вывести() работает именно с ними.

Отдельный вид — области кода в модулях. Конструкции #Область Проведение ... #КонецОбласти не влияют на выполнение программы: это инструмент навигации и сворачивания кода в конфигураторе. Определить их можно визуально по структуре модуля или поиском по тексту.

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

Откройте макет в конфигураторе: найдите нужный объект (документ, справочник, отчёт), перейдите на вкладку «Макеты» и откройте макет типа «Табличный документ». Именованные области отображаются в левой части окна макета в виде выделенных полос с именами.

Чтобы увидеть имя конкретной области, выделите интересующие строки или ячейки — имя области отобразится в поле имени рядом с панелью инструментов (аналог поля «Имя» в Excel). Также можно открыть свойства ячейки правой кнопкой и посмотреть, входит ли она в именованный диапазон.

Как посмотреть области макета
  1. 1
    Откройте конфигуратор и найдите объект с нужным макетом
  2. 2
    Откройте макет типа «Табличный документ»
  3. 3
    Выделите строки или ячейки — имя области появится в поле имени
  4. 4
    Для просмотра всех областей раскройте список в поле имени или используйте меню «Таблица — Имена»
  5. 5
    Проверьте границы области: выделите её имя в списке, и диапазон подсветится

Полный список имён доступен через меню «Таблица — Имена — Именованные диапазоны» (в разных версиях платформы пункт может называться немного иначе). Там же можно создать новую область или изменить границы существующей.

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

Для поиска области в уже сформированном табличном документе используется метод НайтиОбласть(). Он принимает имя области и возвращает объект области или Неопределено, если область с таким именем не найдена. Всегда проверяйте результат перед обращением к свойствам области.

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

bsl
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);

ОбластьНайденная = ТабДок.НайтиОбласть("Подвал");
Если ОбластьНайденная <> Неопределено Тогда
    Сообщить("Область найдена, строки: " + ОбластьНайденная.Верх + " - " + ОбластьНайденная.Низ);
Иначе
    Сообщить("Область не найдена");
КонецЕсли;

Если нужно определить, в какую область попадает конкретная ячейка результирующего документа, получите область по адресу через Область(Верх, Лево, Низ, Право) и проверьте её свойство Имя. Для ячейки внутри именованного диапазона имя вернёт имя области, для обычной ячейки — адрес вида «R5C3».

Как определить область кода в модуле

В модуле объекта или общем модуле области кода видны через кнопку «Структура модуля» на панели конфигуратора — откроется дерево с процедурами, функциями и областями. Двойной щелчок по области переносит курсор к её началу.

Быстрый способ найти конкретную область — поиск по тексту модуля (Ctrl+F) по строке #Область. Это полезно в больших модулях форм, где областей могут быть десятки: обработчики событий, служебные процедуры, программный интерфейс.

При чтении чужого кода обращайте внимание на стандартные имена областей из стандартов разработки: «ПрограммныйИнтерфейс», «СлужебныйПрограммныйИнтерфейс», «СлужебныеПроцедурыИФункции». Это помогает быстро понять, какие процедуры предназначены для вызова извне, а какие — внутренние.

Типичные ошибки при работе с областями

Самая частая проблема — исключение «Область не найдена» при вызове ПолучитьОбласть(). Причины: опечатка в имени, другой регистр букв, область удалена из макета при доработке или код обращается не к тому макету. Проверяйте имя непосредственно в макете, а не по памяти.

Вторая типичная ошибка — попытка вывести вертикальную или произвольную область методом Вывести(). Для вертикальных областей используется Присоединить(), а смешивание методов приводит к искажению печатной формы.

Типичные ошибки
01
Опечатка или неверный регистр в имени области — ПолучитьОбласть() вызывает исключение, проверяйте имя в макете
02
Игнорирование результата НайтиОбласть() — обращение к Неопределено вызывает ошибку, всегда проверяйте на Неопределено
03
Вывод вертикальной области методом Вывести() — форма «ломается», используйте Присоединить()
04
Непарные блоки #Область/#КонецОбласти после рефакторинга — модуль не компилируется
05
Дублирование имён областей в макете — поиск возвращает не ту область, имена должны быть уникальными

Как проверить результат и границы самостоятельной работы

После получения области программно убедитесь, что границы соответствуют ожиданиям: свойства Верх, Низ, Лево, Право показывают координаты диапазона. Выведите их в сообщение и сравните с макетом — это быстрый способ отловить обращение не к той области.

Контрольные точки

Как проверить результат

Имя области в коде и в макете
Норма

Имена совпадают посимвольно, включая регистр

Тревожный признак

Отличается регистр или есть опечатка — будет исключение

Результат НайтиОбласть()
Норма

Возвращён объект области с корректными координатами

Тревожный признак

Возвращено Неопределено — области нет в документе

Печатная форма после вывода
Норма

Области выведены в правильном порядке, данные на месте

Тревожный признак

Пустые строки, сдвиг колонок, пропавшие секции

Безопасная граница самостоятельной работы — поиск и чтение областей, тестовый вывод печатных форм на копии базы. Изменение типовых макетов и модулей в рабочей базе без резервной копии и понимания механизма обновления конфигурации — зона риска: при обновлении доработки могут быть потеряны.

Итог

Что важно запомнить

Область табличного документа определяется по имени в макете или методами ПолучитьОбласть() и НайтиОбласть() в коде, область модуля — блоками #Область/#КонецОбласти через структуру модуля. Всегда проверяйте результат поиска на Неопределено и точность имён.

Частые вопросы

Чем НайтиОбласть() отличается от ПолучитьОбласть()?

НайтиОбласть() ищет область в уже сформированном табличном документе и возвращает Неопределено, если её нет. ПолучитьОбласть() вызывается у макета и извлекает область для вывода; при отсутствии области вызывается исключение.

Как узнать имя области, если макет чужой и большой?

Откройте макет и выделите нужные строки — имя появится в поле имени над таблицей. Альтернатива — меню «Таблица — Имена», где перечислены все именованные диапазоны макета с их границами.

Почему НайтиОбласть() возвращает Неопределено, хотя область есть в макете?

Метод ищет область в результирующем табличном документе, а не в макете. Если область ещё не была выведена в документ методом Вывести() или Присоединить(), найти её невозможно.

Влияют ли области кода на производительность модуля?

Нет. Конструкции #Область и #КонецОбласти обрабатываются только редактором конфигуратора для сворачивания и навигации. На скорость выполнения и компиляцию кода они не влияют.

Можно ли создать область табличного документа программно, без макета?

Да. Получите диапазон методом Область() с координатами и присвойте свойству Имя нужное значение. После этого к диапазону можно обращаться по имени, как к области из макета.

Что делать, если после обновления конфигурации пропала доработанная область макета?

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