Онлайн проверка марок Честный знак при разрешительном порядке в розничной торговле для v.8 и 7.7

22.10.24

Интеграция - Обмен с ГосИС

Уже с 01.04.2024 вводится так называемый "разрешительный" режим продажи маркированной продукции в розницу. Это значит, что перед продажей нужно запрашивать у сервиса ЦРПТ разрешение на реализацию каждой марки. Здесь кратко опишу, как это делается, и приложу примеры для 1С 8 и 7.7.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Онлайн проверка марок для 7.7
.ert 37,50Kb
38
38 Скачать (1 SM) Купить за 1 850 руб.
Онлайн проверка марок для v.8
.epf 15,00Kb
106
106 Скачать (1 SM) Купить за 1 850 руб.

Подписано постановление правительства РФ № 1944 от 21 ноября 2023 о продаже маркированной продукции с предварительной проверкой в информационной системе «Честный ЗНАК».

Основные этапы запуска данного режима:

1 апреля 2024

Табачная продукция, Пиво, сидр, слабоалкогольные напитки (в кегах)

1 мая 2024 — для сетей из 50 и более магазинов

Молочные товары и упакованная вода

1 сентября 2024 — для всех

Молочные товары и упакованная вода

1 ноября 2024 года

Парфюмерия, БАДы и антисептики, Одежда и обувь, Фототовары, Шины, Пиво и слабоалкогольные напитки.

5 февраля 2025

Соки и безалкогольные напитки

 

Как можно выполнять такую проверку из 1С 8 и 7.7:

 

На самом деле, все просто.

 - В личном кабинете Честного Знака можно получить токен авторизации для ККТ (см 4-ю картинку).

 - Определить сервер (CDN площадку), через который пойдет проверка марки

    - До 01.04.2024 можно использовать markirovka.crpt.ru

    - После 01.04.2024 надо получать список доступных площадок проверки кода через API сервиса https://cdn.crpt.ru/api/v4/true-api/cdn/info

        - ЦРПТ вернет список доступных серверов, из них надо будет выбрать тот, что наименее нагружен

          - Нагрузку определяем через api/v4/true-api/cdn/health/check , там возвращается среднее время ожидания

 - Используя HTTPЗапрос (post) передать марку и ИНН на этот сервер (площадку) через API сервиса api/v4/true-api/codes/check

 - Получить обратно информацию по марке в JSON, разобрать ее.

 - Сделать вывод, можно ли продавать данную марку.

 - При продаже на ККТ в отраслевой реквизит чека (тег 1260) передать идентификатор запроса и отметку времени, которые вернет ЦРПТ.

 

Электронная подпись не нужна!

 

Как передавать результаты в чек ККТ:

1260:отраслевой реквизит предмета расчета
  1262: 030 идентификатор ФОИВ
  1263: 21.11.2023 дата документа основания
  1264: 1944 номер документа основания
  1265: UUID=56662403-e336-4114-88f3-6bd727f61a02&Time=1710432829649 значение отраслевого реквизита

 

В публикацию включены обработки, демонстрирующие весь процесс для 1С 8.х и 1С 7.7:

 - Получение площадок CDN из ЦРПТ через /cdn/info

 - Выбор самой быстрой из них через /cdn/health/check

 - Запрос данных о статусе марки через /codes/check и разбор полученного ответа json

 - Определение возможности продажи марки

 

ВАЖНО:

Марки должны передаваться на контроль с символом <GS> в тех местах, где он положен по правилам маркировки.

Обычно он идет перед крипто-хвостом, т.е. перед маркерами 91,92,93 в коде  марки.

Символ этот должен передаваться в JSON формате экранированным, как \u001d

Пример запроса: { "codes":[ "01048657365749062155esJWe\u001d93dGVz" ], "fiscalDriveNumber": "1234567890123456" }

Чтобы обработки из этой публикации корректно отправляли символ <GS> на контроль, марку надо вводить в следующем виде: 0104601662006162215rP23&(29)93wOyt

Т.е символ <GS> обозначать как (29)

 

Пример запроса статуса марки для 1С 8.х:

Функция ВыполнитьОнлайнКонтрольМаркиЧестныйЗнак(Марка,Токен,ИНН,НомерФН,ТестовыйКонтур,ПлощадкаCDN) Экспорт
     
        Заголовки = Новый Соответствие();
	Заголовки.Вставить("X-API-KEY",Токен);
	Заголовки.Вставить("Accept-Charset","utf-8");
	Заголовки.Вставить("Content-Type","application/json; charset=utf-8");
	
	HTTPЗапрос = Новый HTTPЗапрос("api/v4/true-api/codes/check",Заголовки);
	
	Если ЗначениеЗаполнено(ИНН) Тогда
		ЧастьЗапросаИНН = ",""inn"":"""+СокрЛП(ИНН)+"""";
	Иначе
		ЧастьЗапросаИНН = "";
	КонецЕсли;
	
	Если ЗначениеЗаполнено(НомерФН) Тогда
		ЧастьЗапросаФН  = ",""fiscalDriveNumber"":"""+СокрЛП(НомерФН)+"""";
	Иначе
		ЧастьЗапросаФН  = "";
	КонецЕсли;	
	
	ТелоЗапросаJSON = "{""codes"":["""+СокрЛП(Марка)+"""]"+ЧастьЗапросаИНН+ЧастьЗапросаФН+"}";
	
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	
        Если ЗначениеЗаполнено(ПлощадкаCDN) Тогда
            АдресРесурса = ПлощадкаCDN;
        Иначе   
	    АдресРесурса = ?(ТестовыйКонтур=Истина,"markirovka.sandbox.crptech.ru","markirovka.crpt.ru");
        КонецЕсли;
	
	Попытка
		
		ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено,Неопределено);
		
		Соединение = Новый HTTPСоединение(АдресРесурса,443,,,Неопределено,1.5,ЗащищенноеСоединение);
		
		HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); //post
		
	Исключение
		
		Сообщить(ОписаниеОшибки());
		
		Возврат Ложь;
		
	КонецПопытки;
	
	ТелоОтветаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
	
	Сообщить("Код состояния: "+HTTPОтвет.КодСостояния);
	Сообщить("Текст ответа: "+ТелоОтветаJSON);

        Возврат Истина;
 
КонецФункции

 

Пример запроса CDN-площадок для  1С 8.х

Функция ЗапроситьДанныеПлощадокCDN(Токен,ТестовыйКонтур) Экспорт
		
	Заголовки = Новый Соответствие();
	Заголовки.Вставить("X-API-KEY",Токен);
	Заголовки.Вставить("Accept-Charset","utf-8");
	Заголовки.Вставить("Content-Type","application/json; charset=utf-8");
	
	HTTPЗапрос = Новый HTTPЗапрос("api/v4/true-api/cdn/info",Заголовки);
	
	АдресРесурса = ?(ТестовыйКонтур=Истина,"markirovka.sandbox.crptech.ru","cdn.crpt.ru"); //Тут хост продуктивного контура другой
	
	Попытка
		
		ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено,Неопределено);
		
		Соединение = Новый HTTPСоединение(АдресРесурса,443,,,Неопределено,1.5,ЗащищенноеСоединение);
		
		HTTPОтвет = Соединение.Получить(HTTPЗапрос); //GET
		
	Исключение
				
		Сообщить(ОписаниеОшибки());
		
		Возврат Ложь;
		
	КонецПопытки;
	
	ТелоОтветаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
	
	Сообщить("Код состояния: "+HTTPОтвет.КодСостояния);
	Сообщить("Текст ответа: "+ТелоОтветаJSON);
	
	Если HTTPОтвет.КодСостояния = 200 Тогда
		
		Возврат Истина;
				
	Иначе	
		
		Сообщить("Не удалось получить площадку CDN. Код ответа: "+Строка(HTTPОтвет.КодСостояния));
		
		Возврат Ложь;

	КонецЕсли;
	
КонецФункции

 

Пример проверки CDN-площадки для  1С 8.х

Функция ПроверитьПлощадкуCDN(Токен,ПлощадкаCDN) Экспорт
	
	Заголовки = Новый Соответствие();
	Заголовки.Вставить("X-API-KEY",Токен);
	Заголовки.Вставить("Accept-Charset","utf-8");
	Заголовки.Вставить("Content-Type","application/json; charset=utf-8");
	
	HTTPЗапрос = Новый HTTPЗапрос("api/v4/true-api/cdn/health/check",Заголовки);
		
	АдресРесурса  = ПлощадкаCDN;
	ПортРесурса   = 443;
	ИспШифрование = Истина;
	
	ВремяЗапроса = 0;
	
	Попытка
		
		Если ИспШифрование Тогда
			ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено,Неопределено);
		Иначе	                   
			ЗащищенноеСоединение = Неопределено;
		КонецЕсли;	
		
		Соединение = Новый HTTPСоединение(АдресРесурса,ПортРесурса,,,Неопределено,1.5,ЗащищенноеСоединение);
		
		ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
		
		HTTPОтвет = Соединение.Получить(HTTPЗапрос); //Get
		
		ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
		
		ВремяЗапроса = ВремяОкончания - ВремяНачала;
		
	Исключение
		
		//Нет соединения или таймаут - продажа разрешена
		
		Сообщить(ОписаниеОшибки());
		
		Возврат -1;
		
	КонецПопытки;
	
	ТелоОтветаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
	
	Сообщить("Код состояния: "+HTTPОтвет.КодСостояния);
	Сообщить("Текст ответа: "+ТелоОтветаJSON);
		
	Если HTTPОтвет.КодСостояния=200 Тогда
		
		//ВремяОжиданияСтр = ПолучитьИзСтрокиJSON(ТелоОтветаJSON,"avgTimeMs");
				
		Возврат ВремяЗапроса ;
						
	Иначе
				
		Сообщить("Не удалось проверить площадку CDN. Код ответа: "+Строка(HTTPОтвет.КодСостояния));
		
		Возврат -1;
		
	КонецЕсли;	
	
	
КонецФункции

 

Пример запроса статуса марки для 1С 7.7 :

Функция ВыполнитьОнлайнКонтрольМаркиЧестныйЗнак(Марка,Токен,ИНН,НомерФН,ТестовыйКонтур,ПлощадкаCDN)
	
        Если ПустоеЗначение(ПлощадкаCDN)=0 Тогда
            АдресРесурса = ПлощадкаCDN;
        Иначе   
	    АдресРесурса = ?(ТестовыйКонтур=1,"markirovka.sandbox.crptech.ru","markirovka.crpt.ru");
        КонецЕсли;
	
	АдресРесурса = "https://"+АдресРесурса+"/api/v4/true-api/codes/check";
	
	HTTPЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
	HTTPЗапрос.Option(2,"utf-8");
	HTTPЗапрос.SetTimeouts(1500, 1500, 1500, 1500);
	
	HTTPЗапрос.Open("POST",АдресРесурса,1);
	
	HTTPЗапрос.SetRequestHeader("X-API-KEY", СокрЛП(Токен));
	HTTPЗапрос.SetRequestHeader("Accept-Charset", "utf-8");
	HTTPЗапрос.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
	
	Если ПустаяСтрока(ИНН)=0 Тогда
		ЧастьЗапросаИНН = ",""inn"":"""+СокрЛП(ИНН)+"""";
	Иначе
		ЧастьЗапросаИНН = "";
	КонецЕсли;
	
	Если ПустаяСтрока(НомерФН)=0 Тогда
		ЧастьЗапросаФН  = ",""fiscalDriveNumber"":"""+СокрЛП(НомерФН)+"""";
	Иначе
		ЧастьЗапросаФН  = "";
	КонецЕсли;	
	
	ТелоЗапросаJSON = "{""codes"":["""+СокрЛП(Марка)+"""]"+ЧастьЗапросаИНН+ЧастьЗапросаФН+"}"; 
	
	HTTPЗапрос.Send(ТелоЗапросаJSON);
	ТаймаутОжидания = 5;
	Попытка
		РезЗапроса = HTTPЗапрос.WaitForResponse(ТаймаутОжидания);
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат 0;
	КонецПопытки;
	
	Если РезЗапроса = -1 Тогда
		КодСостояния = HTTPЗапрос.status();
		КодСостоянияТекст = HTTPЗапрос.statusText();
		ТелоОтветаJSON = СокрЛП(HTTPЗапрос.ResponseText());
		
		Сообщить("Код состояния: "+Строка(КодСостояния));
		Сообщить("Состояние: "+КодСостоянияТекст);
		Сообщить("Текст ответа: "+ТелоОтветаJSON); //Строка длинная, может не влезть, в файле для скачивания она делится на короткие строки
        
              Возврат 1;

       Иначе
  
        Сообщить("Нет связи с ЦРПТ.");
        Возврат 0;
      
       КонецЕсли;  

КонецФункции

 

Пример запроса CDN-площадок для  1С 7.7 :

Функция ЗапроситьДанныеПлощадокCDN(Токен,ТестовыйКонтур) Экспорт
		
	АдресРесурса = ?(ТестовыйКонтур=1,"markirovka.sandbox.crptech.ru","cdn.crpt.ru"); //Тут хост продуктивного контура другой
	АдресРесурса = "https://"+АдресРесурса +"/api/v4/true-api/cdn/info";
	
	HTTPЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
	HTTPЗапрос.Option(2,"utf-8");
	HTTPЗапрос.SetTimeouts(3000, 3000, 3000, 3000);
	
	HTTPЗапрос.Open("GET",АдресРесурса,1);
	
	HTTPЗапрос.SetRequestHeader("X-API-KEY", СокрЛП(Токен));
	HTTPЗапрос.SetRequestHeader("Accept-Charset", "utf-8");
	HTTPЗапрос.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
	
	ВремяНачала = _GetPerformanceCounter();
	
	HTTPЗапрос.Send();
	ТаймаутОжидания = 5;
	Попытка
		РезЗапроса = HTTPЗапрос.WaitForResponse(ТаймаутОжидания);
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат 0;
	КонецПопытки;
	
	ВремяОкончания = _GetPerformanceCounter();
	ВремяЗапроса = ВремяОкончания - ВремяНачала;
	
	Если РезЗапроса = -1 Тогда
		КодСостояния = HTTPЗапрос.status();
		КодСостоянияТекст = HTTPЗапрос.statusText();
		ТелоОтветаJSON = СокрЛП(HTTPЗапрос.ResponseText());
		
		Сообщить("Код состояния: "+Строка(КодСостояния));
		Сообщить("Состояние: "+КодСостоянияТекст);
		Сообщить("Текст ответа: "+ТелоОтветаJSON);
		
		Если КодСостояния=200 Тогда
			
			Возврат 1;
			
		Иначе	
						
			Сообщить("Не удалось получить площадку CDN. Код ответа: "+Строка(КодСостояния));
			
			Возврат 0;
			
		КонецЕсли;
		
	Иначе
		
		Сообщить("Нет связи с ГИС МТ.");
		Возврат Рез;
		
	КонецЕсли;	
	
КонецФункции

 

Пример проверки CDN-площадки для  1С 7.7

Функция ПроверитьПлощадкуCDN(Токен,ПлощадкаCDN) Экспорт
		
	АдресРесурса  = ПлощадкаCDN;
	ПортРесурса   = 443;
	
	ИспШифрование = 1;
	
	Если ИспШифрование=1 Тогда
		АдресРесурса = "https://"+АдресРесурса;
	Иначе	
		АдресРесурса = "http://"+АдресРесурса;
	КонецЕсли;
		
	АдресРесурса = АдресРесурса +"/api/v4/true-api/cdn/health/check";
	
	HTTPЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
	HTTPЗапрос.Option(2,"utf-8");
	HTTPЗапрос.SetTimeouts(3000, 3000, 3000, 3000);
	
	HTTPЗапрос.Open("GET",АдресРесурса,1);
	
	HTTPЗапрос.SetRequestHeader("X-API-KEY", СокрЛП(Токен));
	HTTPЗапрос.SetRequestHeader("Accept-Charset", "utf-8");
	HTTPЗапрос.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
	
	ВремяНачала = _GetPerformanceCounter();
	
	HTTPЗапрос.Send();
	ТаймаутОжидания = 5;
	Попытка
		РезЗапроса = HTTPЗапрос.WaitForResponse(ТаймаутОжидания);
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат -1;
	КонецПопытки;
	
	ВремяОкончания = _GetPerformanceCounter();
	ВремяЗапроса = ВремяОкончания - ВремяНачала;
	
	Если РезЗапроса = -1 Тогда
		КодСостояния = HTTPЗапрос.status();
		КодСостоянияТекст = HTTPЗапрос.statusText();
		ТелоОтветаJSON = СокрЛП(HTTPЗапрос.ResponseText());
		
		Сообщить("Код состояния: "+Строка(КодСостояния));
		Сообщить("Состояние: "+КодСостоянияТекст);
		Сообщить("Текст ответа: "+ТелоОтветаJSON);
		
		Если КодСостояния=200 Тогда
						
			//ВремяОжиданияСтр = ПолучитьИзСтрокиJSON(ТелоОтветаJSON,"avgTimeMs");
						
			Возврат ВремяЗапроса;
			
		Иначе	
			
			Сообщить("Не удалось получить площадку CDN. Код ответа: "+Строка(КодСостояния));
			
			Возврат -1;
			
		КонецЕсли;
		
	Иначе
		
		Сообщить("Нет связи с ГИС МТ.");
		Возврат -1;
		
	КонецЕсли;	
	
КонецФункции

 

UPD 15.03.2024

Добавлено получение площадок CDN

Добавлен выбор наилучшей площадки CDN

 

UPD 21.03.2024

Добавлена проверка площадок CDN

Добавлена передача номера ФН при проверке марки (это рекомендуется делать, чтобы при "подозрительной активности" ЦРПТ блокировало запросы по номеру ФН а не токен целиком")

 

UPD 25.03.2024

Добавлено важно замечание относительно символа <GS> в коде марки, отправляемом на контроль.

Обновлены обработки.

 

UPD 27.03.2024

Все таймауты увеличены до 15 секунд. Как показала практика эксплуатации, 3 секунд крайне мало.

 

UPD 01.04.2024

Добавил экранирование символа GS1 (код 29) при передаче в ЦРПТ.

 

UPD 02.04.2024

Добавил обработку тега isOwner в ответе ЦРПТ при проверке марки

Проверено на следующих конфигурациях и релизах:

  • Управление торговлей, редакция 10.3, релизы 10.3.87.2

Честный Знак Разрешительный порядок Онлайн проверка марок Розница ЦРПТ CDN площадки

См. также

Оптовая торговля Розничная торговля ККМ ЭДО и ОФД Обмен с ГосИС Системный администратор Программист Оперативный учет 7.7 Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 1С:Комплексная 7.7 1С:Торговля и склад 7.7 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Платные (руб)

Подключение фискального регистратора к 1С 7.7 в режиме онлайн-кассы (в соответствии с 54-ФЗ). Поддержка крайних версий драйверов ККТ: ДТО 10 и ДТО 8 для Атол, 4.15, 5.16 для Штрих-М. Поддержка протоколов ФФД 1.0, 1.05, 1.1 и 1.2, развитые настройки для применения частичных оплат и авансов в оптовой и розничной торговле. Поддержка чеков коррекции всех версий. Поддержка розничной продажи маркированной продукции (ЕГАИС, табак, обувь, лекарства, шины, одежда, белье, парфюмерия, молочная продукция, вода и пр.). Вывод электронного чека (на е-майл, телефон) по требованию покупателя, поддерживаются комбинированные типы оплаты, режим эмуляции печати чека на ФР. Полный цикл работы из 1С 7.7 с маркировкой Честный ЗНАК (ГИСМТ, ЦРПТ) из 1С 7.7. ЭДО (табак, обувь, шины, одежда, молочная продукция, вода и прочие группы товаров) для розницы и опта (приемка и оптовая отгрузка маркированной продукции). Поддерживается как объемно-сортовой учет (ОСУ) так и поштучный (поэкземплярный) учет.

2000 руб.

28.03.2017    479035    4452    3489    

2456

Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Обмен с ГосИС Программист Бухгалтер Оперативный учет 7.7 Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 1С:Комплексная 7.7 1С:Торговля и склад 7.7 1С:Упрощенное налогообложение 7.7 Сельское хозяйство и рыболовство Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Пищевая промышленность Россия Бухгалтерский учет Управленческий учет Платные (руб)

Полностью автоматизированный обмен между конфигурациями 1С 7.7 и ФГИС Меркурий через Ветис.API для всех видов деятельности (Опт, Розница, Производство). Для организации обмена с ФГИС Меркурий требуется минимальная доработка конфигураций (поддерживается "из коробки" 1С: "Торговля и склад ред. 9.2", 1С: "Комплексная ред. 4.5", 1С: "Бухгалтерия 7.7", 1С: "УСН 7.7", 1С Предприниматель, другие конфигурации по заказу, включая нетиповые и самописные). Модуль разработан таким образом, чтобы минимизировать затраты по внедрению в произвольную конфигурацию на базе 1С 7.7. Вы можете БЕСПЛАТНО скачать демо-версию без ограничения по функционалу и опробовать решение в полном объеме перед покупкой. В данном программном продукте реализованы все технические требования Россельхознадзора по обмену в формате 2.0 и 2.1. Решение прошло опытную эксплуатацию и тестирование на крупных объектах всех видов деятельности: Производство, Опт, Розница.

10000 руб.

21.11.2018    54036    156    105    

70

Оптовая торговля Розничная торговля Обмен с ГосИС Бухгалтер Оперативный учет 7.7 1С:Торговля и склад 7.7 Бухгалтерский учет Акцизы Платные (руб)

Дорогие друзья! Предлагаю Вашему вниманию обработку, предназначенную для обмена данными из Вашей учетной системы с ЕГАИС, через универсальный транспортный модуль (УТМ). В обработке реализован весь функционал обмена: - загрузка справочных данных по контрагентам, производителям, импортерам алкогольной продукции; - загрузка справочных данных по номенклатуре алкогольной продукции; - загрузка остатков; - помощник сопоставления справочных данных и запись их в базу данных; - загрузка приходных ТТН и справок Б от поставщиков, отправка по ним актов всех типов, создание по ним приходных документов; - выгрузка расходных ТТН покупателям; - управление Марками и ведение Регистра 3; Обработку возможно использовать автономно, не внося изменений в Вашу Учетную систему. Код открыт.

6000 руб.

13.11.2015    126877    172    2529    

233

Обмен с ГосИС Программист Платформа 1С v7.7 1С:Комплексная 7.7 1С:Торговля и склад 7.7 Ювелирная промышленность и торговля Россия Бухгалтерский учет Абонемент ($m)

Интеграция 1С 7.7 с ГИИС ДМДК (маркировка ювелирных изделий и драгоценных камней). Данная публикация является попыткой выяснения спроса на полноценную интеграцию конфигураций на базе платформы 1С 7.7 с ГИИС ДМДК (https://dmdk.ru/). На текущий момент реализована печать ценников-бирок, содержащие УИН продукции в формате ШК Datamatrix. Имеются планы разработки решения для учета розничных продаж через УТМ (Универсальный Транспортный Модуль) из 1С 7.7.

1 стартмани

01.03.2022    5990    1    victuan    0    

17

Обмен с ГосИС Программист Платформа 1С v7.7 Конфигурации 1cv7 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Абонемент ($m)

Конец 2021 и начало 2022 года принесло много увлекательной работы в связи с переходом на ГИИС ДМДК. Все движения драгоценных металлов и камней должны отражаться в ГИИС. Для этого есть два пути: ручной ввод или интеграция существующей учетной системы с ГИИС. Ручной ввод не подходит тем организациям, которые имеют большое количество движений, а интеграция слишком дорога для небольших магазинчиков. Но самое неприятное в том, что в настоящий момент для интеграции требуется обезличенная ЭЦП, а выдавать ее никто не может или не имеет права. Это и привело меня к разработке продукта, который бы позволил автоматизировать часть работы с помощью эмуляции действий пользователя в личном кабинете.

1 стартмани

04.02.2022    5133    0    aldan    0    

3

ККМ Обмен с ГосИС Бухгалтер Пользователь Оперативный учет 7.7 1С:Торговля и склад 7.7 Розничная и сетевая торговля (FMCG) Россия Бухгалтерский учет Управленческий учет Абонемент ($m)

Обработка для загрузки базы кодов цен в ККТ "Меркурий" с помощью программы-конфигуратора MercConfig из базы Торговля и склад 9.2 1С: Предприятие 7.7.

1 стартмани

25.01.2021    8733    1    aleksandr_leiman    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. pablo_escobar 15.03.24 11:37 Сейчас в теме
В документации сказано
адрес для обращения к codes/check (https://markirovka.crpt.ru) будут действовать до 1 апреля
2024 года. С этой даты метод можно будет вызывать только по адресам CDN-площадок,
полученных методом /cdn/info
2. kirlog 131 15.03.24 11:55 Сейчас в теме
(1) Но методика запроса там будет та же, только адреса другие
3. pablo_escobar 15.03.24 12:31 Сейчас в теме
(2)Методика чуть посложнее, предварительно нужно получить сервера, потом проверить их доступность, потом только слать марку на проверку.
4. kirlog 131 15.03.24 14:26 Сейчас в теме
(3) Получать сервера и проверять доступность надо будет в начале смены или при недоступности выбранной ранее площадки. Этот механизм тоже выложу здесь, как сделаю.
89. TVA_11 22.10.24 12:53 Сейчас в теме
(2)
Подскажите, а у вас в обработке есть пример вывода Тегов в чек ККТ?

И что нового нужно выводить в чек - в случае маркированного товара?
90. kirlog 131 22.10.24 15:22 Сейчас в теме
(89) Здравствуйте!
В обработках нету. Но тут в обсуждении есть. Для ККТ АТОЛ 15-е сообщение, для ККТ ШТРИХ 51-е.
Но это теги специфичные именно для разрешительного режима.
Для любого маркированного товара кроме них в ФФД 1.2 еще надо передавать тег 1163 (там полный код маркировки с криптохвостом и символами GS1) и результат онлайн-проверки марок средствами ККТ, а для ФФД 1.05-1.1 тег 1162 (там хитро кодированный КИЗ - GTIN+SN)
Кроме того, для различных отраслей (например аптек, фармацевтики) существуют и еще дополнительные теги, которые надо передавать в ККТ.
94. TVA_11 23.10.24 12:35 Сейчас в теме
(90) Правильно понимаю, что в случае сбоя, ошибки, в чек надо записать ответ от Честного Знака, чтобы подтвердить факт обращения к нему:

И теги 1260, 1163, 1162 - и есть искомая информация?

пс.
Чтобы иметь, что ответить на претензию к пробитию в чеке скомпрометированного/выведенного из оборота кода маркировки.
5. user2067856 17.03.24 22:52 Сейчас в теме
скажите пожалуйста, а всегда ли значения такие ?
1260:отраслевой реквизит предмета расчета
1262: 030 идентификатор ФОИВ
1263: 21.11.2023 дата документа основания
1264: 1944 номер документа основания
6. kirlog 131 18.03.24 00:30 Сейчас в теме
(5) Над данный момент - да, всегда такие. По крайней мере, типовые программы 1С шлют именно так. В УНФ 3, например, эти значения прописаны прямо в коде. Но со временем это может измениться, конечно.
78. Stan 33 22.08.24 12:49 Сейчас в теме
(6) А можете подсказать, где в типовом коде УНФ прописываются эти значения (в каком модуле, обработке)? Не могу найти. Заранее благодарю.
79. kirlog 131 26.08.24 14:10 Сейчас в теме
(78) Добрый день!

ОбщийМодуль.ОборудованиеЧекопечатающиеУстройства.Модуль(4622, 49)

Процедура ЗаполнитьДанныеЗапросПроверкиКода(Позиция)
	
	ЗапросПроверкиКода = Позиция.ЗапросПроверкиКода; 
	ОтраслевойРеквизит = Позиция.ОтраслевойРеквизит;
	
	Если Не ПустаяСтрока(ЗапросПроверкиКода.ИдентификаторЗапроса) И Не ПустаяСтрока(ЗапросПроверкиКода.ВременнаяМетка) Тогда
		ОтраслевойРеквизит.ИдентификаторФОИВ = "030"; // 1262 - "030"
		ОтраслевойРеквизит.ДатаДокументаОснования = Дата("20231121"); // 1263 - "21.11.2023"
		ОтраслевойРеквизит.НомерДокументаОснования = "1944"; // 1264 - "1944"
		ЗначениеРеквизита = "UUID=%1&Time=%2";             
		ЗначениеРеквизита = СтрШаблон(ЗначениеРеквизита, ЗапросПроверкиКода.ИдентификаторЗапроса, ЗапросПроверкиКода.ВременнаяМетка); 
		ОтраслевойРеквизит.ЗначениеРеквизита = ЗначениеРеквизита;  // 1265  
	КонецЕсли;
	
КонецПроцедуры
Показать
80. Stan 33 27.08.24 20:57 Сейчас в теме
7. Tarlich 116 18.03.24 11:37 Сейчас в теме
(8) (не совсем в теме) а проверка марок средствами ККТ не решает эту проблему ?
т.е если раньше мне надо было в момент приема для ИП постоянно идти в Бухгалтерию за ЭЦП (т.к там ЭДО)
то теперь мне надо будет ЭЦП еше на каждую точку ? или судя по коду пока токена достаточно ? в Типовых же есть настройка СУЗ где мы вводим данные Токена - или это не то ?
8. kirlog 131 18.03.24 16:11 Сейчас в теме
(7) Проверка марок средствами ККТ не решает вопрос. Новый механизм онлайн проверки марок вводится в дополнение к нему. Одного механизма им показалось мало:)
ЭЦП на каждую точку не нужно. Достаточно токена. По крайней мере до 01.04.2025. Что будет после, пока неясно. Обещают оффлайн проверку по аналогии с УТМ ЕГАИС.
В типовых (новых релизах 2024г) есть справочник "токены авторизации", который можно открыть из панели "Обмен с ИС МП (Обувь, одежда, табак..)". В этом справочнике можно указать токен с типом "ИС МП (розница)". Вот этот тот самый токен, который будет использоваться на кассовых местах для онлайн проверки марок без ЭЦП.
Однако, насколько мне известно, типовые конфигурации 1С на данный момент не в полной мере поддерживают новый механизм. Обновления с полноценной поддержкой обещают в ближайшее время.
9. AlexJustAlex 3 24.03.24 21:49 Сейчас в теме
Наверное надо КодОшибки = "5" пропускать.
Это вроде ошибка отсуствие криптохвоста в марке, в сигаретах и молочке его у нас нет, в пиве вроде тоже.
С криптохвостом видимо слишком большой QR-код получается, не помещается у производителей.
И ещё в марке есть код проверки - "93" + 4 символа, с ними не находит это нужно отрезать.

А остальное ОК, работает, спасибо.
10. kirlog 131 25.03.24 02:15 Сейчас в теме
(9) В табаке, молочке и пиве, крипто-хвост это 4 последние символа "кода проверки". В молочке и пиве есть маркер "93" для него, а в табаке код проверки идет прямо после МРЦ.

Но с табаком проверка работает корректно: на нормальные марки, считанные с реальных пачек, ошибку 5 я не получал. Они нормально ищутся целиком. Но если специально исказить код проверки, ошибка тут как тут. А значит, у ЦРПТ это учтено. Поэтому, я пока не вижу необходимости игнорировать ошибку 5, по крайней мере, в табаке.

Что касается молока и пива, в методическом руководстве ЦРПТ есть пример, где марка передается на контроль целиком, включая "93" и код проверки. Может быть, проблема в том, что надо обязательно передать еще символ <GS> \u001d перед "93" ?
Мне пока негде проверить, нет токенов с молоком или пивом в обороте.

Вот из руководства.

>>Пример тела запроса:
{ "codes":[ "01048657365749062155esJWe\u001d93dGVz" ], "fiscalDriveNumber": "1234567890123456" }
11. kirlog 131 25.03.24 15:19 Сейчас в теме
(9)Проверил молочную продукцию. Перед крипто-хвостом надо отправлять на контроль символ <GS> в экранированном виде \u001d для тех видов маркировки, где он предполагается.

Вот так: { "codes":[ "01048657365749062155esJWe\u001d93dGVz" ], "fiscalDriveNumber": "1234567890123456" }

Тогда код находится, крипто-хвост корректно обрабатывается, проблем нет.

По итогу:
- Игнорировать ошибку 5 не надо
- Отбрасывать код проверки и маркер "93" не надо
- Марка передается на контроль целиком, включая символы <GS>

Публикация обновлена.
Обработки обновлены.
Кто уже скачал обработки, пишите в личку, я отправлю новые версии.
26. HSV 3 01.04.24 15:30 Сейчас в теме
(11)
\u001d

Все таки не пойму как экранировать.
Если так делаю
ПодготовленныйШК = СтрЗаменить(_Марка,Символ29,"\u001d");
выдает:
Текст запроса: {"codes":["0104600605031841215,T**q\\u001d93n***"],"inn":"150201234567","fiscalDriveNumber":"1234567890123456"}
Код состояния: 200
Состояние: OK
Текст ответа: {"code":0,"description":"ok","codes":[{"cis":"0104600605031841215,T**q\\u001d93n***","valid":true,"printView":"0104600605031841215,T**q\\u001d93n***","gtin":"04600605031841","verified":f
alse,"message":"cannot find code [0104600605031841215,T**q\\u001d93n***] in db","found":false,"realizable":false,"utilised":false,"isBlocked":false,"isOwner":false,"errorCode":10,"isTracking":false,"s
old":false,"grayZone":false}],"reqId":"741b3894-cbe6-420b-9b52-3527a697286c","reqTimestamp":1711973307102}
Продажа разрешена: 0
ИД запроса:
Временная метка:
Время запроса: 335
Текст ошибки: КМ не найден в ГИС МТ. cannot find code [0104600605031841215,T**q\u001d93n***] in db

*****************
Если отправлять марку как есть, то выдает
Код состояния: 400
Состояние: Bad Request
Текст ответа: {"code":400,"description":"400 BAD_REQUEST \"Failed to read HTTP message\"","codes":[]}
Продажа разрешена: 0
ИД запроса:
Временная метка:
Время запроса: 0
Текст ошибки: Не удалось выполнить проверку марки. Код ответа: 400. 400 BAD_REQUEST "Failed to read HTTP message"
12. basil_m 6 28.03.24 11:20 Сейчас в теме
Добрый день! А вообще на каком этапе это должно проводится? Получается при каждом сканировании маркированного товара или уже потом перед фискализацией всего чека? С десяток маркированных товаров и наверное чек минут 5 будет кассир пробивать.
Интересно кто-нибудь в реальных условиях это опробовал, как долго это происходит?
Реквизиты 1260, 1262, 1263, 1264 получается при регистрации каждой позиции надо вносить. Нет примера реквизита 1260? Еще интересно откуда берутся значения реквизитов 1262, 1263 и 1264, они у всех одинаковые что-ли?
14. kirlog 131 28.03.24 12:23 Сейчас в теме
(12)Добрый день!
Рекомендуется выполнять онлайн-проверку при добавлении марки в чек, т.е. при сканировании каждой марки.
На каждую марку ЦРПТ обещает ответ за 1.5 секунды (что уже сейчас не везде так, хотя, очевидно, это зависит от канала связи и прочих вещей, а не только от ЦРПТ). У меня на тестах никогда не было задержек более 800 мс. Однако, на кассовых местах со слабым интернетом наблюдаю 2-3 секунды. Это терпимо.
Теги 1262, 1263, 1264 у всех одинаковые.
Тег 1265 это идентификатор и временная метка, которые вернет ЦРПТ в ответ на запрос онлайн-проверки марки, в случае если ее продажа разрешена.
Пример программирования тега 1260 на драйвере АТОЛ 10 сейчас напишу ответом на следующее сообщение.
13. vitaliysv 28.03.24 12:08 Сейчас в теме
Добрый день

Может у кого есть пример кода записи тега 1260 для 1с77 и драйвера Атол10

Вот мой код:

Объект.setParam(1262, "030");
Объект.setParam(1263, "21.11.2023");
Объект.setParam(1264, "1944");
Объект.setParam(1265, "UUID=e4a7049b-e0ad-4d89-9e10-11d118106f8f&Time=1711615815316");

Если Объект.utilFormTlv() = 0 Тогда
Тег1260 = Объект.getParamString(Объект.LIBFPTR_PARAM_TAG_VALUE);
КонецЕсли;


Если ПустоеЗначение(Тег1260) = 0 Тогда
Объект.setParamStrHex(1260, Тег1260);
КонецЕсли;


после регистрации позиции получаю ошибку:
148: Ошибка программирования реквизита 1260 (Ошибка программирования реквизита 1260
15. kirlog 131 28.03.24 12:29 Сейчас в теме
(13)Добрый день!

У Вас ошибка вот в этой строке:

Тег1260 = Объект.getParamString

Надо использовать:

Тег1260 = Объект.getParamStringHex

Мой рабочий пример:

ДрайверККМ.setParam(1262, "030");
ДрайверККМ.setParam(1263, "21.11.2023");
ДрайверККМ.setParam(1264, "1944");
ДрайверККМ.setParam(1265, "UUID="+СокрЛП(ИдЗапроса)+"&Time="+СокрЛП(ВременнаяМетка));
ДрайверККМ.utilFormTLV();

ДанныеТега1260 = ДрайверККМ.getParamStringHex(ДрайверККМ.LIBFPTR_PARAM_TAG_VALUE);

//.........

ДрайверККМ.setParamStrHex(1260,ДанныеТега1260);
Показать


Также, учитывайте, что метод utilFormTLV() очищает все установленные ранее теги.
Поэтому, его надо использовать до того, как заполняются остальные реквизиты чека.
Т.е. порядок такой:

- формируем тег 1260, запоминаем его в переменной
- заполняем остальные параметры чека
- заполняем тег 1260
HSV; basil_m; +2 Ответить
16. vitaliysv 28.03.24 12:31 Сейчас в теме
(15) Огромное Вам спасибо
18. basil_m 6 28.03.24 13:44 Сейчас в теме
(15)
utilFormTLV


ИдЗапроса и Временная ветка берем из ответа ТелоОтветаJSON ?
19. kirlog 131 28.03.24 15:57 Сейчас в теме
(18) Да. Это параметры reqId и reqTimestamp в этом ответе.
В обработках, присоединенных к публикации, это есть.
63. nevs1 15.04.24 23:26 Сейчас в теме
(15) Подскажите, пожалуйста, не пойму, что не так. Вроде все скопировано из Вашего примера:

ECR.setParam(1262, "030");
ECR.setParam(1263, "21.11.2023");
ECR.setParam(1264, "1944");
ECR.setParam(1265, тз.ДанныеТега1265);
ECR.utilFormTLV();

ДанныеТега1260 = ECR.getParamStringHex(ECR.LIBFPTR_PARAM_TAG_VALUE);

//заполнение других тегов

ECR.setParamStrHex(1260, ДанныеТега1260);


Но появляется ошибка:

Объекту 0x0697E418 присвоен код ошибки 148 [Ошибка программирования реквизита 1260 (Превышение длины реквизита)]
64. nevs1 15.04.24 23:43 Сейчас в теме
(63) Нашлась ошибка. При создании колонки ТЗ ДанныеТега1265 убрала указание длины и все заработало. Спасибо!
65. nevs1 16.04.24 12:41 Сейчас в теме
(15) Подскажите, пожалуйста, что не так.

В 1с77 в документ добавляю две позиции номенклатуры, а в логе первая позиция нормально проходит, а на второй ошибка. Видно, что для второй позиции теги 1262-1265 не прописываются, и прописана ошибка Код ошибки ККТ - 4459h. Соответственно в ЧЗ чек уходит только с одной первой позицией.

Код из 1с:
Пока тз.ПолучитьСтроку()=1 Цикл

	ECR.setParam(1262, "030"); 
	ECR.setParam(1263, "21.11.2023"); 
	ECR.setParam(1264, "1944"); 
	ECR.setParam(1265, тз.ДанныеТега1265); 
	ECR.utilFormTLV(); 

	ДанныеТега1260 = ECR.getParamStringHex(ECR.LIBFPTR_PARAM_TAG_VALUE); 

       //данные других тегов

       ECR.setParamStrHex(1260, ДанныеТега1260);

	Если ОшибкаДрайвера()=0 Тогда
		ECR.registration(); 
	Иначе
		Возврат;
	КонецЕсли;
		
КонецЦикла; 
Показать

Фрагмент лога:

Скрытый текст
66. kirlog 131 16.04.24 14:24 Сейчас в теме
(65)Сложно сказать что то определенное без полного кода формирования чека в 1С.
Судя по логу, вторая регистрация продажи как то сильно отличается от первой.
Видимо, что то совсем иное происходит в цикле на второй строке.
Похоже, вторая позиция у Вас идет как немаркированная. Нет ни марки в логе, ни попытки передать тег 1260, еще тега 1212 нет (а он обязательный).

Почему Вы не проверяете результат выполнения команды registration ?
По идее, если эта команда не прошла, надо запрашивать у драйвера описание ошибки, и отменять чек.
Драйвер даст более менее развернутое описание ошибки, что именно не так. Код ошибки из лога не всегда однозначен.

Например, так:

Ответ = ДрайверККМ.registration();
Если Ответ <> 0 Тогда
	Сообщить(ДрайверККМ.errorDescription());
	ДрайверККМ.cancelReceipt();
	Возврат 0;
КонецЕсли;


Ну и общий совет для 7.7: всегда и везде для передачи строчных данных в драйвер ККТ используйте СокрЛП()
Иначе драйвер будет получать строку добитую пробелами до длины поля в 1С.
67. nevs1 16.04.24 17:42 Сейчас в теме
(66) Большое спасибо за направление!
Команда registration ошибок не выдает.
Одна и та же марка почему-то может проходить как маркированный товар, так и немаркированный.
Продолжаю искать.
68. kirlog 131 16.04.24 20:11 Сейчас в теме
(67)Если команда registration не выдает ошибок (Вы проверили errorCode() и errorDescription() после ее выполнения), значит позиция добавилась в чек.
Но если позиция не маркированная (а по логу именно так), в ЧЗ она не пойдет.
69. nevs1 16.04.24 20:40 Сейчас в теме
(68) Большое спасибо за помощь!

Кажется немного стало понятно, почему так отрабатывает.
Все дело в старой проверке средствами драйвера. Непонятно, как приходят ответы.
С выбывшей маркой может быть ответ 15, а с рабочей маркой может быть ответ 5 (правда, сюда же входят случаи превышения ожидания).
Для одной и той же марки могут приходить разные ответы.
Соответственно, так было задумано, если результат проверки <> 15, то товар продается как немаркированный.

Правильно ли я понимаю, что такие случаи записываются в статистику отклонений ЧЗ, как "Продажа товара без проверки КМ"?

На форумах пишут, что сейчас М+ необязательный параметр. Можно, чтобы было просто М.
Подскажите, пожалуйста, чтобы мне не разбираться еще и со старым механизмом, можно ли принудительно установить такое значение нужного тега, чтобы в чеке печаталась просто М?
70. kirlog 131 16.04.24 21:56 Сейчас в теме
(69) По проверке марки средствами ККТ, да, не важно М+ будет, М-, или просто М.
Важно, чтобы такая проверка просто выполнялась для данной марки. Это обязательно.
Проверка марки средствами ККТ это уведомительный механизм.
Важно отличать этот механизм от нового - разрешительного, того что обсуждается в этой публикации.
Механизмы эти не связаны. Сейчас нужно использовать оба.

А вот продавать товар как немаркированный при получении ответа М-, это, с моей точки зрения, нарушение.
Марка у Вас в таком случае не уходит с оборота в ЧЗ, т.к. Вы ее не передаете в чек.
Кроме того, что эти марки повисают у Вас в обороте, а за это обещают штрафовать по истечении срока годности партии (и в лекарствах уже штрафуют), отсутствие в чеке кода маркировки, например на сигареты, это уже сейчас 100% штраф при первом же обращении покупателя "куда следует" или контрольной закупке.

Поэтому, методика проверки средствами ККТ должна быть такая:
- Проверяем все марки в чеке
- Если проверка не прошла, не пробиваем весь чек.
- Или изымаем из чека ту марку, что вызывает проблемы, и не продаем этот товар вовсе, т.к. это скорее всего некорректная марка с точки зрения структуры кода, и ошибку мы получим все равно на добавлении ее в чек.
- Если проверка прошла, пробиваем в чеке все марки с теми статусами, что вернула проверка (М+/М-/М)

Это, опять же, мое личное мнение.
83. user1991633 26.09.24 17:14 Сейчас в теме
(15) тег 1260 формируется же для каждой позиции маркируемого товара, как тогда быть с очисткой тегов?
тег сформируем и сохраним, затем заполним 1260. Но следующая позиция - когда будем формировать тег для нее - ведь произойдет снова очистка.
84. kirlog 131 26.09.24 21:31 Сейчас в теме
(83) Тег 1260 (отраслевой реквизит предмета расчета) подчинен тегу 1059 (предмет расчета).
Тегов 1059 - предметов расчета в чеке может быть несколько, по количеству позиций в чеке.
Соответственно, когда добавляем в чек очередную позицию, добавляем тег 1059 и при необходимости подчиняем ему тег 1260. В каждом предмете расчета свои данные, формируем свой тег 1260. Если речь про АТОЛ, то команда "utilFormTLV" очищает лишь текущие свойства драйвера, но не те данные, что уже отправлены на ККТ командой "Registration". Так что, предыдущие строки чека не будут затронуты при формировании текущей.
user1991633; +1 Ответить
17. s_vasenin 28.03.24 13:24 Сейчас в теме
Здравствуйте. "Все таймауты увеличены до 15 секунд. Как показала практика эксплуатации, 3 секунд крайне мало." - подскажите о чем идет речь? Какие таймауты вы увеличили?
20. kirlog 131 28.03.24 16:00 Сейчас в теме
(17) Таймауты на HTTP-запрос.
Вот эти:

Для 1С v.8:
ТАЙМАУТ = 15; //Тут в секундах
Соединение = Новый HTTPСоединение(АдресРесурса,ПортРесурса,,,Неопределено,ТАЙМАУТ,ЗащищенноеСоединение);


Для 1С 7.7:
HTTPЗапрос.SetTimeouts(15000, 15000, 15000, 15000); //Тут в мс
21. s_vasenin 29.03.24 07:07 Сейчас в теме
(20)
ТАЙМАУТ

Правильно я понимаю, что всё-таки 1.5 секунды на данный момент не хватает для получения ответа по коду маркировки от CDN площадки?
Я пробовал проводить тесты и по моим результатам на ожидание ответа от CDN площадки уходит 9 - 10 секунд, хотя если отправлять ответ не на CDN площадку, а на сам портал, то время ожидания ответа составляет менее секунды.
22. kirlog 131 30.03.24 01:32 Сейчас в теме
(21) По моему опыту 1.5 секунды не хватает, да.

И ведь с 01.04.2024 использовать адрес markirovka.crpt.ru будет нельзя. Можно только CDN-площадки.

По идее, эти площадки и вводились, чтобы распределить нагрузку и уменьшить время ответа.
А 9-10 секунд это не просто много для проверки одной марки, это катастрофически много.

Может быть, у Вас что то не так с интернетом/антивирусом/сетевым экраном? Часто работе с CDN-площадками мешает, например, защитник windows. Основные адреса markirovka.crpt.ru и cdn.crpt.ru он при этом не трогает. Т.е. список площадок получить удается, но подключиться к площадке - нет.

Или у ЦРПТ плановые работы какие то?
23. HSV 3 01.04.24 10:29 Сейчас в теме
Здравствуйте, скачал обработку, попробовал проверить марку:

Код состояния: 400
Состояние: Bad Request
Текст ответа: {"code":400,"description":"400 BAD_REQUEST \"Failed to read HTTP message\"","codes":[]}
Продажа разрешена: 0
ИД запроса:
Временная метка:
Время запроса: 0
Текст ошибки: Не удалось выполнить проверку марки. Код ответа: 400. 400 BAD_REQUEST "Failed to read HTTP message"


что делать?
24. HSV 3 01.04.24 11:26 Сейчас в теме
(23) простите, табак проверяет.
25. kirlog 131 01.04.24 15:30 Сейчас в теме
(24) Это 7.7? А на какую марку дает ошибку? В ней, наверное, какие то символы непечатные остались? Вы заменили в марке символ с кодом 29 (GS1) на последовательность "(29)"? Эти символы идут обычно перед маркерами 91, 92, и 93 т.е. перед крипто-частью марки.
В табаке символов GS1 нет, как и этих маркеров. Но у меня работает и молоко и вода нормально.

Вот так например:
01048657365749062155esJW(29)93dGVz
010460507701248021010001H966T09(29)91ee05(29)92Cksz/NoXpOzkFGgHxIBWyoB51u299V1ElFHA7sUOis8=
27. HSV 3 01.04.24 17:42 Сейчас в теме
(25) Да у меня 7.7
Табак (пачка)до 29 символов проходит, а вот с разделителями GS1 (по молоку, воды и блок сигарет) нет.

ПодготовленныйШК = СтрЗаменить(_Марка,Симв("29"),"\u001d");

Вот пример марки 25 позиция символ с кодом 29 (GS1)
0104600605031841215xZRn,93CT/k
Длина марки 31
Как ее нужно преобразовать? Ели заменить символ с кодом 29 (GS1) на "\u001d"),
во так 0104600605031841215xZRn,\u001d93CT/k
то выдает, что марка не найдена
Текст ошибки: КМ не найден в ГИС МТ. cannot find code [0104600605031841215xZRn,\u001d93CT/k] in db

Так тоже не проходит 0104600605031841215xZRn,\u00193CT/k
Текст ошибки: Не удалось выполнить проверку марки. Код ответа: 400. 400 BAD_REQUEST "Failed to read HTTP message"
28. HSV 3 01.04.24 18:44 Сейчас в теме
(25)
010460507701248021010001H966T09(29)91ee05(29)92Cksz/NoXpOzkFGgHxIBWyoB51u299V1ElFHA7sUOis8=

Все спасибо! Работает так:
ПодготовленныйШК = СтрЗаменить(_Марка,Симв("29"),"(29)");
29. kirlog 131 01.04.24 19:53 Сейчас в теме
(28) Если Вы используете мою обработку, то на вход ей надо подавать марку в таком вот виде
0104600605031841215xZRn,(29)93CT/k

Ну а в запросе ЦРПТ вместо (29) должно стоять ,\u001d

Т.е., например, так:

{ "codes":[ "01048657365749062155esJWe\u001d93dGVz" ], "fiscalDriveNumber": "1234567890123456" }

Моя обработка последовательность "(29)" сама заменяет на "\u001d"

Но ни в запросе ЦРПТ, ни на входе обработки не должно быть непечатных символов типа Симв(29).

Поэтому, по итогу Вы, конечно, правильно его заменяете. Однако, его просто не должно быть там:)

Я сейчас в обработках своих это подправлю, добавлю замену.
30. HSV 3 01.04.24 20:14 Сейчас в теме
(29) Да, ступил, в ВАЖНО это написано, сейчас перечитал сначала, не заметил днем видимо. Спасибо!
31. falcon 01.04.24 21:41 Сейчас в теме
(22) подскажи куда копать.

Текст запроса: {"codes":["0104602864016539215E5&L6M\\u001d93Ux16"],"inn":"*********"}

Текст ответа: {"code":0,"description":"ok","codes":[{"cis":"0104602864016539215E5&L6M\\u001d93Ux16","valid":true,"printView":"0104602864016539215E5&L6M\\u001d93Ux16","gtin":"04602864016539","verified"
:false,"message":"cannot find code [0104602864016539215E5&L6M\\u001d93Ux16] in db","found":false,"realizable":false,"utilised":false,"isBlocked":false,"isOwner":false,"errorCode":10,"isTracking":false
,"sold":false,"grayZone":false}],"reqId":"5993345d-8e5b-463f-b688-1208b86aa749","reqTimestamp":1711996577180}

Текст ошибки: КМ не найден в ГИС МТ. cannot find code [0104602864016539215E5&L6M\u001d93Ux16] in db

Текст запроса: {"codes":["0104602864016539215E5&L6M93Ux16"],"inn":"***********"}
Текст ответа: {"code":0,"description":"ok","codes":[{"cis":"0104602864016539215E5&L6M93Ux16","valid":true,"printView":"0104602864016539215E5&L6M93Ux16","gtin":"04602864016539","verified":false,"messag
e":"cannot find code [0104602864016539215E5&L6M93Ux16] in db","found":false,"realizable":false,"utilised":false,"isBlocked":false,"isOwner":false,"errorCode":10,"isTracking":false,"sold":false,"grayZo


Текст ошибки: КМ не найден в ГИС МТ. cannot find code [0104602864016539215E5&L6M93Ux16] in db


с табаком проблем нет, пиво - не хочет находится в ГИС МТ, что с экранированием \u001d, что без.....
32. kirlog 131 01.04.24 22:45 Сейчас в теме
(31)На мой взгляд лишний слеш в запросе при экранировании. Он там должен быть один.

Должно быть так: {"codes":["0104602864016539215E5&L6M\u001d93Ux16"],"inn":"*********"}


Вот пример из методических рекомендаций ЦРПТ, который я тут приводил:
{ "codes":[ "01048657365749062155esJWe\u001d93dGVz" ], "fiscalDriveNumber": "1234567890123456" }
33. falcon 02.04.24 08:02 Сейчас в теме
(32) ты прав....
надо сначала JSONСтрока(), а потом уже \u001d добавлять.....
34. kirlog 131 02.04.24 13:17 Сейчас в теме
(33) Ну или при передаче в функцию JSONСтрока() на месте символа GS1 (код 29) ставить "(29)", тогда JSONСтрока() сама корректно заменит на \u001d
35. VZhulanov 5 02.04.24 20:01 Сейчас в теме
запрос "codes/check" позволяет за 1 вызов проверить до 1000 марок
так что можно вызывать проверку не при добавлении товара в чек, а перед пробитием

И нигде не нашел в документации можно ли заранее вызвать проверку кодов по остаткам БД, запомнить результат,ИД и датувремя проверки и потом просто их в чек подставлять при добавлении товара
В таком случае можно было бы фоном проверять марки, по которым в базе есть полный код (с криптохвостом) и не тратить время при продаже
36. VZhulanov 5 02.04.24 20:24 Сейчас в теме
И еще нашел 3 (три) интересных ситуаций - видимо косяк Честного Знака и в будущем могут поправить.
А может и не косяк, но важно это учитывать при проверке!

1. Токен и ИНН взял от одного юр.лица, а проверяю упаковку, которая принадлежит совсем другому юр.лицу и еще не продана.
Проверка прошла успешно, вроде бы можно продавать.
Единственное что в ответе по этой упаковке поле isOwner=false, только проанализировав его видно что упаковка принадлежит другому юр.лицу, т.е. нельзя продать.

2. Токен от одного юр.лица, ИНН и упаковка от другого.
Результат как и в 1ом варианте

3. Токен от одного юр.лица, ИНН от второго, упаковка от третьего (ну есть у меня доступ к разным клиентам ))
Результат как и в 1ом варианте

Т.е. делаю выводы:
1. можно без проблем чужие токены использовать
2. обязательно нужно проверять поле isOwner, чтобы запретить продажу чужой упаковки. Но только если используешь свой токен, так как если используешь чужой токен, то это поле будет Ложь даже на собственных упаковках
37. VZhulanov 5 02.04.24 20:31 Сейчас в теме
Проверка идет быстро, 5 марок одним запросом за 300 миллисекунд
Площадка cdn05.crpt.ru
40. basil_m 6 03.04.24 09:48 Сейчас в теме
(37)Добрый день. А ID ответа в данном случае будет один на все марки?
Подскажите, в запрос 5 штук их как можно добавить, через запятую?
"{""codes"":["""+СокрЛП(Марка)+"""]"+ЧастьЗапросаИНН+ЧастьЗапросаФН+"}"
Тут непонятно как удобнее, по каждому товару делать или сразу на всё перед пробитием, будет позиций 20 в чеке - и разбирайся потом.
41. VZhulanov 5 03.04.24 10:08 Сейчас в теме
(40)
ИД ответа и ДатаВремя проверки одни на все марки
Тяжело воспринимать такую строку запроса так как это формат JSON
Проще делать так:
ТелоЗапроса = Новый Структура("codes", Новый Массив);
ТелоЗапроса.codes.Добавить(марка1); // марки с нормальным разделителем GS (символ с кодом 29)
ТелоЗапроса.codes.Добавить(марка2);
Если ЗначениеЗаполнено(ИНН) Тогда
    ТелоЗапроса.Вставить("inn", ИНН);
КонецЕсли;
Если ЗначениеЗаполнено(НомерФН) Тогда
    ТелоЗапроса.Вставить("fiscalDriveNumber", НомерФН);
КонецЕсли;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
ТелоЗапросаJSON = ЗаписьJSON.Закрыть();
Показать


получите текст
{
"codes": [
"0108594737231018212016424583902\u001D91EE08\u001D92AWcK9yOi­QvlTxWMD+w9Ur4cHd6xgJG/eEcL/kdc8VRA=",
"010460714356060421F0L50AAT37GD6\u001D91EE09\u001D92YdP09S5l­PNU27j0NiLU12edNOnJXTYzH+ZRGPnfe1k4="
],
"inn": "4222016254"
}
и символы GS автоматом преобразуются как надо
kimarle; basil_m; +2 Ответить
44. basil_m 6 03.04.24 11:14 Сейчас в теме
42. VZhulanov 5 03.04.24 10:11 Сейчас в теме
(40)
Тут непонятно как удобнее, по каждому товару делать или сразу на всё перед пробитием, будет позиций 20 в чеке - и разбирайся потом.


У меня в программе настройка добавлена и уже клиент сам выбирает перед добавлением марки в чек проверку делать или перед пробитием чека.
53. kirlog 131 04.04.24 18:16 Сейчас в теме
(42)Проверка перед пробитием вызывает ряд сложно разрешимых методических проблем.
Вот пример:

1. Покупается 3 пачки одинаковых сигарет (более 1 пачки берет каждый четвертый покупатель, из статистики).
2. Вот их пикнули, добавили в чек, хотим пробить.
3. На одну из марок приходит запрет.
4. Как теперь убрать эту марку из чека и забрать у покупателя нужную пачку?
5. Только считывая заново все 3 марки.
6. Значит, надо забрать у покупателя эти три пачки, все считать, одну отменить. Это не просто сложность, это конфликтная ситуация и серьезный затор на кассовом узле. Особенно, если пачек не три а пять, и в чеке 20 позиций, которые покупатель уже рассовал по пакетам.
7. Я не говорю уже о том, что для отмены позиции из чека во всех приличных магазинах нужен старший кассир или администратор смены со своей карточкой доступа или ключом.

Выводы:
1. В универсамах и вообще в магазинах с большой проходимостью проверка марок перед пробитием не годится.
2. На кассах самообслуживания тоже не годится.
3. В магазинах с небольшой проходимостью экономить время на добавление марки в чек нет необходимости в принципе.

Поэтому, ИМХО, онлайн-проверку марок целесообразно реализовывать только при добавлении в чек.
38. kirlog 131 02.04.24 23:48 Сейчас в теме
(36)Я тоже замечал, что на ИНН Честный Знак не обращает внимание.
Кстати, из последних версий методических рекомендаций ЦРПТ ИНН вообще исчез. В запросе марок остался только номер ФН. Т.е. принадлежность марки определяется только по токену.

Я добавил в обработки этой публикации проверку isOwner
Спасибо.
39. HSV 3 03.04.24 06:54 Сейчас в теме
(38)Не совсем по теме, но нет у вас такой обработки для постановки кеги на кран для 7.7?
43. kirlog 131 03.04.24 11:01 Сейчас в теме
45. nevs1 03.04.24 22:01 Сейчас в теме
Добрый день! В обработке нажимаю кнопку Проверить площадку CDN (площадка https://cdn01.crpt.ru), получаю:

Ответ получен: 0
Время ожидания: 0
Время запроса: 0
Текст ошибки: WinHttp.WinHttpRequest: Ошибка поддержки безопасных каналов

Подскажите, пожалуйста, как это исправить.
48. nevs1 04.04.24 12:30 Сейчас в теме
(45) Нашлась еще одна публикация 2077143, в которой описаны способы подключения для старых Windows. Буду пробовать.
Обоим авторам огромная благодарность!
49. basil_m 6 04.04.24 14:29 Сейчас в теме
54. nevs1 04.04.24 21:27 Сейчас в теме
50. kirlog 131 04.04.24 17:45 Сейчас в теме
(48)На windows 7 помогло вот это (Раздел Easy Fix, там качается msi файл, установил, и все заработало): https://support.microsoft.com/en-us/topic/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-winhttp-in-windows-c4bd73d2-31d7-761e-0178-11268bb10392
Нужны сервис-паки, конечно тоже.
Возможно, еще надо будет обновить корневые сертификаты. На 7-ке, т.е. заставить это работать 100% можно.

Под обычную windows xp без SP3 решения нет и можно не искать.
Но вот вот под windows POSEmbedded на базе XP решения в сети есть. Они заключаются в добавлении поддержки TLS 1.2 и обновлении корневых сертификатов. Пишут также, что обычную winXP можно переделать в POSEmbedded добавлением ключей в реестр.
Однако, я все это проделал, и результат неудовлетворительный. Возможно, когда то пару лет назад это было актуально. Но сейчас в 2024г запросы идут очень медленно (из за глюков в согласовании безопасности), и в 90% случаев приходит ошибка. Т.е. корректно отрабатывает только один запрос из 10.
Так что, мы у себя решили, что кассы на базе XP - всё. Их заменяем.
shaggy.vgh; +1 Ответить
55. nevs1 04.04.24 21:28 Сейчас в теме
(50)Спасибо! Потестируем с админом.
59. shaggy.vgh 08.04.24 11:21 Сейчас в теме
(50)
Добрый день! По ссылке ничего не нашел. Выложите пожалуйста другую ссылку на файл, или если можно пришлите на почту.
61. shaggy.vgh 08.04.24 14:46 Сейчас в теме
(50)

Нашел, скачал, установил, помогло. Большое спасибо!
46. DimanZ 27 04.04.24 08:22 Сейчас в теме
Добрый день!
Поделитесь, пожалуйста, примером формирования тега 1260 из 7.7 для Штрих.
Какие команды посылать и в какой последовательности.
И нужно ли оставить локальную проверку
				// Локальная проверка
		        Объект.BarCode = СокрЛП(ПолныйКМ);
				
		        Если ТипЧека = 0 Тогда
		            Объект.ItemStatus = 1; //1 - Штучный товар, подлежащий обязательной маркировке средством  
		        ИначеЕсли ТипЧека = 2 Тогда
		            Объект.ItemStatus = 3;  // возвращен
		        КонецЕсли;

			Объект.CheckItemMode = 0; //Указанный реквизит должен принимать значение, равное «0»

		        Объект.FNCheckItemBarcode();
			РезультатПроверки = Объект.CheckItemLocalResult;
Показать
51. kirlog 131 04.04.24 17:55 Сейчас в теме
(46)
1260


Проверку марок средствами ККТ надо оставлять. Новый механизм ее не отменяет.

Рабочий код формирования тега 1260 для Штриха.

ДрайверФР.TagNumber=1262;
ДрайверФР.TagType=7;
ДрайверФР.TagValueStr="030";
ДрайверФР.FNSendTagOperation();

ДрайверФР.TagNumber=1263;
ДрайверФР.TagType=7;
ДрайверФР.TagValueStr="21.11.2023";
ДрайверФР.FNSendTagOperation();

ДрайверФР.TagNumber=1264;
ДрайверФР.TagType=7;
ДрайверФР.TagValueStr="1944";
ДрайверФР.FNSendTagOperation();

ДрайверФР.TagNumber=1265;
ДрайверФР.TagType=7;
ДрайверФР.TagValueStr="UUID=56662403-e336-4114-88f3-6bd727f61a028&Time=1710432829649"
ДрайверФР.FNSendTagOperation();
81. vSAD 29.08.24 16:50 Сейчас в теме
(51) Подскажите а тэги идут на весь чек или на регистрацию каждой позиции?
82. kirlog 131 29.08.24 20:23 Сейчас в теме
47. basil_m 6 04.04.24 10:50 Сейчас в теме
Добрый день.
Попробовал без ИНН, запрос нормально проходит.
Что-то почитал вчера эти методические указания, чего там только не наворотили.
Я вот не пойму как это реализовывать. Ну допустим в начале работы запрос площадок и выбор быстрой. В метод.указаниях пишут, что надо все площадки сохранить в своё ПО и проставить приоритеты, чтобы потом не делать запрос, вообще пишут запрос не чаще раз в 6 часов. Потом получается,если в течении дня первая площадка отваливается, мне надо переключаться на другую, а ту помечать как неработающую (еще и время написано на 15 минут). А если все перестали работать, вообще проверку отключать. Справочник что-ли делать отдельный для этих площадок? Или просто если площадка отвалилась, снова делать запрос площадок с выбором лучшей?
Столько понаписано с этим режимом, жуть просто.
Кто как это реализовывает?
52. kirlog 131 04.04.24 18:02 Сейчас в теме
(47)Мы сделали справочник (регистр сведений) площадок.
Запрашиваем список площадок раз в сутки и пишем туда. Выбираем лучшую и помечаем. Если тут есть ответ - контроль включен. Иначе контроль выключаем до конца дня.
Запрашиваем статус площадки каждый раз при входе в режим продаж. Если она не отвечает выбираем лучшую, если ни одна не отвечает, отключаем контроль до конца дня.
При проверке кода, если нет ответа, повторяем запрос, если на второй нет ответа, меняем площадку, если ни одна не ответила, отключаем контроль до конца дня.
Все сопровождаем записью подробных логов и сообщениями на экран.

В распределенке площадки запрашивает только центральный узел и раздает на точки.
Точки только выбирают из уже полученных площадок.
56. basil_m 6 05.04.24 09:32 Сейчас в теме
(52)Спасибо! Да уж, всё не так просто
57. DimanZ 27 05.04.24 11:17 Сейчас в теме
58. shaggy.vgh 07.04.24 23:17 Сейчас в теме
Здравствуйте!
Пробую делать проверку CDN-площадки для 1С 7.7, а она выдает ответ: "..WinHttp.WinHttpRequest: Данные, необходимые для завершения этой операции еще не доступны..."
В чем может быть проблема?
60. shaggy.vgh 08.04.24 11:33 Сейчас в теме
Добрый день!
Не получается проверить площадку CDN.
По кнопке "Запрос площадок CDN" список получает, а проверки ни одна площадка не проходит, пишет "Ответ получен: НЕТ".
Если проверить просто площадку приходит ответ: Текст ошибки: WinHttp.WinHttpRequest: Ошибка поддержки безопасных каналов
Прикрепленные файлы:
62. shaggy.vgh 08.04.24 14:48 Сейчас в теме
(60)
Скачал предложенный в (50) Easy Fix и все заработало!)
71. djmarat3 23.05.24 17:34 Сейчас в теме
Здравствуйте. Подскажите пожалуйста, проверка кода маркировки одежды выдает такой результат:
Текст ответа:
{"code":0,
"description":"ok",
"codes":[{"cis":"XXXX",
"valid":true,
"printView":"XXXX",
"gtin":"XXXX",
"groupIds":[1],
"verified":false,
"message":"AI 91 for [XXXX] is invalid",
"found":true,
"realizable":true,
"utilised":true,
"isBlocked":false,
"isOwner":false,
"errorCode":7,
"isTracking":true,
"sold":false,
"packageType":"UNIT",
"producerInn":"XXXXX",
"grayZone":false}]

Код маркировки состоит из 31 символа и символов GS не содержит. Вроде бы проверка показывает, что код в обороте, но ошибка 7 меня смущает. Можете подсказать можно ли с такой ошибкой в чек данные передавать и пробивать?
98. Sol1986 31.10.24 16:19 Сейчас в теме
(71)
"realizable":true,
"utilised":true,
"isBlocked":false,
"isOwner":false,
"errorCode":7,
"isTracking":true,
"sold":false,
"packageType":"UNIT",
"producerInn":"XXXXX",
"grayZone":false}]

Код маркировки состоит из 31 символа и символов GS не содержит. Вроде бы проверка показывает, что код в обороте, но ошибка 7 меня смущает. Можете подсказать можно ли с такой ошибкой в чек данные передавать и пробивать?

Добрый день. Подскажите нашли ответ на данный вопрос? Сейчас с тем же столкнулся
72. basil_m 6 19.07.24 09:35 Сейчас в теме
Добрый день. А получается в этих чеках с проверкой в ОФД появляется:
ОТРАСЛЕВОЙ РЕКВИЗИТ,ИДЕНТИФИКАТОР ФОИВ и ДАТА/НОМЕР ДОК. ОСНОВАНИЯ ?
И еще такой вопрос, пробую сканировать просроченную продукцию, даёт положительный результат и возможность пробить. В вашей обработке нет запрета на просрочку?
73. basil_m 6 19.07.24 15:17 Сейчас в теме
(72) по просрочке не нашел, добавил реквизит для проверки
74. iddqd 372 01.08.24 19:35 Сейчас в теме
День добрый.
Проверку сделал давно, сейчас занялся формированием тега 1260 в чеке, и возник вопрос:
Тут (да и в инструкции от ЧЗ) пишут, что 1265 должен быть таким:
1265: UUID=56662403-e336-4114-88f3-6bd727f61a02&Time=1710432829649


А что на счет как раньше было
1265: "tm=mdlp&" + "sid=" +ИДМестаДеятельности + ПараметрыЛьготногоРецепта(если надо)


Это все уже не нужно?
Или я что-то не понимаю?

Пардон, ступил. Это же лекарства, а проверка - по ГИС МТ..
75. basil_m 6 02.08.24 11:09 Сейчас в теме
(74) Добрый день. Подскажите, а где-нибудь в ЧЗ или ОФД видно, что разрешительный режим применяется? в ОФД под товаром появляются доп реквизиты. Это значит, что всё норм?
В ЧЗ вообще ничего не нашёл
Прикрепленные файлы:
76. iddqd 372 02.08.24 12:22 Сейчас в теме
(75) Ну да, UUID передали - UUID отобразился в ОФД, по идее все Ок.