Разработка и Конфигурация · 11 мин
Как прочитать данные из макета 1С
Как прочитать данные из макета 1С: табличный документ, ПолучитьОбласть, Параметры, чтение макета в дерево значений. Примеры кода и типичные ошибки.
Макет в 1С — это объект конфигурации, который хранит шаблон: табличный документ, схему компоновки данных, текст, двоичные данные или ActiveDocument. Чаще всего под «прочитать данные из макета» понимают работу с табличным макетом: получение областей, заполнение параметров и программное считывание значений из ячеек. Это нужно при формировании печатных форм, загрузке данных из встроенных таблиц и обмене данными без внешних файлов.
Способ чтения зависит от типа макета и от того, где он расположен: в общих макетах конфигурации, в объекте метаданных (справочнике, документе) или во внешней обработке. Ниже разобраны основные сценарии: получение макета, вывод областей, чтение ячеек по координатам, загрузка табличного макета в таблицу значений и типичные ошибки, которые приводят к пустым или неверным данным.
Что такое макет и какие типы макетов бывают
Макет — это хранилище шаблона внутри конфигурации. При создании макета в конфигураторе вы выбираете его тип, и именно тип определяет, как с ним работать в коде. Наиболее распространён табличный документ: он состоит из ячеек, объединённых в именованные области, и поддерживает параметры вида [ИмяПараметра], которые подставляются при выводе.
Другие типы — схема компоновки данных (для отчётов на СКД), текстовый документ, двоичные данные, HTML-документ, географическая схема, графическая схема и ActiveDocument (например, встроенный файл Excel или Word). Прочитать «данные» напрямую можно в основном из табличного макета; текстовый макет возвращается как текст, а двоичный — как поток байтов.
Как получить макет программно
Доступ к макету зависит от того, где он создан. Общий макет получают через менеджер: ПолучитьОбщийМакет("ИмяМакета"). Макет, созданный внутри объекта метаданных, доступен через его менеджер, например: Справочники.Номенклатура.ПолучитьМакет("ПрайсЛист") или Документы.РеализацияТоваровУслуг.ПолучитьМакет("МакетПечати"). В модуле самого объекта достаточно вызвать ПолучитьМакет("ИмяМакета") или использовать метод ЭтотОбъект.ПолучитьМакет().
Для внешней обработки или отчёта макет получают через ЭтотОбъект.ПолучитьМакет("ИмяМакета") в модуле объекта обработки. Результат — объект типа «ТабличныйДокумент» (для табличного макета), с которым дальше выполняют все операции чтения и вывода.
// Общий макет
Макет = ПолучитьОбщийМакет("ШаблонДоговора");
// Макет справочника
Макет = Справочники.Номенклатура.ПолучитьМакет("КарточкаТовара");
// Макет внешней обработки (в модуле объекта)
Макет = ЭтотОбъект.ПолучитьМакет("ДанныеДляЗагрузки");
Чтение областей и заполнение параметров
Классический сценарий — вывод печатной формы. Макет делится на области: «Шапка», «Строка», «Подвал». Каждую область получают методом ПолучитьОбласть("ИмяОбласти"), заполняют её параметры через коллекцию Параметры и выводят в результирующий табличный документ методом Вывести().
Чтобы «прочитать» данные из уже заполненной области, обращаются к свойству Параметры.ИмяПараметра — оно возвращает текущее значение. Если параметр не заполнялся, значение будет неопределено. Это удобно для проверки того, что именно было подставлено в область перед выводом.
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = Ссылка.Номер;
ОбластьШапка.Параметры.Контрагент = Ссылка.Контрагент;
ТабДок.Вывести(ОбластьШапка);
// Чтение обратно из области
ТекКонтрагент = ОбластьШапка.Параметры.Контрагент;
Загрузка макета в таблицу значений
Когда табличный макет используют как источник данных, удобно перенести его целиком в таблицу значений. Для этого создают таблицу с нужными колонками и типами, затем в цикле читают строки макета и добавляют строки таблицы. Такой подход упрощает дальнейшую работу: поиск, отбор, свёртку и сортировку выполняют уже штатными методами таблицы значений.
Альтернатива — построитель отчёта или запрос к табличному документу через объект ПостроительОтчета с источником «ТабличныйДокумент», но на практике прямой обход проще и прозрачнее. Главное — жёстко задать соответствие колонок макета и колонок таблицы, чтобы при изменении макета несоответствие обнаруживалось сразу, а не давало тихие ошибки в данных.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50)));
ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Макет = ПолучитьОбщийМакет("Прайс");
Для НомСтр = 2 По Макет.ВысотаТаблицы Цикл
СтрокаАртикул = СокрЛП(Макет.Область(НомСтр, 1).Текст);
Если ПустаяСтрока(СтрокаАртикул) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Артикул = СтрокаАртикул;
Попытка
НоваяСтрока.Цена = Число(СтрЗаменить(Макет.Область(НомСтр, 2).Текст, " ", ""));
Исключение
НоваяСтрока.Цена = 0;
КонецПопытки;
КонецЦикла;
Работа с параметрами и расшифровкой
Кроме обычных параметров областей, в макете используются шаблоны (свойство ячейки «Заполнение» = «Шаблон»), где в одном тексте смешаны фиксированные части и подстановки вида [Параметр]. При чтении такой ячейки свойство Текст вернёт шаблон целиком с квадратными скобками, а не подставленное значение — значения берутся только из коллекции Параметры области.
Ячейки с расшифровкой (свойство ПараметрРасшифровки) хранят ссылку на объект или произвольное значение, которое используется при клике в готовом отчёте. Программно это значение читается так же — через свойство области Расшифровка или ПараметрРасшифровки в зависимости от контекста. Это полезно, когда из сформированного отчёта нужно извлечь ссылки на документы-основания.
Типичные ошибки и их диагностика
Самая частая проблема — обращение к несуществующей области или параметру: платформа вызывает исключение «Область не найдена» или параметр оказывается неопределённым. Причины — опечатка в имени, переименование области в конфигураторе без правки кода, либо область удалена при доработке макета. Лечится сверкой имён в конфигураторе и в коде.
Вторая группа ошибок связана с типами: число из ячейки читается как строка с пробелами-разделителями разрядов, и Число() вызывает исключение; дата в произвольном формате не преобразуется штатно. Решение — очищать строку от пробелов и неразрывных пробелов (Символ(160)) и оборачивать преобразование в Попытка/Исключение с журналированием номера строки макета.
Как проверить результат чтения
Совпадает с числом непустых строк макета минус заголовок
Строк больше или меньше — проверяйте границы цикла и пустые строки
Числа без исключений преобразуются и дают ожидаемые итоги
Нули или исключения — в макете пробелы, разделители или текст
Код выполняется без исключений, области выводятся
Исключение «не найдено» — имя в коде не совпадает с конфигуратором
FAQ
Как прочитать макет типа «Текстовый документ» или «Двоичные данные»?
Метод ПолучитьМакет() вернёт объект соответствующего типа: для текстового макета — ТекстовыйДокумент, из которого текст читают методом ПолучитьТекст(); для двоичных данных — значение типа ДвоичныеДанные, которое можно записать во временный файл методом Записать() и обработать дальше.
Можно ли читать макет на клиенте в управляемом приложении?
Напрямую ПолучитьМакет() доступен только на сервере. В управляемых формах макет получают в серверной процедуре, а на клиент возвращают готовый табличный документ, адрес во временном хранилище или уже извлечённые данные (таблицу значений, массив структур).
Как узнать, картинка или текст находится в ячейке макета?
У области ячейки проверяют свойство ТипСодержимого или наличие рисунков: коллекция Рисунки табличного документа содержит все картинки с координатами привязки. Текст ячейки с картинкой обычно пуст, поэтому опираться только на свойство Текст нельзя.
Почему ВысотаТаблицы возвращает больше строк, чем видно в макете?
ВысотаТаблицы учитывает все строки, где когда-либо было содержимое или форматирование, включая визуально пустые. Поэтому в цикле обязательно проверяйте содержимое ключевой колонки функцией ПустаяСтрока() и пропускайте пустые строки.
Как прочитать данные из макета внешней печатной формы?
В модуле объекта внешней обработки вызовите ЭтотОбъект.ПолучитьМакет("ИмяМакета"). Если код выполняется в модуле формы, получите объект обработки через РеквизитФормыВЗначение("Объект") и затем вызовите ПолучитьМакет() у полученного объекта.
Можно ли изменить макет программно и сохранить его в конфигурацию?
Нет, макеты — часть метаданных и изменяются только в конфигураторе. Программно можно изменить полученный экземпляр табличного документа и сохранить его как файл (метод Записать с типом MXL, XLSX, PDF), но сам шаблон в конфигурации это не затронет.
Что важно запомнить
Макет получают через ПолучитьМакет() нужного менеджера, области выводят через ПолучитьОбласть и Параметры, а данные читают по координатам ячеек с обязательной проверкой пустых строк и аккуратным преобразованием типов. Перед загрузкой данных из макета в базу проверяйте результат на копии.