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

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

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

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

Добавить комментарий для fixin Отменить ответ

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