Сообщаем Мобильной Кассе, что чек пробит из Розницы 2.3
Продолжаем исследование начатое ранее. Теперь наша задача сообщить Мобильной Кассе, что чек в Рознице пробит.
Пока будем просто устанавливать чеку статус пробит, без реального пробития чека.
Нужно передать в чек свойство «Состояние» из таблицы «ДополнительныеРеквизиты«:
Ищем выгрузку чеков из 1С:Розница
В итоге выяснилось, что загрузка и выгрузка идет в фоновом задании, а веб-сервис только опрашивает это задание. Т.е. отладку веб-сервисов можно было и не настраивать.
Загрузка идет здесь:
И кстати, если бы я не отключил игнорирование чеков не из ОбменУРМК, чеки бы не загружались, потому что вариант настройки ОбменМК:
Выгрузка идет здесь:
Можно даже посмотреть сформированный файл:
Открыв его по пути в ПолноеИмяФайла, но данных в этом файле нет:
Видимо, аналогичным образом чек исключается из выгрузки, как и при загрузке данных.
Добавление выгрузки чеков в 1С:Рознице
В плане обмена «Синхронизация через универсальный формат» отсутствуют чеки ККМ, добавил и зарегистрировал полученный чек.
Но после этого выгрузка начала выдавать ошибку, т.к. для Чека она не находила ПОД (Правила обмена данными):
Выгрузку я пробовал обычную, в файл, потому что в фоновом режиме используются те же правила.
Задача — найти где заполняются КомпонентыОбмена.ПравилаОбработкиДанных и почему там не фигурирует чек.
Как видим, правила для чека есть, но нет поля ОбъектДанных:
Поэтому добавляем это поле расширением модуля МенеджерОбменаЧерезУниверсальныйФормат:
&Вместо("ДобавитьПКО_Документ_ЧекККМ_Отправка") Процедура дор_ДобавитьПКО_Документ_ЧекККМ_Отправка(ПравилаКонвертации) ПродолжитьВызов(ПравилаКонвертации); ИскСтр = ПравилаКонвертации.Найти("Документ.ЧекККМ", "ОбъектФормата"); Если ИскСтр <> Неопределено Тогда ИскСтр.ОбъектДанных = Метаданные.Документы.ЧекККМ; КонецЕсли; КонецПроцедуры
Но это ПКО, а ругается еще и на ПОД! Поэтому прописываем ПОД для чека ККМ, слава богу в формате описание этого ПОД есть:
Процедура ДобавитьПОД_Документ_ЧекККМ_Отправка(ПравилаОбработкиДанных) ПравилоОбработки = ПравилаОбработкиДанных.Добавить(); ПравилоОбработки.Имя = "Документ_ЧекККМ_Отправка"; ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Документы.ЧекККМ; ПравилоОбработки.ПриОбработке = "ПОД_Документ_ЧекККМ_Отправка_ПриОбработке"; ПравилоОбработки.ОчисткаДанных = Ложь; ПравилоОбработки.ИспользуемыеПКО.Добавить("Документ_ЧекККМ_Отправка"); КонецПроцедуры &Вместо("ЗаполнитьПравилаОбработкиДанных") Процедура дор_ЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных) ПродолжитьВызов(НаправлениеОбмена, ПравилаОбработкиДанных); Если НаправлениеОбмена = "Отправка" Тогда ДобавитьПОД_Документ_ЧекККМ_Отправка(ПравилаОбработкиДанных); КонецЕсли; КонецПроцедуры
После этого выгрузка заработала, но понадобилось передавать в ПКО не объект в ДанныеИБ а структуру:
&Вместо("ПКО_Документ_ЧекККМ_Отправка_ПриОтправкеДанных") Процедура дор_ПКО_Документ_ЧекККМ_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки) НовыеДанныеИБ = Новый Структура(); НовыеДанныеИБ.Вставить("Ссылка", ДанныеИБ.Ссылка); НовыеДанныеИБ.Вставить("СтатусЧекаККМ", ДанныеИБ.СтатусЧекаККМ); НовыеДанныеИБ.Вставить("УчитыватьНДС", ложь); //Временно НовыеДанныеИБ.Вставить("Товары", ДанныеИБ.Товары.Выгрузить()); НовыеДанныеИБ.Вставить("ЭтоВозврат", ложь);//Временно НовыеДанныеИБ.Вставить("ЦенаВключаетНДС", Истина);//Временно ПродолжитьВызов(НовыеДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки); ЗаписьЖурналаРегистрации("Отладка.Сервис",,,ДанныеИБ.Ссылка,"Выгрузка заказа:" + "ПробитИзОчередиФискализации"); ДопРеквизиты = Новый ТаблицаЗначений; ДопРеквизиты.Колонки.Добавить("Свойство"); ДопРеквизиты.Колонки.Добавить("ЗначениеСвойства"); СтрокаДопРеквизита = ДопРеквизиты.Добавить(); СтрокаДопРеквизита.Свойство = Новый Структура("Наименование", "Состояние"); СтрокаДопРеквизита.ЗначениеСвойства = "ПробитИзОчередиФискализации"; ДанныеXDTO.Вставить("ДополнительныеРеквизиты", ДопРеквизиты); ДанныеXDTO.Вставить("Дата", ДанныеИБ.Дата);//Почему-то дату не выгружает КонецПроцедуры
Товары нужно выгружать в ТЗ, иначе не работает, пытается обработать как ТЗ после выгрузки.
Скорее всего я пропустил какой-то этап конвертации Чека в ДанныеИБ, поэтому приходится делать конвертацию в структуру самому.
В общем, не проходит проверку полученный объект XDTO, хотя я даже свойства пытался прописывать:
Посмотрел, в объекте XDTO присутствуют и нормально конвертируются товары, можно было бы заполнить ключевые поля кассы вручную, но нет. Надо разобраться.
Пробую разобраться через копирование 1С:Касса
Посмотрим, как отправка чеков сделана в 1С:Касса. Вот все, что есть:
Т.е. есть ПКО и ПОД для кассового чека.
Процедуры: Добавить ПОД и ПКО, ПКО при отправке данных, заполнить правила обработки данных.
Проверяем теперь ЧекККМ_Отправка в Рознице. Проверил, ничего не дало, стал разбираться дальше. Ложный след.
Выгрузка чека работает
Поковырявшись, я добился чтобы касса и чек выгружались, поправив правила конвертации свойств чека прямо в коде модуля:
Решил вынести это в расширение позже, если касса воспримет чек.
Посмотрел, как выглядит чек в файле обмена:
Радует, что мой дополнительный реквизит Свойство с нужным мне значением ПробитИзОчередиФискализации есть.
Теперь можно запустить обмен с МК через веб-сервис и посмотреть, что будет, получит ли касса информацию, что чек пробит.
Пробуем загрузить чек в МК на Android
При загрузке чека через файл обмена в локальную базу 1С:МК чек сменил статус на Пробит:
До этого он был в статусе сохранен:
1С:МК отбрасывает чужие чеки, поэтому чек, который пришел в 1С:Розница с МК на Андроиде, в эту базу не загружается:
Наступило время проверить пробитие на мобильном телефоне. 1С выдала стандартную ошибку:
Но это может быть связано с тем, что я не успел за три попытки обмена зарегистрировать чек в плане обмена.
Поэтому запускаю на мобильном телефоне синхронизацию и смотрю, получил ли чек статус Пробит.
Зависание МК на Android
Если как только получаю чек, тут же его провести, чек должен уйти обратно в МК и по-идее получение данных должно быть завершено.
Но тут случилось странное — МК начала зависать при получении данных, если провести чек:
Я нашел в МК код, который работает в этот момент:
Загрузка чека выполняется в процедуре ВыполнитьУдаленнуюФискализациюЗагрузка, аеще точнее здесь (ВыполнитьУдаленнуюФискализациюЗагрузкаСервер):
Загрузка происходит тут, но как понять, она зависает или нет?
Тайм-аут для веб-сервиса составляет 20 секунд, так что из-за обращения к веб-сервису не должно зависать.:
Можно посмотреть журнал приложения.
Но увы, лог оказался не особо информативен:
Еще одна попытка — это поставить точку останова в Рознице, когда выполняется одна из функций веб-сервиса — подготовки выгрузки и получения части выгрузки, чтобы понять, проходит ли запрос на выгрузку данных:
Поиск причины зависания МК на Windows-версии
В поисках причины «зависания» МК синхронизировали МК в Windows-версии с Розницей. И зависание воспроизвелось.
Начинаем поиски. Обнаруживаем в процедуре Подключаемый_ВыполнитьУдаленнуюФискализациюЗагрузка формы ФормаВводаОплатыРМК, что не установлено поле РезультатЗагрузки.ФискальныйПризнак, поэтому 1С не заходит в ветку:
И не попадает вообще ни в какую из веток (даже в ветку ошибки), таким образом, модальное окно остается висеть.
Поиск поля «ФискальныйПризнак» в конфигурации ничего не дал, это поле передается в обмене в блоке дополнительных реквизитов, здесь:
Поэтому надо устанавливать поле при выгрузке из Розницы, для теста достатоно так:
И после этого чек успешно был отмечен как пробитый в МК:
Объем: 6 час.
Среда: 1С:Касса (3.0.10.8), 1С:Мобильная касса (для разработчиков), редакция 3 (3.14.7.0)
Потом спрашивают почему никто не идет в 1с.
Потому что не хотят в этом кале мамонта копаться.
Малейшее изменение структур — все рассыпается. Ошибку будешь искать сутками. Тут допиши, здест поменяй, там не забудь.
До первого обновления
Потому и 2500 в час на сложных вещах