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

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

Как прочитать данные из макета 1С

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

Макет в 1С — это объект конфигурации, который хранит шаблон: табличный документ, схему компоновки данных, текст, двоичные данные или ActiveDocument. Чаще всего под «прочитать данные из макета» понимают работу с табличным макетом: получение областей, заполнение параметров и программное считывание значений из ячеек. Это нужно при формировании печатных форм, загрузке данных из встроенных таблиц и обмене данными без внешних файлов.

Способ чтения зависит от типа макета и от того, где он расположен: в общих макетах конфигурации, в объекте метаданных (справочнике, документе) или во внешней обработке. Ниже разобраны основные сценарии: получение макета, вывод областей, чтение ячеек по координатам, загрузка табличного макета в таблицу значений и типичные ошибки, которые приводят к пустым или неверным данным.

Что такое макет и какие типы макетов бывают

Макет — это хранилище шаблона внутри конфигурации. При создании макета в конфигураторе вы выбираете его тип, и именно тип определяет, как с ним работать в коде. Наиболее распространён табличный документ: он состоит из ячеек, объединённых в именованные области, и поддерживает параметры вида [ИмяПараметра], которые подставляются при выводе.

Другие типы — схема компоновки данных (для отчётов на СКД), текстовый документ, двоичные данные, HTML-документ, географическая схема, графическая схема и ActiveDocument (например, встроенный файл Excel или Word). Прочитать «данные» напрямую можно в основном из табличного макета; текстовый макет возвращается как текст, а двоичный — как поток байтов.

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

Доступ к макету зависит от того, где он создан. Общий макет получают через менеджер: ПолучитьОбщийМакет("ИмяМакета"). Макет, созданный внутри объекта метаданных, доступен через его менеджер, например: Справочники.Номенклатура.ПолучитьМакет("ПрайсЛист") или Документы.РеализацияТоваровУслуг.ПолучитьМакет("МакетПечати"). В модуле самого объекта достаточно вызвать ПолучитьМакет("ИмяМакета") или использовать метод ЭтотОбъект.ПолучитьМакет().

Для внешней обработки или отчёта макет получают через ЭтотОбъект.ПолучитьМакет("ИмяМакета") в модуле объекта обработки. Результат — объект типа «ТабличныйДокумент» (для табличного макета), с которым дальше выполняют все операции чтения и вывода.

// Общий макет

Макет = ПолучитьОбщийМакет("ШаблонДоговора");

// Макет справочника

Макет = Справочники.Номенклатура.ПолучитьМакет("КарточкаТовара");

// Макет внешней обработки (в модуле объекта)

Макет = ЭтотОбъект.ПолучитьМакет("ДанныеДляЗагрузки");

Чтение областей и заполнение параметров

Классический сценарий — вывод печатной формы. Макет делится на области: «Шапка», «Строка», «Подвал». Каждую область получают методом ПолучитьОбласть("ИмяОбласти"), заполняют её параметры через коллекцию Параметры и выводят в результирующий табличный документ методом Вывести().

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

ТабДок = Новый ТабличныйДокумент;

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

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ОбластьШапка.Параметры.НомерДокумента = Ссылка.Номер;

ОбластьШапка.Параметры.Контрагент = Ссылка.Контрагент;

ТабДок.Вывести(ОбластьШапка);

// Чтение обратно из области

ТекКонтрагент = ОбластьШапка.Параметры.Контрагент;

Загрузка макета в таблицу значений

Когда табличный макет используют как источник данных, удобно перенести его целиком в таблицу значений. Для этого создают таблицу с нужными колонками и типами, затем в цикле читают строки макета и добавляют строки таблицы. Такой подход упрощает дальнейшую работу: поиск, отбор, свёртку и сортировку выполняют уже штатными методами таблицы значений.

Альтернатива — построитель отчёта или запрос к табличному документу через объект ПостроительОтчета с источником «ТабличныйДокумент», но на практике прямой обход проще и прозрачнее. Главное — жёстко задать соответствие колонок макета и колонок таблицы, чтобы при изменении макета несоответствие обнаруживалось сразу, а не давало тихие ошибки в данных.

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50)));

ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));

Макет = ПолучитьОбщийМакет("Прайс");

Для НомСтр = 2 По Макет.ВысотаТаблицы Цикл

СтрокаАртикул = СокрЛП(Макет.Область(НомСтр, 1).Текст);

Если ПустаяСтрока(СтрокаАртикул) Тогда

Продолжить;

КонецЕсли;

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Артикул = СтрокаАртикул;

Попытка

НоваяСтрока.Цена = Число(СтрЗаменить(Макет.Область(НомСтр, 2).Текст, " ", ""));

Исключение

НоваяСтрока.Цена = 0;

КонецПопытки;

КонецЦикла;

Работа с параметрами и расшифровкой

Кроме обычных параметров областей, в макете используются шаблоны (свойство ячейки «Заполнение» = «Шаблон»), где в одном тексте смешаны фиксированные части и подстановки вида [Параметр]. При чтении такой ячейки свойство Текст вернёт шаблон целиком с квадратными скобками, а не подставленное значение — значения берутся только из коллекции Параметры области.

Ячейки с расшифровкой (свойство ПараметрРасшифровки) хранят ссылку на объект или произвольное значение, которое используется при клике в готовом отчёте. Программно это значение читается так же — через свойство области Расшифровка или ПараметрРасшифровки в зависимости от контекста. Это полезно, когда из сформированного отчёта нужно извлечь ссылки на документы-основания.

Типичные ошибки и их диагностика

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

Вторая группа ошибок связана с типами: число из ячейки читается как строка с пробелами-разделителями разрядов, и Число() вызывает исключение; дата в произвольном формате не преобразуется штатно. Решение — очищать строку от пробелов и неразрывных пробелов (Символ(160)) и оборачивать преобразование в Попытка/Исключение с журналированием номера строки макета.

Типичные ошибки
01
Обращение к области по имени с опечаткой — исключение «Область не найдена» при выполнении
02
Чтение свойства Текст у ячейки-шаблона и ожидание подставленного значения — возвращается шаблон с [скобками]
03
Преобразование числа без удаления пробелов и неразрывных пробелов — ошибка преобразования или ноль
04
Обход макета с первой строки, хотя в ней заголовки, — в данных появляются лишние строки
05
Игнорирование пустых строк внутри макета — в таблице значений появляются пустые записи
Контрольные точки

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

Количество прочитанных строк
Норма

Совпадает с числом непустых строк макета минус заголовок

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

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

Значения числовых колонок
Норма

Числа без исключений преобразуются и дают ожидаемые итоги

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

Нули или исключения — в макете пробелы, разделители или текст

Имена областей и параметров
Норма

Код выполняется без исключений, области выводятся

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

Исключение «не найдено» — имя в коде не совпадает с конфигуратором

FAQ

Как прочитать макет типа «Текстовый документ» или «Двоичные данные»?

Метод ПолучитьМакет() вернёт объект соответствующего типа: для текстового макета — ТекстовыйДокумент, из которого текст читают методом ПолучитьТекст(); для двоичных данных — значение типа ДвоичныеДанные, которое можно записать во временный файл методом Записать() и обработать дальше.

Можно ли читать макет на клиенте в управляемом приложении?

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

Как узнать, картинка или текст находится в ячейке макета?

У области ячейки проверяют свойство ТипСодержимого или наличие рисунков: коллекция Рисунки табличного документа содержит все картинки с координатами привязки. Текст ячейки с картинкой обычно пуст, поэтому опираться только на свойство Текст нельзя.

Почему ВысотаТаблицы возвращает больше строк, чем видно в макете?

ВысотаТаблицы учитывает все строки, где когда-либо было содержимое или форматирование, включая визуально пустые. Поэтому в цикле обязательно проверяйте содержимое ключевой колонки функцией ПустаяСтрока() и пропускайте пустые строки.

Как прочитать данные из макета внешней печатной формы?

В модуле объекта внешней обработки вызовите ЭтотОбъект.ПолучитьМакет("ИмяМакета"). Если код выполняется в модуле формы, получите объект обработки через РеквизитФормыВЗначение("Объект") и затем вызовите ПолучитьМакет() у полученного объекта.

Можно ли изменить макет программно и сохранить его в конфигурацию?

Нет, макеты — часть метаданных и изменяются только в конфигураторе. Программно можно изменить полученный экземпляр табличного документа и сохранить его как файл (метод Записать с типом MXL, XLSX, PDF), но сам шаблон в конфигурации это не затронет.

Итог

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

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