Как программно распечатать диапазон страниц документа Word из 1С

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

При автоматизации документооборота часто возникает задача не просто отправить файл Microsoft Word на принтер, а распечатать только конкретные страницы или заданный диапазон. Для этого в объектной модели Word предусмотрен метод PrintOut. Однако при работе через COM-объект из 1С (особенно в версии 7.7) программисты часто сталкиваются с тем, что параметры передаются некорректно, очередь печати остается пустой или принтер выдает пустые листы.

В этой статье мы подробно разберем, как правильно использовать метод PrintOut, разберем значение каждого параметра и выясним, почему важен порядок их следования при вызове из 1С.

Понимание метода PrintOut и его параметров

Основная сложность заключается в том, что в VBA (языке макросов Word) параметры можно передавать по именам (например, Range:=wdPrintFromTo). В 1С мы вынуждены передавать параметры позиционно, через запятую. Если мы пропускаем важный параметр или передаем его не в ту «позицию», Word либо игнорирует команду, либо выдает ошибку.

Рассмотрим структуру метода PrintOut. Он может принимать до 19 параметров. Вот наиболее важные из них в порядке их следования:

  1. Background — выполнение печати в фоновом режиме.
  2. Append — добавление документа к другому файлу (используется редко).
  3. Range — тип диапазона печати (важнейший параметр).
  4. OutputFileName — имя файла, если печать идет в файл.
  5. From — номер первой страницы (если Range = 3).
  6. To — номер последней страницы (если Range = 3).
  7. Item — что именно печатать (текст, свойства и т.д.).
  8. Copies — количество копий.
  9. Pages — конкретные номера страниц или диапазоны через запятую (если Range = 4).
  10. PageType — тип печатаемых страниц (все, четные или нечетные).

Проанализируем значения для третьего параметра Range (константы WdPrintOutRange):

Решение проблемы пустой очереди печати (Background)

Одной из самых частых проблем является ситуация, когда код 1С отрабатывает, но на принтер ничего не уходит. Выясним причину этого поведения. Первый параметр метода PrintOut — Background.

Если мы передаем в него Истина (или 1), Word начинает формировать задание на печать в фоновом режиме и сразу возвращает управление в 1С. Если следом в вашем коде идет команда Приложение.Quit(), 1С закрывает процесс Word до того, как тот успеет передать данные в очередь печати системы. В результате задание просто уничтожается.

Рекомендация: Всегда устанавливайте первый параметр в 0 (Ложь). В этом случае 1С будет «ждать», пока задание полностью сформируется и уйдет в спулер печати Windows.

Вариант 1: Печать страниц «От» и «До»

Если нам нужно распечатать непрерывный диапазон, например, со 2-й по 5-ю страницу, мы используем константу Range = 3. Разберем по шагам, как должен выглядеть вызов в 1С. Обратите внимание на обязательное заполнение «пустых» мест нулями или пустыми строками, так как 1С 7.7 не всегда корректно обрабатывает пропущенные запятые.


// Создаем объект
Word = СоздатьОбъект("Word.Application");
Док = Word.Documents.Open(ПутьКФайлу);

СтрОт = "2";
СтрДо = "5";

// Параметры: 
// 1: Background = 0 (ждем завершения)
// 2: Append = 0
// 3: Range = 3 (wdPrintFromTo)
// 4: OutputFileName = ""
// 5: From = СтрОт
// 6: To = СтрДо
// 7: Item = 0 (wdPrintDocumentContent)
// 8: Copies = 1

Док.PrintOut(0, 0, 3, "", СтрОт, СтрДо, 0, 1);

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

Вариант 2: Печать произвольного набора страниц (диапазоны)

Этот способ является более универсальным. Он позволяет напечатать, например, «1, 3, 7-10» страницы за один вызов. Для этого в третьем параметре Range нужно указать значение 4, а сам список страниц передать в девятом параметре.

Посмотрим на пример реализации:


// Диапазон задается строкой через запятую или дефис
СписокСтраниц = "1,3,6-9";

// Обратите внимание на количество запятых! 
// Нам нужно попасть в 9-й параметр.
// 1:Background, 2:Append, 3:Range, 4:OutputFileName, 5:From, 6:To, 7:Item, 8:Copies, 9:Pages
Док.PrintOut(0, 0, 4, "", "", "", 0, 1, СписокСтраниц);

Важный нюанс: В некоторых версиях Word использование пробелов внутри строки диапазона (например, "1, 3") может приводить к ошибкам интерпретации. Рекомендуется формировать строку без пробелов: "1,3,5".

Типичные ошибки и их исправление

Проанализируем ситуацию, когда принтер печатает пустые листы или выдает техническую информацию вместо текста. Это часто связано с седьмым параметром Item.

Параметр Item определяет тип содержимого. Значение 0 (wdPrintDocumentContent) означает печать самого документа. Если туда по ошибке передать другое число, Word может начать печатать свойства документа (дату создания, автора), список исправлений или комментарии. Всегда явно указывайте 0 в этой позиции, чтобы избежать двусмысленности.

Также стоит обратить внимание на логические значения (True/False). При работе с COM-объектами Office из 1С лучше избегать встроенных констант Истина и Ложь. Передавайте числа: 1 для истины и 0 для лжи. Это гарантирует правильное понимание команды движком Microsoft Office.

Завершение работы и очистка памяти

После вызова печати необходимо правильно закрыть приложение. Если этого не сделать, в системе останется «висеть» процесс WINWORD.EXE. При многократном повторении печати эти процессы заполнят оперативную память, что приведет к зависанию сервера или компьютера пользователя.

Рассмотрим правильный цикл завершения:


// Закрываем документ без сохранения изменений
Док.Close(0); 

// Выходим из ворда
Word.Quit(0);

// Очищаем переменную в 1С
Word = ""; // для 7.7
// Или Word = Неопределено; // для 8.x

В случае с версией 8.3 (Управляемые формы) работа с COM-объектами должна происходить на стороне клиента (так как Word установлен у пользователя) или на сервере, если там настроены соответствующие права и установлен MS Office. Но логика вызова PrintOut и последовательность параметров остаются неизменными независимо от версии платформы 1С.

Альтернатива для современных версий (PDF)

Если ваша задача — не просто отправить документ на принтер, а получить PDF-файл с определенными страницами, то, начиная с Word 2007 SP2, рекомендуется использовать метод ExportAsFixedFormat. Он работает гораздо стабильнее, чем печать на виртуальный PDF-принтер, и позволяет более гибко настраивать экспорт диапазона страниц без манипуляций с очередью печати.

Однако для прямой отправки на физический принтер метод PrintOut остается единственным надежным инструментом. Главное — строго соблюдать позиционность параметров и не забывать отключать фоновый режим печати.

← На главную