Почему 1С 7.7 печатает на принтер по умолчанию вместо заданного в коде?

Программист 1С v7.7
← На главную

Разработчики, работающие с платформой 1С 7.7, часто сталкиваются с капризным поведением системы печати. Типичная ситуация: программист прописывает имя принтера в методе ПараметрыСтраницы, но программа упорно отправляет документ на устройство, выбранное в Windows по умолчанию, или на тот принтер, на который пользователь печатал вручную в прошлый раз. В этой статье мы подробно разберем, почему так происходит, и как заставить «семерку» четко следовать вашим инструкциям.

Анализируем причину проблемы: механизм Moxel и реестр

Для начала проанализируем, как 1С 7.7 (движок печати Moxel) хранит настройки. В отличие от современных платформ, 1С 7.7 очень сильно завязана на реестр Windows. Когда вы вызываете печать, система обращается к ветке HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<ИмяБазы>\V7\<ИмяПользователя>\Moxel\. Если в коде не указаны специфические настройки, 1С берет параметры из последнего успешного сеанса печати.

Основная ошибка заключается в игнорировании метода Опции. Если мы не задаем уникальный ключ для сохранения параметров, 1С использует общие настройки, что и приводит к «запоминанию» старого принтера. Давайте разберем по шагам, как правильно выстроить программный код.

Шаг 1: Правильный порядок вызова методов

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


// Создаем объект таблицы
Таб = СоздатьОбъект("Таблица");

// 1. Устанавливаем Опции. 
// Пятый параметр - "ИмяОпций" - КРИТИЧЕСКИ ВАЖЕН!
// Это уникальная строка, под которой настройки сохранятся в реестре.
Таб.Опции(0, 0, 0, 0, "ПечатьЧекаНаTSC");

// 2. Устанавливаем параметры страницы.
// Имя принтера передается 12-м параметром.
ИмяПринтера = "TSC TE200";
Таб.ПараметрыСтраницы(1, , , 0, 0, 0, 0, , , 1, , ИмяПринтера);

// 3. Отправляем на печать без диалога (0)
Таб.Напечатать(0);

Выясним причину, почему пятый параметр метода Опции так важен. Если вы укажете Таб.Опции(1, 1, 0, 0, "МойПринтер1"), 1С создаст отдельную запись в реестре. При следующем вызове с тем же именем опций система сначала проверит программно переданные параметры, и если они заданы, применит их. Без этого ключа 1С «путается» в глобальных настройках профиля пользователя.

Шаг 2: Проверка имени принтера

Рассмотрим подробнее требования к имени принтера. 1С 7.7 крайне чувствительна к кодировкам и спецсимволам. Проанализируем типичные проблемы с именованием:

  1. Кириллица и пробелы: Хотя платформа формально поддерживает русские названия, иногда возникают проблемы с кодировкой (особенно в сетевых именах). Попробуйте временно переименовать принтер в системе в TSC_TE200 (без пробелов, латиницей) и проверьте работу.
  2. Длина имени: Старайтесь, чтобы имя принтера не превышало 32 символа. Длинные сетевые пути вида \\SERVER\Printer_Accounting_Department_Room_101 часто обрезаются внутренними буферами платформы.
  3. Служебные символы: Избегайте использования кавычек, слешей и точек в названии принтера внутри операционной системы.

Шаг 3: Особенности работы в терминальном режиме (RDP)

Выясним ситуацию, если ваша база работает на сервере терминалов. Это самый сложный случай. При подключении через RDP принтеры пользователей пробрасываются с динамическими именами, например: HP LaserJet (перенаправлено 15). При каждом новом входе число в скобках меняется.

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

Альтернативный метод: Использование Windows Script Host

Если стандартные методы ПараметрыСтраницы продолжают игнорировать настройки, разберем радикальный, но надежный способ. Мы можем временно изменить принтер по умолчанию в самой Windows средствами системы, выполнить печать из 1С и вернуть настройки обратно. Посмотрим на пример реализации через объект WScript.Network:


// Создаем системный объект для управления принтерами
WshNetwork = СоздатьОбъект("WScript.Network");
// Запоминаем текущий принтер (чтобы вернуть потом)
// В 1С 7.7 напрямую получить принтер по умолчанию сложно, 
// обычно используют чтение реестра или внешние компоненты.

// Устанавливаем нужный принтер принтером по умолчанию в Windows
WshNetwork.SetDefaultPrinter("TSC TE200");

// Печатаем из 1С
Таб.Напечатать(0);

// Возвращаем старый принтер, если это необходимо
// WshNetwork.SetDefaultPrinter(СтарыйПринтер);

Важный момент: Этот метод влияет на всю систему. Если в момент печати пользователь решит распечатать письмо из почты, оно тоже уйдет на чековый принтер. Используйте этот подход с осторожностью.

Резюме и рекомендации

Подведем итог нашего анализа. Чтобы печать в 1С 7.7 работала предсказуемо, придерживайтесь следующих правил:

  1. Всегда используйте Таб.Опции(,,,, "УникальноеИмя") перед печатью.
  2. Убедитесь, что имя принтера в ПараметрыСтраницы в точности совпадает с тем, что вы видите в панели управления Windows (вплоть до регистра букв).
  3. Если вы работаете в RDP, используйте внешние компоненты для идентификации актуального имени перенаправленного принтера.
  4. Проверьте права доступа: иногда настройки принтера не применяются из-за того, что у пользователя нет прав на изменение веток реестра HKEY_CURRENT_USER\Software\1C.

Соблюдение этих простых шагов позволит вам избежать хаоса при печати документов и обеспечит стабильную работу системы на любых принтерах этикеток и чеков.

← На главную