В процессе автоматизации документооборота часто возникает задача формирования печатных форм или файлов Microsoft Word, в которых должен отображаться список согласующих лиц. Стандартных реквизитов автозаполнения не всегда достаточно, особенно когда требуется вывести не просто список имен, а конкретные результаты согласования, даты и должности. В этой статье мы подробно разберем, как написать скрипт для получения виз согласования, проанализируем типичные ошибки и настроим корректный вывод данных в шаблон документа.
Прежде чем приступать к написанию кода, давайте разберем, где именно хранятся данные о согласовании в системе 1С:Документооборот. В версиях 2.1 и выше основным источником информации является справочник ВизыСогласования. Каждая запись в этом справочнике связана с владельцем документа (внутренним, входящим или исходящим) и содержит информацию об исполнителе, результате его решения и дате.
Рассмотрим базовую структуру запроса, который позволит нам получить список согласующих лиц для текущего предмета. Для этого нам необходимо обратиться к реквизиту ВладелецФайла (или Предмет), чтобы установить связь между файлом и документом.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВизыСогласования.Исполнитель КАК Исполнитель,
| ВизыСогласования.РезультатСогласования КАК Результат,
| ВизыСогласования.ДатаИсполнения КАК Дата
|ИЗ
| Справочник.ВизыСогласования КАК ВизыСогласования
|ГДЕ
| ВизыСогласования.Документ = &Предмет
| И ВизыСогласования.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("Предмет", Файл.ВладелецФайла);
Проанализируем ситуацию, когда документ проходит несколько кругов согласования. В системе 1С:Документооборот старые визы не удаляются физически, а помечаются как архивные. Если мы не добавим условие на отсечение старых итераций, в наш файл попадут все визы со всех предыдущих кругов вперемешку, что является грубой ошибкой.
Для корректного отбора только актуальных виз необходимо добавить фильтр по реквизиту ПомещенаВИсторию. Также важно учитывать статус удаления самой визы. Выясним, какие условия нужно добавить в блок ГДЕ нашего запроса:
|ГДЕ
| ВизыСогласования.Документ = &Предмет
| И НЕ ВизыСогласования.ПометкаУдаления
| И НЕ ВизыСогласования.Удалена
| И НЕ ВизыСогласования.ПомещенаВИсторию
| И ВизыСогласования.РезультатСогласования = ЗНАЧЕНИЕ(Перечисление.РезультатыСогласования.Согласовано)
Обратите внимание на использование функции ЗНАЧЕНИЕ. Это критически важный момент для языка запросов 1С. Попытка обратиться к перечислению через точку в тексте запроса (например, Перечисления.Результаты.Согласовано) приведет к ошибке выполнения скрипта. Также часто требуется выводить не только результат "Согласовано", но и "Согласовано с замечаниями". В этом случае лучше использовать оператор В и передать массив значений или перечислить их в ЗНАЧЕНИЕ.
После того как мы получили данные из базы, нам нужно преобразовать их в текстовую строку, которую поймет шаблон Microsoft Word или OpenOffice. Скрипт автозаполнения ожидает, что переменная Результат будет содержать готовую строку или значение.
Разберем по шагам процесс сборки финальной строки с использованием цикла обхода выборки запроса. Мы будем форматировать дату для более презентабельного вида и добавлять должность сотрудника.
Результат = "";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем должность сотрудника
Должность = Выборка.Исполнитель.ОсновноеРабочееМесто.Должность;
// Форматируем дату (убираем время для официального вида)
ДатаСтр = Формат(Выборка.Дата, "ДЛФ=D");
// Собираем строку: Должность, ФИО, Результат и Дата
СтрокаВизы = Строка(Должность) + " " + Строка(Выборка.Исполнитель) +
": " + Строка(Выборка.Результат) + " от " + ДатаСтр;
// Добавляем перенос строки, если это не первая запись
Результат = Результат + ?(ПустаяСтрока(Результат), "", Символы.ПС) + СтрокаВизы;
КонецЦикла;
Посмотрим на ситуацию со стороны отладки. Часто пользователи жалуются на ошибку в общем модуле АвтозаполнениеШаблоновФайловСервер. Проанализируем основные причины сбоев:
Пользователи), в то время как поле в Word ожидает строковый тип. Всегда используйте функцию Строка() для представления ссылочных данных.ВизыСогласования, скрипт завершится аварией. Убедитесь, что в профилях групп доступа разрешено чтение этого справочника.Результат может остаться неопределенной. Обязательно инициализируйте её пустой строкой в самом начале скрипта: Результат = "";.Если вы работаете в новой версии системы (3.0), следует помнить, что логика работы с процессами изменилась. Согласование теперь может храниться в регистрах сведений "Результаты обработки" или в новых структурах задач. Однако для обратной совместимости во многих конфигурациях справочник виз продолжает заполняться. Если ваш запрос к справочнику ВизыСогласования в версии 3.0 ничего не возвращает, рекомендуется проверить настройки программы или обратиться к программному интерфейсу (API), используя функции интеграции процессов.
Если в вашем шаблоне предусмотрена специальная таблица для листа согласования, эффективнее использовать механизм заполнения табличных частей. В этом случае скрипт должен возвращать не строку, а объект ТаблицаЗначений. Колонки таблицы значений должны называться точно так же, как теги в ячейках таблицы в вашем Word-файле.
Проанализируем пример подготовки такой таблицы:
ТаблицаВиз = Новый ТаблицаЗначений;
ТаблицаВиз.Колонки.Добавить("НомерПП");
ТаблицаВиз.Колонки.Добавить("ФИО");
ТаблицаВиз.Колонки.Добавить("Дата");
Счетчик = 1;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТаблицаВиз.Добавить();
НоваяСтрока.НомерПП = Счетчик;
НоваяСтрока.ФИО = Строка(Выборка.Исполнитель);
НоваяСтрока.Дата = Формат(Выборка.Дата, "ДЛФ=D");
Счетчик = Счетчик + 1;
КонецЦикла;
Результат = ТаблицаВиз;
Важно: При использовании таблиц в настройках автозаполнения необходимо указать тип заполнения "Таблица" и выбрать соответствующую таблицу в файле-шаблоне. Это обеспечит автоматическое добавление новых строк в документ в зависимости от количества согласующих.
Таким образом, мы рассмотрели полный цикл настройки автозаполнения: от написания корректного запроса с фильтрацией архивных данных до форматирования вывода и обработки потенциальных ошибок. Используя предложенные методы, вы сможете настроить гибкое и отказоустойчивое формирование документов в системе 1С:Документооборот.