При работе с системой 1С:Предприятие, в частности с конфигурацией 1С:Комплексная автоматизация 2 (КА2), часто возникает задача создания и заполнения печатных форм документов. Пользователям, особенно новичкам в программировании 1С, может быть неочевидно, как правильно "связать" данные проведенного документа с макетом печатной формы, чтобы информация корректно отображалась в итоговом печатном виде. В данной статье мы подробно разберем, как осуществить этот процесс, включая получение данных, заполнение областей макета и вывод порядкового номера и даты документа.
Прежде чем мы перейдем к практическим шагам, давайте зафиксируем основные понятия. В 1С печатная форма — это не просто статичное изображение, а динамически генерируемый ТабличныйДокумент, который формируется на основе заранее подготовленного Макета и данных, полученных из объекта системы (в нашем случае, документа). Макет определяет структуру формы (шапка, табличная часть, подвал) и содержит специальные параметры, которые мы будем заполнять программно.
Первым делом нам необходимо создать макет печатной формы. Это шаблон, который определяет внешний вид нашей будущей печати. Макет создается в конфигураторе 1С в специальном табличном редакторе.
Шапка: для общих данных документа (номер, дата, контрагент).ЗаголовокТабличнойЧасти: для заголовков колонок табличной части.СтрокаТабличнойЧасти: для данных каждой строки табличной части.Подвал: для итоговых сумм, подписей.Для определения области выделите нужные ячейки и в свойствах области (обычно внизу экрана) укажите ее имя. Например, выделите несколько верхних строк и назовите область "Шапка".
<НомерДокумента>, <ДатаДокумента>, <КонтрагентНаименование>. Эти имена параметров должны быть осмысленными, так как именно по ним мы будем обращаться из кода.Основная проблема, с которой столкнулся автор темы, заключалась в том, как "вытащить" данные из документа, чтобы заполнить ими печатную форму. Рассмотрим несколько сценариев получения ссылки на документ и, что самое главное, эффективный способ сбора самих данных.
1. Получение ссылки на печатаемый документ:
В этом случае, ссылка на текущий открытый документ доступна через глобальный объект Объект. Например, для получения номера и даты, мы можем использовать Объект.Номер и Объект.Дата.
В этом сценарии ссылка на документ обычно передается в процедуру или функцию формирования печатной формы в качестве параметра. Если у нас есть только ссылка на документ (например, СсылкаНаДок), а нам нужны его реквизиты, нам потребуется "получить объект" документа. Это делается с помощью метода ПолучитьОбъект(), который возвращает объект документа со всеми его реквизитами и табличными частями. Однако, мы рекомендуем использовать запросы для получения данных, даже если есть объект, так как это более производительно и гибко.
2. Использование запросов для сбора данных:
Наиболее эффективный и рекомендуемый способ получения данных из документа, особенно если нам нужны данные из его табличных частей или связанных справочников, — это использование запросов. Запрос позволяет выбрать все необходимые поля за один раз, минимизируя обращения к базе данных.
Разберем пример структуры запроса, который выбирает основные реквизиты документа и его табличную часть:
// Создаем новый объект Запрос
Запрос = Новый Запрос;
// Определяем текст запроса.
// Мы выбираем номер, дату документа, наименование контрагента
// и данные из табличной части "Товары" (номенклатура, количество, сумма).
Запрос.Текст = "ВЫБРАТЬ
| Документ.Номер КАК Номер,
| Документ.Дата КАК Дата,
| Документ.Контрагент.Наименование КАК КонтрагентНаименование,
| ДокументТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
| ДокументТовары.Количество КАК Количество,
| ДокументТовары.Сумма КАК Сумма
|ИЗ
| Документ.НазваниеДокумента КАК Документ // Используем псевдоним 'Документ' для основного объекта
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.НазваниеДокумента.Товары КАК ДокументТовары // Присоединяем табличную часть 'Товары'
| ПО Документ.Ссылка = ДокументТовары.Ссылка // Условие соединения по ссылке на документ
|ГДЕ
| Документ.Ссылка = &СсылкаНаДокумент // Фильтруем по конкретной ссылке на документ
|УПОРЯДОЧИТЬ ПО
| НоменклатураНаименование"; // Сортируем строки табличной части для удобства
// Устанавливаем параметр запроса - ссылку на документ, который мы хотим напечатать
Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаПечатаемыйДокумент);
// Выполняем запрос и получаем выборку данных.
// Выборка будет содержать строки, где для каждой строки табличной части
// будут дублироваться данные шапки документа.
Выборка = Запрос.Выполнить().Выбрать();
После выполнения запроса мы получаем объект Выборка, который содержит все необходимые данные. Мы будем перемещаться по этой выборке, чтобы заполнять параметры нашего макета.
Теперь, когда у нас есть макет и данные, мы можем приступить к формированию итогового табличного документа.
Мы инициализируем объект, который будет представлять нашу готовую печатную форму:
ТабличныйДокумент = Новый ТабличныйДокумент;
Нам нужно получить наш макет, который мы создали в конфигураторе:
// Предполагаем, что код находится в модуле менеджера документа
// или макет является общим макетом конфигурации.
Макет = Документы.НазваниеДокумента.ПолучитьМакет("НазваниеВашегоМакета");
Если макет является общим макетом, то обращение к нему будет через ОбщиеМакеты.НазваниеВашегоМакета.ПолучитьМакет("НазваниеОбластиВМакете").
Для каждой области, которую мы хотим заполнить и вывести, мы должны получить ее из загруженного макета по имени:
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
ОбластьЗаголовкаТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаТабличнойЧасти");
Используя данные из нашей Выборки, мы заполняем параметры полученных областей. Имена параметров должны точно соответствовать тем, что мы указали в угловых скобках в макете.
Например, если в макете есть параметр <Номер>, то в коде мы обращаемся к нему как ОбластьШапки.Параметры.Номер.
После заполнения параметров, каждая область выводится в итоговый табличный документ. Для этого используются методы Вывести() или Присоединить(). Вывести() вставляет область как новую, а Присоединить() добавляет ее непосредственно после предыдущей без переноса строки, что полезно для многострочных полей или смежных областей.
// Выводим шапку документа
ТабличныйДокумент.Вывести(ОбластьШапки);
// Выводим заголовок табличной части
ТабличныйДокумент.Вывести(ОбластьЗаголовкаТаблицы);
Когда все области сформированы и выведены в табличный документ, мы показываем его пользователю с помощью метода Показать():
ТабличныйДокумент.Показать();
Рассмотрим полный пример кода для заполнения и вывода печатной формы:
// Предположим, что СсылкаНаПечатаемыйДокумент уже получена
// (например, как параметр функции или из Объект.Ссылка).
// 1. Создаем новый табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
// 2. Загружаем макет печатной формы
// "НазваниеВашегоМакета" - это имя макета, которое вы дали в конфигураторе
// "НазваниеДокумента" - это имя вашего документа (например, "РеализацияТоваровУслуг")
Макет = Документы.НазваниеДокумента.ПолучитьМакет("НазваниеВашегоМакета");
// 3. Получаем данные из документа с помощью запроса
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Документ.Ссылка,
| Документ.Номер,
| Документ.Дата,
| Документ.Контрагент.Наименование КАК КонтрагентНаименование,
| ДокументТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
| ДокументТовары.Количество КАК Количество,
| ДокументТовары.Сумма КАК Сумма
|ИЗ
| Документ.НазваниеДокумента КАК Документ
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.НазваниеДокумента.Товары КАК ДокументТовары
| ПО Документ.Ссылка = ДокументТовары.Ссылка
|ГДЕ
| Документ.Ссылка = &СсылкаНаДокумент
|УПОРЯДОЧИТЬ ПО
| ДокументТовары.НомерСтроки"; // Обычно сортируют по номеру строки табличной части
Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаПечатаемыйДокумент);
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
// 4. Заполняем и выводим области макета
// Получаем область шапки документа
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
// Переходим к первой записи выборки, которая содержит данные шапки
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
ОбластьШапки.Параметры.Номер = ВыборкаДетальныеЗаписи.Номер;
ОбластьШапки.Параметры.Дата = Формат(ВыборкаДетальныеЗаписи.Дата, "ДФ=dd.MM.yyyy"); // Форматируем дату
ОбластьШапки.Параметры.Контрагент = ВыборкаДетальныеЗаписи.КонтрагентНаименование;
// ... другие параметры шапки
КонецЕсли;
// Выводим заполненную шапку в табличный документ
ТабличныйДокумент.Вывести(ОбластьШапки);
// Получаем и выводим заголовок табличной части (если он есть в макете)
Если Макет.ЕстьОбласть("ЗаголовокТаблицы") Тогда // Проверяем наличие области
ОбластьЗаголовкаТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
// Здесь можно заполнить параметры заголовка, если они есть,
// например, названия колонок.
ТабличныйДокумент.Вывести(ОбластьЗаголовкаТаблицы);
КонецЕсли;
// Получаем область для одной строки табличной части
ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаТабличнойЧасти");
// Сбрасываем выборку, чтобы начать обход с начала для табличной части
ВыборкаДетальныеЗаписи.Сбросить();
// Перебираем все строки выборки и заполняем область строк
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Заполняем параметры области для текущей строки
ОбластьСтроки.Параметры.Номенклатура = ВыборкаДетальныеЗаписи.НоменклатураНаименование;
ОбластьСтроки.Параметры.Количество = ВыборкаДетальныеЗаписи.Количество;
ОбластьСтроки.Параметры.Сумма = ВыборкаДетальныеЗаписи.Сумма;
// ... другие параметры строки
// Выводим заполненную строку в табличный документ
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
// В данном месте можно вывести область подвала, если она предусмотрена в макете,
// например, с итоговыми суммами. Для этого вам потребуется рассчитать их в запросе
// или после получения выборки.
// Если Макет.ЕстьОбласть("Подвал") Тогда
// ОбластьПодвала = Макет.ПолучитьОбласть("Подвал");
// // ОбластьПодвала.Параметры.ИтоговаяСумма = ...;
// ТабличныйДокумент.Вывести(ОбластьПодвала);
// КонецЕсли;
// 5. Показываем сформированный табличный документ пользователю
ТабличныйДокумент.Показать();
// Обычно функция формирования печатной формы возвращает ТабличныйДокумент
Возврат ТабличныйДокумент;
Автор темы спрашивал, как правильно вывести порядковый номер и дату в заголовке. Мы уже рассмотрели это в примере выше, но давайте акцентируем внимание на форматировании.
<ЗаголовокПечати> или отдельные параметры <НомерДок> и <ДатаДок>.Если мы используем выборку из запроса:
// Предполагаем, что Выборка уже получила данные и находится на нужной записи
ОбластьШапки.Параметры.НомерДок = Выборка.Номер;
// Используем функцию Формат для корректного отображения даты
ОбластьШапки.Параметры.ДатаДок = Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");
// Или для полного заголовка:
ОбластьШапки.Параметры.ТекстЗаголовка = "Документ № " + Выборка.Номер + " от " + Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");
Если код выполняется непосредственно в форме документа и мы имеем доступ к объекту документа (через Объект):
// Пример использования из формы документа
ОбластьШапки.Параметры.НомерДок = СокрЛП(Объект.Номер); // СокрЛП убирает лишние пробелы
ОбластьШапки.Параметры.ДатаДок = Формат(Объект.Дата, "ДФ=dd.MM.yyyy"); // Пример формата даты
Обратите внимание на использование функции Формат(), которая позволяет задать желаемый формат даты, времени или числа. "ДФ=dd.MM.yyyy" означает "формат даты: день.месяц.год".
Где именно размещать код, который мы написали для формирования печатной формы, зависит от требований и контекста:
Это стандартный и наиболее распространенный вариант для типовых (встроенных) печатных форм. В модуле менеджера документа создается экспортная функция, которая принимает ссылку на документ (или массив ссылок) и возвращает сформированный ТабличныйДокумент. Именно такие функции вызываются из команд печати в системе 1С:Предприятие.
Пример структуры функции в модуле менеджера:
// В модуле менеджера документа "НазваниеДокумента"
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати) Экспорт
// МассивОбъектов содержит ссылки на печатаемые документы.
// Для одной печати берем первый элемент.
Если МассивОбъектов.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
СсылкаНаДокумент = МассивОбъектов[0];
ТабличныйДокумент = Новый ТабличныйДокумент;
// Далее весь код по получению данных запросом,
// загрузке макета, заполнению областей и выводу
// в ТабличныйДокумент, как мы рассмотрели выше.
// ...
Возврат ТабличныйДокумент;
КонецФункции
Для внешних печатных форм, которые подключаются к конфигурации без изменения ее исходного кода, код формирования печатной формы размещается в модуле объекта этой внешней обработки или отчета. Это удобно для кастомизации и обновления конфигурации.
В современных конфигурациях 1С (на управляемых формах) для обработки команды печати часто используется клиент-серверное взаимодействие. Сначала клиентская процедура в форме документа вызывает серверную процедуру (например, экспортную функцию в модуле менеджера), которая выполняет основные действия по формированию ТабличногоДокумента. Затем сформированный ТабличныйДокумент передается обратно на клиент для показа.
В 1С:КА2, как и в других конфигурациях, построенных на Библиотеке Стандартных Подсистем (БСП), активно используется механизм внешних печатных форм. Это мощный инструмент, который позволяет добавлять новые печатные формы или изменять существующие без необходимости внесения изменений в основную конфигурацию. Это значительно упрощает процесс поддержки и обновления системы.
ПараметрыПечати или ДополнительныеПараметры в описании команды печати, что расширяет ее функциональность.В 1С:КА2 предусмотрена возможность редактирования существующих макетов печатных форм непосредственно в режиме "Предприятие" без необходимости входа в конфигуратор. Это очень удобно для оперативной корректировки дизайна формы, например, изменения шрифтов, расположения текста или добавления логотипа.
<НомерДокумента>), так как это может нарушить работу печати. Эти выражения являются программными параметрами, и их изменение приведет к тому, что система не сможет найти данные для их заполнения. Мы можем изменять только статический текст, форматирование ячеек, добавлять новые строки и т.д.Итак, мы подробно рассмотрели процесс подключения печатной формы к документу в 1С:КА2, от создания макета и получения данных с помощью запросов до заполнения и вывода итогового ТабличногоДокумента. Надеемся, что это руководство поможет вам уверенно работать с печатными формами и эффективно решать задачи по автоматизации документооборота.