Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 апр 2025, 11:58

Подключение нового ККМ АТОЛ 91Ф к 1С

Автор Yanawerg, 14 апр 2025, 09:08

0 Пользователей и 1 гость просматривают эту тему.

Yanawerg

Появилась необходимость перейти на новую ставку НДС 5%, в связи с чем пришлось ставить новый драйвер АТОЛ 10.10.6 где есть нужная ставка.

Драйвер установили, подключили WEB Request, добились что бы он работал с ККМ но 1С наотрез отказывается выбивать чек и выдаёт ошибку:

{"error":{"code":505,"description":"unauthorized"}}

Чек не пробит! Ошибка регистрации в очереди! Проверьте работоспособность сервера и параметры кассы!
.

Кто знает что нужно сделать что бы всё заработало ?

УПП 1.3 / 1С:Предприятие 8.2 (8.2.19.116)

До этого был именно Веб Сервер на версии 10.8.0.0 с которым всё работало.


sali

проверьте еще раз параметры кассы. сделайте тестовое

Максим75

Yanawerg, смотрите, драйвер - это связь кода программы с внешним устройством (у Вас это ККМ).
скорее всего надо искать в коде общего модуля, который непосредственно отправляет чек в ККМ, там видимо пока еще не обрабатывается случай с другой ставкой НДС.
У Вас программный ККМ? Потому как судя по тому, что прилетает в ошибке, отправляется некий HTTP запрос и возвращается ответ про ошибку (очень похож на джисон, что-то с невозможностью авторизироваться). Могу конечно и ошибаться.

Yanawerg

Максим75, Проверил в общем модуле как отправляется запрос и если я правильно понимаю в чём сейчас проблема то, по всей видимости сейчас необходимо что бы отправлялся логин и пароль.

Попробовал что-то сделать но раньше json запросы не приходилось делать поэтому я можно сказать буквально ноль в этом.

Можете посмотреть что именно не так и почему не авторизуется.

Процедура ОтправитьЗаданиеНаВебСервер(ПараметрыЧека) Экспорт

Идентификатор = ПараметрыЧека.Идентификатор;
Операция = ПараметрыЧека.Операция;
АдресWebСервера = ПараметрыЧека.АдресWebСервера;
ПортWebСервера = ПараметрыЧека.ПортWebСервера;
ЛогинWebСервера = ПараметрыЧека.ЛогинWebСервера;
ПарольWebСервера= ПараметрыЧека.ПарольWebСервера;

Если Операция = "ФискальныйЧек" Тогда
СсылкаНаОбъект = ПараметрыЧека.ТекущийЧек;
ОтветственноеЛицо = ПараметрыЧека.ОтветственноеЛицо;
НомерКонтрагента = ПараметрыЧека.НомерКонтрагента;

Если СсылкаНаОбъект = Неопределено Тогда
Сообщить("ОШИБКА! Чек ККМ не пробит! Не удалось создать чек ККМ!");
Возврат;
КонецЕсли;

JSONзадание = "{
|""uuid"": """+Идентификатор+""",
|""request"":
|{";

Если СсылкаНаОбъект.ВидОперации = Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
JSONзадание = JSONзадание + "
|""type"": ""sell"",";
ИначеЕсли СсылкаНаОбъект.ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат Тогда
JSONзадание = JSONзадание + "
|""type"": ""sellReturn"",";
КонецЕсли;

JSONзадание = JSONзадание + "
|""ignoreNonFiscalPrintErrors"": false,
    |""operator"": {
        | ""name"": """+СокрЛП(ОтветственноеЛицо)+"""
    | },";
Если СсылкаНаОбъект.Электронный Тогда
JSONзадание = JSONзадание + "
|""electronically"": true,
    |""clientInfo"": {
        | ""emailOrPhone"": """+СокрЛП(НомерКонтрагента)+"""
    | },";
КонецЕсли;
JSONзадание = JSONзадание + "
|""items"": [";

ТоварАванс = Справочники.Номенклатура.НайтиПоКоду("ШШ000024041");
ТоварОплатаКредита = Справочники.Номенклатура.НайтиПоКоду("ШШ000040292");

Для каждого СтрТовары из СсылкаНаОбъект.Товары Цикл
Если СтрТовары.НомерСтроки <> 1 Тогда
JSONзадание = JSONзадание + ",";
КонецЕсли;
JSONзадание = JSONзадание + "
| {
        |   ""type"": ""position"",
|   ""name"": """+СокрЛП(СтрТовары.Номенклатура)+""",
|   ""price"": "+Формат(СтрТовары.Цена,"ЧГ=0;ЧРД=.")+",
|   ""quantity"": "+Формат(СтрТовары.Количество,"ЧГ=0;ЧРД=.")+",
|   ""amount"": "+Формат(СтрТовары.Сумма,"ЧГ=0;ЧРД=.")+",";
Если СтрТовары.Номенклатура = ТоварАванс Тогда
JSONзадание = JSONзадание + "
|   ""paymentMethod"": ""advance"",
        |   ""paymentObject"": ""payment"",";
ИначеЕсли СтрТовары.Номенклатура = ТоварОплатаКредита Тогда
JSONзадание = JSONзадание + "
|   ""paymentMethod"": ""creditPayment"",
        |   ""paymentObject"": ""payment"",";
Иначе
Если СсылкаНаОбъект.ПризнакСпособаРасчета = Перечисления.ПризнакиСпособаРасчета.ПередачаВКредит Тогда
JSONзадание = JSONзадание + "
        |   ""paymentMethod"": ""credit"",";
ИначеЕсли СсылкаНаОбъект.ПризнакСпособаРасчета = Перечисления.ПризнакиСпособаРасчета.ПолныйРасчет Тогда
JSONзадание = JSONзадание + "
        |   ""paymentMethod"": ""fullPayment"",";
ИначеЕсли СсылкаНаОбъект.ПризнакСпособаРасчета = Перечисления.ПризнакиСпособаРасчета.ЧастичныйРасчетИКредит Тогда
JSONзадание = JSONзадание + "
        |   ""paymentMethod"": ""partialPayment"",";
КонецЕсли;
JSONзадание = JSONзадание + "
        |   ""paymentObject"": ""commodity"",";
КонецЕсли;
Если ЗначениеЗаполнено(СтрТовары.СуммаНДС) Тогда
Если СтрТовары.Номенклатура = ТоварАванс Тогда
JSONзадание = JSONзадание + "
        |   ""tax"": {
        |       ""type"": ""vat120"",
| ""sum"": "+Формат(СтрТовары.СуммаНДС,"ЧГ=0;ЧРД=.")+"
        |    }
        | }";
ИначеЕсли СтрТовары.Номенклатура = ТоварОплатаКредита Тогда
JSONзадание = JSONзадание + "
        |   ""tax"": {
        |       ""type"": ""none""
        |    }
        | }";
Иначе
JSONзадание = JSONзадание + "
        |   ""tax"": {
        |       ""type"": ""vat20"",
| ""sum"": "+Формат(СтрТовары.СуммаНДС,"ЧГ=0;ЧРД=.")+"
        |    }
        | }";
КонецЕсли;
Иначе
JSONзадание = JSONзадание + "
        |   ""tax"": {
        |       ""type"": ""none""
        |    }
        | }";
КонецЕсли;
КонецЦикла;

JSONзадание = JSONзадание + "
        | ],
|""payments"": [";

Для каждого СтрокаОплаты из СсылкаНаОбъект.Оплата Цикл
Если СтрокаОплаты.НомерСтроки <> 1 Тогда
JSONзадание = JSONзадание + ",";
КонецЕсли;
Если СтрокаОплаты.ВидОплаты = Справочники.ВидыОплатЧекаККМ.Наличные Тогда
JSONзадание = JSONзадание + "
| {
| ""type"": ""cash"",";
ИначеЕсли СтрокаОплаты.ВидОплаты = Справочники.ВидыОплатЧекаККМ.НайтиПоКоду("000000003") Тогда //Безналичные
JSONзадание = JSONзадание + "
| {
| ""type"": ""electronically"",";
ИначеЕсли СтрокаОплаты.ВидОплаты = Справочники.ВидыОплатЧекаККМ.НайтиПоКоду("000000004") Тогда //Предварительная оплата (аванс)
JSONзадание = JSONзадание + "
| {
| ""type"": ""prepaid"",";
ИначеЕсли СтрокаОплаты.ВидОплаты = Справочники.ВидыОплатЧекаККМ.НайтиПоКоду("000000005") Тогда //Последующая оплата (кредит)
JSONзадание = JSONзадание + "
| {
| ""type"": ""credit"",";
КонецЕсли;
JSONзадание = JSONзадание + "
| ""sum"": "+Формат(СтрокаОплаты.Сумма,"ЧГ=0;ЧРД=.")+"
| }";
КонецЦикла;

JSONзадание = JSONзадание + "
|   ]
|}
|}";
ИначеЕсли Операция = "X-отчет" Тогда
JSONзадание = "{
|""uuid"": """+Идентификатор+""",
|""request"":
|{
|""type"": ""reportX""
|}
|}";
ИначеЕсли Операция = "Z-отчет" Тогда
JSONзадание = "{
|""uuid"": """+Идентификатор+""",
|""request"":
|{
|""type"": ""closeShift""
|}
|}";
КонецЕсли;

// Подготовка HTTP запроса
HTTPЗапрос = Новый HTTPЗапрос();
HTTPЗапрос.АдресРесурса = "/requests";
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");

// Добавляем Basic Auth заголовок
СтрокаАвторизации = Base64Строка(ЛогинWebСервера + ":" + ПарольWebСервера);
HTTPЗапрос.Заголовки.Вставить("Authorization", "Basic " + СтрокаАвторизации);

HTTPЗапрос.УстановитьТелоИзСтроки(JSONзадание,"CESU-8");

Попытка
// Настройка HTTPS соединения
//УстановитьТипБезопасностиСоединения("TLS1.2");

// Создаем соединение с авторизацией
Соединение = Новый HTTPСоединение(
АдресWebСервера,
ПортWebСервера,
ЛогинWebСервера,
ПарольWebСервера
);

// Отправляем запрос
ОтветHTTP = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
Исключение                             
Сообщить("Чек не пробит! Ошибка регистрации в очереди! Проверьте работоспособность сервера и параметры кассы!");
Возврат;
КонецПопытки;

// Обработка ответа
Тело = ОтветHTTP.ПолучитьТелоКакСтроку();
Если Не ОтветHTTP.КодСостояния = 201 Тогда
Сообщить("HTTP код: " + ОтветHTTP.КодСостояния);
Сообщить("Ответ сервера: " + Тело);
Сообщить("Чек не пробит! Ошибка регистрации в очереди! Проверьте работоспособность сервера и параметры кассы!");
Возврат;
КонецЕсли;

ПараметрыЧека.Вставить("ПоставленВОчередь",Истина);

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


Заранее пишу что все данные прописаны правильно (АдресWebСервера,ПортWebСервера,ЛогинWebСервера,ПарольWebСервера)

Максим75

Yanawerg, да вроде все красиво.
проверьте что передается вот здесь

СтрокаАвторизации = Base64Строка(ЛогинWebСервера + ":" + ПарольWebСервера);
HTTPЗапрос.Заголовки.Вставить("Authorization", "Basic " + СтрокаАвторизации);

что в логин и пароль прилетает. да и адрес с портом тоже проверьте. может что-то не то передается.
 

Yanawerg

Максим75, вот строки которые передаются:

ПараметрыЧека.Вставить("АдресWebСервера",Основание.Касса.АдресWebСервера);
ПараметрыЧека.Вставить("ПортWebСервера",16732);
ПараметрыЧека.Вставить("ЛогинWebСервера","User1");
ПараметрыЧека.Вставить("ПарольWebСервера","Password1password");


АдресWebСервера - это IP (192.168.100.100, пример).

Ещё раз перепроверил на соответствие и всё прописано правильно и одинаково.
Регистр, все цифры, без пробелов.


Может чего-то не хватает ?
Может для WEBRequests нужно ещё что-то передавать ?

Максим75

Yanawerg, а Вы из браузера можете попасть на нужный ресурс?
что нужно для WEBRequests - этот вопрос надо адресовать тому, кто выпустил данное детище.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск