При разработке внешних печатных форм (ВПФ) в формате Microsoft Word часто возникает задача адаптации текста под пол конкретного сотрудника. Например, в тексте трудового договора или соглашения фраза "именуемый в дальнейшем" должна автоматически меняться на "именуемая в дальнейшем", если документ печатается для женщины. В этой статье мы подробно разберем, как правильно реализовать эту логику в коде 1С, избежав типичных ошибок начинающих разработчиков.
Прежде чем приступать к написанию кода, проанализируем, где именно хранятся данные о поле. В конфигурациях на базе БСП (например, ЗУП 3.1, ERP, КА) информация о поле содержится в справочнике ФизическиеЛица. Справочник Сотрудники является лишь оболочкой, которая содержит ссылку на конкретное физическое лицо.
Рассмотрим типичную ошибку из обсуждения: обращение к менеджеру справочника вместо конкретной ссылки. Код Справочники.ФизическиеЛица.Пол не будет работать, так как система пытается найти реквизит Пол у всего справочника в целом, а не у конкретного человека. Нам необходимо сначала получить ссылку на физическое лицо, а затем обратиться к его свойствам.
Самый распространенный способ — подготовить значение параметра в коде 1С и передать его в шаблон Word. Разберем по шагам, как это сделать правильно.
Во-первых, мы должны убедиться, что сравниваем значение пола не со строкой "Мужской" или "Женский", а со значением системного перечисления. Это гарантирует корректную работу программы при любом языке интерфейса.
Посмотрим на пример правильной реализации логики в модуле обработки:
// Предположим, у нас есть структура ДанныеПечати, куда мы собрали сведения о сотруднике
Если ДанныеПечати.Пол = Перечисления.ПолФизическогоЛица.Женский Тогда
Окончание = "ая";
СловоЦеликом = "именуемая";
Иначе
// Если пол мужской или не указан, по правилам делопроизводства используем мужской род
Окончание = "ый";
СловоЦеликом = "именуемый";
КонецЕсли;
// Заполняем параметры для передачи в Word
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ыйая", Окончание);
СтруктураПараметров.Вставить("ИменуемыйИменуемая", СловоЦеликом);
В данном примере мы подготовили два варианта: подстановку только окончания (если в шаблоне написано именуем{ыйая}) и подстановку слова целиком (если в шаблоне стоит параметр {ИменуемыйИменуемая}). Рекомендуем использовать второй вариант, так как он делает шаблон более читаемым.
Чтобы избежать ошибки "Поле объекта не обнаружено", которая часто возникает при попытке прямого обращения к реквизитам через точку (особенно если переменная может оказаться пустой), следует использовать функции библиотеки стандартных подсистем (БСП). Рассмотрим, как это упрощает код:
// Получаем пол через общие модули БСП, это безопаснее
ПолСотрудника = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаСотрудника, "ФизическоеЛицо.Пол");
Если ПолСотрудника = Перечисления.ПолФизическогоЛица.Женский Тогда
ПараметрыМакета.Вставить("ТекстИменуемый", "именуемая");
Иначе
ПараметрыМакета.Вставить("ТекстИменуемый", "именуемый");
КонецЕсли;
Использование ОбщегоНазначения.ЗначениеРеквизитаОбъекта позволяет в одну строку "пробросить" путь через несколько реквизитов (от сотрудника к полу физлица) и корректно обработать ситуацию, если ссылка пустая.
Существует еще один продвинутый способ, который позволяет не загромождать код 1С условиями. Мы можем передать в Word только значение пола, а логику выбора слова прописать в самом файле .docx с помощью полей условий (IF). Рассмотрим, как это настроить:
Ctrl+F9. Появятся фигурные скобки.{ IF { MERGEFIELD Пол } = "Женский" "именуемая" "именуемый" }.
// В 1С передаем просто пол
ДанныеДляПечати.Вставить("Пол", Строка(СсылкаНаФизЛицо.Пол));
Этот метод удобен тем, что кадровик или юрист может самостоятельно изменить текст "именуемый" на "принятый/принятая" прямо в ворде, не обращаясь к программисту для правки кода Если ... Тогда.
Проанализируем ситуацию, упомянутую в сообщении №26: ошибка "Значение не является значением объектного типа (ПоследняяВыведеннаяОбласть)". Эта проблема специфична для механизмов печати 1С через COM-соединение или подсистему УправлениеПечатью.
Она возникает в следующих случаях:
"ыйая" в коде совпадает с именем поля в макете.СписокСотрудников), убедитесь, что границы областей в Word не пересекаются и правильно размечены.ПечатнаяФорма не был создан должным образом до момента вызова функции заполнения параметров.Если ваша задача сложнее, чем просто замена окончания (например, нужно просклонять должность "Главный бухгалтер" в родительном падеже с учетом пола), рассмотрим использование сервиса Морфер или встроенных функций 1С. В ЗУП 3.1 есть полезная функция, которую мы можем вызвать для формирования представлений:
// Пример использования встроенного склонения для ФИО и связанных слов
РезультатСклонения = ФизическиеЛица.СклонитьФИО(ФизЛицо.ФИО, 2, ФизЛицо.Пол);
// Где 2 - это родительный падеж
Для прилагательных (именуемый/именуемая) в крупных проектах часто создают вспомогательную таблицу соответствий или отдельную функцию в общем модуле, которая принимает на вход мужской вариант слова и возвращает нужный результат в зависимости от переданного пола. Это позволяет избежать дублирования кода во многих печатных формах.
Подводя итог, выясним самый эффективный путь: для простых замен "ый/ая" лучше всего использовать программную проверку через Перечисления.ПолФизическогоЛица в модуле обработки и передавать готовое слово в параметр макета. Это наиболее надежный и понятный для поддержки способ.