Разработка эффективной системы отчетности в 1С:Предприятие требует не только правильного составления запросов, но и создания качественных печатных форм. Именно макеты позволяют представить сухие цифры в понятном для руководства или контрагентов виде. Многие начинающие разработчики сталкиваются с трудностями при попытке вывести данные в нужном формате, используя стандартные средства платформы.
В этой статье мы детально разберем процесс создания внешнего отчета или обработки, в которой результат формируется на основе заранее заготовленного шаблона. Вы научитесь работать с инструментом Табличный документ, который является стандартом де-факто для печати в экосистеме 1С. Мы перейдем от теории к практике, рассматривая реальные примеры кода и настройки свойств ячеек.
Подготовка формы и выбор типа макета
Первым шагом в создании любого отчета является определение его структуры. В конфигураторе 1С для хранения визуального шаблона используются объекты типа Макет. Существует несколько видов макетов, но для формирования печатных форм наиболее востребованным является тип Табличный документ. Этот формат позволяет гибко настраивать ширину колонок, объединять ячейки и задавать сложные границы.
Создайте новый объект конфигурации или откройте существующую обработку. В дереве метаданных найдите ветку "Макеты" и добавьте новый элемент. При создании система предложит выбрать тип. Выберите Табличный документ. Откроется редактор, визуально напоминающий интерфейс Microsoft Excel, но с расширенными возможностями для программной обработки.
Здесь важно сразу продумать расположение данных. Не стоит пытаться сделать универсальный шаблон "на все случаи жизни". Лучше создать несколько специализированных макетов для разных сценариев использования. Например, один макет для краткой справки руководителю, а другой — для детальной расшифровки для бухгалтера.
⚠️ Внимание: Если вы планируете выводить данные в формате PDF или отправлять их по электронной почте, убедитесь, что используемые шрифты являются стандартными для сервера 1С, иначе при печати на удаленном клиенте верстка может "поехать".
Настройка областей и параметров вывода
Ключевым механизмом работы с макетами является система Областей. Область — это именованный диапазон ячеек, к которому программа обращается по имени. Это позволяет динамически заполнять шаблон данными, не зная заранее точных координат строк и столбцов. Для создания области выделите нужный диапазон ячеек в редакторе макета.
В панели свойств найдите поле "Имя области" и задайте уникальное идентификатор, например, Шапка, СтрокаТовара или Подвал. Имена должны быть латиницей и не содержать пробелов, так как они будут использоваться в коде программы как строковые константы. Разделите ваш макет на логические блоки: заголовок отчета, таблицу с данными и итоговую часть.
Для динамического подстановки значений внутри ячеек используются Параметры. В тексте ячейки укажите имя параметра в фигурных скобках, например <НаименованиеОрганизации> или <Сумма>. При выполнении кода платформа автоматически заменит эти метки на реальные значения из структуры данных.
- 📊 ОбластьМакет — основной контейнер для повторяющихся строк таблицы.
- 🏷️ Параметры — переменные для подстановки единичных значений (даты, суммы, названия).
- 🎨 Стили — набор настроек оформления (шрифт, цвет, выравнивание), применяемый к области.
Используйте разные цвета фона для областей в редакторе макета (свойство "Цвет фона"), чтобы визуально отличать шапку от тела таблицы при разработке. На печать этот цвет не выводится, если не задано явно.
Заполнение данных через код 1С
После подготовки визуальной части необходимо написать программный код, который свяжет базу данных с макетом. Обычно это делается в модуле объекта обработки или в форме элемента. Основной алгоритм заключается в получении макета, создании таблицы значений и циклическом заполнении областей.
Сначала получаем объект макета из конфигурации. Затем создаем объект ТабличныйДокумент и загружаем в него макет. Далее формируем запрос к базе данных для получения необходимых сведений. Результаты запроса помещаются в таблицу значений, которая будет служить источником данных для отчета.
Макет = ПолучитьМакет("ОсновнойМакет");
ТабДок = Новый ТабличныйДокумент;
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.Вывести(Макет);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Номенклатура.Наименование КАК Товар,
| Сумма(Продажи.Сумма) КАК СуммаПродаж
|ИЗ Документ.РеализацияТоваровУслуг КАК Продажи
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
|ПО Продажи.Номенклатура = Номенклатура.Ссылка
|ГДЕ Продажи.Дата МЕЖДУ &НачПериода И &КонПериода
|СГРУППИРОВАТЬ ПО Номенклатура.Наименование";
Запрос.УстановитьПараметр("НачПериода", НачалоДня(ПериодНач));
Запрос.УстановитьПараметр("КонПериода", КонецДня(ПериодКон));
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Важно правильно организовать цикл обработки выборки. Для каждой строки результата запроса мы должны взять область макета, заполнить её параметрами и вывести в табличный документ. Метод ВывестиОбласть автоматически сдвигает курсор вывода вниз, формируя непрерывную таблицу.
⚠️ Внимание: Интерфейсы и методы работы с метаданными могут незначительно отличаться в зависимости от версии платформы 1С:Предприятие (8.2, 8.3, 8.4). Всегда проверяйте синтаксис в справочной системе вашей конкретной конфигурации.
☑️ Алгоритм заполнения отчета
Циклический вывод строк таблицы
Самая распространенная ошибка при создании отчетов — попытка вывести все данные одной областью. Правильный подход подразумевает вывод строки-образца для каждой записи выборки. Внутри цикла Пока ВыборкаДетальныеЗаписи.Следующий() происходит маппинг полей запроса на параметры макета.
Создайте структуру или используйте непосредственно поля выборки для передачи значений. Обратите внимание на типы данных: если в макете параметр ожидает число, а в базе приходит строка, может возникнуть ошибка форматирования или отображение значения в неверном виде. Используйте явное приведение типов при необходимости.
Для сложных отчетов, где требуется группировка данных (например, вывод итогов по каждому контрагенту), логика цикла усложняется. Вам потребуется отслеживать изменение значения группирующего поля и выводить дополнительную область ИтогоПоГруппе при смене контекста.
- 🔄 Цикл По — стандартный оператор для перебора коллекции данных.
- 📉 Сумма — агрегатная функция, часто используемая для подсчета итогов в запросе.
- 📑 ВывестиОбласть — метод табличного документа для печати конкретного блока.
Рассмотрим пример кода для цикла вывода:
Пока ВыборкаДетальныеЗаписи.Следущий() Цикл
Область = Макет.ПолучитьОбласть("СтрокаТовара");
Область.Параметры.Товар = ВыборкаДетальныеЗаписи.Товар;
Область.Параметры.Сумма = ВыборкаДетальныеЗаписи.СуммаПродаж;
ТабДок.Вывести(Область);
КонецЦикла;
Как обрабатывать пустые выборки?
Если запрос не вернул ни одной строки, цикл не выполнится ни разу. В таком случае рекомендуется вывести специальную область "НетДанных" с соответствующим сообщением, чтобы пользователь не видел пустой отчет.
Форматирование и условное оформление
Внешний вид отчета играет критическую роль в восприятии информации. Платформа 1С позволяет применять Условное оформление непосредственно в коде или через настройки макета. Вы можете менять цвет шрифта, фон ячейки или добавлять рамки в зависимости от значения данных.
Например, если сумма продажи превышает определенный лимит, можно выделить строку жирным шрифтом или красным цветом. Это делается через объект ОформлениеЯчейки. Создайте экземпляр оформления, задайте нужные свойства и примените его к диапазону ячеек табличного документа.
| Свойство оформления | Описание | Пример значения |
|---|---|---|
| Шрифт | Настройки гарнитуры и размера | Arial, 12, Жирный |
| ЦветТекста | Цвет символов в ячейке | Красный, Синий |
| ЦветФона | Цвет заливки ячейки | СветлоЖелтый |
| ГоризонтальноеВыравнивание | Положение текста по горизонтали | ПоЦентру, Право |
Также стоит уделить внимание нумерации страниц и колонтитулам. В свойствах табличного документа можно задать текст для верхнего и нижнего колонтитула, который будет повторяться на каждой странице при печати. Используйте специальные поля, такие как <Страница> и <КоличествоСтраниц>, для автоматической нумерации.
Условное оформление лучше задавать программно после вывода данных, так как это дает максимальную гибкость и позволяет реагировать на сложные логические условия, недоступные в статическом макете.
Вывод на печать и сохранение в файл
Финальным этапом работы с отчетом является его представление пользователю. Объект ТабличныйДокумент обладает широким спектром методов для экспорта. Самый простой способ — вызвать метод Показать(), который откроет стандартное окно просмотра с панелью инструментов для печати и сохранения.
Для автоматического сохранения в файл используется метод Записать(). Вы можете выбрать формат сохранения: собственный формат 1С (mxl), PDF, Excel (xlsx) или HTML. При сохранении в PDF важно настроить параметры страницы, чтобы данные не обрезались на стыке листов.
Если отчет формируется в фоновом задании или на стороне сервера без интерфейса, необходимо явно указывать путь к файлу на клиентском месте или использовать потоки для передачи данных. В тонком клиенте прямой доступ к файловой системе сервера из кода ограничен политиками безопасности.
// Сохранение в PDF
ИмяФайла = "C:\Отчеты\Продажи.pdf";
ТабДок.Записать(ИмяФайла, ФорматТабличногоДокумента.PDF);
// Открытие для просмотра
ТабДок.Показать("Отчет по продажам");
⚠️ Внимание: При сохранении в формат Excel сложные элементы оформления 1С (например, специфические рамки или объединение ячеек особого типа) могут конвертироваться некорректно. Всегда проверяйте результат в целевом офисном пакете.
Часто задаваемые вопросы (FAQ)
Как сделать так, чтобы таблица переносилась на следующую страницу автоматически?
Для этого в свойствах макета или программного объекта ТабличныйДокумент необходимо включить режим АвтоМасштаб и правильно настроить поля страницы. Также убедитесь, что высота строк не зафиксирована жестко, позволяя контенту переноситься.
Можно ли использовать один макет для разных печатных форм?
Да, это распространенная практика. Вы можете создавать в одном макете несколько областей с разными именами и в коде решать, какую из них выводить в зависимости от настроек отчета или типа документа.
Почему не отображаются картинки в макете при печати?
Проверьте, что картинки вставлены как объекты "Картинка" внутри ячеек, а не просто как фон. Убедитесь, что путь к изображению корректен и у пользователя есть права на чтение этого файла, если картинка подгружается динамически.
Как скрыть колонку в макете, если данных нет?
Используйте программное управление видимостью. Получите область, соответствующую колонке, и установите её свойство Видимость в значение Ложь перед выводом, если условие выполнения не соблюдается.
В чем разница между Областью и Параметром?
Область — это диапазон ячеек (блок), который выводится целиком. Параметр — это переменная внутри ячейки, значение которой подставляется в текст. Область может содержать множество параметров.