В процессе разработки на платформе 1С:Предприятие часто возникает задача создания универсальных механизмов. Одной из таких задач является автоматическое извлечение структуры регистра сведений для последующего вывода в отчет или обработки данных. В этой статье мы подробно рассмотрим, как программно получить названия полей регистра, как динамически наполнить макет параметрами и как правильно управлять оформлением ячеек табличного документа.
Для начала разберем, как получить список всех полей регистра сведений. В 1С метаданные объекта разделены на коллекции: СтандартныеРеквизиты, Измерения, Ресурсы и Реквизиты. Чтобы получить полное описание структуры, нам необходимо обойти каждую из этих коллекций.
Проанализируем пример кода, который позволяет собрать все имена полей в один массив. Это фундаментальный подход для создания любых универсальных обработок:
// Определяем объект метаданных нужного регистра
ОписаниеРегистра = Метаданные.РегистрыСведений.ИмяВашегоРегистра;
МассивПолей = Новый Массив;
// 1. Получаем стандартные реквизиты (Период, Регистратор, Активность и др.)
Для каждого Поле Из ОписаниеРегистра.СтандартныеРеквизиты Цикл
МассивПолей.Добавить(Поле.Имя);
Сообщить("Стандартный реквизит: " + Поле.Имя);
КонецЦикла;
// 2. Извлекаем измерения (ключевые поля регистра)
Для каждого Поле Из ОписаниеРегистра.Измерения Цикл
МассивПолей.Добавить(Поле.Имя);
Сообщить("Измерение: " + Поле.Имя);
КонецЦикла;
// 3. Извлекаем ресурсы (хранимые значения)
Для каждого Поле Из ОписаниеРегистра.Ресурсы Цикл
МассивПолей.Добавить(Поле.Имя);
Сообщить("Ресурс: " + Поле.Имя);
КонецЦикла;
// 4. Извлекаем дополнительные реквизиты
Для каждого Поле Из ОписаниеРегистра.Реквизиты Цикл
МассивПолей.Добавить(Поле.Имя);
Сообщить("Реквизит: " + Поле.Имя);
КонецЦикла;
Важно помнить, что помимо свойства Имя, объекты метаданных имеют свойство Синоним. Если вы планируете выводить названия колонок пользователю, лучше использовать именно Синоним, так как он содержит человекочитаемое название на языке пользователя.
Иногда требуется не просто вывести данные в готовый макет, а создать этот макет "на лету" или программно изменить существующий. Рассмотрим ситуацию, когда нам нужно превратить обычную ячейку макета в параметр, чтобы затем заполнить её данными.
Выясним, как это сделать по шагам. Для работы с областью ячеек используется объект ОбластьЯчеекТабличногоДокумента. Чтобы ячейка начала принимать значения, её свойство Заполнение должно быть установлено в значение ТипЗаполненияОбластиТабличногоДокумента.Параметр.
Рассмотрим практический пример создания области в макете:
ТабДок = Новый ТабличныйДокумент;
// Получаем существующий макет из объекта (обработки или документа)
Макет = ПолучитьМакет("Макет");
// Выделяем область (строка 1, колонка 1)
Область = Макет.Область(1, 1);
// Указываем, что это параметр
Область.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
Область.Параметр = "ЗаголовокОтчета";
// Назначаем имя всей области, чтобы к ней можно было обратиться позже
Область.Имя = "Шапка";
// Теперь мы можем получить эту область и заполнить её
СекцияШапка = Макет.ПолучитьОбласть("Шапка");
СекцияШапка.Параметры.ЗаголовокОтчета = "Продажи за период";
ТабДок.Вывести(СекцияШапка);
ТабДок.Показать();
Часто возникают вопросы с правильной адресацией ячеек при использовании метода Область(). Существует два основных способа обращения к ячейкам:
Макет.Область(НомерСтроки, НомерКолонки). Это наиболее удобный способ для программных циклов. Помните, что индексация начинается с 1.ТабДок.Область("R1C2"). Здесь "R" означает Row (строка), а "C" — Column (колонка). Этот метод часто используется, когда адреса ячеек хранятся в настройках или внешних данных.Проанализируем типичную ошибку: если вы используете Область(1, 2), вы обращаетесь к конкретной ячейке на пересечении первой строки и второй колонки. Если же вы хотите выделить прямоугольник, используйте четыре параметра: Область(Верх, Лево, Низ, Право).
Чтобы универсальный отчет выглядел профессионально, необходимо программно управлять его внешним видом. После того как вы получили объект области, вы можете изменять шрифт, выравнивание и границы.
Разберем, как сделать текст жирным и центрировать его:
Область = ТабДок.Область("R1C1:R1C10"); // Выделяем заголовочную строку
// Установка жирного шрифта
// Обратите внимание: мы создаем новый объект Шрифт на основе текущего
Область.Шрифт = Новый Шрифт(Область.Шрифт, , , Истина);
// Горизонтальное и вертикальное выравнивание
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
// Добавление границ (сетки)
Область.Обвести(ТипЛинииЯчейкиТабличногоДокумента.Сплошная);
Важный нюанс: при работе со шрифтами в 1С нельзя просто изменить свойство Жирный. Объект Шрифт является неизменяемым, поэтому мы всегда создаем новый экземпляр, передавая в конструктор старый шрифт и указывая признак Истина для жирности.
Для создания действительно универсального макета, где количество колонок зависит от структуры регистра, используйте метод Присоединить() вместо Вывести(). Метод Вывести() всегда добавляет новую строку (сверху вниз), а Присоединить() добавляет область справа к уже выведенной строке.
Посмотрим на пример формирования динамической шапки:
// Сначала выводим первую колонку (фиксированную)
ОбластьЯчейки = Макет.ПолучитьОбласть("ЯчейкаДляЗаголовка");
ТабДок.Вывести(ОбластьЯчейки);
// Затем в цикле присоединяем остальные колонки из метаданных
Для каждого Измерение Из ОписаниеРегистра.Измерения Цикл
ОбластьЯчейки.Параметры.ТекстЗаголовка = Измерение.Синоним;
ТабДок.Присоединить(ОбластьЯчейки);
КонецЦикла;
Такой подход позволяет строить отчеты для любых регистров, не перерисовывая макет вручную каждый раз при изменении состава полей в конфигураторе. Это экономит время разработчика и делает систему более гибкой.