В процессе работы с конфигурациями на обычных формах, такими как «1С:Управление торговлей 10.3», у пользователей часто возникает необходимость ускорить рутинные операции. Одной из таких задач является групповая печать документов (например, накладных «Реализация товаров и услуг») непосредственно из формы списка сразу на принтер, минуя окно предварительного просмотра и диалоговые окна выбора параметров печати. Особенно важно сделать это с автоматическим заданием количества копий (например, по 2 экземпляра на каждый документ).
Разберем подробно, почему стандартные попытки написать простой цикл обхода выделенных строк часто приводят к ошибкам вроде Слишком много фактических параметров, как на это влияют внешние печатные формы (ВПФ) и как правильно реализовать эту задачу программно.
Обычно разработчики пытаются решить задачу «в лоб», обходя выделенные строки формы списка и вызывая процедуру НапечататьДокументИзФормыСписка общего модуля УниверсальныеМеханизмы:
Процедура ДействиеГрупповаяПечать(Кнопка)
ВыделенныеСтроки = ЭлементыФормы.Список.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
УниверсальныеМеханизмы.НапечататьДокументИзФормыСписка(ВыделеннаяСтрока.Ссылка.ПолучитьОбъект());
КонецЦикла;
КонецПроцедуры
При использовании этого кода для каждого документа будет открываться окно предварительного просмотра. Попытка передать дополнительные параметры напрямую в эту процедуру (например, количество копий или флаг прямой печати):
УниверсальныеМеханизмы.НапечататьДокументИзФормыСписка(ВыделеннаяСтрока.Ссылка.ПолучитьОбъект(), 2, Истина);
приводит к ошибке компиляции Слишком много фактических параметров. Происходит это потому, что в типовой конфигурации УТ 10.3 сигнатура данной процедуры строго ограничена и принимает только один параметр — ссылку или объект документа:
Процедура НапечататьДокументИзФормыСписка(ДокументСсылка) Экспорт
Для гибкого управления процессом печати нам потребуется использовать другие механизмы платформы и конфигурации.
Самый простой способ, предусмотренный разработчиками типового решения, — это использование встроенной настройки пользователя «Печать документов без предварительного просмотра».
Выясним, как это работает изнутри. При вызове стандартных механизмов печати система проверяет персональные настройки текущей учетной записи с помощью следующего кода:
НаПринтер = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ПечатьДокументовБезПредварительногоПросмотра") = Истина;
Если эта настройка включена (установлена в значение Истина), система автоматически отправляет формируемые табличные документы на принтер по умолчанию.
Чтобы активировать этот режим для конкретного пользователя, выполните следующие шаги:
Часто программисты сталкиваются с ситуацией: флаг «Печать документов без предварительного просмотра» в настройках пользователя взведен, но предварительный просмотр все равно настойчиво открывается на экране. Рассмотрим подробнее, почему так происходит.
Причина кроется в использовании внешних печатных форм (ВПФ). Если для документа зарегистрирована внешняя обработка печати, управление процессом вывода передается модулю этой обработки. Распространенной ошибкой при написании ВПФ является жесткое кодирование вывода на экран прямо внутри функции Печать() внешней обработки:
// Пример ОШИБОЧНОГО кода внутри внешней печатной формы:
Функция Печать() Экспорт
ТабДокумент = СформироватьПечатнуюФорму();
// Здесь Ложь принудительно отключает отправку напрямую на принтер
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, 1, Ложь, "Накладная");
Возврат Неопределено;
КонецФункции
При такой реализации внешняя обработка сама инициирует показ формы предварительного просмотра, полностью игнорируя глобальные настройки пользователя в системе.
Как правильно настроить ВПФ для корректной работы:
Функция Печать() во внешней обработке должна отвечать исключительно за формирование макета и заполнение его данными, после чего возвращать готовый объект ТабличныйДокумент вызывающей системе. Окончательное решение о выводе на экран или принтер система должна принять самостоятельно на основе настроек пользователя:
// Правильный вариант реализации функции Печать() в ВПФ:
Функция Печать() Экспорт
ТабДокумент = СформироватьПечатнуюФорму();
Возврат ТабДокумент; // Возвращаем объект, система сама решит, как его обработать
КонецФункции
Если вам все же необходимо программно управлять логикой печати непосредственно внутри самой внешней обработки, обязательно считывайте настройки текущего пользователя:
Функция Печать() Экспорт
ТабДокумент = СформироватьПечатнуюФорму();
// Динамически считываем настройки пользователя
НаПринтер = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(
ПараметрыСеанса.ТекущийПользователь,
"ПечатьДокументовБезПредварительногоПросмотра"
) = Истина;
// Передаем полученный флаг НаПринтер в процедуру печати
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, 2, НаПринтер, "Реализация товаров и услуг");
Возврат Неопределено;
КонецФункции
Если вам требуется гарантированно отправлять выделенные из формы списка документы сразу на принтер (например, ровно по 2 копии), полностью игнорируя любые настройки пользователей и особенности внешних обработок, наилучшим решением будет прямое использование программных методов платформы 1С.
Проанализируем этот подход. Мы можем вручную сформировать табличный документ для каждого выделенного объекта, настроить его свойства (количество копий, имя принтера) и вызвать встроенный метод платформы Напечатать() с параметром, отключающим показ диалогового окна.
Разберем по шагам код, который необходимо разместить в обработчике нажатия кнопки в модуле формы списка документов:
Процедура ДействиеГрупповаяПечать(Кнопка)
// 1. Получаем массив выделенных строк из табличного поля формы списка
ВыделенныеСтроки = ЭлементыФормы.Список.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 0 Тогда
Предупреждение("Не выбрано ни одного документа для печати!");
Возврат;
КонецЕсли;
// 2. Запускаем цикл обхода выбранных документов
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
ДокСсылка = ВыделеннаяСтрока.Ссылка;
ДокОбъект = ДокСсылка.ПолучитьОбъект();
// 3. Формируем табличный документ.
// Вызываем стандартную функцию печати документа (имя макета зависит от конфигурации)
ТабДок = ДокОбъект.Печать("Реализация", 1, Ложь);
// Проверяем, вернулся ли корректный табличный документ
Если ТипЗнч(ТабДок) = Тип("ТабличныйДокумент") Тогда
// 4. Устанавливаем требуемое количество копий
ТабДок.КоличествоКопий = 2;
// 5. Отправляем документ напрямую на принтер по умолчанию без показа диалога печати
// Передача параметра Ложь (или РежимИспользованияДиалогаПечати.НеИспользовать)
// гарантирует моментальную отправку в очередь печати операционной системы
ТабДок.Напечатать(Ложь);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот способ является наиболее надежным с точки зрения разработчика, так как он полностью контролирует весь жизненный цикл печатной формы — от момента ее генерации до отправки в диспетчер печати Windows, исключая любые сторонние факторы влияния пользовательских настроек.