К статье
Практический материал

Автоматизация · 10 мин

Как удалить таблицу в Word из 1С

Как удалить таблицу в документе Word из 1С через COM-объект: поиск таблицы по индексу и содержимому, готовый код, проверка результата и типичные ошибки.

Удаление таблицы в документе Word из 1С — типовая задача при автоматизации печатных форм: шаблон содержит несколько таблиц, а в конкретном документе часть из них не нужна. Например, таблица скидок должна исчезать, если скидки нет, или пустая таблица услуг не должна попадать в договор. Решается это через COM-подключение к Word и вызов метода Delete у объекта таблицы.

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

Ниже разобраны способы подключения к Word, поиск таблицы, готовый код удаления, обработка смежных ситуаций (удаление строк, очистка содержимого вместо удаления) и контроль результата.

Как 1С управляет документами Word

1С не имеет встроенных средств редактирования файлов Word, поэтому используется COM-автоматизация: платформа создаёт объект Word.Application и управляет редактором как обычный макрос VBA. Всё, что доступно в макросах Word, доступно и из кода 1С с той же логикой вызовов.

Типовая цепочка объектов выглядит так: Word.Application → Documents → конкретный Document → коллекция Tables → отдельная таблица Table. Удаление выполняется методом Delete() у объекта таблицы. Аналогичные методы есть у строк (Rows), столбцов (Columns) и диапазонов (Range).

Важно понимать ограничение: на компьютере, где выполняется код, должен быть установлен Microsoft Word. На сервере 1С без установленного Office COM-подключение не создастся, поэтому серверный вызов обычно заменяют клиентским или используют формат DOCX как zip-архив с XML — но это отдельный, более сложный путь.

Подключение к Word и открытие документа

Перед удалением таблицы нужно создать COM-объект и открыть файл. Базовый фрагмент:

Word = Новый COMОбъект("Word.Application");

Word.Visible = Ложь;

Word.DisplayAlerts = 0; // wdAlertsNone — подавить диалоги

Документ = Word.Documents.Open("C:\Шаблоны\Договор.docx");

Свойство Visible = Ложь скрывает окно Word — это ускоряет работу и не мешает пользователю. DisplayAlerts = 0 отключает всплывающие вопросы («сохранить изменения?»), которые при фоновом выполнении повисли бы без ответа.

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

Как найти нужную таблицу

По порядковому номеру

Если структура шаблона фиксирована, таблицу можно взять по индексу. Нумерация в коллекции Tables начинается с единицы и идёт по порядку следования таблиц в документе:

Таблица = Документ.Tables(2); // вторая таблица документа

Таблица.Delete();

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

По содержимому ячейки

Надёжнее искать таблицу по тексту-метке, например по слову «Скидка» в первой строке:

Для Ном = 1 По Документ.Tables.Count Цикл

Таблица = Документ.Tables(Ном);

ТекстЯчейки = Таблица.Cell(1, 1).Range.Text;

Если Найти(ТекстЯчейки, "Скидка") > 0 Тогда

Таблица.Delete();

Прервать;

КонецЕсли;

КонецЦикла;

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

Порядок действий
  1. 1
    Создайте COMОбъект("Word.Application") и откройте документ
  2. 2
    Найдите таблицу по индексу или по тексту ячейки
  3. 3
    Вызовите Таблица.Delete()
  4. 4
    Сохраните документ методом Save или SaveAs
  5. 5
    Закройте документ и вызовите Word.Quit()
  6. 6
    Откройте файл и визуально проверьте результат

Альтернативы полному удалению таблицы

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

ЗадачаМетодКогда применять
Убрать лишние строкиТаблица.Rows(N).Delete()Строк данных меньше, чем строк-заготовок в шаблоне
Очистить содержимоеТаблица.Range.Delete() не подходит; используйте цикл по ячейкам с присвоением пустого текстаТаблица нужна, но пустая
Скрыть таблицуЗадать границам Borders.Enable = 0 и очистить текстСтруктуру нельзя менять, но выводить данные не нужно
Удалить таблицу целикомТаблица.Delete()Блок документа не нужен полностью

Частая ситуация: шаблон содержит таблицу из десяти пустых строк, а реальных позиций три. Тогда заполняются первые три строки, а остальные удаляются в цикле с конца: Документ.Tables(1).Rows(НомерСтроки).Delete(), перебирая номера от большего к меньшему, чтобы не сбить нумерацию.

Сравнение вариантов

Удаление по индексу

Быстро и просто, но ломается при любом изменении шаблона. Подходит для стабильных форм.

Поиск по тексту ячейки

Устойчиво к перестановке таблиц, но требует уникальной метки и чуть медленнее на больших документах.

Удаление строк вместо таблицы

Сохраняет структуру шаблона; подходит, когда число строк данных заранее неизвестно.

Готовая процедура целиком

Собранный пример с обработкой ошибок и гарантированным закрытием Word:

Процедура УдалитьТаблицуИзWord(ПутьКФайлу, ТекстМетки)

Попытка

Word = Новый COMОбъект("Word.Application");

Исключение

Сообщить("Word не установлен или недоступен");

Возврат;

КонецПопытки;

Word.Visible = Ложь;

Word.DisplayAlerts = 0;

Попытка

Документ = Word.Documents.Open(ПутьКФайлу);

Для Ном = 1 По Документ.Tables.Count Цикл

Таблица = Документ.Tables(Ном);

Если Найти(Таблица.Cell(1, 1).Range.Text, ТекстМетки) > 0 Тогда

Таблица.Delete();

Прервать;

КонецЕсли;

КонецЦикла;

Документ.Save();

Документ.Close();

Исключение

Сообщить("Ошибка: " + ОписаниеОшибки());

КонецПопытки;

Word.Quit();

КонецПроцедуры

Ключевые моменты примера: создание COM-объекта вынесено в отдельную попытку, чтобы отличить отсутствие Word от ошибок работы с файлом; Word.Quit() вызывается в любом случае после блока попытки; документ сохраняется до закрытия.

bsl
Word = Новый COMОбъект("Word.Application");
Документ = Word.Documents.Open(Путь);
Документ.Tables(1).Delete();
Документ.Save();
Документ.Close();
Word.Quit();

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Удаление по индексу без проверки содержимого — после правки шаблона удаляется чужая таблица
02
Перебор коллекции с начала при удалении нескольких таблиц — индексы смещаются, часть таблиц пропускается
03
Отсутствие Word.Quit() — процессы WINWORD.EXE накапливаются и блокируют файлы
04
Сравнение текста ячейки через точное равенство — служебные символы конца ячейки мешают совпадению
05
Выполнение кода на сервере без установленного Office — исключение и пустой результат
Контрольные точки

Как проверить результат

Наличие таблицы в файле
Норма

Таблица с заданной меткой отсутствует, остальные на месте

Тревожный признак

Удалена не та таблица или текст вокруг потерял форматирование

Диспетчер задач
Норма

После завершения кода процессов WINWORD.EXE не осталось

Тревожный признак

Процессы копятся — значит, не вызывается Quit()

Повторный запуск
Норма

Файл открывается и обрабатывается повторно без ошибок

Тревожный признак

Файл заблокирован или повреждён

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

Итог

Что важно запомнить

Таблица удаляется методом Delete() объекта Table из коллекции Документ.Tables. Ищите таблицу по тексту-метке, а не только по индексу, удаляйте несколько таблиц с конца коллекции и всегда завершайте работу вызовом Word.Quit().

Частые вопросы

Можно ли удалить таблицу в Word без установленного Office?

Через COM — нет. Альтернатива: работать с DOCX как с zip-архивом и править XML напрямую, либо формировать печатную форму в табличном документе 1С и сохранять её в PDF, полностью отказавшись от Word.

Как удалить сразу все таблицы документа?

Выполните цикл Пока Документ.Tables.Count > 0 Цикл Документ.Tables(1).Delete(); КонецЦикла; — каждый раз удаляется первая таблица, пока коллекция не опустеет. Так не возникает проблемы со смещением индексов.

Почему после Delete() остаётся пустая строка на месте таблицы?

Таблица в Word всегда окружена знаками абзаца. Метод Delete убирает саму таблицу, но абзац после неё остаётся. Если пустая строка мешает, удалите и его: выделите Range, захватывающий следующий абзац, и вызовите Delete у него.

Как удалить таблицу, вложенную в другую таблицу?

Обратитесь к ней через коллекцию Tables конкретной ячейки: Документ.Tables(1).Cell(2, 2).Tables(1).Delete(). Верхнеуровневая коллекция документа вложенные таблицы не содержит.

Код работает на клиенте, но падает на сервере. В чём причина?

На сервере 1С не установлен Microsoft Word либо у учётной записи службы сервера нет прав на запуск COM-приложений. Установка Office на сервер — плохая практика; надёжнее выполнять формирование Word-файлов на клиенте.

Можно ли отменить удаление, если удалили не ту таблицу?

Пока документ не сохранён — да: закройте его через Документ.Close(0) без сохранения, и файл останется в исходном состоянии. Поэтому безопасный порядок — сначала все изменения, потом один Save после проверки.