В процессе разработки в среде 1С часто возникает задача автоматизации рутинных действий. Одной из таких задач является массовое формирование печатных форм (например, приказов, справок или расчетных листков) с их последующим сохранением в информационной базе. Это особенно актуально для конфигураций, использующих Библиотеку стандартных подсистем (БСП), таких как 1С:ЗУП, 1С:ERP или 1С:КА. В данной статье мы разберем, как программно перебрать документы, сформировать для них табличные документы, преобразовать их в формат PDF и прикрепить к объектам через механизм «Присоединенные файлы».
Для реализации этой функциональности нам необходимо выполнить последовательность из четырех ключевых шагов. Рассмотрим их подробнее:
ТабличныйДокумент.Проанализируем ситуацию: нам нужно обработать список документов. На сервере мы создаем запрос, который выбирает ссылки на документы. Важно помнить, что работа с прикреплением файлов должна происходить строго на стороне сервера.
// Пример получения выборки документов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриемНаРаботу.Ссылка КАК Ссылка
|ИЗ
| Документ.ПриемНаРаботу КАК ПриемНаРаботу
|ГДЕ
| ПриемНаРаботу.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Здесь будет вызываться логика формирования и сохранения
ОбработатьДокумент(Выборка.Ссылка);
КонецЦикла;
Выясним причину, по которой лучше использовать типовые механизмы печати. В современных конфигурациях печатные формы описываются в модулях менеджеров объектов. Чтобы не дублировать код заполнения макета, мы обратимся к функции СформироватьПечатныеФормы. Рассмотрим, как получить ТабличныйДокумент программно.
Функция ПолучитьТабДокДокумента(СсылкаНаДокумент)
// Подготовим структуры для вызова менеджера печати
ИменаМакетов = "ПФ_MXL_Т1"; // Имя макета из модуля менеджера
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
ПараметрыПечати = Новый Структура;
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИменаМакетов);
ОбъектыПечати = Новый СписокЗначений;
// Вызываем формирование
Документы.ПриемНаРаботу.Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, Новый Структура);
// Извлекаем результат
СтрокаПечатнойФормы = КоллекцияПечатныхФорм.Найти(ИменаМакетов, "ИмяМакета");
Если СтрокаПечатнойФормы <> Неопределено Тогда
Возврат СтрокаПечатнойФормы.ТабличныйДокумент;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Разберем важный нюанс: запись файла на диск сервера — операция медленная и требующая прав доступа. Современная платформа 1С позволяет работать в оперативной памяти с помощью потоков. Проанализируем, как конвертировать ТабличныйДокумент в ДвоичныеДанные напрямую.
Важно: Для сервисов кадрового ЭДО и обмена документами (например, «1С:Кабинет сотрудника») рекомендуется использовать формат PDF.
// Получаем двоичные данные из табличного документа
Поток = Новый ПотокВПамяти();
ТабДок.Записать(Поток, ТипФайлаТаблицы.PDF);
ДвоичныеДанныеФайла = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Теперь рассмотрим самый ответственный момент — регистрацию файла в системе. В БСП за это отвечает общий модуль ПрисоединенныеФайлы. Нам не нужно вручную создавать элементы справочников, система сделает это сама, определив правильный тип справочника (например, Справочник.ПриемНаРаботуПрисоединенныеФайлы) по типу владельца.
Разберем по шагам параметры метода ДобавитьФайл:
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ИмяФайлаБезРасширения", "Приказ_Т1_" + Формат(ОбъектСсылка.Дата, "ДФ=yyyyMMdd"));
ПараметрыФайла.Вставить("Расширение", "pdf");
ПараметрыФайла.Вставить("ДатаМодификацииУниверсальная", ТекущаяДатаСеанса());
НовыйФайлСсылка = ПрисоединенныеФайлы.ДобавитьФайл(
ОбъектСсылка, // Ссылка на документ-владелец
ПараметрыФайла.ИмяФайлаБезРасширения,
ПараметрыФайла.Расширение,
ПараметрыФайла.ДатаМодификацииУниверсальная,
ДвоичныеДанныеФайла, // Те самые данные из потока
ПараметрыФайла // Дополнительные параметры
);
Если ваша задача связана с проектом «Кабинет сотрудника» (как упоминалось в обсуждении на форуме), помните, что простого прикрепления файла к документу может быть недостаточно. Для того чтобы документ появился в личном кабинете для подписи, его необходимо опубликовать в подсистеме Электронного кадрового документооборота (КЭДО).
Проанализируем ситуацию: после того как мы программно создали присоединенный файл, нам необходимо создать запись в соответствующем регистре сведений или документе «Электронный документ входящий», указав ссылку на наш новый файл. Это инициирует регламентное задание, которое выгрузит документ в облако 1С.
Подведем итоги нашей совместной работы по разбору данной задачи:
ПрисоединенныеФайлы, вместо прямой манипуляции справочниками. Это гарантирует целостность данных и правильное размещение файлов в томах на диске.ПрисоединенныеФайлы.ДанныеФайлов(ОбъектСсылка).Используя данный подход, вы сможете автоматизировать формирование любых отчетов и документов, сохраняя их историю непосредственно в карточке объекта 1С, что значительно повышает удобство работы пользователей.