Автоматизация · 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Создайте COMОбъект("Word.Application") и откройте документ
- 2Найдите таблицу по индексу или по тексту ячейки
- 3Вызовите Таблица.Delete()
- 4Сохраните документ методом Save или SaveAs
- 5Закройте документ и вызовите Word.Quit()
- 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() вызывается в любом случае после блока попытки; документ сохраняется до закрытия.
Word = Новый COMОбъект("Word.Application");
Документ = Word.Documents.Open(Путь);
Документ.Tables(1).Delete();
Документ.Save();
Документ.Close();
Word.Quit();Проверка результата и типичные ошибки
После выполнения откройте полученный файл вручную и убедитесь, что удалена именно нужная таблица, а соседние блоки текста не съехали и не потеряли форматирование. Особое внимание уделите документам, где таблицы вложены друг в друга: коллекция Tables верхнего уровня не включает вложенные таблицы, и обращение по индексу может дать неожиданный результат.
Как проверить результат
Таблица с заданной меткой отсутствует, остальные на месте
Удалена не та таблица или текст вокруг потерял форматирование
После завершения кода процессов 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 после проверки.