Имя: Пароль:
1C
 
Программное списание кодов маркировки в честном знаке
↓ (Волшебник 22.08.2025 21:54)
0 Nikqwe
 
22.08.25
17:34
Кто-нибудь занимался интеграцией с честным знаком, подскажите с чего начать? Мне нужно сделать обработку списания кодов маркировки. На инфостарте есть много примеров как взаимодействовать с ЧЗ, но примеров как именно списывать что то совсем нет.
1 mikecool
 
22.08.25
17:32
взять типовую и посмотреть предлагать?
2 Nikqwe
 
22.08.25
17:35
(1) как вариант можно, но хотелось бы не лазить в коде типовой конфы)
3 Волшебник
 
22.08.25
17:36
(2) А хотите почитать документацию на API Честный Знак?
4 MWWRuza
 
гуру
22.08.25
18:17
(0) Под клюшки код тоже не предлагать? :-)

Процедура ОтправитьЧерезАПИ()
Процедура ОтправитьЧерезАПИ()
	Если ПроверитьПолучитьТокен() = 0 Тогда	
		Если Вопрос("Отсутствует токен авторизации. Если это рабочее место имеет доступ к ЭЦП, нажмите ""Да"", иначе нажмите ""Нет"" и выполните проверку связи с ЦРПТ с рабочего места, имеющего доступ к ЭЦП.", 4, 15) = 6 Тогда
	   		СтрОшибка 	= "";
	   		ТекТокен 	= ПолучитьТокенЦРПТ(глПользователь.ЭЦП, ПрефиксВерсии, СтрОшибка);
		Иначе
	   		Записать();
			СтатусВозврата(0);
			Возврат;
		КонецЕсли;	   		
	КонецЕсли;
	ВремКат	= КаталогВременныхФайлов(); 
	СзЗаг 	= СоздатьОбъект("СписокЗначений");
	СзТов	= СоздатьОбъект("СписокЗначений");
	ТзТов	= СоздатьОбъект("ТаблицаЗначений");
	СзЗаг.ДобавитьЗначение(СокрЛП(ВыделитьИНН(ЮрЛицо.ИНН)),	"inn");
	Если ПричВыб = Перечисление.ПричВыбМарки.Развес Тогда
		СзЗаг.ДобавитьЗначение("PACKING", 		"action");
	Иначе
		СзЗаг.ДобавитьЗначение("EXPIRATION",	"action");
	КонецЕсли; 
	СзЗаг.ДобавитьЗначение(ПреобразоватьДатуВСтрХМЛ(ТекущаяДата()),	"action_date");

// 	Если ПричВыб = Перечисление.ПричВыбМарки.Развес Тогда
		СзЗаг.ДобавитьЗначение("OTHER", 			"document_type");
//	Иначе	
//		СзЗаг.ДобавитьЗначение("OTHER", 			"document_type");
//	КонецЕсли;
	
	СзЗаг.ДобавитьЗначение(СокрЛП(Число(НомерДок)),			"document_number");
	СзЗаг.ДобавитьЗначение(ПреобразоватьДатуВСтрХМЛ(ДатаДок),"document_date");
	Если ПричВыб = Перечисление.ПричВыбМарки.Развес Тогда
		СзЗаг.ДобавитьЗначение("Акт фасовки товара", 		"primary_document_custom_name");
	Иначе
		СзЗаг.ДобавитьЗначение("Акт списания товара", 		"primary_document_custom_name");	
	КонецЕсли;
	ВыбратьСтроки();
	Если ПричВыб = Перечисление.ПричВыбМарки.Развес Тогда
		ТзТов.НоваяКолонка("cis");
		ТзТов.НоваяКолонка("product_cost");; 
	Иначе 
		Если СпосУч = Перечисление.СпособУчета.ОСУ Тогда
			ТзТов.НоваяКолонка("gtin");
			ТзТов.НоваяКолонка("gtin_quantity");
		Иначе
			ТзТов.НоваяКолонка("cis");
		КонецЕсли;
	КонецЕсли;
	Пока ПолучитьСтроку() = 1 Цикл
		ТзТов.НоваяСтрока(); 
		Марк						= СокрЛП(Марка); 
		Если ПричВыб = Перечисление.ПричВыбМарки.Развес Тогда
			ТзТов.cis				= Марк;
		Иначе 
			Если СпосУч = Перечисление.СпособУчета.ОСУ Тогда
				Если СтрДлина(Марк) > 14  Тогда
					ПозРазд 			= Найти(Марк, "21");
					НачМарки			= Лев(Марк, ПозРазд - 1);
					GTIN				= Прав(НачМарки, 14);				
				Иначе	
					GTIN				= Марк;
				КонецЕсли;
				ТзТов.gtin				= GTIN;
			Иначе
				ТзТов.cis				= ПолучитьКИЗ(СтрЗаменить(Марка, "<GS1>", Симв(29)));
			КонецЕсли;
		КонецЕсли;	
		Если ПричВыб = Перечисление.ПричВыбМарки.Развес Тогда
			ТзТов.product_cost		= ЦенаЕд * 100;	
		Иначе
			Если СпГрупп.ТекущаяСтрока() = 1 Тогда
				Если СпосУч = Перечисление.СпособУчета.ОСУ Тогда
					ТзТов.gtin_quantity	= Количество;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	СзЗаг.ДобавитьЗначение(ТзТов,	"products");
	Если Сервис = 0 Тогда
		Ош 							= ИзмСпосВывода(1);
	 	СтатусВозврата(0);
	 	Возврат;		
	КонецЕсли;
	
	СтрДжейсон		  = Сервис.DecodeToUTF8(ЗначениеВJSON(СзЗаг));
	
//	Тхт = СоздатьОбъект("Текст");
//	Тхт.ДобавитьСтроку(СтрДжейсон);
//	Тхт.Записать("C:\Temp\Spis.txt");
	
	Кодировка 			= "base64";
	Стр 				= Кодировать(СтрДжейсон, Кодировка);
	Тхт					= СоздатьОбъект("Текст");
	Тхт.ДобавитьСтроку(СтрДжейсон);
	ИсхФайл				= ВремКат + "DocJSON.json";	
	Тхт.Записать(ИсхФайл);
	Стр 				= СтрЗаменить(Стр, Симв(10), "");
	СтрДок64			= СтрЗаменить(Стр, Симв(13), "");
	ПодпФайл			= ВремКат + "DocJSON.json.sig";	
	Серт 				= ПолучитьСертификатПоОтпечатку(СокрЛП(глПользователь.ЭЦП.Отпечаток));
	ПодписатьФайл(ИсхФайл, Серт, ПодпФайл, 1);
	СтрЭЦП				= УбратьПереносыСтрок(ПодпФайл);
	сзJSONЗапрос		= СоздатьОбъект("СписокЗначений");
	сзJSONЗапрос.ДобавитьЗначение("MANUAL", 		"document_format");
	сзJSONЗапрос.ДобавитьЗначение(СтрДок64, 		"product_document");
	сзJSONЗапрос.ДобавитьЗначение(СокрЛП(СтрЭЦП),	"signature");
	Если Причвыб = Перечисление.ПричВыбМарки.Развес Тогда
		сзJSONЗапрос.ДобавитьЗначение("LK_RECEIPT", 		"type");
	Иначе
		Если СпосУч = Перечисление.СпособУчета.Поэкземплярный Тогда
			сзJSONЗапрос.ДобавитьЗначение("LK_RECEIPT", 	"type");	
		Иначе	
			сзJSONЗапрос.ДобавитьЗначение("LK_GTIN_RECEIPT","type");
		КонецЕсли;
	КонецЕсли;
	сзЗаголовки 						= СоздатьОбъект("СписокЗначений");
	сзЗаголовки.ДобавитьЗначение("application/json;charset=utf-8", "Content-Type");
	сзЗаголовки.ДобавитьЗначение("no-cache", 			"cache-control");
	сзЗаголовки.ДобавитьЗначение("application/json", 	"Accept");
	СтрОшибка			= "";
	Url					= АдресСервераМОТП + "/" + ПрефиксВерсии + "/lk/documents/create?pg=" + ВернутьГруппуТовара(); // "milk";	

	Ответ 				= глКарлик_ВыполнитьЗапрос("POST", Url, ТекТокен, сзЗаголовки, СтрОшибка, сзJSONЗапрос);

	УинДокаЦРПТ			= СокрЛП(Ответ);
	Записать();
	ДоступностьКнопкиОтправить();
	Форма.кнОтправить.Доступность(0); 	// На тот случай, если ID из ЧЗ еще не прилетел, заблокируем принудительно от повторных отправок
	Если СокрЛП(Ответ) <> "" Тогда
		Пока Вопрос("Ожидание проверки статуса документа(~10 сек)......."+РазделительСтрок + "ОК - Проверить статус, Отмена - Прервать", 1,10) <> 2 Цикл
			ПроверитьСтатус();
			Если СокрЛП(Статус) <> "" Тогда
				Провести();
				Прервать;
			КонецЕсли;
		КонецЦикла;	
	КонецЕсли;
КонецПроцедуры
5 Волшебник
 
22.08.25
18:18
(4) За применение 7.7 в 2025 году надо ввести штрафы :)
6 MWWRuza
 
гуру
22.08.25
20:10
(5) За что??? :-))) Нииинадааа!!! Ведь, как ни странно, но все работает👍
7 Волшебник
 
22.08.25
20:11
(6) "Работает — не трогай!" (у меня именно такая наклейка под монитором на рабочем месте). Если нужен пруф, я сделаю в понедельник :)
8 MWWRuza
 
гуру
22.08.25
20:12
(3) почитать документацию на API Честный Знак?

Выложить? А то вдруг у него нет...
9 Волшебник
 
22.08.25
20:18
(8) Я ожидал ответа типа "не хочу". Ну не хочет он ничего читать/смотреть, кроме готовых примеров. Сегодня зарегился и хочет всё и сразу.
10 Nikqwe
 
22.08.25
20:29
(9) Я так понимаю ты тут, самый прожжённый токсик )))
11 Волшебник
 
модератор
22.08.25
20:34
(10) Да, Вы правильно поняли. Я тут главный.
А вот Вы поставили лишнюю запятую после "тут".
Видите, я замечаю.
12 Nikqwe
 
22.08.25
20:37
(11) умница, увидел, ошибку, возьми, пирожок, с, полки, )))
13 Nikqwe
 
22.08.25
20:37
Короче, тема закрыта, ну вас нафиг )))
14 Волшебник
 
22.08.25
20:56
Ха! Я смеюсь над вами!
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший