Сообщаем Мобильной Кассе, что чек пробит из Розницы 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)

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 2

  1. Павел:

    Потом спрашивают почему никто не идет в 1с.

    Потому что не хотят в этом кале мамонта копаться.

    Малейшее изменение структур — все рассыпается. Ошибку будешь искать сутками. Тут допиши, здест поменяй, там не забудь.

    До первого обновления

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *