Имя: Пароль:
1C
1С v8
Из 1с отправить данные на определенный ip адрес и порт
0 Zombi
 
09.08.12
08:18
Имеются: камеры, видеорегистратор, ПО "TRASSIR"  http://www.dssl.ru/support/tech/soft/trassir_index.php , и 1с "Ресторан 8" от РАРУСа. Программке "TRASSIR" можно на определенный порт присылать команды и она будет накладывать на записываемое видео какой либо текст. Каким образом можно отправлять команды из 1с в данное ПО?
1 BuHu
 
09.08.12
08:22
(0) а какие команды может принимать TRASSIR?
2 Zombi
 
09.08.12
08:22
(1)


Формат DSSL XML для ActivePOS
Формат позволяет присылать события в ActivePOS от имени кассового терминала. Сообщения в этом формате можно присылать как по TCP так и UDP.

Описание протокола. Как видно из названия протокола, данный протокол основан на XML. Каждое событие, произошедшее на кассовом терминале, представляется в виде блока-транзакции:


<?xml version="1.0" encoding="cp1251"?>
<transaction>
 <event_type>pos_position_add</event_type>
 <operation_id>E44D0F4A-9822-11E0-36A3-0050FB005F0A</operation_id>
 <cashier>Пупкин Василий Федорович</cashier>

 <date>06/16/2011</date>
 <time>18:14:05</time>

 <position>5</position>
 <weight>1.064</weight>
 <quantity>1</quantity>
 <code>1149990037</code>
 <name>Корм "Престиж"</name>
 <price>185.4</price>
</transaction>

Протокол использует следующие поля:

event_type - тип события.
Имеется строго ограниченный список значений, которые могут содержаться в данном поле:

pos_work_session_start - начало сессии
pos_work_session_end - завершение сессии
pos_cashier_registration - регистрация кассира
pos_exit_from_the_system - выход кассира из системы
pos_moneybox_open - открытие денежного ящика
pos_new_receipt_sell - новый чек "продажа", событие должно содержать имя кассира
pos_new_receipt_return - новый чек "возврат", событие должно содержать имя кассира
pos_new_receipt_cancel - новый чек "отмена продажи", событие должно содержать имя кассира
pos_new_receipt_exchange - новый чек "замена", событие должно содержать имя кассира
pos_new_receipt_inclusion - новый чек "внесение денежных средств", событие должно содержать имя кассира
pos_receipt_number - номер чека
pos_position_add - добавление позиции
pos_position_change - изменение позиции
pos_position_cancel - отмена позиции
pos_position_cost_increase - увеличение стоимости позиции
pos_position_cost_decrease - уменьшение стоимости позиции
pos_position_amount_increase увеличение количества товара
pos_position_amount_decrease - уменьшение количества товара
pos_applying_discount_for_position - применение скидки к товару
pos_cancel_discount_for_position - отмена скидки на товар
pos_applying_discount_for_receipt - применение скидки к чеку
pos_preliminary_result - предварительная суммарная стоимость
pos_final_result - финальная стоимость по чеку
pos_credit_card_payment - оплата кредитной картой
pos_cash_payment - оплата наличными
pos_cash_change - сдача
pos_receipt_cancel - отмена чека
pos_receipt_delay - отложенный чек
pos_receipt_restore - восстановление чека
pos_receipt_close - закрытие чека
pos_x_report - X-отчет
pos_z_report - Z-отчет
pos_operation_error - ошибка
pos_fraud - мошенничество
pos_comment - комментарий
pos_new_receipt_weighing - взвешивание
pos_new_receipt_cashcounting - подсчет наличных
operation_id - уникальный идентификатор операции (порядковый номер чека передается отдельным событием после открытия чека)
date - дата совершения операции (MM/dd/yyyy)
time - время совершения операции (hh:mm:ss)
position - позиция
code - артикул продукта, штрих-код
quantity - количество
weight - вес
name - наименование товара
price - цена
Часто используемый вариант - скрипт отсылающий сообщения на 127.0.0.1 по UDP. Порт должен соответствовать терминалу, созданному в диалоге настройки ActivePOS.

t = "<?xml version= ... <transaction> ... </transaction>"
import socket
try:
   s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   s.connect(("127.0.0.1", port))
   s.send(t)
   s.close()
except socket.error, msg:
   error("can't forward to port %i: %s" % (port, msg))
   s.close()
3 vde69
 
09.08.12
08:32
сохраняешь в файл, далее вызываешь пакетник с телнетом
4 Zombi
 
09.08.12
08:37
(3) Пример аналогичного кода можно?
5 aleks-id
 
09.08.12
08:44
не все так просто. надо формировать xml-заголовок с хидером и его отправлять уже по типу mssoap
6 aleks-id
 
09.08.12
08:45
не могу найти свою обработку. давно уже делал
7 Zombi
 
09.08.12
08:46
(6) Если найдешь, кинь, пожалуйста.
8 aleks-id
 
09.08.12
09:02
(7) обработку не дам, кусок кода выложу
9 Zombi
 
09.08.12
09:15
(8) Да, конечно.
10 aleks-id
 
09.08.12
09:42
как то так...

Процедура ВыполнитьЗапрос()
   
 ИмяФункции = "pos_position_add";
 ИдентификаторОперации = "E44D0F4A-9822-11E0-36A3-0050FB005F0A";
 ФИО="Пупкин Василий Федорович";
 НужнаяДата="06/16/2011";
 НужноеВремя="18:14:05";
 Позиция="5";
 Вес="1.064";
 Количество="1";
 Код="1149990037";
 Наименование="Корм ""Престиж""";
 Цена="185.4";

 АдресСервера="127.0.0.1";
 НомерПорта="80";
 
 
   ТекстXML="<?xml version=""1.0"" encoding=""cp1251""?>
   |<transaction>
   |  <event_type>"+ИмяФункции+"</event_type>
   |  <operation_id>"+ИдентификаторОперации+"</operation_id>
   |  <cashier>"+ФИО+"</cashier>
   |  <date>"+НужнаяДата+"</date>
   |  <time>"+НужноеВремя+"</time>
   |  <position>"+Позиция+"</position>
   |  <weight>"+Вес+"</weight>
   |  <quantity>"+Количество+"</quantity>
   |  <code>"+Код+"</code>
   |  <name>"+Наименование+"</name>
   |  <price>"+Цена+"</price>
   |</transaction>";
   
   HTTPxml =  Новый COMОбъект("MSXML2.ServerXMLHTTP");
   HTTPxml.setTimeouts(600000,600000,600000,600000);
   HTTPxml.Open("POST", АдресСервера+":"+НомерПорта);
   Попытка
       HTTPxml.Send(ТекстXML);
   Исключение
       еггог = ИнформацияОбОшибке();
       Сообщить("Не удалось отправить данные серверу - "+ОписаниеОшибки());
       Сообщить("Описание ошибки - "+еггог.Описание);
       Сообщить("Причина - " +еггог.Причина.Описание);
   КонецПопытки;
   Если СокрЛП(HTTPxml.status)<>"100" Тогда
   //не обязательно 100, надо проверить какой код ошибки у тебя
       Сообщить( "Ошибка получения данных: "+ HTTPxml.responsetext);
   иначе    
       РаспарситьОтвет(HTTPxml.responsetext);
       //это моя процедура парсинга ответа. ты пиши свою.
   конецесли;

КонецПроцедуры
11 Zombi
 
09.08.12
09:47
(10) Спасибо, буду ковырять.
12 Zombi
 
16.08.12
14:18
Написал:



Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   ИмяФункции = "pos_position_add";
   ИдентификаторОперации = "E44D0F4A-9822-11E0-36A3-0050FB005F0A";
   ФИО = "Пупкин Василий Федорович";
   НужнаяДата = "06/16/2011";
   НужноеВремя = "18:14:05";
   Позиция = "5";
   Вес = "1.064";
   Количество = "1";
   Код = "1149990037";
   Наименование = "Корм ""Престиж""";
   Цена = "185.4";
   
   ТекстXML = "<?xml version=""1.0"" encoding=""cp1251""?>
   |<transaction>
   |    <event_type>"+ИмяФункции+"</event_type>
   |    <operation_id>"+ИдентификаторОперации+"</operation_id>
   |    <cashier>"+ФИО+"</cashier>
   |    <date>"+НужнаяДата+"</date>
   |    <time>"+НужноеВремя+"</time>
   |    <position>"+Позиция+"</position>
   |    <weight>"+Вес+"</weight>
   |    <quantity>"+Количество+"</quantity>
   |    <code>"+Код+"</code>
   |    <name>"+Наименование+"</name>
   |    <price>"+Цена+"</price>
   |</transaction>";
   
   HTTPxml =  Новый COMОбъект("MSXML2.ServerXMLHTTP");
   HTTPxml.setTimeouts(600000,600000,600000,600000);
   HTTPxml.Open("POST", "192.168.1.11:2555");
   
   Попытка
       HTTPxml.Send(ТекстXML);
   Исключение
       Ошибка = ИнформацияОбОшибке();
       Сообщить("Не удалось отправить данные серверу - "+ОписаниеОшибки());
       Сообщить("Описание ошибки - "+Ошибка.Описание);
       Сообщить("Причина - " +Ошибка.Причина.Описание);
   КонецПопытки;

   
КонецПроцедуры


На строке

HTTPxml.Open("POST", "192.168.1.11:2555");

выдает ошибку:

{Форма.Форма.Форма(33)}: Ошибка при вызове метода контекста (open)
   HTTPxml.Open("POST", "192.168.1.11:2555");
по причине:
Произошла исключительная ситуация (msxml3.dll): URL-адрес не использует поддерживаемый протокол

Телнетом подключается на этот ип и порт. Что попробовать исправить?
13 Zombi
 
16.08.12
14:35
Помог бы ко нибудь вот с этим блоком мне:

   HTTPxml =  Новый COMОбъект("MSXML2.ServerXMLHTTP");
   HTTPxml.setTimeouts(600000,600000,600000,600000);
   HTTPxml.Open("POST", "192.168.1.11:2555");
14 Rebelx
 
16.08.12
14:38
15 Zombi
 
16.08.12
14:48
(14) Я к сожалению не очень хорошо разбираюсь во всяких сторонних компонентах, и полезного не смог ничего почерпнуть из информации по вашей ссылке. Можно немного конкретнее?
16 Zombi
 
16.08.12
15:07
В документации к TRASSIR нашел это
t = "<?xml version= ... <transaction> ... </transaction>"
import socket
try:
   s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   s.connect(("127.0.0.1", port))
   s.send(t)
   s.close()
except socket.error, msg:
   error("can't forward to port %i: %s" % (port, msg))
   s.close()
как в 1с это все реализовать?
17 Zombi
 
16.08.12
15:30
ап..,
18 Zombi
 
16.08.12
15:47
Апну еще