При автоматизации документооборота часто возникает задача не просто отправить файл Microsoft Word на принтер, а распечатать только конкретные страницы или заданный диапазон. Для этого в объектной модели Word предусмотрен метод PrintOut. Однако при работе через COM-объект из 1С (особенно в версии 7.7) программисты часто сталкиваются с тем, что параметры передаются некорректно, очередь печати остается пустой или принтер выдает пустые листы.
В этой статье мы подробно разберем, как правильно использовать метод PrintOut, разберем значение каждого параметра и выясним, почему важен порядок их следования при вызове из 1С.
Основная сложность заключается в том, что в VBA (языке макросов Word) параметры можно передавать по именам (например, Range:=wdPrintFromTo). В 1С мы вынуждены передавать параметры позиционно, через запятую. Если мы пропускаем важный параметр или передаем его не в ту «позицию», Word либо игнорирует команду, либо выдает ошибку.
Рассмотрим структуру метода PrintOut. Он может принимать до 19 параметров. Вот наиболее важные из них в порядке их следования:
Range = 3).Range = 3).Range = 4).Проанализируем значения для третьего параметра Range (константы WdPrintOutRange):
0 (wdPrintAllDocument) — печать всего документа целиком.1 (wdPrintSelection) — печать только выделенного фрагмента.2 (wdPrintCurrentPage) — печать только текущей страницы.3 (wdPrintFromTo) — печать страниц с номера From по номер To.4 (wdPrintRangeOfPages) — печать произвольного набора страниц, указанных в Pages.Одной из самых частых проблем является ситуация, когда код 1С отрабатывает, но на принтер ничего не уходит. Выясним причину этого поведения. Первый параметр метода PrintOut — Background.
Если мы передаем в него Истина (или 1), Word начинает формировать задание на печать в фоновом режиме и сразу возвращает управление в 1С. Если следом в вашем коде идет команда Приложение.Quit(), 1С закрывает процесс Word до того, как тот успеет передать данные в очередь печати системы. В результате задание просто уничтожается.
Рекомендация: Всегда устанавливайте первый параметр в 0 (Ложь). В этом случае 1С будет «ждать», пока задание полностью сформируется и уйдет в спулер печати Windows.
Если нам нужно распечатать непрерывный диапазон, например, со 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 ожидает в строковом формате, хотя числовые значения также часто срабатывают. Однако для надежности лучше использовать преобразование Строка().
Этот способ является более универсальным. Он позволяет напечатать, например, «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-файл с определенными страницами, то, начиная с Word 2007 SP2, рекомендуется использовать метод ExportAsFixedFormat. Он работает гораздо стабильнее, чем печать на виртуальный PDF-принтер, и позволяет более гибко настраивать экспорт диапазона страниц без манипуляций с очередью печати.
Однако для прямой отправки на физический принтер метод PrintOut остается единственным надежным инструментом. Главное — строго соблюдать позиционность параметров и не забывать отключать фоновый режим печати.