При подготовке печатных форм и автозаполняемых шаблонов коммерческих договоров или соглашений в 1С:Документооборот часто возникает необходимость выгрузить в документ Microsoft Word данные не нашей компании, а контрагента. Одной из главных задач становится корректное получение ФИО подписанта со стороны сторонней организации и его правильное склонение (например, в родительном падеже: «в лице...»). Проанализируем, как решить эту задачу с помощью программных скриптов, выясним причины проблем со склонением и рассмотрим нюансы работы с защищенными шаблонами файлов.
В зависимости от структуры хранения данных в системе 1С:Документооборот, подписанта со стороны контрагента можно получить двумя основными способами:
Рассмотрим пример запроса для получения контактного лица контрагента:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| КонтактныеЛица.Ссылка КАК КонтактноеЛицо
|ИЗ
| Справочник.КонтактныеЛица КАК КонтактныеЛица
|ГДЕ
| КонтактныеЛица.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", Контрагент);
РезультатЗапроса = Запрос.Выполнить();
Если же данные о подписанце находятся в шапке или реквизитах документа, обращение к представлению физического лица из табличной части Стороны выглядит следующим образом:
// Извлечение наименования подписанта второй стороны (индекс 1)
ФИОПодписанта = Файл.ВладелецФайла.Стороны[1].Подписал.Наименование;
Для подстановки ФИО в преамбулу договора требуется родительный падеж (кого? / чего?). В Библиотеке Стандартных Подсистем (БСП) предусмотрен специальный общий модуль СклонениеПредставленийОбъектов.
Разберем базовый вызов функции склонения конкретной текстовой строки в родительный падеж (число 2 соответствует родительному падежу):
РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьПредставление(ФИОПодписанта, 2);
Если требуется получить полный набор падежей или гарантировать обработку всей структуры ФИО, используем функцию ПросклонятьПредставлениеПоВсемПадежам:
ФИО = Файл.ВладелецФайла.Стороны[1].Подписал.Наименование;
СтруктураПадежей = СклонениеПредставленийОбъектов.ПросклонятьПредставлениеПоВсемПадежам(ФИО, Истина);
Если СтруктураПадежей <> Неопределено Тогда
РезультатОбработки = СтруктураПадежей.РодительныйПадеж;
КонецЕсли;
Бывают ситуации, когда код выполняется без ошибок, но на выходе система возвращает исходную строку в именительном падеже или выдает ошибку заполнения реквизитов. Разберем основные причины такого поведения:
Попытка ... Исключение и возвращает исходную строку без склонения.Для поиска точной причины сбоя проанализируем выполнение алгоритма в режиме отладки. В Конфигураторе выберите пункт меню «Отладка» -> «Остановка по ошибке» и установите флаг «Останавливаться по ошибке». Также можно установить точку останова в функции ПросклонятьПредставление общего модуля СклонениеПредставленийОбъектов и пройти по шагам с помощью клавиши F11.
Отдельный практический вопрос — использование шаблонов Word в формате .dotx или .docx, на которые установлена защита от редактирования с паролем.
Важное ограничение: Стандартный механизм 1С (парсинг OpenXML/ZIP-архива) и штатное обращение через COM-объект Word.Application не могут изменить защищенный документ, если на него наложен пароль. Попытка подстановки значений в защищенный файл приведет либо к ошибке выполнения, либо к повреждению структуры документа.
Для работы с такими шаблонами применяются следующие подходы:
// Пример работы с защищенным документом через COM-соединение
ДокументWord = COMОбъект.Documents.Open(ПутьКФайлу);
// Снимаем защиту паролем
ДокументWord.Unprotect("ВашПароль");
// Выполняем подстановку значений в теги или закладки
// ...
// Возвращаем защиту (2 - разрешено только заполнение форм, 3 - только чтение)
ДокументWord.Protect(2, Ложь, "ВашПароль");
ДокументWord.Save();