Как реализовать массовую обработку файлов Word и Excel с установкой колонтитулов

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с большими объемами документации часто возникает задача унификации: например, когда нужно во все имеющиеся документы (договоры, отчеты, спецификации) добавить фирменный колонтитул или техническую информацию. Если файлов несколько сотен тысяч, ручная обработка исключена. В рамках данной статьи мы разберем, как с помощью 1С автоматизировать этот процесс, используя механизмы COM-соединения, рекурсивный обход каталогов и методы оптимизации для работы с действительно большими массивами данных.

Организация поиска и перебора файлов в папках

Прежде чем приступать к редактированию содержимого, нам необходимо научить систему находить нужные файлы. Для этого в 1С используется объект НайтиФайлы. Важно учитывать, что файлы могут располагаться в разветвленной структуре подпапок, поэтому мы применим рекурсивный метод поиска. Рассмотрим пример кода, который собирает массив путей к файлам:


// Функция для получения списка всех файлов Word и Excel в указанной папке
Функция ПолучитьСписокФайлов(ПутьККаталогу)
    СписокФайлов = Новый Массив;
    
    // Ищем файлы Word (.doc, .docx) и Excel (.xls, .xlsx)
    МаскаПоиска = "*.*"; 
    НайденныеФайлы = НайтиФайлы(ПутьККаталогу, МаскаПоиска, Истина); // Истина - включая подпапки
    
    Для Каждого Файл Из НайденныеФайлы Цикл
        Если Файл.ЭтоКаталог() Тогда
            Продолжить;
        КонецЕсли;
        
        Расширение = НРег(Файл.Расширение);
        Если Расширение = ".doc" Или Расширение = ".docx" 
            Или Расширение = ".xls" Или Расширение = ".xlsx" Тогда
            СписокФайлов.Добавить(Файл.ПолноеИмя);
        КонецЕсли;
    КонецЦикла;
    
    Возврат СписокФайлов;
КонецФункции

Использование параметра Истина в методе НайтиФайлы позволяет нам автоматически получить файлы изо всех вложенных директорий, что избавляет от необходимости писать сложную рекурсию вручную. Однако стоит помнить, что при 300 000 файлов этот метод может занять значительное время и потребовать много оперативной памяти. В таких случаях лучше обрабатывать папки по очереди.

Автоматизация работы с Microsoft Word

Для изменения колонтитулов в документах Word мы будем использовать COM-объект Word.Application. Основная сложность здесь заключается в том, что в Word колонтитулы привязаны к секциям (разделам) документа. Проанализируем пример кода, который находит в нижнем колонтитуле текстовую метку (шаблон) и заменяет её на данные из 1С:


Процедура УстановитьКолонтитулWord(ПолноеИмяФайла, ТекстКолонтитула)
    Попытка
        WordApp = Новый COMОбъект("Word.Application");
        WordApp.Visible = Ложь; // Скрываем окно приложения
        
        Документ = WordApp.Documents.Open(ПолноеИмяФайла);
        
        // Обрабатываем первую секцию (для большинства документов этого достаточно)
        // Если в документе несколько разделов, нужно организовать цикл по Sections
        Для Каждого Секция Из Документ.Sections Цикл
            // Footers(1) - это основной нижний колонтитул
            // Можно также использовать Find для замены текста-заполнителя
            Секция.Footers(1).Range.Text = ТекстКолонтитула;
        КонецЦикла;
        
        Документ.Save();
        Документ.Close();
        WordApp.Quit();
    Исключение
        Сообщить("Ошибка при обработке файла: " + ПолноеИмяФайла);
        Если WordApp <> Неопределено Тогда
            WordApp.Quit();
        КонецЕсли;
    КонецПопытки;
КонецПроцедуры

Если в вашем шаблоне уже есть колонтитул с определенным форматированием, лучше использовать метод Find.Execute. Это позволит заменить, например, строку [НашаОрганизация] на реальное название, сохранив шрифт и размер текста. Важный нюанс: не забывайте отключать видимость приложения через Visible = Ложь, чтобы избежать мерцания окон на экране и ускорить процесс.

Установка колонтитулов в Microsoft Excel

Работа с Excel отличается тем, что параметры страницы (включая колонтитулы) настраиваются для каждого листа (Worksheet) отдельно. Рассмотрим, как программно задать верхний и нижний колонтитулы, используя объект PageSetup:


Процедура УстановитьКолонтитулExcel(ПолноеИмяФайла, ТекстЦентр, ТекстПраво)
    Попытка
        ExcelApp = Новый COMОбъект("Excel.Application");
        ExcelApp.Visible = Ложь;
        ExcelApp.DisplayAlerts = Ложь; // Отключаем предупреждения
        
        Книга = ExcelApp.Workbooks.Open(ПолноеИмяФайла);
        
        Для Каждого Лист Из Книга.WorkSheets Цикл
            // Настройка верхнего центрального колонтитула
            Лист.PageSetup.CenterHeader = ТекстЦентр;
            
            // Настройка правого нижнего колонтитула
            Лист.PageSetup.RightFooter = "Исполнитель: " + ТекстПраво;
            
            // Дополнительные параметры для корректного отображения
            Лист.PageSetup.FitToPagesWide = 1;
            Лист.PageSetup.FitToPagesTall = 100;
        КонецЦикла;
        
        Книга.Save();
        Книга.Close();
        ExcelApp.Quit();
    Исключение
        Сообщить("Ошибка Excel: " + ПолноеИмяФайла);
        Если ExcelApp <> Неопределено Тогда
            ExcelApp.Quit();
        КонецЕсли;
    КонецПопытки;
КонецПроцедуры

Обратите внимание на свойство DisplayAlerts = Ложь. При массовой обработке Excel может выдавать запросы о сохранении в старом формате или совместимости. Отключение этих уведомлений критически важно для бесперебойной работы алгоритма.

Оптимизация для сверхбольших массивов (300 000 файлов)

Если нам нужно обработать 300 тысяч файлов, классический подход через последовательное открытие каждого файла в COM-объекте будет работать крайне медленно (возможно, несколько недель). Разберем, как ускорить этот процесс:

  1. Использование фоновых заданий: Разделим весь массив файлов на порции (например, по 1000 файлов) и запустим обработку этих порций в нескольких параллельных фоновых заданиях. На 8-ядерном сервере можно эффективно запустить 8-12 потоков.
  2. Прямая правка XML (для .docx и .xlsx): Файлы современных форматов являются ZIP-архивами. Мы можем открывать их через ЧтениеZipФайла, находить внутри XML-документ (например, word/footer1.xml), программно внедрять туда текст через ЧтениеXML и ЗаписьXML, а затем запаковывать обратно. Это в десятки раз быстрее, чем запуск Microsoft Office.
  3. Управление памятью: При работе через COM-объекты софт от Microsoft имеет свойство "утекать" по памяти. Рекомендуется перезапускать экземпляр Word.Application или Excel.Application каждые 50-100 файлов, чтобы освободить системные ресурсы.
  4. Проверка формата: Старые форматы (.doc, .xls) не поддерживают XML-правку. Для них придется оставить COM-автоматизацию, но можно предварительно конвертировать их в новые форматы.

Обработка ошибок и контроль качества

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

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

Во-вторых, используйте механизм таймаутов. Если файл открывается более 30-60 секунд, скорее всего, Office завис или открыл модальное окно, которое не видно в фоновом режиме. В таких случаях процедуру нужно прерывать и принудительно завершать процесс winword.exe или excel.exe через системные средства (например, через WMI или команду taskkill).

В-третьих, учитывайте специфику колонтитулов Word. Если в документе установлена галочка "Особый колонтитул для первой страницы", то ваша правка основного колонтитула не отобразится на первом листе. Программисту необходимо проверять свойство DifferentFirstPageHeaderFooter и при необходимости дублировать текст в Footers(2) (индекс для первой страницы).

Подводя итог, можно сказать, что задача вполне решаема средствами 1С. Для небольших объемов (до 1000 файлов) идеально подходит COM-соединение благодаря простоте реализации. Для масштабных задач уровня 300 000 файлов следует комбинировать многопоточность (фоновые задания) и, по возможности, прямой доступ к внутренней XML-структуре файлов офисного пакета.

← На главную