Работа с внешними приложениями через механизм OLE Automation — классическая задача для разработчика 1С:Предприятия 7.7. Одной из самых популярных операций является формирование печатных форм в формате MS Word. Однако этот процесс часто сопровождается ошибками, связанными как с метаданными самой 1С, так и с особенностями объектной модели Word. Рассмотрим подробно, как диагностировать и исправлять ошибки при передаче данных в текстовые редакторы.
Данная ошибка в контексте работы со справочниками (например, Сотрудники) означает, что система не может найти реквизит или метод с указанным именем у конкретного объекта. Проанализируем основные причины возникновения этой ситуации:
Сотрудник.ФИОДатПад, но в Конфигураторе у справочника Сотрудники нет реквизита с идентификатором ФИОДатПад, система выдаст ошибку. Проверьте вкладку «Реквизиты» в структуре справочника.Сотрудник пуста (например, значение не выбрано в форме), попытка обратиться к любому её полю приведет к ошибке. Всегда используйте проверку:
Если Сотрудник.Выбран() = 1 Тогда
// выполняем действия
Иначе
Сообщить("Сотрудник не выбран!");
КонецЕсли;
Получить(). Рассмотрим на примере:
// Неправильно для периодического реквизита:
Значение = Сотрудник.ФИОДатПад;
// Правильно:
Значение = Сотрудник.ФИОДатПад.Получить(ДатаДок);
После того как связь с объектом 1С налажена, может возникнуть проблема на стороне Word. Ошибка «Ошибка! Переменная документа не указана» (Document Variable Not Defined) появляется непосредственно в тексте распечатанного документа.
Выясним причину: в шаблоне Word (файл .dot или .doc) вставлено поле типа { DOCVARIABLE "ИмяПеременной" }, но из кода 1С в коллекцию Variables этого документа не было передано соответствующее значение. Чтобы исправить это, проанализируем следующие шаги:
1. Соответствие имен. Проверьте, что имя переменной в 1С в точности совпадает с именем в шаблоне Word. Регистр символов в некоторых версиях Word может иметь значение. Например:
// В 1С:
Document.Variables.Item("ДатаНОтп").Value = СокрЛП(датаНачОтп);
В шаблоне Word при нажатии Alt + F9 вы должны увидеть: { DOCVARIABLE ДатаНОтп }. Если в Word написано «ДатаНачОтп», а в 1С «ДатаНОтп», возникнет ошибка.
2. Принудительное обновление полей. После заполнения всех переменных необходимо дать команду Word пересчитать значения полей, иначе он не «подхватит» переданные данные. Добавьте в конец блока печати следующую строку:
Document.Fields.Update();
Рассмотрим важный архитектурный вопрос: стоит ли хранить ФИО в дательном падеже (ФИОДатПад) как отдельный реквизит справочника? Существует два подхода:
NameDecl.dll). Разберем, как это реализовать. Посмотрим на пример вызова внешней компоненты:
Если ЗагрузитьВнешнююКомпоненту("NameDecl.dll") = 0 Тогда
Сообщить("Компонента склонения не найдена!");
КонецЕсли;
Склонение = СоздатьОбъект("AddIn.NameDeclension");
// Получаем ФИО в дательном падеже (цифра 3 соответствует дательному падежу)
ФИО_Дательный = Склонение.Просклонять(Сотрудник.Наименование, 3, Сотрудник.Пол);
Проанализируем ситуацию: если ваша организация небольшая, проще добавить реквизит. Если сотрудников сотни — внедряйте автоматическое склонение, но оставьте возможность ручной корректировки для исключительных случаев.
Если работа с Variables кажется вам избыточной или нестабильной, разберем альтернативный способ передачи данных — через закладки. Закладка — это именованная область в документе Word.
Посмотрим на пример кода при использовании закладок:
// Устанавливаем текст в месте расположения закладки "СотрудникИмя"
Document.Bookmarks("СотрудникИмя").Range.Text = СокрЛП(Сотрудник.Наименование);
Преимущества метода закладок:
Document.Fields.Update(), текст меняется мгновенно.В завершение подчеркнем: при возникновении ошибки «Поле агрегатного объекта не обнаружено» всегда начинайте с проверки метаданных в Конфигураторе и типа переменной в отладчике. Только убедившись, что объект в 1С валиден, переходите к отладке шаблона MS Word.