Все привет.
Есть УТ 10.3 на 8.2, к ней прикручен web-сервис. Есть планшет, для него написано мобильное приложение, которое "общается" с 1С через web-сервис, т.е. получает товар, формируется продажа и отправляется обратной в 1С. Как только web-сервис получает данные, они записываются в регистр сведений. Функция печати на сервере 1С не доступна, поэтому сейчас запускается отдельно сеанс 1С, в котором автоматом открывается обработка, и каждую секунду она проверяет наличие данных в регистре – если есть, формируется документ заказа и сразу же распечатывается на принтеры (разные формы на разные принтеры).
Заказчика не устаивает, что надо запускать сеанс, поскольку каждую ночь делается бэкап – выгрузка в dt, а утром могут забыть включить, либо при обновлении конфигурации надо его закрыть (сеанс), а потом не забыть включить – на сервере. Так же не устаивает, чтобы обработка автоматом открывалась на компьютере кассира (они всегда есть, когда есть продажи, т.е. у кассиров 1С всегда работает), т.к. даже задержка в 1 сек. (на время формирования и печати документов) у кассира тоже не устраивает. Пока временно его устроило это – когда кассир заходит в 1С, автоматом запускается еще один сеанс, в котором и происходит формирование и печать документов. В конечном итоге заказчик хочет, чтобы печать не зависела от человеческого фактора, т.е. работает служба 1С, работает печать.
Было несколько идей (все через com-объекты):
- печать через Adobe Reader () (печатная форма сохранена в pdf) – «Новый COMОбъект("AcroExch.AVDoc")…» (проверял и на объектах "AcroExch.App", "AcroExch.AVDoc.1" – везде не верно указан класс), но не прокатывает, где-то прочитал, что нужна версия Prof как минимум.
- печать через IE (печатаная форма сохранена в html) – «Новый COMОбъект("InternetExplorer.Application")…», но не зависимо от значения свойства «Visible» все равно открывается окно. Хотя не проверял, буте ли идти печать с сервера, проверю, отпишусь.
- крайний вариант – на сервере стоит Office, но это все рано не вариант.
В общем нужно реализовать печать с сервера 1С, которая будет максимально просто реализовать и при использовании бесплатного ПО.
- печать через IE (печатаная форма сохранена в html) – «Новый COMОбъект("InternetExplorer.Application")…», но не зависимо от значения свойства «Visible» все равно открывается окно. Хотя не проверял, буте ли идти печать с сервера, проверю, отпишусь.
так что, печать с сервера пошла?
какие образом печатаешь в этом случае?
еще как вариант:
сохраняй результат печати в файл, а потом батником печатай.
например батник, который будет печатать все файлы из указанной папки, а в конце удалять их, такое вроде пишеться.
(2) infostart user, Пока сделал так - при открытии сеанса кассира (потому что они всегда в 1С) открывается доп. сеанс (нет никаких меню, прав) - затем открывается обработка которая висит и печатает.
Про IE - не проверял.
Батник думал, но он умеет распечатывать только текстовые сообщения. Если в нем использовать com или вызов приложения с параметрами (например, Acrobat), то это можно сделать и в 1С. Тем более если печатать через внешнее приложение, то будет открываться окно (IE или Acrobat), а это не надо, поскольку хочется, чтобы печать шла через службу сервера 1С, т.е. нет запущенного сеанса Винды.
(4) spezc, команду в студию.
Пробовал, скачал API Acrobat Reader - не катит.
см. 1 пост:
- печать через Adobe Reader () (печатная форма сохранена в pdf) – «Новый COMОбъект("AcroExch.AVDoc")…» (проверял и на объектах "AcroExch.App", "AcroExch.AVDoc.1" – везде не верно указан класс), но не прокатывает, где-то прочитал, что нужна версия Prof как минимум.
Хотя сейчас только пришла идея - использовать Foxit Reader.
тоже интересна тема, есть момент когда нужно оперативно отправить документ на печать, но при вызове функции ТабДок.Напечатать() база задумываеться секунд на 5, хотел отправить в фоновое задание, но там выполнение только на сервере =(
(6) Rokstedi, вроде как нашел решение.
Пробовал вызывать Adobe Reader с параметром, но открывался документ, а затем шла печать:
"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe" /h /t "G:\Test.pdf" "Microsoft XPS Document Writer".
Решил проверить с Foxit Reader, вроде как катит (ничего не открывается, сразу идет печать), но еще не проверял работу в фоновом задании:
"C:\Program Files (x86)\Foxit Software\Foxit Reader\Foxit Reader.exe" /t "G:\Test.pdf" "Microsoft XPS Document Writer".
Буду проверять на выходных.
(7) Aero, и как проверка? У меня в серверном варианте не работает. Видно что процесс Foxit запустился, но печать не происходит.
Если взять ту же строку запуска и открыть под обычным пользователем через cmd - то печатает.
(9) Добрый день.
Как сделал - под кассиром запускается дополнительный сеанс, в нем открывается форма с обработчиком ожидания. Процедура из обработчика ожидания проверяет, есть ли что-нибудь на печать (у меня данные хранятся в регистре сведений), если есть - печатает и очищает регистр сведений. Т.к. доп. сеанс запускается на клиенте и интерактивно, то проблем с печатью нет.
Ниже часть кода:
// Возвращает Истина, если информационная база - файловая.
//
// Параметры:
// СтрокаСоединенияСБД - Строка - строка соединения. Если параметр не задан,
// то используется текущая информационная база.
//
Функция ОпределитьЭтаИнформационнаяБазаФайловая(СтрокаСоединенияСБД = "") Экспорт
СтрокаСоединенияСБД = ?(ПустаяСтрока(СтрокаСоединенияСБД), СтрокаСоединенияИнформационнойБазы(), СтрокаСоединенияСБД);
// в зависимости от того файловый это вариант БД или нет немного по-разному путь в БД формируется
ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "FILE=");
Возврат ПозицияПоиска = 1;
КонецФункции
Функция ЗапуситьДополнительнийСеансПечати() Экспорт
ИмяПользователя = Константы.ПользовательПечати.Получить();
Если НЕ ЗначениеЗаполнено(ИмяПользователя) Тогда
Возврат "Не указан пользователь для печати";
КонецЕсли;
СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();
ПользовательАктивен = Ложь;
Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл
Если ИмяПользователя = Соединение.Пользователь.Имя Тогда
ПользовательАктивен = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПользовательАктивен Тогда //Сеанс печати запущен
Возврат "";
КонецЕсли;
ЭтоФайловаяИБ = ОпределитьЭтаИнформационнаяБазаФайловая(); // Метод у ГлобальногоМодуля в УТ 10.3, выше приведен код.
СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
СтрокаПодключения = ?(ЭтоФайловаяИБ, " /F ", " /S ");
Если Найти(Врег(СтрокаСоединенияСБД), "FILE=") > 0 Тогда
СтрокаПодключения = СтрокаПодключения + Сред(СтрокаСоединенияСБД, 6, СтрДлина(СтрокаСоединенияСБД) - 6);
Иначе
СтрокаПодключения = СтрокаПодключения + Сред(СтрокаСоединенияСБД, 6, СтрДлина(СтрокаСоединенияСБД) - 6);
СтрокаПодключения = СтрЗаменить(СтрокаПодключения, """;Ref=""", "\");
КонецЕсли;
ПарольПользователя = "???";
СтрокаКоманды = КаталогПрограммы() + "1cv8.exe" + " ENTERPRISE" + СтрокаПодключения + " /N" + ИмяПользователя + " /P" + ПарольПользователя;
ЗапуститьПриложение(СтрокаКоманды);
Возврат "";
КонецФункции
Функция ЭтоПользовательДляПечати()
ИмяПользователя = Константы.ПользовательПечати.Получить();
Если НЕ ЗначениеЗаполнено(ИмяПользователя) Тогда
Возврат Ложь;
КонецЕсли;
Возврат ИмяПользователя() = ИмяПользователя;
КонецФункции
Процедура ЗапуститьПечать()
ИмяПользователя = Константы.ПользовательПечати.Получить();
Если НЕ ЗначениеЗаполнено(ИмяПользователя) Тогда
Возврат;
КонецЕсли;
СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();
КоличествоСеансов = 0;
Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл
Если ИмяПользователя = Соединение.Пользователь.Имя Тогда
КоличествоСеансов = КоличествоСеансов + 1;
КонецЕсли;
КонецЦикла;
Если КоличествоСеансов > 1 Тогда //Сеанс печати запущен
Возврат;
КонецЕсли;
// Моя обработка печати.
ОбработкаПечати = Обработки.ОбработкаЗаданийНаПечать.Создать();
// Тут устанавливаем значение реквизитов обработки:
ОбработкаПечати.ФоновоеВыполнение = Истина;
ОбработкаПечати.ПринудительноОткрыть = Истина;
ОбработкаПечати.ПолучитьФорму("Форма").Открыть();
КонецПроцедуры
// Событие из модуля обычного приложения - у меня УТ 10.3
Процедура ПриНачалеРаботыСистемы()
// Этот код запускается под пользователем для печати - доп. сеанс.
Если ЭтоПользовательДляПечати() Тогда
ЗапуститьПечать();
Возврат;
КонецЕсли;
// Этот код запускается под кассиром.
Если РазрешитьЗапускДополнительногоСеансаПечати() Тогда
ЗапуситьДополнительнийСеансПечати();
КонецЕсли;
КонецПроцедуры
Показать
Саму обработку "ОбработкаЗаданийНаПечать" не даю, она заточена под мою архитектуру. Если надо, могу дать. В этой обработке весь код по проверке данных к печати, и сама печать. При печати создаются документы, печатные формы которых и печатаются.