Печать на сервере 1С

1. Aero 33 07.10.14 03:02 Сейчас в теме
Все привет.
Есть УТ 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С, которая будет максимально просто реализовать и при использовании бесплатного ПО.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. infostart user 20 07.10.14 14:29 Сейчас в теме
(1) Aero,
- печать через IE (печатаная форма сохранена в html) – «Новый COMОбъект("InternetExplorer.Application")…», но не зависимо от значения свойства «Visible» все равно открывается окно. Хотя не проверял, буте ли идти печать с сервера, проверю, отпишусь.

так что, печать с сервера пошла?
какие образом печатаешь в этом случае?

еще как вариант:
сохраняй результат печати в файл, а потом батником печатай.
например батник, который будет печатать все файлы из указанной папки, а в конце удалять их, такое вроде пишеться.
+
3. Aero 33 15.12.14 04:39 Сейчас в теме
(2) infostart user, Пока сделал так - при открытии сеанса кассира (потому что они всегда в 1С) открывается доп. сеанс (нет никаких меню, прав) - затем открывается обработка которая висит и печатает.
Про IE - не проверял.
Батник думал, но он умеет распечатывать только текстовые сообщения. Если в нем использовать com или вызов приложения с параметрами (например, Acrobat), то это можно сделать и в 1С. Тем более если печатать через внешнее приложение, то будет открываться окно (IE или Acrobat), а это не надо, поскольку хочется, чтобы печать шла через службу сервера 1С, т.е. нет запущенного сеанса Винды.
+
4. spezc 782 15.12.14 06:44 Сейчас в теме
1. получаете печатную форму на сервере
2. сохраняете как пдф
3. через командную строку отправляете пдф на печать
4. профит
+
5. Aero 33 18.12.14 07:51 Сейчас в теме
(4) spezc, команду в студию.
Пробовал, скачал API Acrobat Reader - не катит.
см. 1 пост:
- печать через Adobe Reader () (печатная форма сохранена в pdf) – «Новый COMОбъект("AcroExch.AVDoc")…» (проверял и на объектах "AcroExch.App", "AcroExch.AVDoc.1" – везде не верно указан класс), но не прокатывает, где-то прочитал, что нужна версия Prof как минимум.
Хотя сейчас только пришла идея - использовать Foxit Reader.
+
6. Rokstedi 19 18.12.14 15:43 Сейчас в теме
тоже интересна тема, есть момент когда нужно оперативно отправить документ на печать, но при вызове функции ТабДок.Напечатать() база задумываеться секунд на 5, хотел отправить в фоновое задание, но там выполнение только на сервере =(
+
7. Aero 33 18.12.14 16:37 Сейчас в теме
(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".
Буду проверять на выходных.
Basko; Rokstedi; +2
8. simplebee 21.05.15 23:45 Сейчас в теме
(7) Aero, и как проверка? У меня в серверном варианте не работает. Видно что процесс Foxit запустился, но печать не происходит.
Если взять ту же строку запуска и открыть под обычным пользователем через cmd - то печатает.
+
9. celtic 34 14.05.18 09:49 Сейчас в теме
(7) понимаю что тема древняя, но все же. нашли решение для печати из 1С на сервере?
+
10. Aero 33 14.05.18 13:39 Сейчас в теме
(9) Добрый день.
Как сделал - под кассиром запускается дополнительный сеанс, в нем открывается форма с обработчиком ожидания. Процедура из обработчика ожидания проверяет, есть ли что-нибудь на печать (у меня данные хранятся в регистре сведений), если есть - печатает и очищает регистр сведений. Т.к. доп. сеанс запускается на клиенте и интерактивно, то проблем с печатью нет.

Ниже часть кода:

// Возвращает Истина, если информационная база - файловая.
//
// Параметры:
//    СтрокаСоединенияСБД - Строка - строка соединения. Если параметр не задан, 
//                                   то используется текущая информационная база.
//
Функция ОпределитьЭтаИнформационнаяБазаФайловая(СтрокаСоединенияСБД = "") Экспорт
			
	СтрокаСоединенияСБД = ?(ПустаяСтрока(СтрокаСоединенияСБД), СтрокаСоединенияИнформационнойБазы(), СтрокаСоединенияСБД);
	
	// в зависимости от того файловый это вариант БД или нет немного по-разному путь в БД формируется
	ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "FILE=");
	
	Возврат ПозицияПоиска = 1;	
	
КонецФункции

Функция ЗапуситьДополнительнийСеансПечати() Экспорт
	
	ИмяПользователя = Константы.ПользовательПечати.Получить();
	Если НЕ ЗначениеЗаполнено(ИмяПользователя) Тогда
		Возврат "Не указан пользователь для печати";
	КонецЕсли;
	
	СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();	
	ПользовательАктивен = Ложь;	
	Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл		
		Если ИмяПользователя = Соединение.Пользователь.Имя Тогда
			ПользовательАктивен = Истина;
			Прервать;
		КонецЕсли;		
	КонецЦикла;	
	Если ПользовательАктивен Тогда	//Сеанс печати запущен
		Возврат "";
	КонецЕсли;
	
	ЭтоФайловаяИБ = ОпределитьЭтаИнформационнаяБазаФайловая();	// Метод у ГлобальногоМодуля в УТ 10.3, выше приведен код.
	
	СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
	
	СтрокаПодключения = ?(ЭтоФайловаяИБ, " /F ", " /S ");
	
	Если Найти(Врег(СтрокаСоединенияСБД), "FILE=") > 0 Тогда
		СтрокаПодключения = СтрокаПодключения + Сред(СтрокаСоединенияСБД, 6, СтрДлина(СтрокаСоединенияСБД) - 6);
	Иначе
		СтрокаПодключения = СтрокаПодключения + Сред(СтрокаСоединенияСБД, 6, СтрДлина(СтрокаСоединенияСБД) - 6);
		СтрокаПодключения = СтрЗаменить(СтрокаПодключения, """;Ref=""", "\");
	КонецЕсли;
	
	ПарольПользователя = "???";
	
	СтрокаКоманды = КаталогПрограммы() + "1cv8.exe" + " ENTERPRISE" + СтрокаПодключения + " /N" + ИмяПользователя + " /P" + ПарольПользователя;
	
	ЗапуститьПриложение(СтрокаКоманды);
	
	Возврат "";
	
КонецФункции

Функция ЭтоПользовательДляПечати()
	
	ИмяПользователя = Константы.ПользовательПечати.Получить();
	Если НЕ ЗначениеЗаполнено(ИмяПользователя) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Возврат ИмяПользователя() = ИмяПользователя;
	
КонецФункции

Процедура ЗапуститьПечать()
	
	ИмяПользователя = Константы.ПользовательПечати.Получить();
	Если НЕ ЗначениеЗаполнено(ИмяПользователя) Тогда
		Возврат;
	КонецЕсли;
	
	СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();	
	КоличествоСеансов = 0;	
	Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл		
		Если ИмяПользователя = Соединение.Пользователь.Имя Тогда
			КоличествоСеансов = КоличествоСеансов + 1;
		КонецЕсли;		
	КонецЦикла;	
	Если КоличествоСеансов > 1 Тогда	//Сеанс печати запущен
		Возврат;
	КонецЕсли;
	
	// Моя обработка печати.
	ОбработкаПечати = Обработки.ОбработкаЗаданийНаПечать.Создать();
	// Тут устанавливаем значение реквизитов обработки:
	ОбработкаПечати.ФоновоеВыполнение = Истина;
	ОбработкаПечати.ПринудительноОткрыть = Истина;
	ОбработкаПечати.ПолучитьФорму("Форма").Открыть();
	
КонецПроцедуры

// Событие из модуля обычного приложения - у меня УТ 10.3
Процедура ПриНачалеРаботыСистемы()
	
	// Этот код запускается под пользователем для печати - доп. сеанс.
	Если ЭтоПользовательДляПечати() Тогда
		ЗапуститьПечать();
		Возврат;
	КонецЕсли;
	
	// Этот код запускается под кассиром.
	Если РазрешитьЗапускДополнительногоСеансаПечати() Тогда
		ЗапуситьДополнительнийСеансПечати();
	КонецЕсли;
	
КонецПроцедуры
Показать


Саму обработку "ОбработкаЗаданийНаПечать" не даю, она заточена под мою архитектуру. Если надо, могу дать. В этой обработке весь код по проверке данных к печати, и сама печать. При печати создаются документы, печатные формы которых и печатаются.
soi; KAV2; +2
11. ipoloskov 162 14.05.18 13:56 Сейчас в теме
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот