Вот пример запроса удачного
<?xml version=»1.0″ encoding=»UTF-8″?>
<CheckPackage>
<Parameters CashierName=»А» OperationType=»1″ TaxationSystem=»3″ SaleLocation=»Магазин » CustomerEmail=»» CustomerPhone=»»>
<AgentData/>
<VendorData/>
</Parameters>
<Positions>
<FiscalString Name=»Товар» Quantity=»1″ PriceWithDiscount=»1″ AmountWithDiscount=»1″ DiscountAmount=»0″ Department=»1″ VATRate=»none» VATAmount=»0″ PaymentMethod=»4″ CalculationSubject=»1″ MeasurementUnit=»»>
<AgentData/>
<VendorData/>
</FiscalString>
</Positions>
<Payments Cash=»1″ ElectronicPayment=»0″ PrePayment=»0″ PostPayment=»0″ Barter=»0″/>
</CheckPackage>
Вот пример неудачного — выдает выше описанную ошибку
<?xml version=»1.0″ encoding=»UTF-8″?>
<CheckPackage>
<Parameters CashierName=»кассир» OperationType=»1″ TaxationSystem=»3″ SaleLocation=»Магазин » CustomerEmail=»» CustomerPhone=»»>
<AgentData/>
<VendorData/>
</Parameters>
<Positions>
<FiscalString Name=»Фурнитура молнии (<Не заполнено>)» Quantity=»1″ PriceWithDiscount=»1″ AmountWithDiscount=»1″ DiscountAmount=»0″ Department=»1″ VATRate=»none» VATAmount=»0″ PaymentMethod=»4″ MeasurementUnit=»»>
<AgentData/>
<VendorData/>
</FiscalString>
</Positions>
<Payments Cash=»1″ ElectronicPayment=»0″ PrePayment=»0″ PostPayment=»0″ Barter=»0″/>
</CheckPackage>
Вот пример запроса удачного
<?xml version=»1.0″ encoding=»UTF-8″?>
<CheckPackage>
<Parameters CashierName=»А» OperationType=»1″ TaxationSystem=»3″ SaleLocation=»Магазин » CustomerEmail=»» CustomerPhone=»»>
<AgentData/>
<VendorData/>
</Parameters>
<Positions>
<FiscalString Name=»Товар» Quantity=»1″ PriceWithDiscount=»1″ AmountWithDiscount=»1″ DiscountAmount=»0″ Department=»1″ VATRate=»none» VATAmount=»0″ PaymentMethod=»4″ CalculationSubject=»1″ MeasurementUnit=»»>
<AgentData/>
<VendorData/>
</FiscalString>
</Positions>
<Payments Cash=»1″ ElectronicPayment=»0″ PrePayment=»0″ PostPayment=»0″ Barter=»0″/>
</CheckPackage>
Вот пример неудачного — выдает выше описанную ошибку
<?xml version=»1.0″ encoding=»UTF-8″?>
<CheckPackage>
<Parameters CashierName=»кассир» OperationType=»1″ TaxationSystem=»3″ SaleLocation=»Магазин » CustomerEmail=»» CustomerPhone=»»>
<AgentData/>
<VendorData/>
</Parameters>
<Positions>
<FiscalString Name=»Фурнитура молнии (<Не заполнено>)» Quantity=»1″ PriceWithDiscount=»1″ AmountWithDiscount=»1″ DiscountAmount=»0″ Department=»1″ VATRate=»none» VATAmount=»0″ PaymentMethod=»4″ MeasurementUnit=»»>
<AgentData/>
<VendorData/>
</FiscalString>
</Positions>
<Payments Cash=»1″ ElectronicPayment=»0″ PrePayment=»0″ PostPayment=»0″ Barter=»0″/>
</CheckPackage>
Добрый день! Перевожу у клиента ККМ Атол 55Ф на 5 платформу, ФФД 1.2 для корректной работы с маркировкой.
На рабочем месте 2 ККМ: ООО для алкоголя(2 платформа), ИП для остального товара и табака (5 платформа). Первая проблема возникла при подключении ККМ на 5 платформе через Вэб сервер. Если настроил и подключил эту ККМ (ИП), попытался проверить связь, снять отчет, то в драйвере Атол вторую кассу уже не найти. Нужно или удалить порт с драйвером и установить заново или остановить вэб сервер. Долго возились, пока не подключили ККМ ИП по TCP/IP , ККМ ООО осталась на СОМ порту и устойчиво все работает. Затем появилась ошибка реквизита 1197. ТП подсказали, обновил библиотеку Device Menager. После этого получилось продать пакет. Пробуем продать сигареты и получаем сообщение «Ошибка парсинга запроса (некорректное значение поля)». Ошибка от ККМ, но Атол ответил, что она(ошибка) от торговой программы.
1. Скрин
https://yadi.sk/d/o7t8qGXS9mQ_uA
2.Лайт версия 74.
3.Windows 7. Service Pack 1.
4.База на SQL Express 2008.
5.Настройки Лайта
https://yadi.sk/d/aOuOF-yo0vx6Xw
.
6.Лог ошибок
https://yadi.sk/d/ryVLDVPMN-gF1Q
.
7. PortMon здесь.
https://yadi.sk/d/krOy0ZvQ42PsEQ
8.Описание последовательности. Запустил Лайт, считал сканером пачку сигарет, нажалF9 и Enter. Все. Инн кассира, ИП введены верно.
Воспроизвожу ошибку сам в любое время, хозяева смотрят косо, но терпят.
Получил ответ ТП: Новая библиотека devicemanager.dll работает с ФФД 1.2, а у Вас используется ФФД 1.1
Здесь Получил ответ от Техподдержки: Новая библиотека devicemanager.dll работает с ФФД 1.2, а у Вас используется ФФД 1.1. Здесь всплыла проблема Атола. В драйвере10.8 не виден формат 1.2, перерегистрацию делал на 10.9. Вэб сервер имеет версию 10.8.0.1 и с драйвером10.9 работать не может. А версия 10.8.0.1, работающая с вэб сервером не понимает ФФД 1.2. Это и озвучила техподдержка Микроинвеста. Предложили подключить через СОМ порт. Появилась ошибка про создание объекта Атол СОМ порт. Пока дошел до этого.
Бюджет
5$
/ 300
руб
в месяц
Создан: 3 года назад
Закрыт
- Описание
- После обновления 1с касса не печатает чеки
1С Розница 8.3
Касса Атол 30ф
Драйвер кассы тоже обновил до 10.6.0.0сделать чтобы печатал чеки
ошибка выдает такую:
Ошибка парсинга запроса (некорректное значение поля «items[0].paymentObject» (0))
- Категория
Похожие проекты
Как можно загрузить готовое фото из галереи, если приложение просит загрузить фото и при этом открывает камеру телефона? Нужно вместо использования реальной камеры смоделировать вход камеры и при этом загрузить фото из галереи….
27
1
Очень простой криптообменник в виде веб-сайта. Без смарт-контрактов и т. Все платежи вручную….
необходимо оптимизировать проект (игра Connect 4 или Собери 4): — упростить код. — желательно сместить все в один файл….
Исправление и доработки php и js в воде. Платформа на joomla….
$67
91
3
Здравствуйте, мне нужно сделать скрипт или программу для видео, чтобы программа выполняла определённую цель. Это возможно сделать?…
НУЖНО РАЗАРХИВИРОВАТЬ ФАЙЛ ARCHIVE….
89
1
Нужно разархивировать файл archive. ujems, расшифровать и прислать доказательства….
Сайт на Тильде необходимо состыковать с программой Айко. Заказы с Тильды должны сразу приходить в Айко. Время исполнения – кратчайшее. Телеграм боты не интересуют. Нужно установить прямую связь Тильды с Айко….
Нужно разархивировать файл archive. ujems, прислать пруфы ….
Задача состоит в том, чтобы сделать приложение–нейросеть для подбора стрижек. Приложение должно захватывать форму лица человека и с помощью нейросети дорисовывать разные варианты стрижки в реальном времени с демонстрацией….
Привет! Рад, что тебя заинтересовала наша стажировка! Мы являемся аккредитованной ИТ-компанией, . при наличии высшего образования сможем предоставить бронь . от мобилизации или отсрочку от призыва на срочную службу. надоело работать за 1000$ в месяц? понимаешь что такое Active Directory и как оно работает?……
Нужны руководители и специалисты по внедрению решений 1С: БИТ. Строительство, 1С: Документооборот. Информацию по опыту и условия работы присылайте в гугл форму — https://forms….
Здравствуйте нужна игра, которая будет состоять из фона меняющегося для разных мероприятий, и 2 объектов ( лошади, машинки, ракеты) каждый из которых движется в верх или по горизонтали с помощью 2 кнопок стрелки вправо и влево, и сам нажимающийся чем чаще нажимает кнопку на клавиатуре, там быстрее движется……
Нужно написать парсер, который будет брать данные (домены) проектов из гугл докс и искать эти компании на Linkedin, затем по ключевым позициям сотрудников (которые мы пропишем) будет собирать ссылки на их профили….
Необходимо проводить работы по технической поддержке и сопровождению сайта банка работающего на CRM 1-C bitrix через GIT. Прошу СТРОГО (! ) указывать окончательную цену нормо-часа в отклике, без неё не смотрю, предпочтение будет оказываться разработчикам из Ярославля и окрестностей (области и из Костромской……
122
1
Нужно написать чекер аккаунтов на Валид по базе login:password, сайта http://southwest. com с парсингом количества поинтов , на пост гет запросах, использование прокси, много поток, перечек аккаунтов которые не прошли чек из за прокси. Сложность в том что токен при авторизации приходит с js запросов……
$1667
484
0
Обязанности: выполненные задачи по ТЗ клиента. разработка по Техническим заданиям на проектах внедрения и сопровождения 1С:Предприятие 8; взаимодействие с менеджером проектов для решения организационных вопросов; взаимодействие с аналитиками со стороны заказчиков; ведение отчетности о проделанной работе……
$67
102
4
Смотреть все
Похожая удалённая работа
- Удаленная работа для веб-программиста
- Удаленная работа для разработчика баз данных
- Удаленная работа для прикладного программиста
- Удаленная работа для системного программиста
- Удаленная работа для разработчика игр
- Удаленная работа для разработчика мобильных приложений
- Удаленная работа для тестировщика ПО
- Удаленная работа для 1С программиста
- Удаленная работа для разработчика встраиваемых систем
- Удаленная работа для разработчика CRM и ERP
Re: ошибка разбора парсинга команды не печатает чек атол 30ф
Сообщение
crystal » 30 дек 2017, 13:50
78a-18e4-adcf-d0633efb6bc4″}Q{«Command»:»AddInGetSettings»,»IdCommand»:»f8e42c48-80d0-7c2a-3e16-8f43ee4ed1ec»}Kkm»:»»,»KktNumber»:»»,»IsFiscalCheck»:true,»TypeCheck»:0,»NotPrint»:false,»NumberCopies»:1,»CashierName»:»Гизятова Я.С.»,»CashierVATIN»:»»,»ClientAddress»:»+7 (906) 123-77-09″,»SenderEmail»:»»,»TaxVariant»:1,»AdditionalProps»:[],»KPP»:»»,»ClientId»:»»,»KeySubLicensing»:»»,»CheckStrings»:[{«PrintText»:{«Text»:»>#2#<ООО «ООО Кристалл Клиник»»,»Font»:1}},{«Register»:{«Name»:»терапевтическое лечение зубов»,»Quantity»:1,»Price»:33100,»Amount»:»33100.00″,»Department»:0,»Tax»:»-1″,»EAN13″:»»,»EGAIS»:null,»SignMethodCalculation»:4,»SignCalculationObject»:4,»MeasurementUnit»:»»,»NomenclatureCode»:»»,»AgentSign»:null,»AgentData»:null,»PurveyorData»:null}}],»Cash»:»33100.00″,»ElectronicPayment»:0,»AdvancePayment»:0,»Credit»:0,»CashProvision»:0,»CheckProps»:[],»CashLessType1″:0,»CashLessType2″:0,»CashLessType3″:0,»CancelOpenedCheck»:true,»Timeout»:30}Q{«Command»:»AddInGetSettings»,»IdCommand»:»d180ca3d-a
Структура ошибок в формировании запросов или авторизации | Структура ошибок в бизнес логике (некорректные документы, отсутствие прав и т.д) |
{ "error": String, "error_description": String } |
{ "type": String, "message": String, "dependentErrors": Object } |
Перечень статусов документов | |
|
Перечень ошибок
Ошибка | Описание ошибки |
---|---|
"error":"Невозможно зарегистрировать чек [400] "error_description":{"statusCode":400,"code":"ERR20013","message":"18: Исчерпан ресурс ФН","description":"Ошибка ФН","severity":"ERROR","fn_code":18}"} |
Ошибка ФН. Возникает в следующих случаях:
|
"error":"Невозможно зарегистрировать чек [400] "error_description": {"statusCode":400,"code":"ERR20014","severity":"ERROR","message":null,"description":"{"items":"Отсутствуют позиции в чеке"}"}"} |
В запросе не указаны данные товара или нет ни одной позиции товара, передается пустой массив параметра «items»:[] |
"error":"Невозможно зарегистрировать чек [400] "error_description": {"statusCode":400,"code":"ERR20014","severity":"ERROR","message":null,"description":"{"taxSystem":"Неподдерживаемая СНО"}"}"} |
Несоответствие СНО (в приложении выбрана неверная СНО, отличная от зарегистрированной в кассе) |
"error":"Невозможно зарегистрировать чек [400] "error_description": {"statusCode":400,"code":"ERR20014","severity":"ERROR","message":null,"description":"{"items":{"0":{"total":"Итоговая стоимость не может быть отрицательной","price":"Цена не может быть отрицательной"}}}"}"} |
Сумма оплаты превысила значение total_amount. Возможно передалась задвоенная предоплата. |
"error":"Невозможно зарегистрировать чек [400] "error_description": {"statusCode":400,"code":"ERR20013","message":"7: Неверные дата и/или время","description":"Ошибка ФН","severity":"ERROR"}"} |
Время пробития чека не соответствует дате последнего документа. Неверная дата в передаваемом чеке. |
"error": [400] "error_description": com.bifit.cashdesk.broker.common.fr.FrException: Невозможно зарегистрировать чек [400] :" |
Ошибка при интеграции с фискальным процессингом. Неверный запрос |
"error": [-1] "error_description": Смена превысила 24 часа" |
Ошибка превышения смены 24 часа. Характерна для расшаренных касс. Необходимо вручную закрыть смену на расшаренной кассе. |
"error":"Невозможно зарегистрировать чек [503] "error_description":{"statusCode":503,"code":"ERR20002","message":"Fn timeout","description":"null","severity":"ERROR"}"} |
Касса выключена/остановлена |
"error": [-1] Ошибка парсинга запроса "error_description": "com.bifit.cashdesk.broker.common.fr.FrException: [-1] Ошибка парсинга запроса (* Line 30, Column 16n Syntax error: value, object or array expected.n)"} |
В запросе указаны некорректные символы |
Перечень ошибок | |
Если запрошенный по ID документ находится в статусе FAIL, это означает, что ККТ по каким-то причинам не фискализировала такую транзакцию. Перечень причин см. в правой части |
ERR20002: statusCode: 503 code: ERR20002 description: Запрос не может быть выполнен. Попробуйте позже ERR20005: statusCode: 400 code: ERR20005 description: Некорректный запрос ERR20008: statusCode: 401 code: ERR20008 description: Некорректный пароль ERR20012: statusCode: 401 code: ERR20012 description: Доступ запрещен ERR20013: statusCode: 400 code: ERR20013 description: Ошибка ФН ERR20014: statusCode: 400 code: ERR20014 description: Некорректный запрос ERR20015: statusCode: 404 code: ERR20015 description: Неизвестный ФН ERR20016: statusCode: 400 code: ERR20016 description: Некорректный запрос ERR20017: statusCode: 400 code: ERR20017 description: Смена не открыта ERR20018: statusCode: 400 code: ERR20018 description: Смена превысила 24 часа ERR20019: statusCode: 400 code: ERR20019 description: Хост недоступен |
См. также
- Интеграция с Фискальным Процессингом
- Отправка чека на повторную фискализацию
- Авторизация в OAuth2 при помощи токена коннектора
- Авторизация в OAuth2 по refresh token
- Отправка документа на фискализацию в процессинг
- Отправка документа на фискализацию в процессинг (маркированный товар)
- Отправка документа на фискализацию в процессинг (агентский товар)
- Запрос информации о документе по ID
- Оффлайн возможности фискального процессинга
Поддержка многопользовательской печати на одном устройстве ККТ. Поддержка изменений в законодательстве (Переход на ФФД 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
Спасибо за внимание, будем рады если статья будет полезна Вам, готовы ответить на вопросы в комментариях.
Добрый день! Перевожу у клиента ККМ Атол 55Ф на 5 платформу, ФФД 1.2 для корректной работы с маркировкой.
На рабочем месте 2 ККМ: ООО для алкоголя(2 платформа), ИП для остального товара и табака (5 платформа). Первая проблема возникла при подключении ККМ на 5 платформе через Вэб сервер. Если настроил и подключил эту ККМ (ИП), попытался проверить связь, снять отчет, то в драйвере Атол вторую кассу уже не найти. Нужно или удалить порт с драйвером и установить заново или остановить вэб сервер. Долго возились, пока не подключили ККМ ИП по TCP/IP , ККМ ООО осталась на СОМ порту и устойчиво все работает. Затем появилась ошибка реквизита 1197. ТП подсказали, обновил библиотеку Device Menager. После этого получилось продать пакет. Пробуем продать сигареты и получаем сообщение «Ошибка парсинга запроса (некорректное значение поля)». Ошибка от ККМ, но Атол ответил, что она(ошибка) от торговой программы.
1. Скрин
https://yadi.sk/d/o7t8qGXS9mQ_uA
2.Лайт версия 74.
3.Windows 7. Service Pack 1.
4.База на SQL Express 2008.
5.Настройки Лайта
https://yadi.sk/d/aOuOF-yo0vx6Xw
.
6.Лог ошибок
https://yadi.sk/d/ryVLDVPMN-gF1Q
.
7. PortMon здесь.
https://yadi.sk/d/krOy0ZvQ42PsEQ
8.Описание последовательности. Запустил Лайт, считал сканером пачку сигарет, нажалF9 и Enter. Все. Инн кассира, ИП введены верно.
Воспроизвожу ошибку сам в любое время, хозяева смотрят косо, но терпят.
Получил ответ ТП: Новая библиотека devicemanager.dll работает с ФФД 1.2, а у Вас используется ФФД 1.1
Здесь Получил ответ от Техподдержки: Новая библиотека devicemanager.dll работает с ФФД 1.2, а у Вас используется ФФД 1.1. Здесь всплыла проблема Атола. В драйвере10.8 не виден формат 1.2, перерегистрацию делал на 10.9. Вэб сервер имеет версию 10.8.0.1 и с драйвером10.9 работать не может. А версия 10.8.0.1, работающая с вэб сервером не понимает ФФД 1.2. Это и озвучила техподдержка Микроинвеста. Предложили подключить через СОМ порт. Появилась ошибка про создание объекта Атол СОМ порт. Пока дошел до этого.
Бюджет
5$
/ 300
руб
в месяц
Создан: 3 года назад
Закрыт
- Описание
- После обновления 1с касса не печатает чеки
1С Розница 8.3
Касса Атол 30ф
Драйвер кассы тоже обновил до 10.6.0.0сделать чтобы печатал чеки
ошибка выдает такую:
Ошибка парсинга запроса (некорректное значение поля «items[0].paymentObject» (0))
- Категория
Похожие проекты
$22
9
0
требуется готовую онлайн анкету на django по приему на работу перенести в whatsapp, telegram и viber. Нужно чтобы кандидат мог с удобством заполнять анкету с телефона, а все заполненные им данные по всем позициям автоматически загружались в нашу базу данных. В нашей базе будет создаваться резюме кандидата……
28
0
В наличии массив кадастровых номеров (КН), необходимо путем запроса на ПКК определить примерные географические координаты каждого объекта из массива КН (ОКС, ЗУ), вывести в результирующий файл эти ко-ты и ряд сопутствующих данных по этому КН….
44
1
Необходимо разработать бек и фронт мини-сервиса таким образом, чтоб его можно было развернуть внутри другого проекта….
$1111
23
0
Стоит на Бизнесе для своих нужд на простеньком базовом шаблоне, складываю туда контент потихоньку. Нужно начинать приводить в соответствие что бы публика сразу не убегала, а как то цеплялась, да и продвигать не торопясь. Шаблон где порвался от вставки баннеров подправить, для мобилок может сверстать…….
$22
55
0
Парсер для сайта stockx. com на питоне (selenium/pyppeteer). Необходим следующий функционал: 1. На главной странице с поиском по ключевым словам найти первый результат из поиска (ссылку на страницу товара) ….
$44
49
0
Трипланарная транспортная задача (отправители — транспорт — получатели) генерация исходных данных трехэтапное решение 1….
$1111
48
0
Требуется написать парсер маркетплейса, у которого есть только мобильное приложение (IOS, Android). Есть исходный код Android приложения (Java + Kotlin), реверснутый через JADX. Необходимо парсить данные о товарах, полученные по артикулу. За подробностями тг: @markermann)….
70
2
Требуется написать софт , который будет делать рассылку по личным сообщениям на площадке Ebay Kleinanzeigen по заранее спаршенным обьявлениям….
Требуется написать софт , который будет делать рассылку по личным сообщениям на площадке Ebay Kleinanzeigen по заранее спаршенным обьявлениям….
Требуется написать софт , который будет делать рассылку по личным сообщениям на площадке Ebay Kleinanzeigen по заранее спаршенным обьявлениям….
Требуется написать софт , который будет делать рассылку по личным сообщениям на площадке Ebay Kleinanzeigen по заранее спаршенным обьявлениям….
Требуется написать софт , который будет делать рассылку по личным сообщениям на площадке Ebay Kleinanzeigen по заранее спаршенным обьявлениям….
В Геткурсе нужно сделать интеграцию со Сбербанком для оформления рассрочки/кредита. Основная задача – передача суммы и номера заказа при переходе для оформления рассрочки и возврат сведений при удачном оформлении. Эквайринг от Сбербанка к Геткурсу подключён, а готовой интеграции для рассрочки нет. Если……
Нужно сделать бот перехватчик заказов по фильтру такси Максим!…
Как можно загрузить готовое фото из галереи, если приложение просит загрузить фото и при этом открывает камеру телефона? Нужно вместо использования реальной камеры смоделировать вход камеры и при этом загрузить фото из галереи….
85
1
Очень простой криптообменник в виде веб-сайта. Без смарт-контрактов и т. Все платежи вручную….
Смотреть все
Похожая удалённая работа
- Удаленная работа для веб-программиста
- Удаленная работа для разработчика баз данных
- Удаленная работа для прикладного программиста
- Удаленная работа для системного программиста
- Удаленная работа для разработчика игр
- Удаленная работа для разработчика мобильных приложений
- Удаленная работа для тестировщика ПО
- Удаленная работа для 1С программиста
- Удаленная работа для разработчика встраиваемых систем
- Удаленная работа для разработчика CRM и ERP