При переходе на современные версии Microsoft Office (2013, 2016, 2019) многие разработчики 1С 7.7 сталкиваются с проблемой: старый, годами проверенный код для формирования печатных форм в формате MS Word перестает работать. Чаще всего это проявляется ошибкой: «Microsoft Word: Данная команда недоступна» при попытке выполнить метод Execute объекта Find. Давайте подробно разберем причины этой ситуации и рассмотрим пошаговые методы её решения.
Основная причина кроется в усилении политики безопасности Microsoft Office. Начиная с версии 2013, в Word появился механизм «Защищенного просмотра» (Protected View). Когда программа открывает файл через COM-объект, и этот файл кажется системе подозрительным (например, он был загружен из интернета, почты или находится в папке, которая не считается доверенной), Word блокирует выполнение любых команд редактирования, включая поиск и замену. Команда Execute становится недоступной, так как документ открыт только для чтения в изолированной песочнице.
Также стоит учитывать, что объект Selection (выделение), который часто использовался в коде для 1С 7.7, тесно связан с графическим интерфейсом. В новых версиях Word при работе в невидимом режиме (Word.Visible = 0) использование Selection может приводить к сбоям, так как фоновый процесс не всегда корректно эмулирует активное выделение текста.
Как показывает практика и опыт участников форума, наиболее быстрым и эффективным решением является смена формата файла шаблона. Старые файлы .doc часто воспринимаются Word 2016 в режиме ограниченной функциональности.
Рассмотрим шаги по исправлению:
.doc) непосредственно в MS Word 2016.ИмяФайлаШаблона на новое.Использование формата шаблона (.dot или современного .dotx) сигнализирует системе, что файл предназначен для создания новых документов, и Word более лояльно относится к командам автоматизации.
Если смена формата не помогла, необходимо «объяснить» пакету Office, что папка с шаблонами 1С является безопасной. Проанализируем, как это сделать:
EXTFORMS или той папке, где лежат ваши шаблоны документов.После этого Word перестанет открывать документы из этих папок в режиме защищенного просмотра, и доступ к объекту Selection.Find будет восстановлен.
Давайте посмотрим на исходный код и разберем, как сделать его более отказоустойчивым. В 1С 7.7 параметры методам COM-объектов передаются позиционно. В Word 2016 сигнатура метода Execute могла измениться или стать более чувствительной к типам данных.
Вместо передачи длинного списка параметров в одну строку, мы рекомендуем задавать свойства объекта Find по отдельности, как это делает макрос самого Word. Это повышает читаемость и исключает ошибки позиционирования.
Пример кода в стиле макроса для 1С 7.7:
// Создаем объект Word
Word = СоздатьОбъект("Word.Application");
ДоговорШ = Word.Documents;
Док = ДоговорШ.Open(ИмяФайлаШаблона, 0, 1); // Открываем только на чтение
Word.Visible = 0;
// Вместо одной сложной строки используем объект Find
Поиск = Word.Selection.Find;
Поиск.ClearFormatting(); // Очищаем форматирование поиска
Поиск.Replacement.ClearFormatting(); // Очищаем форматирование замены
Поиск.Text = "{1}"; // Что искать
Поиск.Replacement.Text = " " + НомерДоговора; // На что менять
Поиск.Forward = 1;
Поиск.Wrap = 1; // wdFindContinue
Поиск.Format = 0;
Поиск.MatchCase = 0;
Поиск.MatchWholeWord = 0;
Поиск.MatchWildcards = 0;
Поиск.MatchSoundsLike = 0;
Поиск.MatchAllWordForms = 0;
// Выполняем замену (wdReplaceAll = 2)
Поиск.Execute(,,,,,,,,,, 2);
Проанализируем ситуацию: объект Selection требует, чтобы Word «физически» выделил текст в окне. Если сервер или клиент нагружен, или окно скрыто, это может вызвать сбой. Более надежный способ для фоновой работы — использование объекта Range, который работает с содержимым документа напрямую в памяти.
Разберем пример работы через Range:
// Получаем диапазон всего документа
МойRange = Док.Content;
МойRange.Find.Execute("{1}", 0, 0, 0, 0, 0, 1, 1, 0, " " + НомерДоговора, 2);
Этот метод работает быстрее, так как Word не тратит ресурсы на отрисовку выделения текста в интерфейсе.
Если вы работаете в терминальной сессии или через 64-битную операционную систему, обратите внимание на следующие нюансы:
dcomcnfg для компонента «Microsoft Word Documents». Убедитесь, что права на запуск и активацию предоставлены нужной группе пользователей.Подводя итог, можно сказать, что проблема чаще всего решается административными мерами (настройкой доверия в Word) или простым пересохранением шаблона в формат .dot. Однако для обеспечения долгосрочной стабильности работы системы рекомендуется пересмотреть код и перейти от использования Selection к работе с Range.