Рекомендации по работе с печатными формами в 1С
У печатных форм, которые могут быть отправлены в КЭДО, есть некоторые ограничения.
1. Для стандартных и внешних печатных форм, которые преобразуются в pdf:
- доступен только серверный вызов;
- печатная форма возвращает табличный документ;
- должна отображаться в командах печати выбранного документа;
- внешние печатные формы списочных документов пока не обрабатываются.
Пример печатной формы, которая преобразуется в pdf — Лист ознакомления с ЛНА.
2. Для стандартных и внешних печатных форм, которые преобразуются в docx:
- форма возвращается в таблице в поле «Офисные документы».
Для этого необходимо вызвать УправлениеПечатью.СформироватьПечатныеФормы и получить сформированные печатные формы.
Далее нужно проверить колллекцию ПечатныеФормы.КоллекцияПечатныхФорм[0].ОфисныеДокументы, и если в этой коллекции есть сформированный документ Word, то забрать его.
Иначе считаем, что в 1C была прислана обычная печатная форма, которая преобразуется в pdf.
В данном случае разница заключается в получении строки Base64 для передачи на бэкенд. Документы Word и pdf по-разному сохраняются в 1С. Поэтому важно знать, где расположены печатные формы разных форматов.
При формировании печатных форм в docx, подписание при отправке работать не будет. Печатная форма будет только отправляться в КЭДО, а подписание пройдет уже в заявке. Это связано с тем, что docx сначала конвертируется в pdf, а подписать можно документы только в формате pdf.
3. Для конструктора печатных форм:
- доступен вызов клиентского метода;
- доступно открытие формы конструктора;
- при закрытии форма возвращает структуру по примеру:
Закрыть(Новый Структура("ЭтоДокументWord, ДвоичныеДанные", ЭтоДокументWord, ДвоичныеДанные);
где:
ЭтоДокументWord (Булево) — признак, является ли печатная форма документом Word;
ДвоичныеДанные (ДвоичныеДанные) — двоичные данные табличного документа или документа Word;
- форма должна отображаться в командах печати выбранного документа;
- форма подключена как внешняя печатная форма документа;
- внешние печатные формы списочных документов пока не обрабатываются.
Шаблон внешней обработки с конструктором.
Чтобы кастомный документ работал с КЭДО, необходимо в форме этого документа добавить код процедур ПослеЗаписи() и Оповестить() с событием "Запись_ИмяДокумента". Пример:

Процедуры ПослеЗаписи() и Оповестить() должны присутствовать в форме кастомного документа, если он будет создаваться по кнопке «Создать документ» из заявки в Рабочем месте кадровика. Иначе система не узнает, что документ записался, и не сможет связать его с заявкой КЭДО и отправить его печатные формы в КЭДО.
Информация предназначена для Специалиста 1С со стороны клиента.
Для работы с дополнительными списочными документами на вашей стороне необходимо редактировать обработку, которая формирует и обрабатывает отправку печатной формы в КЭДО, то есть по аналогии с типовыми печатными формами, которые 1С умеет «распиливать», например, «Кадровый перевод списком».
Для этого требуется в коде обработки скорректировать печатную форму. Рекомендуем смотреть в коде, начиная с фрагмента vkd_ОбработкаДанныхСервер.ПечатныеФормыСписочныхДокументовПоСотрудникам, или с иных функций/процедур, перечисленных в описании «распила» ниже.
На стороне КЭДО должна быть добавлена только массовая рассылка в бизнес-процесс, заявки по которому хотите отправлять сотрудникам.
Как работает «распил» внутренней печатной формы:
- Функция ПечатныеФормыСписочныхДокументовПоСотрудникам
Эта функция вызывается не напрямую из интерфейса, а как фоновая многопоточная задача из vkd_КомандыКЭДОСервер. Функция делит сотрудников на порции и каждую порцию отправляет в vkd_ОбработкаДанныхСервер.ПечатныеФормыСписочныхДокументовПоСотрудникам.
Основная функция: цикл по сотрудникам и их командам.
Что делает функция:
- для каждого сотрудника ищет его строки в
КомандыПечатиПоСпискуСотрудников; - для каждой строки вызывает фабрику формы
ПечатнаяФормаДокументаИзКомандыПечати(...); - если форма получена — конвертирует в PDF (binary) и располагает в
СтруктураКоманды.ПечатнаяФормаДвоичныеДанные; - возвращает только успешные команды.
Если печатная форма не получена — пишет ошибку в сообщения пользователя и журнал регистрации и продолжает цикл дальше (не «валит» всю порцию сотрудников).
- Функция ПечатнаяФормаДокументаИзКомандыПечати
Функция определяет, каким способом получить печатную форму для конкретного типа документа.
Ветка A. Если требуется печатная форма для списочных документов «Кадровый перевод списком», «Премия» и т.п., то выполняется:
Процедура СформироватьПечатнуюФормуСВыборомВариантаФормирования(...)
Если печатная форма формируется с помощью отчёта СКД, то вызывается типовой отчёт, в который передается дополнительный отбор по сотруднику.
Проверка осуществляется через функцию ЭтаПечатнаяФормаДокументаФормируетсяОтчетомСКД(...) (набор ID печатных форм Т1а/Т5а/Т6а/Т8а/Т11 и др.).
Далее:
- строится отбор по сотруднику через
ПараметрыОтбораПриФормированииПечатнойФормы; - задаются параметры конкретного отчета через процедуру
ЗаполнитьПараметрыПечати; - выводится в коллекцию печатных форм;
- берётся первый
ТабличныйДокумент.
Ветка B. Если требуется печатная форма для других типов списочных документов, то создаётся временный документ под одного сотрудника, из этого документа извлекается печатная форма с помощью:
Процедура СформироватьПечатнуюФормуДокумента(...)
Важный внутренний механизм для «распила»:
Функция ПечатныеФормыСозданногоДокумента(...)
Алгоритм:
- берётся исходный списочный документ;
- определяется главная табличная часть (
СотрудникиилиДанныеОВременидля табеля); - если у сотрудника нет строк в этой табличной части —
Неопределено; - стартует транзакция;
- документ копируется через
Скопировать(), у копии очищаются все табличные части; - табличные части заполняются только строками нужного сотрудника через процедуру
ЗаполнитьТабличныеЧастиДокумента(...); - копия записывается;
- формируется печатная форма (внешняя обработка или обычный
УправлениеПечатью.СформироватьПечатныеФормы); - транзакция отменяется (данные в базе не остаются).
Получается «чистый» печатный результат по сотруднику. Технический документ не сохраняется в базе данных.
«Распил» на уровне содержимого документа реализован через:
Процедура ЗаполнитьТабличныеЧастиДокумента(...)
Что важно:
- поле связи по сотруднику не всегда
Сотрудник, для ряда документов используетсяИдентификаторСтрокиСотрудника; - запросом берётся набор ключей-строк по выбранному сотруднику;
- выполняется проход по всем табличным частям исходного документа и перенос найденных строк в копию;
- специальные табличные части (
ДополнительныеРеквизиты,ФизическиеЛица) исключены из общего цикла; - блок
ФизическиеЛицадобавляется отдельно и сворачивается по физическому лицу.
Ветка C. Если требуется печатная форма для графика отпусков, то выполняется:
Процедура СформироватьПечатнуюФормуДокументаГрафикОтпусков(...)Функция ПечатьТ7(...)
Для формы Т7 используется отдельная логика через отчёт Отчеты.ГрафикОтпусков:
- выставляется отбор по сотруднику;
- собирается табличный документ;
- возвращается готовая форма.