Как исправить ошибку «Поле агрегатного объекта не обнаружено» и настроить заполнение шаблонов MS Word в 1С 7.7?

Программист 1С v7.7 Управленческий учет
← На главную

Работа с внешними приложениями через механизм OLE Automation — классическая задача для разработчика 1С:Предприятия 7.7. Одной из самых популярных операций является формирование печатных форм в формате MS Word. Однако этот процесс часто сопровождается ошибками, связанными как с метаданными самой 1С, так и с особенностями объектной модели Word. Рассмотрим подробно, как диагностировать и исправлять ошибки при передаче данных в текстовые редакторы.

Разбор ошибки «Поле агрегатного объекта не обнаружено»

Данная ошибка в контексте работы со справочниками (например, Сотрудники) означает, что система не может найти реквизит или метод с указанным именем у конкретного объекта. Проанализируем основные причины возникновения этой ситуации:

  1. Отсутствие реквизита в метаданных. Это самая частая причина. Если в коде вы обращаетесь к Сотрудник.ФИОДатПад, но в Конфигураторе у справочника Сотрудники нет реквизита с идентификатором ФИОДатПад, система выдаст ошибку. Проверьте вкладку «Реквизиты» в структуре справочника.
  2. Объект не выбран. Если переменная Сотрудник пуста (например, значение не выбрано в форме), попытка обратиться к любому её полю приведет к ошибке. Всегда используйте проверку:
    
    Если Сотрудник.Выбран() = 1 Тогда
        // выполняем действия
    Иначе
        Сообщить("Сотрудник не выбран!");
    КонецЕсли;
    
  3. Периодический реквизит. Если реквизит является периодическим, к нему нельзя обращаться напрямую как к обычному полю. Необходимо использовать метод Получить(). Рассмотрим на примере:
    
    // Неправильно для периодического реквизита:
    Значение = Сотрудник.ФИОДатПад; 
    
    // Правильно:
    Значение = Сотрудник.ФИОДатПад.Получить(ДатаДок);
    

Устранение ошибки «Переменная документа не указана» в MS Word

После того как связь с объектом 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();

Автоматизация склонения ФИО: функции против реквизитов

Рассмотрим важный архитектурный вопрос: стоит ли хранить ФИО в дательном падеже (ФИОДатПад) как отдельный реквизит справочника? Существует два подхода:

  1. Ручной ввод в реквизит. Вы создаете текстовый реквизит и пользователь сам вписывает туда фамилию в нужном падеже. Плюс: 100% точность (человек не ошибется в сложных фамилиях). Минус: огромные трудозатраты при большом штате сотрудников.
  2. Программное склонение. Использование функций или внешних компонент (например, NameDecl.dll). Разберем, как это реализовать. Посмотрим на пример вызова внешней компоненты:
    
    Если ЗагрузитьВнешнююКомпоненту("NameDecl.dll") = 0 Тогда
        Сообщить("Компонента склонения не найдена!");
    КонецЕсли;
    Склонение = СоздатьОбъект("AddIn.NameDeclension");
    // Получаем ФИО в дательном падеже (цифра 3 соответствует дательному падежу)
    ФИО_Дательный = Склонение.Просклонять(Сотрудник.Наименование, 3, Сотрудник.Пол);
    

Проанализируем ситуацию: если ваша организация небольшая, проще добавить реквизит. Если сотрудников сотни — внедряйте автоматическое склонение, но оставьте возможность ручной корректировки для исключительных случаев.

Альтернативный метод: Использование закладок (Bookmarks)

Если работа с Variables кажется вам избыточной или нестабильной, разберем альтернативный способ передачи данных — через закладки. Закладка — это именованная область в документе Word.

Посмотрим на пример кода при использовании закладок:


// Устанавливаем текст в месте расположения закладки "СотрудникИмя"
Document.Bookmarks("СотрудникИмя").Range.Text = СокрЛП(Сотрудник.Наименование);

Преимущества метода закладок:

В завершение подчеркнем: при возникновении ошибки «Поле агрегатного объекта не обнаружено» всегда начинайте с проверки метаданных в Конфигураторе и типа переменной в отладчике. Только убедившись, что объект в 1С валиден, переходите к отладке шаблона MS Word.

← На главную