Как исправить ошибку «Данная команда недоступна» при работе с MS Word 2016 в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При переходе на современные версии 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 может приводить к сбоям, так как фоновый процесс не всегда корректно эмулирует активное выделение текста.

Решение 1. Изменение формата шаблона (Переход на .dot)

Как показывает практика и опыт участников форума, наиболее быстрым и эффективным решением является смена формата файла шаблона. Старые файлы .doc часто воспринимаются Word 2016 в режиме ограниченной функциональности.

Рассмотрим шаги по исправлению:

  1. Откройте ваш текущий файл шаблона (.doc) непосредственно в MS Word 2016.
  2. Перейдите в меню «Файл» — «Сохранить как».
  3. Выберите тип файла «Шаблон Word 97-2003 (*.dot)».
  4. В коде 1С 7.7 измените расширение в переменной ИмяФайлаШаблона на новое.

Использование формата шаблона (.dot или современного .dotx) сигнализирует системе, что файл предназначен для создания новых документов, и Word более лояльно относится к командам автоматизации.

Решение 2. Настройка доверенных расположений (Trust Center)

Если смена формата не помогла, необходимо «объяснить» пакету Office, что папка с шаблонами 1С является безопасной. Проанализируем, как это сделать:

  1. Запустите MS Word 2016.
  2. Перейдите в «Файл» — «Параметры» — «Центр управления безопасностью».
  3. Нажмите кнопку «Параметры центра управления безопасностью».
  4. Выберите пункт «Надежные расположения».
  5. Нажмите «Добавить новое расположение» и укажите путь к папке EXTFORMS или той папке, где лежат ваши шаблоны документов.
  6. Обязательно установите галочку «Также доверять всем вложенным папкам».

После этого Word перестанет открывать документы из этих папок в режиме защищенного просмотра, и доступ к объекту Selection.Find будет восстановлен.

Решение 3. Оптимизация программного кода 1С

Давайте посмотрим на исходный код и разберем, как сделать его более отказоустойчивым. В 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);

Решение 4. Переход от Selection к Range

Проанализируем ситуацию: объект Selection требует, чтобы Word «физически» выделил текст в окне. Если сервер или клиент нагружен, или окно скрыто, это может вызвать сбой. Более надежный способ для фоновой работы — использование объекта Range, который работает с содержимым документа напрямую в памяти.

Разберем пример работы через Range:


// Получаем диапазон всего документа
МойRange = Док.Content;
МойRange.Find.Execute("{1}", 0, 0, 0, 0, 0, 1, 1, 0, " " + НомерДоговора, 2);

Этот метод работает быстрее, так как Word не тратит ресурсы на отрисовку выделения текста в интерфейсе.

Дополнительные рекомендации

Если вы работаете в терминальной сессии или через 64-битную операционную систему, обратите внимание на следующие нюансы:

Подводя итог, можно сказать, что проблема чаще всего решается административными мерами (настройкой доверия в Word) или простым пересохранением шаблона в формат .dot. Однако для обеспечения долгосрочной стабильности работы системы рекомендуется пересмотреть код и перейти от использования Selection к работе с Range.

← На главную