Работа с кассой 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-ФЗ #Атол

См. также

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 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

6000 руб.

27.02.2017    796532    4908    9546    

2860

SALE! 25%

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 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 или интернет. Поддержка маркировки и разрешительного режима.

5880 4410 руб.

25.05.2015    335612    1958    3058    

1031

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

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

4500 руб.

27.08.2018    122297    1026    584    

864

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

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

1800 руб.

22.03.2019    84048    509    478    

182

ККМ Кассовые операции Розничная торговля Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Платные (руб)

«Сервер ККМ» позволяет приложениям работать с фискальными регистраторами по локальной сети или интернет, организовать печать на одном ККМ с нескольких рабочих мест. Поддержка драйверов Атол, Штрих и VikiPrint. Поддержка 54-ФЗ и разрешительного режима, ФФД 1.05,1.2. Подключается к 1С Торговля и склад 7.7, 1С:УТ 10/11, 1С:УНФ, 1С:Розница 1/2, 1С:БП 2/3, 1С КА 1/2., 1С:ERP, УПП. Ускоряет печать из терминального сеанса Windows. Работает с разрешительным режимом даже из старых конфигураций. Предоставляет REST API для печати через веб-сервис.

3000 руб.

02.09.2016    136488    152    193    

181

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

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

5880 руб.

12.04.2023    9345    45    3    

36

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

Обработки осуществляют обслуживание фискальных регистраторов, поддерживаемых драйвером "АТОЛ: Драйвер ККМ v.10.10", "ШТРИХ-М: Драйвер ККМ v 5.16", "ВИКИ: Драйвер CSI v 1.6", для конфигураций БП, УТ, КА, УПП, "Розница 3.0", соответствующих требованиям закона ФЗ-54 о применении контрольно-кассовой техники.Поддержка НДС 20%. Поддержка маркировки 488-ФЗ. Марки. Акциз. Честный знак. Разрешительный режим.

5040 руб.

02.02.2017    276525    557    2375    

558

ККМ Пользователь Платформа 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С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

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

13800 руб.

23.08.2022    12275    30    4    

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


а)- имеем задание, которое еще не отмечено как обработанное.
б)- посылаем DELETE
в)-между а и б) - задание уже выполнилось -
г) что получим в ответ? какие действия отрабатываются?
д) какие действия отрабатываются если DELETE попадает на "запрос выполняется в данный момент"..?
е) разница в отработке и реакции системы кассира на Г и Д - есть?
2. ix5s 133 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 3853 04.01.19 21:59 Сейчас в теме
Идея с очередью задания интересна, но требует доработки конфигурации, зачем разрабатывать свой механизм, если у фирмы 1с есть свой, описанный в требования к разработке драйверов. Также непонятно зачем передавать идентификатор в виде текущей даты, если "Новый УникальныйИдентификатор" с этим прекрасно справляется?
У себя ранее уже сделал разработку для обычных форм https://infostart.ru/public/956348/ , которая использует типовой функционал от фирмы 1С, и прекрасно отправляет и получает информацию о напечатанных чеках, также использую его и в своей платной разработке.
5. ix5s 133 09.01.19 09:14 Сейчас в теме
(3) Идентификатор подойдет любой, это правда
по поводу механизма через драйвер, причина в обращении к ККТ одновременно с нескольких ПК.
Первая проблема что периодически происходит зависание ком порта, не все время, но данная ошибка появлялась неоднократно.
Вторая проблема что если одновременно послать на печать чек то одному из двух вернется ошибка недоступности кассы
Третья долгая печать чека, которая на 30ф например, и ожидать печати чека хотя бы с 10 позициями, не очень то и хочется, а через com вся программа зависает и ждет ответа
p.s. свой механизм именно для решения данных проблем и исключения множественного кода

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

Прикладываю описание этого способа.
Но мы используем на каждом рабочем месте свой фискальник, т.к. на сайте 1С где-то была информация, что вообще-то печатать на одном фискальнике с нескольких рабочих мест является грехом по версии налоговой, мы стараемся не грешить! :-)
Прикрепленные файлы:
Пример подключения ККТ АТОЛ 25Ф.docx
brusok; Goggy; independ; +3 Ответить
7. medangel 84 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 84 10.01.19 17:35 Сейчас в теме
"Торговое место" в нашем случае это 1 reception (стойка администратора-регистратора), где обслуживается клиент. Наше субъективное мнение - закон не нарушается, проверки налоговых органов наши клиенты проходили успешно в прошлом году.
Спасибо за ссылку - будем предоставлять клиентам перед выбором схемы работы. Наша МИС "МедАнгел" поддерживает обе схемы.
13. androgin 28.01.19 14:46 Сейчас в теме
локально работает. Но не понимаю, почему удаленно не подключается касса )))
хост и порт указал, в роутере порт перенаправил на нужный сервер....
а не подключается))
14. medangel 84 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 84 01.03.19 16:08 Сейчас в теме
(18) У нас пока нет данной реализации.
19. tacu 01.03.19 10:35 Сейчас в теме
А кто-нибудь ставил для себя логическо-философскую задачу по закрытию смен в 1С и в ККТ:
если закрытие смены в 1С увязано с закрытием смены в ККТ (как это делается в типовых конфигурациях) то при работе нескольких юзеров с одной кассой мы получим конфликт, когда в 1С смена открыта, а в ККТ - закрыта предыдущим пользователем
?
и какие способы решения (с логическими обоснованиями, ессэсно, (и для пользователей тоже)) назовёт уважаемое сообщество?
21. medangel 84 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 84 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 84 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 133 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 84 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 633 30.01.20 04:56 Сейчас в теме
Подскажите, в типовые конфигурации в какой модуль нужно вставить данный функционал? какую процедуру переопределить для вызова ВыполнитьОперацию(Касса,Операция,ДополнительныеПараметры)?
42. user1008452 16.06.20 15:26 Сейчас в теме
Добрый день. По работе с сервером все ок, настроено и работает. Вопрос по отправке электронных чеков через ОФД, в данном описании электронно стоит ложь. Какие параметры необходимо дополнительно передавать чтобы чек отправился покупателю из ОФД?
43. user1008452 16.06.20 16:15 Сейчас в теме
(42) Разобрался
СтруктураКлиент = Новый Структура();
СтруктураКлиент.Вставить("emailOrPhone", ПочтовыйАдресПолучателя);
СтруктураЧека.Вставить("clientInfo",СтруктураКлиент);
44. FreeArcher 162 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 162 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 133 12.02.21 16:37 Сейчас в теме
(48)
Настройки[1].Значение.СуммаДокумента

а в итогах Настройки[1].Значение.СуммаДокумента - сумма за минусом скидки?
53. noxomb 16.02.21 09:02 Сейчас в теме
50. ix5s 133 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 133 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 133 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 51 18.02.21 20:55 Сейчас в теме
Подскажите почему не подключается к вебсерверу?
ОтветHTTP выдает ошибку

Попытка

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

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

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

КонецПопытки;
59. Apolonov-Erik 51 19.02.21 09:30 Сейчас в теме
60. Apolonov-Erik 51 19.02.21 09:44 Сейчас в теме
(59) возможно кому будет полезно, нужно третий параметр обязательно указывать в методе УстановитьТелоИзСтроки ИспользованиеByteOrderMark должно быть НеИспользовать
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапросаJS,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
61. Apolonov-Erik 51 21.02.21 16:09 Сейчас в теме
Подскажите как передавать обращение к нужной кассе если касс несколько? Как указывать правильно идентификатор кассы в коде?
64. ix5s 133 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 2100 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)
- Печатная форма услуги
Через веб браузер и мобильную платформу не выходит печать открытия смены, хотя в тесте подключения тест проходит.
Прикрепленные файлы:
68. Pim 186 20.05.24 13:29 Сейчас в теме
А есть готовое расширение для БП?
69. WaReZ_MEN 23.05.24 14:01 Сейчас в теме
Установил Web сервис Атол работа с кассами, добавил кассу, через TestMace отправляю json, смены открываются и закрываются. Отправляю "чек прихода ( с печатью на чековой ленте)" приходит ответ в
{
"number": 1,
"uuid": "0ba40014-5fa5-11ea-b5e9-037d4786a15d",
"isBlocked": false,
"blockedUUID": ""
}
количество завершённых заданий увеличилось. Чек физически с кассы не выходит. При попытке
/api/v2/requests/0ba40014-5fa5-11ea-b5e9-037d4786a15d

получаю ответ
{"results":[{"error":{"code":501,"description":"Поле \"operator.vatin\" имеет неверный тип (ожидается \"string|undefined\")"},"status":"error","result":null}]}

не понимаю что делаю не так.
70. user1559359 31.05.24 10:47 Сейчас в теме
Уже спрашивали и стало понятно что есть возможность использовать несколько касс. Но могли бы вы уточнить, эти кассы могут быть по разным юрлицам? У Атола есть поддержка? Можете скинуть контакты куда писать по возникшим вопросам? Спасибо!
72. Pim 186 23.06.24 20:49 Сейчас в теме
(70) Да, кассы м.б. разных юр.лиц. Вопрос как вы их будете различать? В стандартной конфигурации проверяется ИНН. Я не нашёл способа получить ИНН из кассы.
71. Pim 186 23.06.24 20:46 Сейчас в теме
Кто-нибудь знает, как через WebRequest (веб сервер АТОЛ) получить ИНН и адрес расчетов?
Оставьте свое сообщение