Печать на сервере 1с. DLL для 1С, способная печатать картинки и pdf файлы в серверном контексте (например, при работе веб-сервиса)

Не знаю, пригодится кому или нет, писалось для себя, т.к  возникла необходимость печатать на принтере этикеток sscc напрямую с ТСД  через web — сервис. Как известно, веб сервис в 1С работает только в серверном контексте и, к сожалению, разработчики платформы пока не позаботились о возможности вызывать метод  при таких условиях. 

Вся инструкция по работе в архиве с библиотекой. Ограничение по pdf — 10  страниц за раз.

Параметры:
PaperHight-Высота бумаги ( число )
PaperWight — ширина бумаги (число)
PrinterName — Имя принтера ( строка) 
FileName — Имя файла ( строка) 
Landscape — Ориентация (АльбомнаяКнижная,trueFalse) (булево)
PixelJpgX — Параметр для печати картинок ( координата по x)  задается для опеределения места начала отрисовки картинке на листе бумаги ( число)
PixelJpgY- Параметр для печати картинок ( координата по y)  задается для опеределения места начала отрисовки картинке на листе бумаги ( число)
LeftField- левое поле отступа ( число ); 
RightField- правое поле отступа ( число);
UpField  — верхнее поле отступа ( число);
DownField  — нижнее поле отступа ( число);

Методы:
ReturnSettings() — возвращает значение параметров(строка);
PrintPDF() — печатает PDF файл ( возвращает ответ -"ОК" или описание ошибки (строка));
PrintJPG() — печатает Файл картинки jpg  , может и другие форматы ( возвращает ответ -"ОК" или описание ошибки (строка));

Имя для ком соединения -"Component1c.MyClassComponent";

Гуиды Библиотеки :
6844AACB-9194-46bf-81AF-9DA73EE687DC — интерфейс;
69EE0677-884A-4eeb-A3BD-D407844C0C70 — класс реализиующий функциональность интерфейса;

Регистрация :
вместо regsvr32 ( это для ++ библиотек) — C:WINDOWSMicrosoft.NETFrameworkv2.0.50727RegAsm.exe  "Путь к файлу"
пример : C:WINDOWSMicrosoft.NETFrameworkv2.0.50727RegAsm.exe "C:UsersuserDocumentscomponent1cComponent1c.dll" 
пример 2 : C:WINDOWSMicrosoft.NETFrameworkv2.0.50727RegAsm.exe "C:UsersuserDocumentscomponent1cComponent1c.dll" /codebase

дорегистрация для 64 битного сервера :

Работа с реестром—-
1. создаем раздел с именем "{69EE0677-884A-4eeb-A3BD-D407844C0C70}" в ветке HKEY_CLASSES_ROOTwow6432nodeappid. Для этого раздела создаем строковое свойство "DllSurrogate" с пустым значением.
2. Находим HKEY_CLASSES_ROOTwow6432nodeCLSID{69EE0677-884A-4eeb-A3BD-D407844C0C70} и добавляем строковое свойство "AppID" со значением "{69EE0677-884A-4eeb-A3BD-D407844C0C70}".

 где 
{69EE0677-884A-4eeb-A3BD-D407844C0C70} гуид приложения 

 

Пример кода 1С  

 МояОбработка=Новый COMОбъект("Component1c.MyClassComponent");
МояОбработка.PrinterName="Honeywell PM42 (203 dpi) - DP";
МояОбработка.FileName= "C:UsersuserDocumentsштрихкод.jpg";
МояОбработка.PaperHight=197;
МояОбработка.PaperWight=404;
МояОбработка.PixelJpgX=50;
МояОбработка.PixelJpgY=10;


Ответ=МояОбработка.PrintJPG();

Тестирование проводилось на платформе 8.3.9+ , КА 1.1  и 64 битном сервере 1С предприятия.

Печатал на принтер этикеток Honeywell PM42  с Терминала сбора данных "EDA50k "  с  установленным на него самописным  мобильным приложением 1С  посредством web -сервиса.  PDF  файлы печатает нормально, однако по какой-то причине — именно на этот принтер всегда в альбомном варианте, хотя и давалась четкая команда на драйвер, что необходим портрет. На обычных принтерах также не всегда отрабатывает команда о смене ориентации . Эту проблему решил (правда, только для обычного принтера)   сохранением из 1С pdf  файла сразу в нужной мне ориентации.

Но  Honeywell PM42 даже  при сохраненном файле в портретном варианте продолжал печатать как альбомный лист.

В итоге, насколько я понял, эта проблема связанна именной с той библиотекой, которую я использовал как базу для работы с pdf. Т.к мне на данном принтере необходимо было печатать только штрихкод, сформированный в 1С, а штрих код в 1С стандартной компонентой формируется как картинка, то я добавил возможность печати картинок.

При отправлении изображения на принтер Honeywell PM42 проблема решилась.

Библиотека для работы с печатью изображений типовая (т.е  от виндовс)  и она может печатать разные форматы изображений, но я тестировал только в jpg.

4 Comments

  1. host_kms

    Выдает ошибку, вроде все по инструкции сделал

    МояОбработка=Новый COMОбъект(«Component1c.MyClassComponent»);
    МояОбработка.PrinterName=»PP8000″;
    МояОбработка.FileName= «D:file.pdf»;
    МояОбработка.PaperHight=100;
    МояОбработка.PaperWight=80;
    Ответ=МояОбработка.PrintPDF();
    
    Reply
  2. evgeny43

    (1) Если все сделано по инструкции, но не работает — то мне известна только 1 причина , из за которой может пойти не так .

    в моем случае сервер 1с у меня работает от системной записи , если у вас это не так, то необходимо дать доступ вашей учетной записи виндовс, под которой работает сервер 1с до компоненты. (п.с на некоторых пк адекватно регистрируется компонента без «/codebase», а на некоторых с.. , попробуйте оба варианта).

    тут есть 2 варианта :

    1) в реестре пробежаться по всем записям сделанным компонентой и вами ( щелкать по ним правой кнопкой мыши , и выбирать меню разрешить доступ и т.д)

    2) можно дать учетной записи доступ ко всем компонентам на пк .

    в разделе Component Services/Computers на My Computer клик правой кнопкой, Свойства (Properties)

    закладка Безопасность COM (COM Security)

    в разделе Права доступа (Access Permissions) нажать Изменить настройки по умолчанию… (Edit Default…), в открывшемся окне добавить для пользователя, под которым запускается служба SQL Server, права Локальный доступ (Local Access)

    в разделе Разрешения на запуск и активацию (Launch and Activation Permissions) нажать Изменить настройки по умолчанию… (Edit Default…), в открывшемся окне добавить для пользователя, под которым запускается служба SQL Server, права Локальный запуск, Локальная активация (Local Launch, Local Activation)

    Component Services— служба компонент «Панель управленияВсе элементы панели управленияАдминистрированиеСлужбы компонентов».

    И не забудьте дать доступ учетной записи 1с , до физического нахождения ком компоненты ( т.е то место куда вы ее скопировали )

    P.S «/codebase»

    до перерегистрации компоненты, не забудьте почистить реестр от ее остатков в ручном режиме, в противном случае есть большая вероятность, что перерегистрация не поможет.

    Reply
  3. D@rkM@ster

    Добрый день, установил компоненту на сервер, проверил работоспособность через внешнюю обработку, все отлично печатало (нужно было реализовать печать SSCC штрихкода для склада WMS). В конфигурацию ничего добавлять не стал, т.к. впереди были выходные.

    Но как не печально это не помогло, ночью позвонили со склада, сказали что 1с не доступна. Попробовали подключиться удаленно, сервер не отвечал… Пришлось вызывать системного администратора, у него тоже ничего не получилось сделать на месте, сервер просто при загрузке показывал черный экран и на этом все. В итоге после долгих попыток что-то придумать, пришлось восстанавливать сервер из бэкапа. К сожалению логов после восстановления из бэкапа не осталось.

    Можете сделать какое-нибудь предположение почему такое могло произойти и с чем могло быть связано ?

    Reply
  4. evgeny43

    (3)

    Здравствуйте. Честно говоря без логов ни чего сказать не могу.

    Однако с обработкой скорее всего не связано, т.к у меня так же все установленно для печати с ТСД на принтер этикеток через сервер 1с. Работаем уже 1.5 года на ней . Единственное различие — com соединение создается в общем модуле, а не в обработке.

    вот код в общем модуле для анализа :

     //// Печать через HP принтер этикеток с рулоном 10 на 5 см ( 10 ширина , 5 высота)
    КомпонентШК=Неопределено;
    ОбработкаШК=Обработки.итПечатьПроизвольногоШтрихкода.Создать();
    ОбработкаШК.ПодключитьКомпоненту(КомпонентШК);
    Если КомпонентШК=Неопределено тогда
    Сообщить(«Нет компоненты штрихкода»);
    Возврат
    КонецЕсли;
    КомпонентШК.ТипКода=4;
    КомпонентШК.ЗначениеКода=ИдентификаторУпаковки;
    КомпонентШК.Высота=110;
    КомпонентШК.Ширина=400;
    ОбработкаШК.ПроверкаКартинкиПоМинимальнымПараметрам(КомпонентШК);
    Картинка=КомпонентШК.ПолучитьШтрихкод();
    Картинка=новый Картинка(Картинка);
    ВременныйФайл = ПолучитьИмяВременногоФайла(«Jpg»);
    Картинка.Записать(ВременныйФайл);
    ComОбработкаПечати=Новый COMОбъект(«Component1c.MyClassComponent»);
    ComОбработкаПечати.PrinterName=Принтер;
    ComОбработкаПечати.FileName=ВременныйФайл;
    ComОбработкаПечати.LeftField=0;
    ComОбработкаПечати.RightField=0;
    ComОбработкаПечати.UpField=0;
    ComОбработкаПечати.DownField=0;
    ComОбработкаПечати.PaperHight=197;
    ComОбработкаПечати.PaperWight=404;
    ComОбработкаПечати.PixelJpgX=0;
    ComОбработкаПечати.PixelJpgY=0;
    
    Ответ=ComОбработкаПечати.PrintJPG();
    УдалитьФайлы(ВременныйФайл);

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *