При переходе на определенные релизы платформы 1С:Предприятие 8.3 (в частности, ветку 8.3.15.1830) многие технические специалисты столкнулись с неприятной проблемой: привычные макеты типа ActiveDocument, содержащие файлы Microsoft Word, перестают корректно инициализироваться. Ошибка может проявляться двояко: либо на этапе загрузки макета в конфигураторе («Неизвестный формат файла»), либо в коде при попытке обращения к объекту Application («Значение не является значением объектного типа»). Рассмотрим подробно, почему это происходит и как решить задачу несколькими способами.
Проанализируем ситуацию: чаще всего проблема возникает в клиент-серверном варианте работы или при использовании файловой базы, расположенной на серверной ОС (например, Windows Server 2019). Основная причина кроется в сочетании двух факторов:
Получить() для макета ActiveDocument, платформа пытается инициализировать COM-соединение с Word. Если в системе есть хотя бы малейшее несоответствие прав или настроек окружения, COM-сервер не возвращает управление 1С, и объект остается пустым (Неопределено).Выясним, какие шаги помогут нам восстановить работоспособность печати документов.
Как показывает практика и советы опытных разработчиков, использование ActiveDocument в 1С — механизм довольно капризный. Самый надежный способ обойти ошибки платформы — это хранить файл Word как Двоичные данные. В этом случае 1С не пытается «разобрать» структуру файла при получении макета, а просто отдает массив байтов.
Разберем по шагам, как переделать макет:
.doc или .docx.Рассмотрим пример кода, который позволяет безопасно получить макет на сервере и передать его для открытия на клиенте:
&НаСервере
Функция ПолучитьМакетДвоичныеДанныеНаСервере()
// Получаем макет как двоичные данные
ПолныйМакет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("МойВордМакет");
// Помещаем во временное хранилище, чтобы передать на клиент
Возврат ПоместитьВоВременноеХранилище(ПолныйМакет);
КонецФункции
&НаКлиенте
Процедура ВыполнитьПечатьВWord(Команда)
// 1. Создаем объект Word на клиенте
Попытка
WordApp = Новый COMОбъект("Word.Application");
Исключение
Сообщить("MS Word не установлен на данном компьютере!");
Возврат;
КонецПопытки;
// 2. Получаем данные из хранилища
АдресХранилища = ПолучитьМакетДвоичныеДанныеНаСервере();
ДвоичныеДанныеМакета = ПолучитьИзВременногоХранилища(АдресХранилища);
// 3. Сохраняем во временный файл
ПутьКФайлу = ПолучитьИмяВременногоФайла("doc");
ДвоичныеДанныеМакета.Записать(ПутьКФайлу);
// 4. Открываем файл в Word
НовыйДокумент = WordApp.Documents.Add(ПутьКФайлу);
WordApp.Visible = Истина;
// Далее выполняем заполнение параметров...
КонецПроцедуры
Этот метод хорош тем, что он полностью исключает зависимость от платформенного баба при работе с типом ActiveDocument. Программа просто работает с файлом напрямую через COM-объект Microsoft Word.
Если вы все же хотите продолжить использовать ActiveDocument, проанализируем настройки сервера. Часто COM-объекты Microsoft Office падают с ошибкой, если в профиле системной учетной записи отсутствуют папки Desktop. Это «древняя» особенность взаимодействия Windows и Office, которая часто проявляется именно на серверных ОС.
Попробуем создать следующие директории вручную:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop (обязательно для 64-битных систем)После создания папок необходимо дать на них полные права пользователю, под которым запускается служба 1C:Enterprise 8.3 Server Agent (обычно это USR1CV8). После этих манипуляций сервер иногда начинает корректно инициализировать ActiveDocument.
Проанализируем ситуацию с разрядностью. В релизе 8.3.15.1830 1С стала более чувствительна к соответствию разрядности (x86 или x64). Если у вас установлена 64-битная версия платформы 1С, а Microsoft Office стоит 32-битный (или наоборот), стандартный вызов Макет.Получить() может завершаться аварийно из-за невозможности маршалинга интерфейсов между процессами разной разрядности.
Рекомендация: Убедитесь, что разрядность клиента 1С и пакета Microsoft Office совпадает. Если вы работаете в терминальном режиме на сервере, проверьте, какой именно клиент 1С запускают пользователи.
Если ошибка «Значение не является значением объектного типа (Application)» сохраняется, стоит проверить настройки компонентов DCOM. Выясним, есть ли у пользователя права на запуск Word как COM-сервера:
Win + R, введите dcomcnfg и нажмите Enter.Рассмотрим альтернативный вариант, который предложили участники обсуждения. Если разработка находится на начальном этапе или макет не слишком сложный, проще всего заменить Word-макет на стандартный Табличный документ 1С. Это избавит вас от необходимости устанавливать Microsoft Office на сервере или рабочих станциях, а также решит проблемы с совместимостью раз и навсегда. Современные возможности 1С позволяют создавать в табличных документах достаточно сложные печатные формы, которые по качеству оформления не уступают документам Word.
Резюме: Ошибка платформы 8.3.15.1830 в работе с ActiveDocument — это известный факт. Если обновление платформы до более стабильной версии (например, финальных сборок 8.3.15 или перехода на 8.3.18+) невозможно, используйте хранение макетов в виде двоичных данных. Это самый стабильный и профессиональный подход, который минимизирует риски возникновения ошибок при взаимодействии с внешними приложениями через COM-интерфейс.