Вот пример запроса удачного
<?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>
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
Сегменты.Партнер КАК Партнер,
ИСТИНА КАК ИспользуетсяОтборПоСегментуПартнеров
ПОМЕСТИТЬ ОтборПоСегментуПартнеров
ИЗ
РегистрСведений.ПартнерыСегмента КАК Сегменты
{ГДЕ
Сегменты.Сегмент.* КАК СегментПартнеров,
Сегменты.Партнер.* КАК Партнер}
ИНДЕКСИРОВАТЬ ПО
Партнер,
ИспользуетсяОтборПоСегментуПартнеров
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КурсВалюты.Валюта КАК Валюта,
КурсВалюты.Курс * КурсВалютыОтчета.Кратность / (КурсВалюты.Кратность * КурсВалютыОтчета.Курс) КАК Коэффициент
ПОМЕСТИТЬ КурсыВалют
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних({(&КонецПериода)}, ) КАК КурсВалюты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних({(&КонецПериода)}, Валюта = &Валюта) КАК КурсВалютыОтчета
ПО (ИСТИНА)
ГДЕ
КурсВалюты.Кратность <> 0
И КурсВалютыОтчета.Курс <> 0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Расчеты.Организация КАК Организация,
Расчеты.Партнер КАК Партнер,
Расчеты.Контрагент КАК Контрагент,
Расчеты.Договор КАК Договор,
Расчеты.НаправлениеДеятельности КАК НаправлениеДеятельности,
Расчеты.ОбъектРасчетов КАК ОбъектРасчетов,
Расчеты.Валюта КАК Валюта,
Расчеты.РасчетныйДокумент КАК РасчетныйДокумент,
Расчеты.ДатаВозникновения КАК ДатаВозникновения,
Расчеты.ДатаПлановогоПогашения КАК ДатаПлановогоПогашения,
СУММА(Расчеты.ДолгПоставщикаНачальныйОстаток) КАК ДолгПоставщикаНачальныйОстаток,
СУММА(Расчеты.НашДолгНачальныйОстаток) КАК НашДолгНачальныйОстаток,
СУММА(Расчеты.ПлановаяОплатаНачальныйОстаток) КАК ПлановаяОплатаНачальныйОстаток,
СУММА(Расчеты.ПлановаяПоставкаНачальныйОстаток) КАК ПлановаяПоставкаНачальныйОстаток,
СУММА(Расчеты.Заказано) КАК Заказано,
СУММА(Расчеты.ЗаказаноКОплате) КАК ЗаказаноКОплате,
СУММА(Расчеты.Поставлено) КАК Поставлено,
СУММА(Расчеты.Зачтено) КАК Зачтено,
СУММА(Расчеты.Оплачено) КАК Оплачено,
СУММА(Расчеты.СписаниеПереоценка) КАК СписаниеПереоценка,
СУММА(Расчеты.Оплачивается) КАК Оплачивается,
СУММА(Расчеты.ДолгПоставщикаКонечныйОстаток) КАК ДолгПоставщикаКонечныйОстаток,
СУММА(Расчеты.НашДолгКонечныйОстаток) КАК НашДолгКонечныйОстаток,
СУММА(Расчеты.ПлановаяОплатаКонечныйОстаток) КАК ПлановаяОплатаКонечныйОстаток,
СУММА(Расчеты.ПлановаяПоставкаКонечныйОстаток) КАК ПлановаяПоставкаКонечныйОстаток
ИЗ
(ВЫБРАТЬ
АналитикаУчета.Организация КАК Организация,
АналитикаУчета.Партнер КАК Партнер,
АналитикаУчета.Контрагент КАК Контрагент,
АналитикаУчета.Договор КАК Договор,
АналитикаУчета.НаправлениеДеятельности КАК НаправлениеДеятельности,
РасчетыПоСрокам.ОбъектРасчетов КАК ОбъектРасчетов,
РасчетыПоСрокам.Валюта КАК Валюта,
РасчетыПоСрокам.РасчетныйДокумент КАК РасчетныйДокумент,
РасчетыПоСрокам.ДатаВозникновения КАК ДатаВозникновения,
РасчетыПоСрокам.ДатаПлановогоПогашения КАК ДатаПлановогоПогашения,
РасчетыПоСрокам.ПредоплатаРеглОстаток КАК ДолгПоставщикаНачальныйОстаток,
РасчетыПоСрокам.ДолгРеглОстаток КАК НашДолгНачальныйОстаток,
0 КАК ПлановаяОплатаНачальныйОстаток,
0 КАК ПлановаяПоставкаНачальныйОстаток,
0 КАК Заказано,
0 КАК ЗаказаноКОплате,
0 КАК Поставлено,
0 КАК Зачтено,
0 КАК Оплачено,
0 КАК СписаниеПереоценка,
0 КАК Оплачивается,
0 КАК ДолгПоставщикаКонечныйОстаток,
0 КАК НашДолгКонечныйОстаток,
0 КАК ПлановаяОплатаКонечныйОстаток,
0 КАК ПлановаяПоставкаКонечныйОстаток
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПоСрокам.Остатки({(&НачалоОстатки)}, ) КАК РасчетыПоСрокам
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПоСрокам.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.Организация,
АналитикаУчета.Партнер,
АналитикаУчета.Контрагент,
АналитикаУчета.Договор,
АналитикаУчета.НаправлениеДеятельности,
РасчетыПоСрокам.ОбъектРасчетов,
РасчетыПоСрокам.Валюта,
РасчетыПоСрокам.РасчетныйДокумент,
РасчетыПоСрокам.ДатаВозникновения,
РасчетыПоСрокам.ДатаПлановогоПогашения,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
РасчетыПоСрокам.ПредоплатаРеглОстаток,
РасчетыПоСрокам.ДолгРеглОстаток,
0,
0
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПоСрокам.Остатки({(&КонецПериодаГраница)}, ) КАК РасчетыПоСрокам
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПоСрокам.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.Организация,
АналитикаУчета.Партнер,
АналитикаУчета.Контрагент,
АналитикаУчета.Договор,
АналитикаУчета.НаправлениеДеятельности,
РасчетыПоСрокам.ОбъектРасчетов,
РасчетыПоСрокам.Валюта,
РасчетыПоСрокам.РасчетныйДокумент,
РасчетыПоСрокам.ДатаВозникновения,
РасчетыПоСрокам.ДатаПлановогоПогашения,
0,
0,
0,
0,
0,
0,
&ПоставленоПоставщиком,
&ЗачтеноПоставщиком,
&ОплаченоПоставщику,
&СписаниеПереоценка,
0,
0,
0,
0,
0
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПоСрокам КАК РасчетыПоСрокам
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПоСрокам.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
(РасчетыПоСрокам.Период МЕЖДУ &НачалоПериода И &КонецПериода) КАК Поле2,
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле4}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.КлючАналитики.Организация,
АналитикаУчета.КлючАналитики.Партнер,
АналитикаУчета.КлючАналитики.Контрагент,
АналитикаУчета.КлючАналитики.Договор,
АналитикаУчета.КлючАналитики.НаправлениеДеятельности,
РасчетыПланОплат.ОбъектРасчетов,
РасчетыПланОплат.Валюта,
РасчетыПланОплат.ДокументПлан,
РасчетыПланОплат.ДатаВозникновения,
РасчетыПланОплат.ДатаПлановогоПогашения,
0,
0,
РасчетыПланОплат.КОплатеНачальныйОстаток * ЕСТЬNULL(Курсы.Коэффициент, 1),
0,
0,
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(РасчетыПланОплат.ДокументПлан) В (&ТипыДокументовПлана)
ТОГДА РасчетыПланОплат.КОплатеПриход * ЕСТЬNULL(Курсы.Коэффициент, 1)
ИНАЧЕ 0
КОНЕЦ,
0,
0,
0,
0,
0,
0,
0,
РасчетыПланОплат.КОплатеКонечныйОстаток * ЕСТЬNULL(Курсы.Коэффициент, 1),
0
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПланОплат.ОстаткиИОбороты({(&НачалоПериода)}, {(&КонецПериода)}, , , ) КАК РасчетыПланОплат
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПланОплат.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК Курсы
ПО (Курсы.Валюта = РасчетыПланОплат.Валюта)
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.КлючАналитики.Организация,
АналитикаУчета.КлючАналитики.Партнер,
АналитикаУчета.КлючАналитики.Контрагент,
АналитикаУчета.КлючАналитики.Договор,
АналитикаУчета.КлючАналитики.НаправлениеДеятельности,
РасчетыПланОтгрузок.ОбъектРасчетов,
РасчетыПланОтгрузок.Валюта,
РасчетыПланОтгрузок.ДокументПлан,
РасчетыПланОтгрузок.ДатаВозникновения,
РасчетыПланОтгрузок.ДатаПлановогоПогашения,
0,
0,
0,
РасчетыПланОтгрузок.СуммаНачальныйОстаток * ЕСТЬNULL(Курсы.Коэффициент, 1),
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(РасчетыПланОтгрузок.ДокументПлан) В (&ТипыДокументовПлана)
ТОГДА РасчетыПланОтгрузок.СуммаПриход * ЕСТЬNULL(Курсы.Коэффициент, 1)
ИНАЧЕ 0
КОНЕЦ,
0,
0,
0,
0,
0,
0,
0,
0,
0,
РасчетыПланОтгрузок.СуммаКонечныйОстаток * ЕСТЬNULL(Курсы.Коэффициент, 1)
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПланПоставок.ОстаткиИОбороты({(&НачалоПериода)}, {(&КонецПериода)}, , , ) КАК РасчетыПланОтгрузок
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПланОтгрузок.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК Курсы
ПО (Курсы.Валюта = РасчетыПланОтгрузок.Валюта)
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.Организация,
АналитикаУчета.Партнер,
АналитикаУчета.Контрагент,
АналитикаУчета.Договор,
АналитикаУчета.НаправлениеДеятельности,
РасчетыСПоставщиками.ОбъектРасчетов,
РасчетыСПоставщиками.Валюта,
НЕОПРЕДЕЛЕНО,
ДАТАВРЕМЯ(1, 1, 1),
ДАТАВРЕМЯ(1, 1, 1),
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
ВЫБОР
КОГДА РасчетыСПоставщиками.ОплачиваетсяОстаток < 0
ТОГДА -РасчетыСПоставщиками.ОплачиваетсяОстаток
ИНАЧЕ 0
КОНЕЦ * ЕСТЬNULL(Курсы.Коэффициент, 1),
0,
0,
0,
0
ИЗ
РегистрНакопления.РасчетыСПоставщиками.Остатки({(&КонецПериодаГраница)}, ) КАК РасчетыСПоставщиками
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыСПоставщиками.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК Курсы
ПО (Курсы.Валюта = РасчетыСПоставщиками.Валюта)
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
И РасчетыСПоставщиками.ОплачиваетсяОстаток < 0
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}) КАК Расчеты
СГРУППИРОВАТЬ ПО
Расчеты.Организация,
Расчеты.Партнер,
Расчеты.Контрагент,
Расчеты.Договор,
Расчеты.НаправлениеДеятельности,
Расчеты.ОбъектРасчетов,
Расчеты.Валюта,
Расчеты.РасчетныйДокумент,
Расчеты.ДатаВозникновения,
Расчеты.ДатаПлановогоПогашения
| Структура ошибок в формировании запросов или авторизации | Структура ошибок в бизнес логике (некорректные документы, отсутствие прав и т.д) |
{ "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
- Оффлайн возможности фискального процессинга
Бюджет
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
Добрый день! Перевожу у клиента ККМ Атол 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. Это и озвучила техподдержка Микроинвеста. Предложили подключить через СОМ порт. Появилась ошибка про создание объекта Атол СОМ порт. Пока дошел до этого.
2021-09-09_18-47-03.mp4
Информация для технической поддержки
Платформа: 8.3.19.1229
Режим БД: клиент-серверный
Конфигурация. Название: 1С:ERP Управление предприятием 2 (2.5.6.261)
Конфигурация. Основной режим запуска: Управляемое приложение
Конфигурация. Вариант встроенного языка: Русский
Конфигурация. Режим управления блокировкой данных: Управляемый
Конфигурация. Режим совместимости: Версия8_3_16
Конфигурация. Версия БСП: 301
Инструменты разработчика. Версия: Портативный 6.08.1p
Инструменты разработчика. Инструмент: Консоль запросов
Инструменты разработчика. Перехват клавиатурного ввода: Да
Инструменты разработчика. Объекты на сервере: Да
Инструменты разработчика. Серверный модуль: Да
Клиент. ОС: Майкрософт Windows 10 Pro 64-разрядная Русский
Клиент. Приложение: Обычное приложение 64б
Клиент. Проверка модальных вызовов: Нет
Клиент. Язык интерфейса конфигурации: ru
Клиент. Язык интерфейса системы: ru
Клиент. От имени администратора Windows: Нет
Сервер. ОС: Windows x86-64 Microsoft Windows 10 version 10.0 (Build 19043)
При вызове Конструктора Запросов ИР возникает ошибка:
Значение не является значением объектного типа (ЭлементФормы)
{ВнешняяОбработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(2842)}: Результат = Результат + ирОбщий.ПредставлениеИзИдентификатораЛкс(ПолеТекста.ЭлементФормы.Имя) + ": ";
{ВнешняяОбработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(3042)}: КоординатыВТекстеЗапроса = ПолучитьКоординатыВТекстеЗапроса(пПолеТекста, СтартоваяСтрокаДляОтображенияОшибок);
{ВнешняяОбработка.ирКлсПолеТекстаПрограммы.Форма.КонструкторЗапроса.Форма(200)}: СтартовыйТокен = РазобратьТекстЗапроса(ТекстПакета,,, Null,, ТаблицаКомментариев);
{ВнешняяОбработка.ирКлсПолеТекстаПрограммы.Форма.КонструкторЗапроса.Форма(122)}: БылиПотери = ОбработатьРасширениеЯзыкаЗапросов() Или БылиПотери;
{ВнешняяОбработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(2956)}: КонструкторЗапроса.УстановитьДанные(НачальныйТокен, ТаблицаКомментариев, БылиПотери,, ПолучитьНомерТекущейСтроки());
{ВнешняяОбработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(2730)}: РезультатРазбора = ЗагрузитьТекстВКонструктор(ТекстЗапроса, КонструкторЗапроса,, мДиалектSQL,, НачальнаяСтрокаЗапроса);
{ВнешняяОбработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(930)}: Результат = ВызватьКонструкторЗапросов(Истина);
{ВнешняяОбработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(891)}: Результат = ВыполнитьКоманду(Команда);
{ВнешняяОбработка.ирКонсольЗапросов.Форма.Форма.Форма(284)}: Результат = ЭкземплярКомпоненты.Нажатие(Кнопка);
Пример запроса
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
Сегменты.Партнер КАК Партнер,
ИСТИНА КАК ИспользуетсяОтборПоСегментуПартнеров
ПОМЕСТИТЬ ОтборПоСегментуПартнеров
ИЗ
РегистрСведений.ПартнерыСегмента КАК Сегменты
{ГДЕ
Сегменты.Сегмент.* КАК СегментПартнеров,
Сегменты.Партнер.* КАК Партнер}
ИНДЕКСИРОВАТЬ ПО
Партнер,
ИспользуетсяОтборПоСегментуПартнеров
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КурсВалюты.Валюта КАК Валюта,
КурсВалюты.Курс * КурсВалютыОтчета.Кратность / (КурсВалюты.Кратность * КурсВалютыОтчета.Курс) КАК Коэффициент
ПОМЕСТИТЬ КурсыВалют
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних({(&КонецПериода)}, ) КАК КурсВалюты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних({(&КонецПериода)}, Валюта = &Валюта) КАК КурсВалютыОтчета
ПО (ИСТИНА)
ГДЕ
КурсВалюты.Кратность <> 0
И КурсВалютыОтчета.Курс <> 0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Расчеты.Организация КАК Организация,
Расчеты.Партнер КАК Партнер,
Расчеты.Контрагент КАК Контрагент,
Расчеты.Договор КАК Договор,
Расчеты.НаправлениеДеятельности КАК НаправлениеДеятельности,
Расчеты.ОбъектРасчетов КАК ОбъектРасчетов,
Расчеты.Валюта КАК Валюта,
Расчеты.РасчетныйДокумент КАК РасчетныйДокумент,
Расчеты.ДатаВозникновения КАК ДатаВозникновения,
Расчеты.ДатаПлановогоПогашения КАК ДатаПлановогоПогашения,
СУММА(Расчеты.ДолгПоставщикаНачальныйОстаток) КАК ДолгПоставщикаНачальныйОстаток,
СУММА(Расчеты.НашДолгНачальныйОстаток) КАК НашДолгНачальныйОстаток,
СУММА(Расчеты.ПлановаяОплатаНачальныйОстаток) КАК ПлановаяОплатаНачальныйОстаток,
СУММА(Расчеты.ПлановаяПоставкаНачальныйОстаток) КАК ПлановаяПоставкаНачальныйОстаток,
СУММА(Расчеты.Заказано) КАК Заказано,
СУММА(Расчеты.ЗаказаноКОплате) КАК ЗаказаноКОплате,
СУММА(Расчеты.Поставлено) КАК Поставлено,
СУММА(Расчеты.Зачтено) КАК Зачтено,
СУММА(Расчеты.Оплачено) КАК Оплачено,
СУММА(Расчеты.СписаниеПереоценка) КАК СписаниеПереоценка,
СУММА(Расчеты.Оплачивается) КАК Оплачивается,
СУММА(Расчеты.ДолгПоставщикаКонечныйОстаток) КАК ДолгПоставщикаКонечныйОстаток,
СУММА(Расчеты.НашДолгКонечныйОстаток) КАК НашДолгКонечныйОстаток,
СУММА(Расчеты.ПлановаяОплатаКонечныйОстаток) КАК ПлановаяОплатаКонечныйОстаток,
СУММА(Расчеты.ПлановаяПоставкаКонечныйОстаток) КАК ПлановаяПоставкаКонечныйОстаток
ИЗ
(ВЫБРАТЬ
АналитикаУчета.Организация КАК Организация,
АналитикаУчета.Партнер КАК Партнер,
АналитикаУчета.Контрагент КАК Контрагент,
АналитикаУчета.Договор КАК Договор,
АналитикаУчета.НаправлениеДеятельности КАК НаправлениеДеятельности,
РасчетыПоСрокам.ОбъектРасчетов КАК ОбъектРасчетов,
РасчетыПоСрокам.Валюта КАК Валюта,
РасчетыПоСрокам.РасчетныйДокумент КАК РасчетныйДокумент,
РасчетыПоСрокам.ДатаВозникновения КАК ДатаВозникновения,
РасчетыПоСрокам.ДатаПлановогоПогашения КАК ДатаПлановогоПогашения,
РасчетыПоСрокам.ПредоплатаРеглОстаток КАК ДолгПоставщикаНачальныйОстаток,
РасчетыПоСрокам.ДолгРеглОстаток КАК НашДолгНачальныйОстаток,
0 КАК ПлановаяОплатаНачальныйОстаток,
0 КАК ПлановаяПоставкаНачальныйОстаток,
0 КАК Заказано,
0 КАК ЗаказаноКОплате,
0 КАК Поставлено,
0 КАК Зачтено,
0 КАК Оплачено,
0 КАК СписаниеПереоценка,
0 КАК Оплачивается,
0 КАК ДолгПоставщикаКонечныйОстаток,
0 КАК НашДолгКонечныйОстаток,
0 КАК ПлановаяОплатаКонечныйОстаток,
0 КАК ПлановаяПоставкаКонечныйОстаток
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПоСрокам.Остатки({(&НачалоОстатки)}, ) КАК РасчетыПоСрокам
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПоСрокам.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.Организация,
АналитикаУчета.Партнер,
АналитикаУчета.Контрагент,
АналитикаУчета.Договор,
АналитикаУчета.НаправлениеДеятельности,
РасчетыПоСрокам.ОбъектРасчетов,
РасчетыПоСрокам.Валюта,
РасчетыПоСрокам.РасчетныйДокумент,
РасчетыПоСрокам.ДатаВозникновения,
РасчетыПоСрокам.ДатаПлановогоПогашения,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
РасчетыПоСрокам.ПредоплатаРеглОстаток,
РасчетыПоСрокам.ДолгРеглОстаток,
0,
0
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПоСрокам.Остатки({(&КонецПериодаГраница)}, ) КАК РасчетыПоСрокам
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПоСрокам.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.Организация,
АналитикаУчета.Партнер,
АналитикаУчета.Контрагент,
АналитикаУчета.Договор,
АналитикаУчета.НаправлениеДеятельности,
РасчетыПоСрокам.ОбъектРасчетов,
РасчетыПоСрокам.Валюта,
РасчетыПоСрокам.РасчетныйДокумент,
РасчетыПоСрокам.ДатаВозникновения,
РасчетыПоСрокам.ДатаПлановогоПогашения,
0,
0,
0,
0,
0,
0,
&ПоставленоПоставщиком,
&ЗачтеноПоставщиком,
&ОплаченоПоставщику,
&СписаниеПереоценка,
0,
0,
0,
0,
0
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПоСрокам КАК РасчетыПоСрокам
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПоСрокам.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
(РасчетыПоСрокам.Период МЕЖДУ &НачалоПериода И &КонецПериода) КАК Поле2,
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле4}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.КлючАналитики.Организация,
АналитикаУчета.КлючАналитики.Партнер,
АналитикаУчета.КлючАналитики.Контрагент,
АналитикаУчета.КлючАналитики.Договор,
АналитикаУчета.КлючАналитики.НаправлениеДеятельности,
РасчетыПланОплат.ОбъектРасчетов,
РасчетыПланОплат.Валюта,
РасчетыПланОплат.ДокументПлан,
РасчетыПланОплат.ДатаВозникновения,
РасчетыПланОплат.ДатаПлановогоПогашения,
0,
0,
РасчетыПланОплат.КОплатеНачальныйОстаток * ЕСТЬNULL(Курсы.Коэффициент, 1),
0,
0,
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(РасчетыПланОплат.ДокументПлан) В (&ТипыДокументовПлана)
ТОГДА РасчетыПланОплат.КОплатеПриход * ЕСТЬNULL(Курсы.Коэффициент, 1)
ИНАЧЕ 0
КОНЕЦ,
0,
0,
0,
0,
0,
0,
0,
РасчетыПланОплат.КОплатеКонечныйОстаток * ЕСТЬNULL(Курсы.Коэффициент, 1),
0
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПланОплат.ОстаткиИОбороты({(&НачалоПериода)}, {(&КонецПериода)}, , , ) КАК РасчетыПланОплат
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПланОплат.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК Курсы
ПО (Курсы.Валюта = РасчетыПланОплат.Валюта)
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.КлючАналитики.Организация,
АналитикаУчета.КлючАналитики.Партнер,
АналитикаУчета.КлючАналитики.Контрагент,
АналитикаУчета.КлючАналитики.Договор,
АналитикаУчета.КлючАналитики.НаправлениеДеятельности,
РасчетыПланОтгрузок.ОбъектРасчетов,
РасчетыПланОтгрузок.Валюта,
РасчетыПланОтгрузок.ДокументПлан,
РасчетыПланОтгрузок.ДатаВозникновения,
РасчетыПланОтгрузок.ДатаПлановогоПогашения,
0,
0,
0,
РасчетыПланОтгрузок.СуммаНачальныйОстаток * ЕСТЬNULL(Курсы.Коэффициент, 1),
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(РасчетыПланОтгрузок.ДокументПлан) В (&ТипыДокументовПлана)
ТОГДА РасчетыПланОтгрузок.СуммаПриход * ЕСТЬNULL(Курсы.Коэффициент, 1)
ИНАЧЕ 0
КОНЕЦ,
0,
0,
0,
0,
0,
0,
0,
0,
0,
РасчетыПланОтгрузок.СуммаКонечныйОстаток * ЕСТЬNULL(Курсы.Коэффициент, 1)
ИЗ
РегистрНакопления.РасчетыСПоставщикамиПланПоставок.ОстаткиИОбороты({(&НачалоПериода)}, {(&КонецПериода)}, , , ) КАК РасчетыПланОтгрузок
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыПланОтгрузок.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК Курсы
ПО (Курсы.Валюта = РасчетыПланОтгрузок.Валюта)
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
АналитикаУчета.Организация,
АналитикаУчета.Партнер,
АналитикаУчета.Контрагент,
АналитикаУчета.Договор,
АналитикаУчета.НаправлениеДеятельности,
РасчетыСПоставщиками.ОбъектРасчетов,
РасчетыСПоставщиками.Валюта,
НЕОПРЕДЕЛЕНО,
ДАТАВРЕМЯ(1, 1, 1),
ДАТАВРЕМЯ(1, 1, 1),
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
ВЫБОР
КОГДА РасчетыСПоставщиками.ОплачиваетсяОстаток < 0
ТОГДА -РасчетыСПоставщиками.ОплачиваетсяОстаток
ИНАЧЕ 0
КОНЕЦ * ЕСТЬNULL(Курсы.Коэффициент, 1),
0,
0,
0,
0
ИЗ
РегистрНакопления.РасчетыСПоставщиками.Остатки({(&КонецПериодаГраница)}, ) КАК РасчетыСПоставщиками
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаУчета
ПО РасчетыСПоставщиками.АналитикаУчетаПоПартнерам = АналитикаУчета.КлючАналитики
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК Курсы
ПО (Курсы.Валюта = РасчетыСПоставщиками.Валюта)
ГДЕ
АналитикаУчета.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
И РасчетыСПоставщиками.ОплачиваетсяОстаток < 0
{ГДЕ
АналитикаУчета.Организация.* КАК Организация,
АналитикаУчета.Партнер.* КАК Партнер,
АналитикаУчета.Контрагент.* КАК Контрагент,
АналитикаУчета.Договор.* КАК Договор,
АналитикаУчета.НаправлениеДеятельности.* КАК НаправлениеДеятельности,
(АналитикаУчета.Партнер В
(ВЫБРАТЬ
ОтборПоСегментуПартнеров.Партнер
ИЗ
ОтборПоСегментуПартнеров
ГДЕ
ОтборПоСегментуПартнеров.ИспользуетсяОтборПоСегментуПартнеров = &ИспользуетсяОтборПоСегментуПартнеров)) КАК Поле2}) КАК Расчеты
СГРУППИРОВАТЬ ПО
Расчеты.Организация,
Расчеты.Партнер,
Расчеты.Контрагент,
Расчеты.Договор,
Расчеты.НаправлениеДеятельности,
Расчеты.ОбъектРасчетов,
Расчеты.Валюта,
Расчеты.РасчетныйДокумент,
Расчеты.ДатаВозникновения,
Расчеты.ДатаПлановогоПогашения
Поддержка многопользовательской печати на одном устройстве ККТ. Поддержка изменений в законодательстве (Переход на ФФД 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
Спасибо за внимание, будем рады если статья будет полезна Вам, готовы ответить на вопросы в комментариях.



