Как подключить печатную форму к документу в 1С:КА2 и заполнить ее данными?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация
← На главную

При работе с системой 1С:Предприятие, в частности с конфигурацией 1С:Комплексная автоматизация 2 (КА2), часто возникает задача создания и заполнения печатных форм документов. Пользователям, особенно новичкам в программировании 1С, может быть неочевидно, как правильно "связать" данные проведенного документа с макетом печатной формы, чтобы информация корректно отображалась в итоговом печатном виде. В данной статье мы подробно разберем, как осуществить этот процесс, включая получение данных, заполнение областей макета и вывод порядкового номера и даты документа.

Понимание архитектуры печатных форм в 1С

Прежде чем мы перейдем к практическим шагам, давайте зафиксируем основные понятия. В 1С печатная форма — это не просто статичное изображение, а динамически генерируемый ТабличныйДокумент, который формируется на основе заранее подготовленного Макета и данных, полученных из объекта системы (в нашем случае, документа). Макет определяет структуру формы (шапка, табличная часть, подвал) и содержит специальные параметры, которые мы будем заполнять программно.

Шаг 1: Создание макета печатной формы

Первым делом нам необходимо создать макет печатной формы. Это шаблон, который определяет внешний вид нашей будущей печати. Макет создается в конфигураторе 1С в специальном табличном редакторе.

  1. Открытие конфигуратора: Запустите 1С в режиме конфигуратора.
  2. Выбор объекта: Найдите нужный документ (например, "РеализацияТоваровУслуг") в дереве объектов конфигурации.
  3. Создание макета: Откройте ветку "Макеты" для вашего документа и добавьте новый макет.
  4. Определение областей: В табличном редакторе макета мы должны разметить области, которые будут заполняться данными. Например:
    • Шапка: для общих данных документа (номер, дата, контрагент).
    • ЗаголовокТабличнойЧасти: для заголовков колонок табличной части.
    • СтрокаТабличнойЧасти: для данных каждой строки табличной части.
    • Подвал: для итоговых сумм, подписей.

    Для определения области выделите нужные ячейки и в свойствах области (обычно внизу экрана) укажите ее имя. Например, выделите несколько верхних строк и назовите область "Шапка".

  5. Размещение параметров: Внутри этих областей мы размещаем параметры, которые будут заполняться программно. Параметры обозначаются в угловых скобках, например, <НомерДокумента>, <ДатаДокумента>, <КонтрагентНаименование>. Эти имена параметров должны быть осмысленными, так как именно по ним мы будем обращаться из кода.
  6. Использование Конструктора: Для упрощения процесса создания базового макета и части кода, мы можем воспользоваться встроенным "Конструктором печатных форм", который доступен через контекстное меню документа в конфигураторе. Он поможет создать стандартные области и предложит начальный код.

Шаг 2: Получение данных из документа

Основная проблема, с которой столкнулся автор темы, заключалась в том, как "вытащить" данные из документа, чтобы заполнить ими печатную форму. Рассмотрим несколько сценариев получения ссылки на документ и, что самое главное, эффективный способ сбора самих данных.

1. Получение ссылки на печатаемый документ:

  1. Если печать запускается из формы документа:

    В этом случае, ссылка на текущий открытый документ доступна через глобальный объект Объект. Например, для получения номера и даты, мы можем использовать Объект.Номер и Объект.Дата.

  2. Если печать запускается из списка документов, из модуля менеджера или из внешней обработки:

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

2. Использование запросов для сбора данных:

Наиболее эффективный и рекомендуемый способ получения данных из документа, особенно если нам нужны данные из его табличных частей или связанных справочников, — это использование запросов. Запрос позволяет выбрать все необходимые поля за один раз, минимизируя обращения к базе данных.

Разберем пример структуры запроса, который выбирает основные реквизиты документа и его табличную часть:


// Создаем новый объект Запрос
Запрос = Новый Запрос;

// Определяем текст запроса.
// Мы выбираем номер, дату документа, наименование контрагента
// и данные из табличной части "Товары" (номенклатура, количество, сумма).
Запрос.Текст = "ВЫБРАТЬ
|    Документ.Номер КАК Номер,
|    Документ.Дата КАК Дата,
|    Документ.Контрагент.Наименование КАК КонтрагентНаименование,
|    ДокументТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
|    ДокументТовары.Количество КАК Количество,
|    ДокументТовары.Сумма КАК Сумма
|ИЗ
|    Документ.НазваниеДокумента КАК Документ // Используем псевдоним 'Документ' для основного объекта
|        ЛЕВОЕ СОЕДИНЕНИЕ Документ.НазваниеДокумента.Товары КАК ДокументТовары // Присоединяем табличную часть 'Товары'
|        ПО Документ.Ссылка = ДокументТовары.Ссылка // Условие соединения по ссылке на документ
|ГДЕ
|    Документ.Ссылка = &СсылкаНаДокумент // Фильтруем по конкретной ссылке на документ
|УПОРЯДОЧИТЬ ПО
|    НоменклатураНаименование"; // Сортируем строки табличной части для удобства

// Устанавливаем параметр запроса - ссылку на документ, который мы хотим напечатать
Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаПечатаемыйДокумент);

// Выполняем запрос и получаем выборку данных.
// Выборка будет содержать строки, где для каждой строки табличной части
// будут дублироваться данные шапки документа.
Выборка = Запрос.Выполнить().Выбрать();

После выполнения запроса мы получаем объект Выборка, который содержит все необходимые данные. Мы будем перемещаться по этой выборке, чтобы заполнять параметры нашего макета.

Шаг 3: Заполнение печатной формы (табличного документа)

Теперь, когда у нас есть макет и данные, мы можем приступить к формированию итогового табличного документа.

  1. Создание нового табличного документа:

    Мы инициализируем объект, который будет представлять нашу готовую печатную форму:

    ТабличныйДокумент = Новый ТабличныйДокумент;
  2. Загрузка макета:

    Нам нужно получить наш макет, который мы создали в конфигураторе:

    
    // Предполагаем, что код находится в модуле менеджера документа
    // или макет является общим макетом конфигурации.
    Макет = Документы.НазваниеДокумента.ПолучитьМакет("НазваниеВашегоМакета");
    

    Если макет является общим макетом, то обращение к нему будет через ОбщиеМакеты.НазваниеВашегоМакета.ПолучитьМакет("НазваниеОбластиВМакете").

  3. Получение областей макета:

    Для каждой области, которую мы хотим заполнить и вывести, мы должны получить ее из загруженного макета по имени:

    
    ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
    ОбластьЗаголовкаТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
    ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаТабличнойЧасти");
    
  4. Заполнение параметров областей:

    Используя данные из нашей Выборки, мы заполняем параметры полученных областей. Имена параметров должны точно соответствовать тем, что мы указали в угловых скобках в макете.

    Например, если в макете есть параметр <Номер>, то в коде мы обращаемся к нему как ОбластьШапки.Параметры.Номер.

  5. Вывод областей в табличный документ:

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

    
    // Выводим шапку документа
    ТабличныйДокумент.Вывести(ОбластьШапки);
    // Выводим заголовок табличной части
    ТабличныйДокумент.Вывести(ОбластьЗаголовкаТаблицы);
    
  6. Показ готовой печатной формы:

    Когда все области сформированы и выведены в табличный документ, мы показываем его пользователю с помощью метода Показать():

    ТабличныйДокумент.Показать();

Рассмотрим полный пример кода для заполнения и вывода печатной формы:


// Предположим, что СсылкаНаПечатаемыйДокумент уже получена
// (например, как параметр функции или из Объект.Ссылка).

// 1. Создаем новый табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;

// 2. Загружаем макет печатной формы
// "НазваниеВашегоМакета" - это имя макета, которое вы дали в конфигураторе
// "НазваниеДокумента" - это имя вашего документа (например, "РеализацияТоваровУслуг")
Макет = Документы.НазваниеДокумента.ПолучитьМакет("НазваниеВашегоМакета");

// 3. Получаем данные из документа с помощью запроса
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    Документ.Ссылка,
|    Документ.Номер,
|    Документ.Дата,
|    Документ.Контрагент.Наименование КАК КонтрагентНаименование,
|    ДокументТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
|    ДокументТовары.Количество КАК Количество,
|    ДокументТовары.Сумма КАК Сумма
|ИЗ
|    Документ.НазваниеДокумента КАК Документ
|        ЛЕВОЕ СОЕДИНЕНИЕ Документ.НазваниеДокумента.Товары КАК ДокументТовары
|        ПО Документ.Ссылка = ДокументТовары.Ссылка
|ГДЕ
|    Документ.Ссылка = &СсылкаНаДокумент
|УПОРЯДОЧИТЬ ПО
|    ДокументТовары.НомерСтроки"; // Обычно сортируют по номеру строки табличной части

Запрос.УстановитьПараметр("СсылкаНаДокумент", СсылкаНаПечатаемыйДокумент);
ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();

// 4. Заполняем и выводим области макета

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

// Переходим к первой записи выборки, которая содержит данные шапки
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    ОбластьШапки.Параметры.Номер = ВыборкаДетальныеЗаписи.Номер;
    ОбластьШапки.Параметры.Дата = Формат(ВыборкаДетальныеЗаписи.Дата, "ДФ=dd.MM.yyyy"); // Форматируем дату
    ОбластьШапки.Параметры.Контрагент = ВыборкаДетальныеЗаписи.КонтрагентНаименование;
    // ... другие параметры шапки
КонецЕсли;

// Выводим заполненную шапку в табличный документ
ТабличныйДокумент.Вывести(ОбластьШапки);

// Получаем и выводим заголовок табличной части (если он есть в макете)
Если Макет.ЕстьОбласть("ЗаголовокТаблицы") Тогда // Проверяем наличие области
    ОбластьЗаголовкаТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
    // Здесь можно заполнить параметры заголовка, если они есть,
    // например, названия колонок.
    ТабличныйДокумент.Вывести(ОбластьЗаголовкаТаблицы);
КонецЕсли;


// Получаем область для одной строки табличной части
ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаТабличнойЧасти");

// Сбрасываем выборку, чтобы начать обход с начала для табличной части
ВыборкаДетальныеЗаписи.Сбросить(); 

// Перебираем все строки выборки и заполняем область строк
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Заполняем параметры области для текущей строки
    ОбластьСтроки.Параметры.Номенклатура = ВыборкаДетальныеЗаписи.НоменклатураНаименование;
    ОбластьСтроки.Параметры.Количество = ВыборкаДетальныеЗаписи.Количество;
    ОбластьСтроки.Параметры.Сумма = ВыборкаДетальныеЗаписи.Сумма;
    // ... другие параметры строки

    // Выводим заполненную строку в табличный документ
    ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;

// В данном месте можно вывести область подвала, если она предусмотрена в макете,
// например, с итоговыми суммами. Для этого вам потребуется рассчитать их в запросе
// или после получения выборки.
// Если Макет.ЕстьОбласть("Подвал") Тогда
//     ОбластьПодвала = Макет.ПолучитьОбласть("Подвал");
//     // ОбластьПодвала.Параметры.ИтоговаяСумма = ...;
//     ТабличныйДокумент.Вывести(ОбластьПодвала);
// КонецЕсли;

// 5. Показываем сформированный табличный документ пользователю
ТабличныйДокумент.Показать();

// Обычно функция формирования печатной формы возвращает ТабличныйДокумент
Возврат ТабличныйДокумент;

Вывод порядкового номера и даты в заголовке

Автор темы спрашивал, как правильно вывести порядковый номер и дату в заголовке. Мы уже рассмотрели это в примере выше, но давайте акцентируем внимание на форматировании.

  1. В макете: Создайте в области "Шапка" параметр, например, <ЗаголовокПечати> или отдельные параметры <НомерДок> и <ДатаДок>.
  2. В коде: Заполняем этот параметр, комбинируя текст, номер и дату.

    Если мы используем выборку из запроса:

    
    // Предполагаем, что Выборка уже получила данные и находится на нужной записи
    ОбластьШапки.Параметры.НомерДок = Выборка.Номер;
    // Используем функцию Формат для корректного отображения даты
    ОбластьШапки.Параметры.ДатаДок = Формат(Выборка.Дата, "ДФ=dd.MM.yyyy"); 
    // Или для полного заголовка:
    ОбластьШапки.Параметры.ТекстЗаголовка = "Документ № " + Выборка.Номер + " от " + Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");
    

    Если код выполняется непосредственно в форме документа и мы имеем доступ к объекту документа (через Объект):

    
    // Пример использования из формы документа
    ОбластьШапки.Параметры.НомерДок = СокрЛП(Объект.Номер); // СокрЛП убирает лишние пробелы
    ОбластьШапки.Параметры.ДатаДок = Формат(Объект.Дата, "ДФ=dd.MM.yyyy"); // Пример формата даты
    

    Обратите внимание на использование функции Формат(), которая позволяет задать желаемый формат даты, времени или числа. "ДФ=dd.MM.yyyy" означает "формат даты: день.месяц.год".

Размещение кода для формирования печатной формы

Где именно размещать код, который мы написали для формирования печатной формы, зависит от требований и контекста:

  1. В модуле менеджера документа:

    Это стандартный и наиболее распространенный вариант для типовых (встроенных) печатных форм. В модуле менеджера документа создается экспортная функция, которая принимает ссылку на документ (или массив ссылок) и возвращает сформированный ТабличныйДокумент. Именно такие функции вызываются из команд печати в системе 1С:Предприятие.

    Пример структуры функции в модуле менеджера:

    
    // В модуле менеджера документа "НазваниеДокумента"
    Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати) Экспорт
        // МассивОбъектов содержит ссылки на печатаемые документы.
        // Для одной печати берем первый элемент.
        Если МассивОбъектов.Количество() = 0 Тогда
            Возврат Неопределено;
        КонецЕсли;
    
        СсылкаНаДокумент = МассивОбъектов[0]; 
        ТабличныйДокумент = Новый ТабличныйДокумент;
    
        // Далее весь код по получению данных запросом,
        // загрузке макета, заполнению областей и выводу
        // в ТабличныйДокумент, как мы рассмотрели выше.
        // ...
    
        Возврат ТабличныйДокумент;
    КонецФункции
    
  2. В модуле объекта внешней обработки/отчета:

    Для внешних печатных форм, которые подключаются к конфигурации без изменения ее исходного кода, код формирования печатной формы размещается в модуле объекта этой внешней обработки или отчета. Это удобно для кастомизации и обновления конфигурации.

  3. В управляемых формах:

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

Внешние печатные формы и интеграция с БСП (Библиотекой Стандартных Подсистем)

В 1С:КА2, как и в других конфигурациях, построенных на Библиотеке Стандартных Подсистем (БСП), активно используется механизм внешних печатных форм. Это мощный инструмент, который позволяет добавлять новые печатные формы или изменять существующие без необходимости внесения изменений в основную конфигурацию. Это значительно упрощает процесс поддержки и обновления системы.

  1. Преимущества: Внешние печатные формы создаются как внешние обработки или расширения, что позволяет их легко подключать и отключать, не затрагивая код конфигурации.
  2. Подключение: Внешние печатные формы подключаются через пользовательский режим 1С в разделе "Администрирование" -> "Печатные формы, отчеты и обработки". Здесь мы можем указать файл внешней обработки, выбрать объект, к которому она относится, и зарегистрировать команду печати.
  3. БСП: БСП предоставляет стандартные механизмы для регистрации команд печати и вызова функций формирования печатных форм, обеспечивая их бесшовную интеграцию в интерфейс программы. Мы можем передавать дополнительные параметры в печатную форму через структуру ПараметрыПечати или ДополнительныеПараметры в описании команды печати, что расширяет ее функциональность.

Настройка макета печатной формы в пользовательском режиме

В 1С:КА2 предусмотрена возможность редактирования существующих макетов печатных форм непосредственно в режиме "Предприятие" без необходимости входа в конфигуратор. Это очень удобно для оперативной корректировки дизайна формы, например, изменения шрифтов, расположения текста или добавления логотипа.

  1. Путь: Мы можем найти эту возможность в разделе "НСИ и администрирование" -> "Печатные формы, отчеты и обработки" -> "Макеты печатных форм".
  2. Редактирование: Здесь мы можем открыть нужный макет и внести изменения с помощью встроенного табличного редактора.
  3. Важное предупреждение: Критически важно не изменять выражения, заключенные в угловые скобки (например, <НомерДокумента>), так как это может нарушить работу печати. Эти выражения являются программными параметрами, и их изменение приведет к тому, что система не сможет найти данные для их заполнения. Мы можем изменять только статический текст, форматирование ячеек, добавлять новые строки и т.д.

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

← На главную