Как программно сформировать печатную форму и прикрепить ее к объекту 1С

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

В процессе разработки в среде 1С часто возникает задача автоматизации рутинных действий. Одной из таких задач является массовое формирование печатных форм (например, приказов, справок или расчетных листков) с их последующим сохранением в информационной базе. Это особенно актуально для конфигураций, использующих Библиотеку стандартных подсистем (БСП), таких как 1С:ЗУП, 1С:ERP или 1С:КА. В данной статье мы разберем, как программно перебрать документы, сформировать для них табличные документы, преобразовать их в формат PDF и прикрепить к объектам через механизм «Присоединенные файлы».

Общая схема решения задачи

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

  1. Получение выборки данных: Создаем запрос к нужным документам, которые требуют обработки.
  2. Формирование печатной формы: Используем программный интерфейс менеджера печати или модуля менеджера документа для получения объекта ТабличныйДокумент.
  3. Преобразование в двоичные данные: Конвертируем печатную форму в поток данных (обычно в формате PDF для универсальности).
  4. Прикрепление к объекту: Используем стандартный программный интерфейс БСП для создания записи в справочнике присоединенных файлов.

Шаг 1: Получение списка документов и инициализация процесса

Проанализируем ситуацию: нам нужно обработать список документов. На сервере мы создаем запрос, который выбирает ссылки на документы. Важно помнить, что работа с прикреплением файлов должна происходить строго на стороне сервера.


// Пример получения выборки документов
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ПриемНаРаботу.Ссылка КАК Ссылка
    |ИЗ
    |   Документ.ПриемНаРаботу КАК ПриемНаРаботу
    |ГДЕ
    |   ПриемНаРаботу.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

Выборка = Запрос.Выполнить().Выбрать();

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

Шаг 2: Программное формирование табличного документа

Выясним причину, по которой лучше использовать типовые механизмы печати. В современных конфигурациях печатные формы описываются в модулях менеджеров объектов. Чтобы не дублировать код заполнения макета, мы обратимся к функции СформироватьПечатныеФормы. Рассмотрим, как получить ТабличныйДокумент программно.


Функция ПолучитьТабДокДокумента(СсылкаНаДокумент)
    
    // Подготовим структуры для вызова менеджера печати
    ИменаМакетов = "ПФ_MXL_Т1"; // Имя макета из модуля менеджера
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(СсылкаНаДокумент);
    
    ПараметрыПечати = Новый Структура;
    КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИменаМакетов);
    ОбъектыПечати = Новый СписокЗначений;
    
    // Вызываем формирование
    Документы.ПриемНаРаботу.Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, Новый Структура);
    
    // Извлекаем результат
    СтрокаПечатнойФормы = КоллекцияПечатныхФорм.Найти(ИменаМакетов, "ИмяМакета");
    Если СтрокаПечатнойФормы <> Неопределено Тогда
        Возврат СтрокаПечатнойФормы.ТабличныйДокумент;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Шаг 3: Работа с двоичными данными через потоки

Разберем важный нюанс: запись файла на диск сервера — операция медленная и требующая прав доступа. Современная платформа 1С позволяет работать в оперативной памяти с помощью потоков. Проанализируем, как конвертировать ТабличныйДокумент в ДвоичныеДанные напрямую.

Важно: Для сервисов кадрового ЭДО и обмена документами (например, «1С:Кабинет сотрудника») рекомендуется использовать формат PDF.


// Получаем двоичные данные из табличного документа
Поток = Новый ПотокВПамяти();
ТабДок.Записать(Поток, ТипФайлаТаблицы.PDF);
ДвоичныеДанныеФайла = Поток.ЗакрытьИПолучитьДвоичныеДанные();

Шаг 4: Прикрепление файла через механизмы БСП

Теперь рассмотрим самый ответственный момент — регистрацию файла в системе. В БСП за это отвечает общий модуль ПрисоединенныеФайлы. Нам не нужно вручную создавать элементы справочников, система сделает это сама, определив правильный тип справочника (например, Справочник.ПриемНаРаботуПрисоединенныеФайлы) по типу владельца.

Разберем по шагам параметры метода ДобавитьФайл:


ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ИмяФайлаБезРасширения", "Приказ_Т1_" + Формат(ОбъектСсылка.Дата, "ДФ=yyyyMMdd"));
ПараметрыФайла.Вставить("Расширение", "pdf");
ПараметрыФайла.Вставить("ДатаМодификацииУниверсальная", ТекущаяДатаСеанса());

НовыйФайлСсылка = ПрисоединенныеФайлы.ДобавитьФайл(
    ОбъектСсылка,             // Ссылка на документ-владелец
    ПараметрыФайла.ИмяФайлаБезРасширения, 
    ПараметрыФайла.Расширение,
    ПараметрыФайла.ДатаМодификацииУниверсальная,
    ДвоичныеДанныеФайла,      // Те самые данные из потока
    ПараметрыФайла            // Дополнительные параметры
);

Интеграция с сервисом «1С:Кабинет сотрудника»

Если ваша задача связана с проектом «Кабинет сотрудника» (как упоминалось в обсуждении на форуме), помните, что простого прикрепления файла к документу может быть недостаточно. Для того чтобы документ появился в личном кабинете для подписи, его необходимо опубликовать в подсистеме Электронного кадрового документооборота (КЭДО).

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

Резюме и практические советы

Подведем итоги нашей совместной работы по разбору данной задачи:

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

← На главную