При работе с программным продуктом 1С:Документооборот 8 КОРП версии 2.1 пользователи часто сталкиваются с тем, что стандартных реквизитов в настройках заполнения шаблонов файлов недостаточно. Одной из типичных задач является вывод должности сотрудника, подготовившего или подписавшего документ, а также формирование списка участников рабочей группы непосредственно в тексте документа Word.
В этой статье мы подробно рассмотрим, как с помощью встроенных скриптов в механизме автозаполнения шаблонов решить эти задачи, проанализируем структуру хранения данных и разберем конкретные примеры кода.
Стандартные реквизиты «Подготовил» или «Подписал» в шаблоне внутреннего документа обычно возвращают только ФИО сотрудника. Однако для официальных документов, таких как докладные записки или приказы, необходимо указывать и его должность. Рассмотрим, как получить должность через скрипт.
Для настройки перейдем в Настройки заполнения файла, выберем нужный реквизит и перейдем на закладку Скрипты. Проанализируем программный код, который позволит нам извлечь должность из базы данных:
РезультатОбработки = "";
Сотрудник = Файл.ВладелецФайла.Подготовил;
Если ЗначениеЗаполнено(Сотрудник) Тогда
// Получаем должность через специализированный программный интерфейс
ДолжностьСтрока = Строка(РаботаСПользователями.ПолучитьДолжность(Сотрудник));
// При необходимости склоняем должность в нужный падеж (например, родительный - 2)
РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьПредставление(ДолжностьСтрока, 2);
КонецЕсли;
Разберем, что происходит в этом коде. Объект Файл.ВладелецФайла обращается к самому документу (внутреннему, входящему или исходящему), к которому прикреплен шаблон. Функция РаботаСПользователями.ПолучитьДолжность — это стандартный метод системы, который обращается к регистру сведений СведенияОПользователяхДокументооборот. Важно помнить, что в системе 1С:Документооборот должности хранятся именно в этом регистре, а не в справочнике Пользователи.
Более сложная задача — это вывод участников рабочей группы документа. Сложность заключается в том, что рабочая группа не является табличной частью документа в привычном понимании программиста, а хранится в отдельном регистре сведений РабочиеГруппы. Кроме того, участником может быть не только конкретный пользователь, но и целое подразделение или роль.
Рассмотрим по шагам, как написать эффективный запрос для получения этого списка. Нам необходимо выполнить соединение данных документа с записями регистра по ссылке на объект.
Проанализируем пример скрипта, который собирает всех участников в одну текстовую строку с разделением по строкам:
РезультатОбработки = "";
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РабочиеГруппы.Участник КАК Участник
|ИЗ
| РегистрСведений.РабочиеГруппы КАК РабочиеГруппы
|ГДЕ
| РабочиеГруппы.Объект = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Файл.ВладелецФайла);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
МассивУчастников = Новый Массив;
Пока Выборка.Следующий() Цикл
// Добавляем строковое представление участника в массив
МассивУчастников.Добавить(Строка(Выборка.Участник));
КонецЦикла;
// Соединяем участников, разделяя их переносом строки
РезультатОбработки = СтрСоединить(МассивУчастников, Символы.ПС);
В данном примере мы используем Символы.ПС для того, чтобы в конечном документе Word каждый участник начинался с новой строки. Выясним причину, по которой мы используем именно Файл.ВладелецФайла: в контексте скрипта автозаполнения это единственный надежный способ получить ссылку на текущий документ.
Часто в рабочую группу добавляют не людей поименно, а подразделение целиком. Если мы используем код выше, в документ просто выведется название подразделения (например, "Бухгалтерия"), что не всегда удобно. Если нам нужно "раскрыть" состав подразделения до конкретных людей, логику следует усложнить.
Посмотрим на алгоритм реализации такой проверки:
РабочиеГруппы.СправочникСсылка.Пользователи, просто добавляем в список.СправочникСсылка.СтруктураПредприятия (подразделение), вызываем функцию РаботаСПользователями.ПолучитьСоставПодразделения.Такой подход гарантирует, что в шаблоне будут перечислены реальные исполнители, а не просто административные единицы.
Выясним важный момент: если вам нужно выводить состав рабочей группы в нескольких разных видах документов, писать один и тот же скрипт в каждой настройке — плохая практика. В 1С:Документооборот существует справочник Алгоритмы (в разделе «Администрирование» или «Настройки»).
Рекомендуем создать один общий алгоритм «ПолучитьСписокРабочейГруппы» и вызывать его в настройках заполнения файла одной строкой. Это значительно упростит поддержку системы: если вы решите изменить формат вывода (например, добавить должности рядом с ФИО), вам достаточно будет поправить код в одном месте.
Также стоит обратить внимание на производительность. При формировании запроса в ГДЕ всегда указывайте РабочиеГруппы.Объект = &Ссылка. Это позволит SQL-серверу использовать индекс по полю Объект и мгновенно находить нужные записи, не перебирая весь регистр, который в крупных организациях может содержать миллионы строк.
Если в шаблоне документа ФИО и должность должны стоять в дательном падеже (например, «Кому: Директору Иванову И.И.»), используйте встроенную функцию склонения. В 1С:ДО 2.1 это обычно делается так:
РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьФИО(ФИО, 3); (где 3 — дательный падеж).
Важно: Склонять нужно каждого участника по отдельности внутри цикла обхода выборки запроса, а не всю итоговую строку целиком, так как алгоритм склонения не сможет корректно обработать длинный список имен, разделенных переносами. Также в визуальное оформление часто входит вставка QR-кода в файлы doc и docx.
Таким образом, комбинируя запросы к регистрам и стандартные функции БСП (Библиотеки стандартных подсистем), можно гибко настроить любые, даже самые сложные шаблоны документов (включая такие аспекты, как цифровая подпись), автоматизируя подготовку документации и снижая вероятность ошибок ручного ввода.