Работа с кассой Atol через веб-сервер ДТО-10

31.12.18

Интеграция - ККМ

Поддержка многопользовательской печати на одном устройстве ККТ. Поддержка изменений в законодательстве (Переход на ФФД 1.05 и НДС 20%).

Предыстория

Так сложилось что работа с кассой в среде 1С строиться через внешнюю компоненту.
Одна из проблем, с которой столкнулись мы – «зависание» com-порта для работы с кассой завершенным сеансом 1С при печати чеков на 1 ККМ с нескольких компьютеров. Также нам не нравилась установка драйвера ДТО на каждом компьютере, с которого требовалось обращение к кассе. 

Ранее использовали службу fdsvc на компьютере, где подключена касса, устанавливатли драйвер на каждом ПК для обеспечения общения с службой. Так же необходимо было зарегистрировать на каждом компьютере библиотеку драйвера Атол FprnM1C.dll, если же dll в новой версии драйвера с тем же именем, то предварительно необходимо почистить временные файлы. Создавался COM объект, в него передавались данные в зависимости от операции, при этом соединение с кассой держалось все время пока выполнялась операция, а так же код выполнялся в синхронном режиме, ожидая выполнения каждой операции.

Что сделали:

Компания Атол выпустила новую версию драйвера, которая поддерживает работу с кассой через HTTP-запросы к веб-серверу Атол. Существует публикация, реализующая механизм работы с этой версией драйвера, но она нас не устраивала закрытостью кода и мы решили реализовать свой механизм.

 

Порядок действий:

1.Установка и настройка сервера от Atol

Скачиваем последний ДТО 10 с сайта Atol

Для работы Web-сервера требуется установленная Java версии 1.8 и выше (х32).

В момент установки отмечаем, что необходимо установить Web-сервер (данное расширение присутствует только в 32-х битном драйвере)

После установки по адресу http://hostname:16732/settings производим настройки web-сервера

Настраиваем параметры подключения

Включаем web-сервер

После перезагрузки необходимо перезапустить службу

2. Взаимодействие с web-сервером

Для обращения к кассе нам необходимо хранить ip-адрес и порт по которому происходит взаимодействие с кассой

В справочнике кассы добавили реквизиты АдресВебСервера и ПортВебСервера

Алгоритм работы

Для добавления задания в очередь на выполнения необходимо отправить его POST-запросом на адрес http://hostname:16732/requests, указав его уникальный идентификатор. В ответ сервер вернет код результата в виде HTTP-статуса.

(Отправляем запрос на регистрацию задания в очереди печати, когда необходимо распечатать чек)

Для того, чтобы узнать результат задания, необходимо отправить GET-запрос на адрес http://hostname:16732/requests/. В ответ вернется JSON, содержащий в себе статусы задания и его результаты.

(Тут сложнее, необходимо запрашивать статусы задач, для этого мы должны организовать хранение отправленных заданий и проверять по ним ответы, мы организовали хранение через регистр сведений, ключом выступил Объект (любая ссылка) – так как необходимо было контролировать уникальность документов оплаты отправленных на печать, и обеспечить повторную отправку печати в случае неуспеха предыдущего задания)

Для отмены задания, которое еще не начало обрабатываться, необходимо отправить DELETE-запрос на адрес http://hostname:16732/requests/. Нельзя отменить задание, которое выполняется в данный момент.

 

Примеры кода

Для выполнения операции была реализована функция выполнения команды, в качестве входных параметров:

Касса на которой необходимо произвести печать

Операция выполняемая в данный момент

Дополнительные параметры для проведения определенной операции

Реализовали функция для постановки в очередь заданий

// Функция - Выполнить операцию

//

// Параметры:

//  Касса - Справочник.КассыККМ - касса на которой необходимо произвести операцию

//  Операция - Строка - Реализованы "ОтчетБезГашения", "ЗакрытиеСмены" и "ФискальныйЧек"

//  ДополнительныеПараметры - Структура - необходимые параметры для выполнения операций 

// 

// Возвращаемое значение:

//  Ответ - Строка - сообщение о результате выполнения операции

Функция ВыполнитьОперацию(Касса,Операция,ДополнительныеПараметры) Экспорт



HTTPЗапрос = Новый HTTPЗапрос();

HTTPЗапрос.АдресРесурса = "/requests";

HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");



Если Операция = "ОтчетБезГашения" Тогда

СтруктураJSON = СформироватьСтруктуруДляОтчетаБезГашения(Касса,Операция,ДополнительныеПараметры);

ИначеЕсли Операция = "ЗакрытиеСмены" Тогда

СтруктураJSON = СформироватьСтруктуруДляЗакрытияСмены(Касса,Операция,ДополнительныеПараметры);

ИначеЕсли Операция = "ФискальныйЧек" Тогда

СтруктураJSON = СформироватьСтруктуруДляФискальногоЧека(Касса,Операция,ДополнительныеПараметры);

Иначе

Возврат "Ошибка выполнения операции! " + "Операция " + Операция + " не реализована!";

КонецЕсли;



Если СтруктураJSON = Неопределено Тогда

Возврат "Не удалось зарегистрировать в очередь!, ошибка формирования менеджера задания (JSON)";

КонецЕсли;



ЗаписьJSON = новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписатьJSON(ЗаписьJSON,СтруктураJSON);

СтрокаЗапросаJS = ЗаписьJSON.Закрыть();

HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапросаJS,КодировкаТекста.UTF8);



Попытка

Соединение = Новый HTTPСоединение(Касса.АдресВебСервера,Касса.ПортВебСервера);

ОтветHTTP = Соединение.ОтправитьДляОбработки(HTTPЗапрос);

Исключение

Возврат "Ошибка регистрации в очереди! Проверьте работоспособность сервера и параметры кассы!";

КонецПопытки;



//обработаем ответ



Тело = ОтветHTTP.ПолучитьТелоКакСтроку();

Если Не ОтветHTTP.КодСостояния = 201 Тогда

Возврат "Ошибка регистрации в очереди!";

КонецЕсли;



//добавим в регистр очереди

Если Операция = "ФискальныйЧек" Тогда

новМенеджер = РегистрыСведений.ОчередьРаботыСКкт.СоздатьМенеджерЗаписи();

новМенеджер.Период = ТекущаяДата();

новМенеджер.Объект = ДополнительныеПараметры.ДокументОплаты;

новМенеджер.Операция = Операция;

новМенеджер.уникИД = СтруктураJSON.uuid;

новМенеджер.Касса = ДополнительныеПараметры.ДокументОплаты.Касса;

новМенеджер.Записать(Ложь);

КонецЕсли;



Возврат "Данные добавлены в очередь!";

КонецФункции

Для каждой операции необходимо формировать свое тело запроса, реализовали под каждую операцию свою функцию которая формирует структуру для отправки на задание

Функция СформироватьСтруктуруДляОтчетаБезГашения(Касса,Операция,ДополнительныеПараметры)



уникИД = Формат(ТекущаяДата(),"ДФ=ддММггггЧЧммсс");

СтруктураJSON = Новый Структура();

СтруктураJSON.Вставить("uuid",уникИД);

МассивПараметров = Новый Массив();

СтруктураОперация  = Новый Структура("type","reportX");

МассивПараметров.Добавить(СтруктураОперация);

СтруктураОператор = Новый Структура();

СтруктураОператор.Вставить("name",Строка(ПараметрыСеанса.Пользователь));

МассивПараметров.Добавить(СтруктураОператор);

СтруктураJSON.Вставить("request",МассивПараметров);



Возврат СтруктураJSON;

КонецФункции



Функция СформироватьСтруктуруДляЗакрытияСмены(Касса,Операция,ДополнительныеПараметры)



уникИД = Формат(ТекущаяДата(),"ДФ=ддММггггЧЧммсс");

ЗаписьJSON = новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

СтруктураJSON = Новый Структура();

СтруктураJSON.Вставить("uuid",уникИД);

МассивПараметров = Новый Массив();

СтруктураОперация  = Новый Структура("type","closeShift");

МассивПараметров.Добавить(СтруктураОперация);

СтруктураОператор = Новый Структура();

СтруктураОператор.Вставить("name",Строка(ПараметрыСеанса.Пользователь));

МассивПараметров.Добавить(СтруктураОператор);

СтруктураJSON.Вставить("request",МассивПараметров);



Возврат СтруктураJSON;



КонецФункции



Функция СформироватьСтруктуруДляФискальногоЧека(Касса,Операция,ДополнительныеПараметры)



ДокументОплаты = ДополнительныеПараметры.ДокументОплаты;

Если Не ПустаяСтрока(ДокументОплаты.НомерЧека) Тогда



СообщениеПользователю = Новый СообщениеПользователю();

СообщениеПользователю.Текст = "По документу уже пробит чек!";

СообщениеПользователю.КлючДанных = ДокументОплаты;

СообщениеПользователю.Сообщить();

Возврат Неопределено;



КонецЕсли;



СтруктураОтвета = ПолучитьСостояниеЗадания("",ДокументОплаты.Касса,ДокументОплаты);

Если Не СтруктураОтвета.ВозможнаОтправка Тогда



СообщениеПользователю = Новый СообщениеПользователю();

СообщениеПользователю.Текст = СтруктураОтвета.ОписаниеОшибки;

СообщениеПользователю.КлючДанных = ДокументОплаты;

СообщениеПользователю.Сообщить();

Возврат Неопределено;



КонецЕсли;



уникИД = Формат(ДокументОплаты.Номер,"ЧГ=") + "-" + Формат(ТекущаяДата(),"ДФ=ддММггЧЧммсс");

ЗаписьJSON = новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

СтруктураJSON = Новый Структура();

СтруктураJSON.Вставить("uuid",уникИД);



МассивПараметров = Новый Массив();

СтруктураЧека = Новый Структура();

//Тип задания

//sell - чек прихода buy - чек расхода sellReturn - чек возврата прихода buyReturn - чек возврата расхода

ВидОперации = ДокументОплаты.ВидОперации;

Если ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперации.ОплатаКлиентом") ИЛИ 

ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперации.ПополнениеЛицевогоСчета") ИЛИ 

ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперации.ВнесениеДенежныхСредств") Тогда



type = "sell";



ИначеЕсли ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперации.ВозвратКлиенту") Тогда



type = "sellReturn";



Иначе



Возврат Неопределено;



КонецЕсли;

СтруктураЧека.Вставить("type",type);

//Электронный чек

СтруктураЧека.Вставить("electronically",Ложь);

//useVAT18 использовать при регистрации чека ставку налога 18%

СтруктураЧека.Вставить("useVAT18",Ложь);

//taxationType Система налогообложения

Если Касса.СистемаНалогооблажения = ПредопределенноеЗначение("Справочник.СистемыНалогообложения.Общая") Тогда

taxationType = "osn";

ИначеЕсли Касса.СистемаНалогооблажения = ПредопределенноеЗначение("Справочник.СистемыНалогообложения.УпрощеннаяДоход") Тогда

taxationType = "usnIncome";

ИначеЕсли Касса.СистемаНалогооблажения = ПредопределенноеЗначение("Справочник.СистемыНалогообложения.УпрощеннаяДоходМинусРасход") Тогда

taxationType = "usnIncomeOutcome";

ИначеЕсли Касса.СистемаНалогооблажения = ПредопределенноеЗначение("Справочник.СистемыНалогообложения.ЕНВД") Тогда

taxationType = "envd";

ИначеЕсли Касса.СистемаНалогооблажения = ПредопределенноеЗначение("Справочник.СистемыНалогообложения.ЕСН") Тогда

taxationType = "esn";

ИначеЕсли Касса.СистемаНалогооблажения = ПредопределенноеЗначение("Справочник.СистемыНалогообложения.ПСН") Тогда

taxationType = "patent";

Иначе

taxationType = "";

КонецЕсли;

Если Не ПустаяСтрока(taxationType) Тогда

СтруктураЧека.Вставить("taxationType",taxationType);

КонецЕсли;

//данные о кассире

СтруктураОператор = Новый Структура();

СтруктураОператор.Вставить("name", Строка(ДокументОплаты.Автор));

СтруктураЧека.Вставить("operator",СтруктураОператор);



//данные о товарах массив items

МассивПозиций = Новый Массив();



Если ВидОперации = Перечисления.ВидыОперации.ПополнениеЛицевогоСчета ИЛИ

ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперации.ВнесениеДенежныхСредств") Тогда



СтруктураПозиции = Новый Структура();

СтруктураПозиции.Вставить("type","position");

СтруктураПозиции.Вставить("name","Оказание медицинских услуг по договору");

СтруктураПозиции.Вставить("price",ДокументОплаты.Сумма);

СтруктураПозиции.Вставить("quantity",1);

СтруктураПозиции.Вставить("amount",ДокументОплаты.Сумма);

СтруктураПозиции.Вставить("paymentMethod","fullPrepayment");

СтруктураПозиции.Вставить("paymentObject","service");

СтруктураНДС = Новый Структура();

СтруктураНДС.Вставить("type","none");

СтруктураПозиции.Вставить("tax",СтруктураНДС);

МассивПозиций.Добавить(СтруктураПозиции);



Иначе



СписокУслуг = ДокументОплаты.СписокУслуг.Выгрузить();

СуммаОплтыБонусами = 0;

МассивОплатБонусами = ДокументОплаты.ВидыОплат.НайтиСтроки(Новый Структура("ВидОплаты",ПредопределенноеЗначение("Перечисление.ВидОплаты.Бонусами")));

Если МассивОплатБонусами.Количество() = 1 Тогда

СуммаОплтыБонусами = МассивОплатБонусами[0].Сумма;

КонецЕсли;



Для Каждого СтрПозиций Из СписокУслуг Цикл



Если СуммаОплтыБонусами = 0 Тогда

Прервать;

КонецЕсли;



Если СтрПозиций.Сумма - 1 <= СуммаОплтыБонусами Тогда

СуммаОплтыБонусами = СуммаОплтыБонусами - (СтрПозиций.Сумма - 1);

СтрПозиций.Сумма = 1;

СтрПозиций.Цена = СтрПозиций.Сумма/СтрПозиций.Количество;

Иначе

СтрПозиций.Сумма = СтрПозиций.Сумма - СуммаОплтыБонусами;

СтрПозиций.Цена = СтрПозиций.Сумма/СтрПозиций.Количество;

СуммаОплтыБонусами = 0;

КонецЕсли;



КонецЦикла;



Для Каждого СтрОплаты Из СписокУслуг Цикл



СтруктураПозиции = Новый Структура();

СтруктураПозиции.Вставить("type","position");

СтруктураПозиции.Вставить("name",СтрОплаты.Услуга.Наименование);

СтруктураПозиции.Вставить("price",СтрОплаты.Цена);

СтруктураПозиции.Вставить("quantity",СтрОплаты.Количество);

СтруктураПозиции.Вставить("amount",СтрОплаты.Сумма);

Если СтруктураЧека.type = "sell" Тогда 

СтруктураПозиции.Вставить("infoDiscountAmount",СтрОплаты.СуммаБезСкидки - СтрОплаты.Сумма);

КонецЕсли;

//paymentMethod - Признак способа рaсчета

//fullPrepayment - предоплата 100% 

//prepayment - предоплата 

//advance - аванс 

//fullPayment - полный расчет 

//partialPayment - частичный расчет и кредит 

//credit - передача в кредит 

//creditPayment - оплата кредита

СтруктураПозиции.Вставить("paymentMethod","fullPrepayment");



//paymentObject

//commodity - товар 

//excise - подакцизный товар 

//job - работа 

//service - услуга 

//gamblingBet - ставка азартной игры 

//gamblingPrize - выигрыш азартной игры 

//lottery - лотерейный билет 

//lotteryPrize - выигрыш лотереи 

//intellectualActivity - предоставление результатов интерелектуальной деятельности 

//payment - платеж 

//agentCommission - агентское вознаграждение 

//proprietaryLaw - имущественное право 

//nonOperatingIncome - внереализационный доход 

//insuranceСontributions - страховые взносы 

//merchantTax - торговый сбор 

//resortFee - курортный сбор 

//composite - составной предмет расчета 

//another - иной предмет расчета

СтруктураПозиции.Вставить("paymentObject","service");



//tax

СтруктураНДС = Новый Структура();

СтруктураНДС.Вставить("type","none");

СтруктураПозиции.Вставить("tax",СтруктураНДС);



МассивПозиций.Добавить(СтруктураПозиции);



КонецЦикла;



КонецЕсли;

СтруктураЧека.Вставить("items", МассивПозиций);



//формирование стуктуры оплат

МассивОплат = Новый Массив();

Для Каждого СтрОплаты Из ДокументОплаты.ВидыОплат Цикл

СтруктураОплаты = Новый Структура();

Если СтрОплаты.ВидОплаты = ПредопределенноеЗначение("Перечисление.ВидОплаты.БезНаличными") Тогда

СтруктураОплаты.Вставить("type", "electronically");

ИначеЕсли СтрОплаты.ВидОплаты = ПредопределенноеЗначение("Перечисление.ВидОплаты.Наличными") Тогда

СтруктураОплаты.Вставить("type", "cash");

Иначе

Продолжить;

КонецЕсли;

СтруктураОплаты.Вставить("sum", СтрОплаты.Сумма);

МассивОплат.Добавить(СтруктураОплаты);

КонецЦикла;

СтруктураЧека.Вставить("payments",МассивОплат);



СтруктураJSON.Вставить("request",СтруктураЧека);



Возврат СтруктураJSON;

КонецФункции

 

Опрос заданий организовали через фоновое задание раз в 60 секунд

Процедура ОбработкаОчередиККТ() Экспорт 

Запрос = Новый Запрос();

Запрос.Текст = "ВЫБРАТЬ

| ОчередьРаботыСККТ.Период КАК Период,

| ОчередьРаботыСККТ.Объект КАК Объект,

| ОчередьРаботыСККТ.Операция КАК Операция,

| ОчередьРаботыСККТ.уникИД КАК уникИД,

| ОчередьРаботыСККТ.Касса КАК Касса,

| ОчередьРаботыСККТ.Статус КАК Статус,

| ОчередьРаботыСККТ.Результат КАК Результат

|ИЗ

| РегистрСведений.ОчередьРаботыСККТ КАК ОчередьРаботыСККТ

|ГДЕ

| ОчередьРаботыСККТ.Статус = """"";



Рез = Запрос.Выполнить().Выбрать();



Пока Рез.Следующий() Цикл

Если Не ЗначениеЗаполнено(Рез.Объект) Тогда

МенеджерЗаписи = РегистрыСведений.ОчередьРаботыСКкт.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Объект = Рез.Объект;

МенеджерЗаписи.Период = Рез.Период;

МенеджерЗаписи.Прочитать();

МенеджерЗаписи.Удалить();

Продолжить;

КонецЕсли;



СтруктураОтвета = ПолучитьСостояниеЗадания(Рез.уникИД,Рез.Объект.Касса,Рез.Объект);

Если Не СтруктураОтвета.Результат Тогда

Продолжить;

КонецЕсли;



СтатусОперации = СтруктураОтвета.results[0].status;

ОписаниеОшибки = СтруктураОтвета.results[0].errorDescription;

Если СтатусОперации = "error" Тогда

//запишем ошибку

МенеджерЗаписи = РегистрыСведений.ОчередьРаботыСКкт.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Объект = Рез.Объект;

МенеджерЗаписи.Период = Рез.Период;

МенеджерЗаписи.Прочитать();

МенеджерЗаписи.Статус = СтатусОперации;

МенеджерЗаписи.Результат = ОписаниеОшибки; 

МенеджерЗаписи.Записать();

Продолжить;

ИначеЕсли СтатусОперации = "ready" Тогда



//проверим номер чека и присвоем оплате

НомерЧека = СтруктураОтвета.results[0].result.fiscalParams.fiscalDocumentNumber;

ДокОплаты = Рез.Объект.ПолучитьОбъект();

ДокОплаты.НомерЧека = НомерЧека;

Попытка

ДокОплаты.Записать(РежимЗаписиДокумента.Запись);

Исключение

Продолжить;

КонецПопытки;

//если задание выполненно успешно то данные о задании удаляем из очереди

МенеджерЗаписи = РегистрыСведений.ОчередьРаботыСКкт.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Объект = Рез.Объект;

МенеджерЗаписи.Период = Рез.Период;

МенеджерЗаписи.Прочитать();

МенеджерЗаписи.Удалить();

КонецЕсли;

КонецЦикла;



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

Функция ПолучитьСостояниеЗадания(УникИД, Касса, Объект) Экспорт



Если Не ЗначениеЗаполнено(УникИД) Тогда

//найдем последний УникИД по объекту

Запрос = Новый Запрос();

Запрос.Текст = "ВЫБРАТЬ

| ОчередьРаботыСККТСрезПоследних.Объект КАК Объект,

| ОчередьРаботыСККТСрезПоследних.Операция КАК Операция,

| ОчередьРаботыСККТСрезПоследних.уникИД КАК уникИД,

| ОчередьРаботыСККТСрезПоследних.Касса КАК Касса

|ИЗ

| РегистрСведений.ОчередьРаботыСККТ.СрезПоследних КАК ОчередьРаботыСККТСрезПоследних

|ГДЕ

| ОчередьРаботыСККТСрезПоследних.Объект = &Объект";

Запрос.УстановитьПараметр("Объект",Объект);

Рез = Запрос.Выполнить().Выбрать();

Если Рез.Следующий() Тогда

УникИД = Рез.уникИД;

Иначе

СтруктураОтвета = Новый Структура();

СтруктураОтвета.Вставить("Результат",Ложь);

СтруктураОтвета.Вставить("ВозможнаОтправка",Истина);

СтруктураОтвета.Вставить("ОписаниеОшибки","Объект не отправлялся в очередь для печати!");

Возврат СтруктураОтвета;

КонецЕсли;



КонецЕсли;



Запрос = Новый Запрос();



HTTPСоединение = Новый HTTPСоединение(Касса.АдресВебСервера,Касса.ПортВебСервера,,,,,);  

HTTPЗапрос = Новый HTTPЗапрос("/requests/" + УникИД);

Попытка

Ответ = HTTPСоединение.Получить(HTTPЗапрос);

ОписаниеОшибки = Ответ.ПолучитьТелоКакСтроку();

Исключение

Возврат Неопределено;

КонецПопытки;



Попытка

ЧтениеJSON = Новый ЧтениеJSON();

ЧтениеJSON.УстановитьСтроку(ОписаниеОшибки);

СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);

ЧтениеJSON.Закрыть();

Исключение

СтруктураОтвета = Новый Структура();

СтруктураОтвета.Вставить("Результат",Ложь);

СтруктураОтвета.Вставить("ВозможнаОтправка",Ложь);

СтруктураОтвета.Вставить("ОписаниеОшибки","Не удалось прочитать статус");

Возврат СтруктураОтвета;

КонецПопытки;

СтатусОперации = СтруктураОтвета.results[0].status;

СтруктураОтвета.Вставить("Результат",Истина);

СтруктураОтвета.Вставить("ВозможнаОтправка",?(СтатусОперации = "error",Истина,Ложь));

СтруктураОтвета.Вставить("ОписаниеОшибки",?(СтатусОперации = "ready","Чек успешно расепчатан ранее!",СтруктураОтвета.results[0].errorDescription));

Возврат СтруктураОтвета;



КонецФункции



Документация по взаимодействию с web-сервером atol описана на сайте http://integration.atol.ru/#web-server

Спасибо за внимание, будем рады если статья будет полезна Вам, готовы ответить на вопросы в комментариях.

#20%НДС #54-ФЗ #Атол

См. также

ККТ-ОНЛАЙН 54-ФЗ: Обработка для работы онлайн касс АТОЛ, ШТРИХ, VIKI PRINT и т.д. МАРКИРОВКА + ЭКВАЙРИНГ + БЕСПЛАТНЫЙ ДЕМО

ККМ Кассовые операции Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения 1С:CRM ПРОФ, КОРП Россия Платные (руб)

Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1). Подключайте любую онлайн кассу к практически любой конфигурации. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows ЭМУЛЯТОР + ЭКВАЙРИНГ + МАРКИРОВКА + ПОДДЕРЖКА ФФД 1.2

4800 руб.

27.02.2017    763179    4668    9495    

2781

Печать кассовых чеков на одну ККМ с нескольких рабочих мест для 1С:УТ11.х, КА2.х, Розница 2.х, УНФ, ERP 2.х, БП 3, БГУ2

ККМ Кассовые операции Розничная торговля Обмен с ГосИС Бухгалтерский учет Оперативный учет Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение конфигурации для УТ 11.4, 11.5, КА 2.4, 2.5, Розница 3.0, 2.3 и 2.2, УНФ 1.6, УНФ 3x, ERP 2.4, 2.5, БП 3, БГУ2 (Управляемые формы) позволяет выполнять печать кассовых чеков на одну ККМ 54-ФЗ с нескольких рабочих мест. НИКАКИХ НАСТРОЕК В РАЗРАБОТКЕ - ПОДКЛЮЧИЛ И ПЕЧАТАЙ. Если у вас несколько отделов и одна ККМ - печатайте на одной ККМ! Если у вас две ККМ и одна поломалась - печатайте на одной ККМ, пока ремонтируете другую!

4000 руб.

27.08.2018    115992    981    564    

827

54-ФЗ. Очередь печати для ККМ. Обработки для подключения онлайн-касс к 1С 8 (поддержка Маркировки) + Эмулятор + ФФД 1.2

ККМ Кассовые операции Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия автономного учреждения Россия Платные (руб)

Обработка осуществляет обслуживание ККТ АТОЛ, Штрих и Меркурий для конфигураций "УТ 10.3", "КА 1.1", "УПП 1.3", "Розница 1.0", "БП 2.0" и других отраслевых решений, построенных на основе указанных выше конфигурациях. Поддерживает возможность параллельно пробития чеков на одной ККМ несколькими пользователями. Поддерживает Веб-сервер Атол. Соответствует требованиям 54-ФЗ. Поддерживает ФФД 1.0, 1.05, 1.1 и 1.2. Разделяет чеки по нескольким СНО. Поддерживает механизмы подключения ККТ по TCP/IP, для работы через RDP или интернет. Поддержка маркировки.

5400 руб.

25.05.2015    316600    1844    3008    

994

Обработка 1С для печати чеков на кассе ККТ АТОЛ.ОНЛАЙН

ККМ Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Печать чеков по документам 1С РеализацияТоваров (РасходнаяНакладная), КорректировкаРеализации, СчетНаОплату, ЗаказКлиента, ЧекККМ, ПоступлениеНаРС. Соответствует требованиям 54-ФЗ. Одна облачная касса может использоваться всеми подразделениями организации, без привязки к рабочим местам. Электронные чеки отправляются на email клиента и всегда доступны в 1С, по требованию можно распечатать. Легкая настройка: после регистрации кассы на сайте АТОЛ.ОНЛАЙН, в обработке необходимо указать логин, пароль и идентификатор группы ККТ (берутся в личном кабинете АТОЛ.ОНЛАЙН). Одну кассу можно использовать с 1С при расчетах с физ. и юр. лицами и для интернет-магазина. HTTPS протокол интеграции API v4 / ФФД 1.05 или API v5 / ФФД 1.2.

21600 руб.

23.08.2022    10553    27    4    

22

Обмен между 1С:Розница и Frontol 6 по организациям (Розница - Фронтол)

ККМ Розничная торговля Платформа 1С v8.3 Оперативный учет 1С:Розница 2 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обмен между 1С:Розница и Frontol 6 при торговле от нескольких организаций, а также ряд других полезных функций. Данный модуль незаменим для тех, кто ведёт учет по нескольким организациям в 1С:Розница, а на РМК (рабочее место кассира) установлен Frontol, или планируется его установка. Подходит для 1С:Розница 2.3./ 3.0, 1С:УНФ 3.0

1500 руб.

22.03.2019    78221    389    475    

161

UTM Proxy для УТМ ЕГАИС (или как не пропустить дубль алкогольной марки и недостачу на кассе + Контроль МРЦ)

Розничная торговля ККМ Обмен с ГосИС Розничная и сетевая торговля (FMCG) Россия Акцизы Платные (руб)

Что такое УТМ прокси? УТМ прокси - это универсальное программное обеспечение для борьбы с дублями марок алкогольной продукции при розничной продажи. Данное программное обеспечение - это своего рода "прокладка" между кассовым ПО и УТМ ЕГАИС. UTM Proxy работает с любыми кассами, вот некоторые из них: miniPOS, рабочие места кассиров в конфигурациях 1С (в том числе и базовые версии), Фронтол и другие...

2400 руб.

16.11.2016    49298    472    60    

24

Пробитие чека ККМ с разных складов через РМК в УТ 11

Кассовые операции ККМ Платформа 1С v8.3 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Россия Управленческий учет Платные (руб)

Расширение для 1С:Управление торговлей 11.5, которое позволяет пробивать чеки ККМ и списывать товар с разных складов. Склад списание товара можно указывать в табличной части рабочего места кассира (РМК).

5880 руб.

12.04.2023    7890    26    2    

23

Разбитие чека ККМ по группам товаров и пробитие их на разных кассах, подключенных к одному рабочему месту. Расширение для УТ 11.5, УТ 11.4, КА 2.5

Кассовые операции ККМ Платформа 1С v8.3 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Расширение для 1С:Управление торговлей 11.5 и 11.4, которое позволяет из рабочего места кассира разбивать чек ККМ на несколько чеков и пробивать их на разных кассах подключенных к одному РМК. Можно пробивать разные группы товаров по разным организациям на разных кассовых аппаратах.

5880 руб.

22.08.2022    10051    13    15    

17
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 3119 31.12.18 18:41 Сейчас в теме
Для отмены задания, которое еще не начало обрабатываться, необходимо отправить DELETE-запрос на адрес http://hostname:16732/requests/. Нельзя отменить задание, которое выполняется в данный момент.


а)- имеем задание, которое еще не отмечено как обработанное.
б)- посылаем DELETE
в)-между а и б) - задание уже выполнилось -
г) что получим в ответ? какие действия отрабатываются?
д) какие действия отрабатываются если DELETE попадает на "запрос выполняется в данный момент"..?
е) разница в отработке и реакции системы кассира на Г и Д - есть?
2. ix5s 118 31.12.18 19:36 Сейчас в теме
(1)
по методу Delete
Отмена задания
HTTP запрос
DELETE http://<hostname>:16732/requests/<uuid>

Возвращаемые ошибки
В случае успешного чтения результата сервер вернет статус 200 (OK) и JSON с результатом.

Также могут вернуться следующие ошибки:

404 (Not Found) - задание с заданным uuid не найдено
405 (Method Not Allowed) - задание с заданным uuid нельзя отменить (уже выполнено или выполняется)

г- ответ получим 405, если задание выполняется в данный момент, т.е. в режиме inProgress.
в данной реализации нет механизма обрабатывающего данный метод, так как очередь большая не собирается, задание очень быстро переходят в статус inProgress
д - действия не выполняются
е - для кассира разницы нет

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

Надеюсь ответил на ваш вопрос
3. karpik666 3760 04.01.19 21:59 Сейчас в теме
Идея с очередью задания интересна, но требует доработки конфигурации, зачем разрабатывать свой механизм, если у фирмы 1с есть свой, описанный в требования к разработке драйверов. Также непонятно зачем передавать идентификатор в виде текущей даты, если "Новый УникальныйИдентификатор" с этим прекрасно справляется?
У себя ранее уже сделал разработку для обычных форм https://infostart.ru/public/956348/ , которая использует типовой функционал от фирмы 1С, и прекрасно отправляет и получает информацию о напечатанных чеках, также использую его и в своей платной разработке.
5. ix5s 118 09.01.19 09:14 Сейчас в теме
(3) Идентификатор подойдет любой, это правда
по поводу механизма через драйвер, причина в обращении к ККТ одновременно с нескольких ПК.
Первая проблема что периодически происходит зависание ком порта, не все время, но данная ошибка появлялась неоднократно.
Вторая проблема что если одновременно послать на печать чек то одному из двух вернется ошибка недоступности кассы
Третья долгая печать чека, которая на 30ф например, и ожидать печати чека хотя бы с 10 позициями, не очень то и хочется, а через com вся программа зависает и ждет ответа
p.s. свой механизм именно для решения данных проблем и исключения множественного кода

а как вы ожидаете ответ от веб-сервера?
6. karpik666 3760 09.01.19 09:20 Сейчас в теме
(5) я не предлагаю отказаться от веб-сервера, и обращаться напрямую через com объект. Отправка http запросов логичный выбор. Просто ожидать ответа от веб-сервера можно по таймауту, без очереди заданий, опрашивая нужное задание на выполнение, для такого варианта нужно будет предусмотреть, чтобы результат запроса не кэшировался.
8. medangel 83 09.01.19 09:26 Сейчас в теме
(6) Согласны, что ваш вариант тоже "хорош". Но для себя выбрали асинхронность.
androgin; +1 Ответить
9. karpik666 3760 09.01.19 09:29 Сейчас в теме
(8) такой вариант как у вас хорош для интернет магазина, когда не требуется сию секундный ответ от фискального регистратора, и можно поместить задание в очередь и ожидать печати долгого времени.
12. medangel 83 10.01.19 17:36 Сейчас в теме
(9) Не совсем - ожидать практически не приходится, работа через очередь практически не проигрывает по скорости "работе в лоб".
Apolonov-Erik; +1 Ответить
4. 3vs 07.01.19 09:18 Сейчас в теме
Может быть кому-то будет интересно, я свои Атол 25Ф подключал к программе 1С Отель, работающий в терминале посредством преобразователя порта USR-TCP232-302.

Прикладываю описание этого способа.
Но мы используем на каждом рабочем месте свой фискальник, т.к. на сайте 1С где-то была информация, что вообще-то печатать на одном фискальнике с нескольких рабочих мест является грехом по версии налоговой, мы стараемся не грешить! :-)
Прикрепленные файлы:
Пример подключения ККТ АТОЛ 25Ф.docx
Goggy; independ; +2 Ответить
7. medangel 83 09.01.19 09:24 Сейчас в теме
(4) Информацию по "греховности печати" не видели, но получали множество запросов от "бизнеса" на реализацию данного функционала.
10. 3vs 09.01.19 10:04 Сейчас в теме
Нашёл текст на сайте 1С:
https://its.1c.ru/db/kkt/content/77/hdoc

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

Рекомендации для осторожных налогоплательщиков
На каждом торговом месте должна быть отдельная онлайн-ККТ. Одна ККТ не может одновременно использоваться на нескольких торговых местах.

По общему правилу ККТ применяется в обязательном порядке всеми организациями и индивидуальными предпринимателями при осуществлении расчетов, включая расчеты при осуществлении торговли (п. 1 ст. 1.2 Федерального закона от 22.05.2003 № 54-ФЗ, Закон № 54-ФЗ).

Торговое место – это место, используемое для совершения сделок розничной купли-продажи с/без использованием(я) торгового объекта, находящееся под управлением одного лица (ГОСТ Р 51303-2013. Национальный стандарт Российской Федерации. Торговля. Термины и определения, утв. приказом Росстандарта от 28.08.2013 № 582-ст).

Поэтому использовать одну ККТ при торговле на нескольких торговых местах, расположенных по одному адресу, нельзя.

(См. письмо УФНС по г. Москве от 02.03.2011 № 17-26/019349@).

Рекомендации для тех, кто готов отстаивать свою позицию
Одна ККТ может одновременно использоваться на нескольких торговых местах, находящихся по одному адресу.

Дело в том, что при регистрации ККТ необходимо указать адрес и место установки (применения) ККТ (п. 2 ст. 4.2 Закона № 54-ФЗ). При этом положения Закона № 54-ФЗ не запрещают использовать ККТ при торговле на нескольких торговых местах, расположенных по одному адресу. Значит, это правомерно.

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

Отметим, что данную позицию, скорее всего, придется отстаивать в суде.
11. medangel 83 10.01.19 17:35 Сейчас в теме
"Торговое место" в нашем случае это 1 reception (стойка администратора-регистратора), где обслуживается клиент. Наше субъективное мнение - закон не нарушается, проверки налоговых органов наши клиенты проходили успешно в прошлом году.
Спасибо за ссылку - будем предоставлять клиентам перед выбором схемы работы. Наша МИС "МедАнгел" поддерживает обе схемы.
13. androgin 28.01.19 14:46 Сейчас в теме
локально работает. Но не понимаю, почему удаленно не подключается касса )))
хост и порт указал, в роутере порт перенаправил на нужный сервер....
а не подключается))
14. medangel 83 28.01.19 20:11 Сейчас в теме
(13) а файервол включен?
если да то порт надо в исключения прописать
15. androgin 08.02.19 19:15 Сейчас в теме
(14) да, забыл про него)))
ну и добавил/доработал ваши методы, кстати, обнаружил ошибку в составлении json. Кассир не определяется вашим способом.
Функция СформироватьСтруктуруДляОткрытияЗакрытияСмены(Касса, Операция, ДополнительныеПараметры)
    
    Если Операция = "ОткрытиеСмены" Тогда
        ТипОперации = "openShift";
    ИначеЕсли Операция = "ЗакрытиеСмены" Тогда	
        ТипОперации = "closeShift";
    Иначе
        Возврат Неопределено;
    КонецЕсли;
    
    УИД = Формат(ТекущаяДата(),"ДФ=ддММггггЧЧммсс");
    
    СтруктураОператор = Новый Структура("name", Строка(ПараметрыСеанса.ТекущийПользователь));
	
    СтруктураЧека = Новый Структура;
    СтруктураЧека.Вставить("type", ТипОперации);
    СтруктураЧека.Вставить("operator", СтруктураОператор);
	
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(СтруктураЧека);
    
    СтруктураJSON = Новый Структура();
    СтруктураJSON.Вставить("uuid", УИД);
    СтруктураJSON.Вставить("request", МассивПараметров);
    
    Возврат СтруктураJSON;
    
КонецФункции
Показать
16. androgin 13.02.19 14:48 Сейчас в теме
(14) и еще вопрос: ККТ не возвращает ответы)
Даже о состоянии ккт.
Возможно ли потому, что ККТ не фискализирована?
17. androgin 13.02.19 18:16 Сейчас в теме
(14) С ответами разобрался (сам дурак)))))
18. pma 2 01.03.19 09:41 Сейчас в теме
Коллеги, никто не делал метод СформироватьСтруктуру для ЧекаКоррекции?
20. medangel 83 01.03.19 16:08 Сейчас в теме
(18) У нас пока нет данной реализации.
19. tacu 01.03.19 10:35 Сейчас в теме
А кто-нибудь ставил для себя логическо-философскую задачу по закрытию смен в 1С и в ККТ:
если закрытие смены в 1С увязано с закрытием смены в ККТ (как это делается в типовых конфигурациях) то при работе нескольких юзеров с одной кассой мы получим конфликт, когда в 1С смена открыта, а в ККТ - закрыта предыдущим пользователем
?
и какие способы решения (с логическими обоснованиями, ессэсно, (и для пользователей тоже)) назовёт уважаемое сообщество?
21. medangel 83 01.03.19 16:13 Сейчас в теме
(19) Не совсем понял - как влияет работа "нескольких юзеров"? При закрытии смены - смена должна закрываться и в 1С, и в ККТ (вне зависимости от количества/режима работы пользователей).
22. tacu 04.03.19 06:00 Сейчас в теме
(21) ну как... первый юзер закрывает свою смену и смену в ККТ, второй юзер не может закрыть смену в ККТ, тк она уже, и свою смену может не закрыть, если конфигурация к этому критична
23. pma 2 05.03.19 09:45 Сейчас в теме
Коллеги, а как Вы обрабатываете ситуацию когда очередь заблокировалась?
У меня она разблокировалась только после физического отключения кассы.
Перезапуск сервера не помогал.
24. medangel 83 06.03.19 15:23 Сейчас в теме
(23)Добрый день, такая ситуация не возникала, можно получать статус последнего задания и на основании него понимать состояние очереди. А ошибка какая была? или просто потерялся конект? один раз так было, был занят ком порт другой программой
25. pma 2 06.03.19 16:25 Сейчас в теме
Настроен тестовый ККТ с тестовым ФН
Послал на Сервер 462 чека.
На почту пришло 3 чека от тестового ОФД.
Дальше тишина

Запросил состояние очереди
2019-03-04 15:28:02.541 INFO [JsonTaskServlet] GET /stat/requests
2019-03-04 15:28:02.545 INFO [JsonTaskServlet] 200 {"not_ready_count":441,"block_request_uuid":"00000001667-040319150552","is_blocked":true,"ready_count":31,"canceled_count":0}
2019-03-04 15:28:07.665 WARN [DriverWorker] Не удалось восстановить состояние, продолжаем попытки...
2019-03-04 15:28:08.665 INFO [DriverWorker] Обнаружена блокировка очереди задачей '00000001667-040319150552'

Больше ничего не менялось.
По заданиям кроме заблокированного возвращался статус wait
2019-03-04 15:11:20.225 INFO [JsonTaskServlet] GET /requests/00000004120-040319150645
2019-03-04 15:11:20.225 INFO [JsonTaskServlet] 200 {"results":[{"result":null,"errorDescription":"","errorCode":0,"status":"wait"}]}
2019-03-04 15:11:20.265 INFO [JsonTaskServlet] GET /requests/00000001667-040319150552
2019-03-04 15:11:20.265 INFO [JsonTaskServlet] 200 {"results":[{"result":null,"errorDescription":"Нет связи","errorCode":2,"status":"blocked"}]}
2019-03-04 15:11:20.287 INFO [JsonTaskServlet] GET /requests/00000001668-040319150552

Остановка/Запуск сервера ККТ ни на что ни влиял

После физического выключения/ включения ККТ
2019-03-04 15:58:15.577 INFO [JsonTaskServlet] GET /stat/requests
2019-03-04 15:58:15.583 INFO [JsonTaskServlet] 200 {"not_ready_count":442,"block_request_uuid":"00000001667-040319150552","is_blocked":true,"ready_count":31,"canceled_count":0}
2019-03-04 15:59:38.417 INFO [DriverWorker] Обнаружена блокировка очереди задачей '00000001667-040319150552'
2019-03-04 15:59:38.602 INFO [DriverWorker] Соединение восстановленно, задача '00000001667-040319150552' не выполнена
2019-03-04 15:59:38.614 INFO [DriverWorker] Обработка задачи '00000001667-040319150552' завершена, разблокируем очередь

И дальше вся очередь обработалась
26. pma 2 06.03.19 16:28 Сейчас в теме
Мне просто надо с 01/07/2019 кучу чеков пробивать и посылать клиентам - вот и провожу нагрузочное тестирование и пытаюсь понять какое и сколько мне нужно оборудования и как все это заставить работать.
27. Solikamsk 2 18.06.19 15:56 Сейчас в теме
(26) Не подскажите какие "Настроен тестовый ККТ с тестовым ФН " используете?
28. medangel 83 18.06.19 16:36 Сейчас в теме
у нас для тестирования релизов используются ККТ:
Retail 02F(Штрих-ФР-02Ф) и Атол 55Ф

Тестовый ФН:
МГМ-ФН
29. Solikamsk 2 20.06.19 14:39 Сейчас в теме
(28) Спасибо, что отвечаете. У меня на любые запросы ответ:
<ht ml>
<head>
<met a http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 500 Server Error</title>
</head>
<body><h2>HTTP ERROR 500</h2>
<p>Problem accessing /requests. Reason:
<pre> Server Error</pre></p><h3>Caused by:</h3><pre>java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(Unknown Source)
at ru.atol.drivers10.webserver.Utils.readFromReader(Utils.java:24)
....

Подскажите, что не так?
30. Solikamsk 2 20.06.19 16:19 Сейчас в теме
А вот пытаюсь postman
Прикрепленные файлы:
31. Solikamsk 2 21.06.19 13:26 Сейчас в теме
Вопрос с "HTTP ERROR 500" и с postman закрыт. У меня тупая ошибка была.
32. avlanskih 12.09.19 14:10 Сейчас в теме
Кто-нибудь сталкивался с такой ошибкой?
Ошибка парсинга запроса (поле "items[0].price" отсутствует)

Кусок json
"items": [
{
"type": "position",
"name": "CD диск принято от Медицинские услуги",
"price": 1,
"quantity": 1,
"amount": 1,
"tax": {
"type": "none",
"sum": 0
}
}
]
Показать
33. ix5s 118 13.09.19 09:39 Сейчас в теме
(32)
price
нет ли случайно проблемы с раскладкой клавиатуры? так вроде все хорошо
34. avlanskih 13.09.19 19:11 Сейчас в теме
(33) неа. И сам писал и на всякий случай с инета копировал, и с калькулятора вводил...
35. avlanskih 16.09.19 07:54 Сейчас в теме
(33)
Полный текст json
{
"uuid": "1abf1c07-8867-4e40-b69d-243d5e68b68716092019095213",
"request": {
"type": "sell",
"ignoreNonFiscalPrintErrors": false,
"electronically": false,
"useVAT18": false,
"taxationType": "osn",
"paymentsPlace": "Организация",
"operator": {
"name": "Кассир",
"vatin": "ИНН"
},
"items": [
{
"type": "position",
"name": "CD диск принято от Медицинские услуги",
"price": 1,
"quantity": 1,
"amount": 1,
"tax": {
"type": "none",
"sum": 0
}
}
],
"payments": [
{
"type": "other",
"sum": 1
}
]
}
}
Показать
36. avlanskih 20.09.19 07:28 Сейчас в теме
(35)
Решение было простое. ИНН кассира не надо указывать
37. GenghisKhan 18.12.19 10:29 Сейчас в теме
Кто-нибудь знает команду очистки очереди заданий веб-сервера АТОЛ? В документации нет ничего, доступа на форум Атол нет, последнее сообщение на эту тему от июня 2018, обещали в следующем релизе.
38. medangel 83 18.12.19 10:56 Сейчас в теме
(37) подозреваем, что пока только через "Отмена задания", доп. информации не присутствует

Отмена задания
HTTP запрос
DELETE http://<hostname>:16732/requests/<uuid>

Возвращаемые ошибки
В случае успешного чтения результата сервер вернет статус 200 (OK) и JSON с результатом.

Также могут вернуться следующие ошибки:

404 (Not Found) - задание с заданным uuid не найдено
405 (Method Not Allowed) - задание с заданным uuid нельзя отменить (уже выполнено или выполняется)
39. GenghisKhan 18.12.19 11:15 Сейчас в теме
(38) Да, с этим поработал, надеюсь, что есть общая команда без идентификаторов.
40. GenghisKhan 18.12.19 13:41 Сейчас в теме
(37) Без команды задача решается удалением файла "C:\Users\All Users\ATOL\drivers10\web\db\web.s3db" или его редактированием, в таблице json_tasks поле is_ready установить в 1, редактором баз SQLite.
41. leobrn 614 30.01.20 04:56 Сейчас в теме
Подскажите, в типовые конфигурации в какой модуль нужно вставить данный функционал? какую процедуру переопределить для вызова ВыполнитьОперацию(Касса,Операция,ДополнительныеПараметры)?
42. user1008452 16.06.20 15:26 Сейчас в теме
Добрый день. По работе с сервером все ок, настроено и работает. Вопрос по отправке электронных чеков через ОФД, в данном описании электронно стоит ложь. Какие параметры необходимо дополнительно передавать чтобы чек отправился покупателю из ОФД?
43. user1008452 16.06.20 16:15 Сейчас в теме
(42) Разобрался
СтруктураКлиент = Новый Структура();
СтруктураКлиент.Вставить("emailOrPhone", ПочтовыйАдресПолучателя);
СтруктураЧека.Вставить("clientInfo",СтруктураКлиент);
44. FreeArcher 158 16.10.20 13:18 Сейчас в теме
Подскажите выполняю запрос в PostMan из документации:
127.0.0.1:16732/api/v2/serverInfo
Получаю ошибку

<ht ml>

<head>
	<met a http-equiv="Content-Type" content="text/html;charset=utf-8" />
	<title>Error 404 Not Found</title>
</head>

<body>
	<h2>HTTP ERROR 404</h2>
	<p>Problem accessing /api/v2/serverInfo. Reason:
		<pre>    Not Found</pre>
	</p>
	<hr>Powered by Jetty:// 9.4.9.v20180320
	<hr />

</body>

</html>
Показать


На все запросы такая ошибка.
Драйвер стоит у меня локально, ККТ на 192.168.0.121:5555.
Здесь (http://127.0.0.1:16732/settings) настройки прописал.

Адрес 192.168.0.121:5555 пингуется и драйвер находит ККТ.

Что-то упустил, но не могу понять что, подскажите?
Может ещё кроме драйвера и веб сервера нужно поставить?
45. FreeArcher 158 19.10.20 09:07 Сейчас в теме
(44) Проблема решилась, установкой драйвера 10.8.
46. user788359 20.10.20 13:23 Сейчас в теме
Второй день мучаюсь с запросом. Для начала пытаюсь распечатать нефискальны документ.
Вроде запрос верный, но выдается ошибка: {"error":{"code":505,"description":"Поле 'uuid' не задано или пустое. Поле 'request' не задано или пустое"}}
Ниже кусок лога. Что может быть не так?
2020/10/20 13:16:54.879371 Начинаем обработку запроса от 192.168.2.8:52610: [POST /api/v2/requests HTTP/1.1
Host: 192.168.1.88:16732
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 382
User-Agent: 1C

{
  "uuid": "0ba40014-5fa5-11ea-b5e9-037d4786a490",
  "request": [
    {
    "type": "nonFiscal",
    "items": [
      {
        "type": "text",
        "text": "INN: 7725760410  KPP: 772501001",
        "alignment": "center"
      },
      {
        "type": "text",
        "text": "ABCD: 00105700000011 :1",
        "alignment": "center"
      }
     ]
    }
  ]
}

]
2020/10/20 13:16:54.887350 Обработка завершена с результатом 400 Bad Request за 7.9789ms [{"error":{"code":505,"description":"Поле 'uuid' не задано или пустое. Поле 'request' не задано или пустое"}}
]
Показать
47. user788359 20.10.20 14:46 Сейчас в теме
(46) Разобрался сам. Если кому будет надо, то в POST-запросе в заголовке не хватало двух строк:
Content-Type: application/json; charset=utf-8
Accept: application/json
shalya_yuriDMIT; Ziggurat; G_117539644445526335982; +3 Ответить
48. noxomb 12.02.21 12:15 Сейчас в теме
Добрый день. подскажите куда копать, вроде так же все как у вас стоит, но чеки со скидкой аннулируются, что не так сделал?
Касса Атол 55ф, Драва Атол 10.8, с офф сайт 32 бита вроде последние.
------------------------------------------------------------------------------------------------------------
Для каждого стр ИЗ  ТабличнаяЧастьПозицииЧека Цикл
		
	пт0 = ВернутьОбъект("type" ,  "position");
	пт0.Вставить("name" ,  СокрЛП(стр.Номенклатура));

	пт0.Вставить("price" , стр.Цена  );
	пт0.Вставить("quantity",стр.Количество);
	пт0.Вставить("amount",  стр.Сумма );
	Скид = (стр.Цена*стр.Количество)-стр.Сумма;
	пт0.Вставить("infoDiscountAmount", Скид);
	пт0.Вставить("department", 1);
	пт0.Вставить("paymentMethod", СокрЛП(ОплатаСписок( Настройки[4].Значение ) )); // credit
	
	пт1 =  ВернутьОбъект( "type" , СокрЛП(ВернутьНдс(стр.НДС))) ;
	пт1.Вставить("sum", СуммаНдс(стр.Сумма,стр.НДС));
	
	пт0.Вставить("tax", пт1 );

	масс.Добавить(пт0);

	пт.Вставить("items" ,масс) ;
	
	КонецЦикла;
		
	пт0 = ВернутьОбъект( "type"  , ОплатаНаЧек( Настройки[5].Значение)); // sell
	пт0.Вставить("sum" ,  Настройки[1].Значение.СуммаДокумента );
	м1 = ВернутьМассив(пт0);
	пт.Вставить("payments" ,м1) ;
    
	пт.Вставить("total" , Настройки[1].Значение.СуммаДокумента) ;

	м = ВернутьМассив(пт);

    парам.Вставить("request", м);
	
	Ответ = PostStat(Настройки[7].Значение, "/requests", парам);
	Ответ = Post(Настройки[7].Значение, "/requests", парам);
------------------------------------------------------------------------------------------------------------
Показать

Когда смотришь json результат, вроде все сходится.
49. ix5s 118 12.02.21 16:37 Сейчас в теме
(48)
Настройки[1].Значение.СуммаДокумента

а в итогах Настройки[1].Значение.СуммаДокумента - сумма за минусом скидки?
53. noxomb 16.02.21 09:02 Сейчас в теме
50. ix5s 118 12.02.21 16:38 Сейчас в теме
(48) можете выложить готовый json с данными на 2-3 позиции?
52. noxomb 16.02.21 08:15 Сейчас в теме
(50) На самом чеке там где скидка -, он печатает 0, доходит до позиции со скидкой и сразу чек аннулирован.

{
"uuid": "728186af-8572-45cc-86bb-2c4bc8e86e96",
"request": [
{
"type": "sell",
"taxationType": "osn",
"ignoreNonFiscalPrintErrors": false,
"operator": {
"name": "Продавец",
"vatin": "ИННПродавца"
},
"preItems": [
{
"type": "text",
"text": "Принято от: Покупатель",
"alignment": "left",
"wrap": "words"
},
{
"type": "text",
"text": "ИНН: покупателя",
"alignment": "left",
"wrap": "words"
}
],
"items": [
{
"type": "position",
"name": "Ветчина Столичная Вязанка ТМ Стародворские колбасы ТС Вязанка в оболочке вектор УВС.Мясной продукт.",
"price": 370.41,
"quantity": 2.726,
"amount": 1009.74,
"infoDiscountAmount": -0.00234,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 91.79
}
},
{
"type": "position",
"name": "Колбаса Вязанка со шпиком ТМ Стародворские колбасы ТС Вязанка в оболочке вектор УВС",
"price": 364.61,
"quantity": 4.082,
"amount": 1488.34,
"infoDiscountAmount": -0.00198,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 135.3
}
},
{
"type": "position",
"name": "Колбаса Классическая ТМ Стародворские колбасы ТС Вязанка в оболочке вектор УВС. Мясной продукт. Колб",
"price": 348.04,
"quantity": 2.696,
"amount": 938.32,
"infoDiscountAmount": -0.00416,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 85.3
}
},
{
"type": "position",
"name": "Колбаса вареная из мяса птицы Докторская Особая ТМ Славница в оболочке УВС. Колбасное изделие варен",
"price": 202.54,
"quantity": 7.365,
"amount": 1491.71,
"infoDiscountAmount": -0.0029,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 135.61
}
},
{
"type": "position",
"name": "Колбаса Молочная Особая ТМ Стародворье в оболочке полиамид. Колбасное изделие",
"price": 202.55,
"quantity": 7.36,
"amount": 1490.77,
"infoDiscountAmount": -0.002,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 135.52
}
},
{
"type": "position",
"name": "Колбаса с/к Швейцарская вак/упак 0,17 кг (СТМ)/15",
"price": 105.87,
"quantity": 3,
"amount": 317.61,
"infoDiscountAmount": 0,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 28.87
}
},
{
"type": "position",
"name": "Ветчина Дугушка ТМ Стародворье в оболочкевектор 0,4 кг УВС. Продукт из мяса птиц/6",
"price": 170.44,
"quantity": 1,
"amount": 136.35,
"infoDiscountAmount": 34.09,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 12.4
}
},
{
"type": "position",
"name": "Ветчина Дугушка ТМ Стародворье вектор Мясной продукт охл",
"price": 337.67,
"quantity": 0.85,
"amount": 229.62,
"infoDiscountAmount": 57.3995,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 20.87
}
},
{
"type": "position",
"name": "Колбаса Докторская Дугушка ТМ Стародворье ТС Дугушка в оболочке вектор",
"price": 369.87,
"quantity": 1.697,
"amount": 502.14,
"infoDiscountAmount": 125.52939,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 45.65
}
},
{
"type": "position",
"name": "Колбаса Докторская ДугушкаТМ Стародворье в оболочке вектор 0,4 кг/6",
"price": 153.84,
"quantity": 1,
"amount": 123.07,
"infoDiscountAmount": 30.77,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 11.19
}
},
{
"type": "position",
"name": "Колбаса Молочная Дугушка ТМ Стародворье ТС Дугушка в оболочке вектор",
"price": 325.19,
"quantity": 0.838,
"amount": 218.01,
"infoDiscountAmount": 54.49922,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 19.82
}
},
{
"type": "position",
"name": "Колбаса Молочная ДугушкаТМ Стародворье в оболочке вектор 0,4 кг/6",
"price": 137.23,
"quantity": 1,
"amount": 109.78,
"infoDiscountAmount": 27.45,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 9.98
}
},
{
"type": "position",
"name": "Колбаса Рубленая Дугушка ТМ Стародворье ТС Дугушка в оболочке вектор",
"price": 336.99,
"quantity": 0.854,
"amount": 230.23,
"infoDiscountAmount": 57.55946,
"department": 1,
"paymentMethod": "creditPayment",
"tax": {
"type": "vat10",
"sum": 20.93
}
}
],
"payments": [
{
"type": "cash",
"sum": 8285.69
}
],
"total": 8285.69
}
]
}
Показать
Прикрепленные файлы:
ТестЧека.JSON
51. ix5s 118 12.02.21 16:46 Сейчас в теме
(48) есть предположение, что возможно проблема с оплатой типа credit
пт0.Вставить("paymentMethod", СокрЛП(ОплатаСписок( Настройки[4].Значение ) )); // credit

и что вот тут

пт0 = ВернутьОбъект( "type" , ОплатаНаЧек( Настройки[5].Значение)); // sell
пт0.Вставить("sum" , Настройки[1].Значение.СуммаДокумента );
м1 = ВернутьМассив(пт0);
пт.Вставить("payments" ,м1) ;


там можно получить в чем именно ошибка по номеру задания, не смотрели?
54. noxomb 16.02.21 09:11 Сейчас в теме
(51) По поводу кредита, это бухгалтер так сказал. Есть правила оформления чека https://its.1c.ru/db/kkt#content:133:hdoc:met3, наш вариант 3 оплаты после отгрузки, в примере указано
1059 1214 Признак способа расчета 7 ОПЛАТА КРЕДИТА +
Соответственно так и настроено при печати.

ниже

type, cash
sum, сумма документа со скидкой
дальше все объединяем в кучу

"там можно получить в чем именно ошибка по номеру задания, не смотрели?"
это вы про что? и где?
55. ix5s 118 16.02.21 11:14 Сейчас в теме
1. Пробил чек, все ок по json, единственное ругался на кассира
"operator": {
"name": "Продавец",
"vatin": "ИННПродавца"
Убрал ИНН и все вышло

2. По уиду можно сделать запрос на кассу и узнать что с заданием, какой статус и какая ошибка если оно не выполнилось
HTTPСоединение = Новый HTTPСоединение(Касса.АдресВебСервера, Касса.ПортВебСервера, , , , 100);  
HTTPЗапрос = Новый HTTPЗапрос("/requests/" + УИД);	
Попытка
		
	Ответ = HTTPСоединение.Получить(HTTPЗапрос);		
	ОписаниеОшибки = Ответ.ПолучитьТелоКакСтроку();	
		
Исключение
		
	Возврат;	
		
КонецПопытки;
Показать
56. noxomb 17.02.21 07:39 Сейчас в теме
(55) ИНН вообще как параметр убирали? или просто пустое значение параметра оставили?

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

{"results":[{"status":"error","result":null,"errorCode":16,"errorDescription":"Неверная цена (сумма)"}]}

"price": 170.44,
"quantity": 1,
"amount": 136.35,
"infoDiscountAmount": 34.09

чисто математически же верно все? цена = 170,44, сумма со скидкой = 136,35, скидка 34,09.
или надо ему сумму без скидки ставить?
57. noxomb 17.02.21 11:33 Сейчас в теме
(56) убрал ИНН и сделал пересчет цены, чтобы она считалась от суммы со скидкой поделённой на количество. вроде заработало. Спасибо за помощь.
58. Apolonov-Erik 45 18.02.21 20:55 Сейчас в теме
Подскажите почему не подключается к вебсерверу?
ОтветHTTP выдает ошибку

Попытка

Соединение = Новый HTTPСоединение("http://127.0.0.1",16732,,,,100);

ОтветHTTP = Соединение.ОтправитьДляОбработки(HTTPЗапрос);

Исключение
Сообщить("Ошибка регистрации в очереди! Проверьте работоспособность сервера и параметры кассы!");
Возврат "Ошибка регистрации в очереди! Проверьте работоспособность сервера и параметры кассы!";

КонецПопытки;
59. Apolonov-Erik 45 19.02.21 09:30 Сейчас в теме
60. Apolonov-Erik 45 19.02.21 09:44 Сейчас в теме
(59) возможно кому будет полезно, нужно третий параметр обязательно указывать в методе УстановитьТелоИзСтроки ИспользованиеByteOrderMark должно быть НеИспользовать
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапросаJS,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
61. Apolonov-Erik 45 21.02.21 16:09 Сейчас в теме
Подскажите как передавать обращение к нужной кассе если касс несколько? Как указывать правильно идентификатор кассы в коде?
64. ix5s 118 01.03.21 16:44 Сейчас в теме
(63)
уть Идентификатор ККМ чтоб отпра

(62)
(61)

Если верить документации то необходимо добавить параметр к запросу

http://127.0.0.1:16732/api/v2/requests?deviceID=ВАШ_ИД

Ссылка на документацию
https://app.swaggerhub.com/apis-docs/atol-dev/fptr-web-server/10.8.1.0#/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%20%D1%81%20%D0%BE%D1%8­7%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%D1%8E%20%D0%B7%D0%B0%D0%B4%D­0%B0%D0%BD%D0%B8%D0%B9/post_api_v2_requests
Apolonov-Erik; user1203706; +2 Ответить
62. serega123 24.02.21 10:24 Сейчас в теме
63. serega123 24.02.21 10:25 Сейчас в теме
куда засунуть Идентификатор ККМ чтоб отправка шла на нужную кассу web сервера
65. vvolkov 26.04.21 12:49 Сейчас в теме
Коллеги, а с каким количеством касс у вас получалось работать через web-сервер?
У нас при увеличении количества касс web-сервис стал зависать, загоняя загрузку процессора в 100%.
66. aximo 2027 22.04.22 15:24 Сейчас в теме
Товарищи, просьба подсказать - поднят веб сервер - подключена касса (проверку по запросам проходит). Но, почему-то не печатает открытие смены и закрытие, а x-отчет печатает.
Ошибок нет. Может, в настройках запроса что-то должно быть?
67. user1533038 01.02.23 15:54 Сейчас в теме
Здраствуйте, прекрипил фото ошибок. Управление нашей фирмой, редакция 3.0 (3.0.2.112) Расширения конфигурации:
- Атол WEB-сервис (3.22.10.19)
- KSOFT: ВебСервер АТОЛ (2.1.1.0)
- Печатная форма услуги
Через веб браузер и мобильную платформу не выходит печать открытия смены, хотя в тесте подключения тест проходит.
Прикрепленные файлы:
Оставьте свое сообщение