ФФД 1.2 на УТ 10.3 маркировка обуви

1. 2 06.10.21 10:57 Сейчас в теме
Нужна помощь в настройке ффд 1.2 на УТ 10.3.71.3 для работы с маркировкой обуви и текстиля. Конфигурация последняя, прошивка ккт атол 5.8.3 , драйвер 10.9.0.4. До перехода на ффд 1.2 ни каких проблем с маркировкой не было. После обновления ни каких ошибок не показывает, чеки в налоговую уходят, даже что то пытается отправить в честный знак
"1059" : [
{
"1023" : 1,
"1030" : "Полотенце пляжное (карта Крыма, морская тематика) (шт)",
"1043" : 380,
"1079" : 380,
"1163" : {
"1305" : "(01)02900003238333(21)LeQnE!YCKZ3DV"
},
но в чз ничего не доходит. Есть мнение что код не должен содержать ковычки.
У кого-то вообще получилось работать в такой конфигурации?
Вознаграждение за ответ
Показать полностью
Найденные решения
153. buka99999 01.12.21 18:18 Сейчас в теме
Добрый день!
Хочу поделиться своим опытом трехдневного запуска ФФД 1.2. )))
Имеем: УТ 10.3.72.2 (все штатно, чеки бьем не из РМК, а из обычного интерфейса самого документа Чека ККМ), Штрих RR-01Ф (версия прошивки: C.3.41963 от 26.08.2021)

Сразу хочу сказать спасибо этой ветки и особенно "andrew.ab" - меня хотя бы направили на путь истинный.
Из коробки естественно ничего не заработало и чем дальше я начал вникать что не так, тем больше понимал, что много что не так. Когда я все для себя финишировал (начали нормально пробиваться чеки), то пришел к выводу, что куча людей доделывают эту программу и каждый из них не может все связать воедино. Элементарный пример:
"ПодключаемоеОборудованиеУниверсальныйДрайверКлиент" функция:"ФискализацияЧека":
Строка:
ДанныеЧека = МенеджерОборудованияВызовСервера.ПолучитьXMLПакетДляФискализацияЧека_ТО(ОбщиеПараметры, ВходныеПараметры, СуммаЧека, ШиринаСтроки, НовыйФормат, ВерсияФФД, ПараметрыФискализации);

В этой строке мы получаем XMLку для пробития чека, но на практике мы ее получаем просто так, так как эти данные нигде далее не используются (ну вот зачем вводить людей в заблуждение и загромождать код). Это лирика и эмоции!!!!
Теперь к делу.


1. Допилил обработку ShtrihMkkt.epf (файл прикреплю). А именно: запихнул в макет штриховскую компоненту от дайвера 5.16.0.886 (в драйвере было две компоненты, одна от ФФД1.1, другая от ФФД1.2); добавил три функции: ЗапросКМ; ПолучитьРезультатыЗапросаКМ; ПодтвердитьКМ (что интересно, в поставке Атоловской - они есть); подправил функцию "СоздатьОбъектДрайвера", чтобы попытка не валилась, т.к. компонента от ФФД1.2 теперь называется SMDrvFR1C34.


2. В общем модуле "МенеджерОборудованияВызовСервера" в функции "РевизияИнтерфейсаДрайверов" изменил:
РевизияИнтерфейса = 3004; //MAScorporation - было 3003
Не смотря на то, что после подмены компоненты (от последнего штриховского драйвера), в котором ревизия начинает определяться как 3004 (ФФД1.2), это место возвращает все на 3003 (ФФД1.1).

3. В этом же модуле добавил функцию (для добавление отсутствующего символа GS1, правда "andrew.ab", здесь немного ошибся и написал неверный символ разделения, точней он верный если драйверу напрямую подкидывать марку в виде строки, но в виде Base64 это не прокатывает):
Функция ВставкаСимволаРазделителяGS1ВШтрихкод(ДанныеКодаТовара) Экспорт //MAScorporation
    
    Штрихкод = Base64ВШтрихкод(ДанныеКодаТовара.ШтрихкодBase64);
    //РазделительGS1 = "<0x1D>";
	РазделительGS1 = Символ(29);
    
    Если Найти(Штрихкод, РазделительGS1) > 0 Тогда
        Возврат ДанныеКодаТовара.ШтрихкодBase64;
    КонецЕсли;
    
    //ДанныеКодаТовара.СерийныйНомер=5Bm2J/KPuYgVT
    ПозицияСерийногоНомера = Найти(Штрихкод, ДанныеКодаТовара.СерийныйНомер);
    ДлинаСерийногоНомера = СтрДлина(ДанныеКодаТовара.СерийныйНомер);
    
    Если ПозицияСерийногоНомера > 0 Тогда
        
        ЛеваяЧастьШтрихкода = Лев(Штрихкод, (ПозицияСерийногоНомера-1)+ДлинаСерийногоНомера);
        СредняЧастьШтрихкода = РазделительGS1 + Сред(Штрихкод, СтрДлина(ЛеваяЧастьШтрихкода) + 1, 6) + РазделительGS1;
        ПраваяЧастьШтрихкода = Сред(Штрихкод, СтрДлина(ЛеваяЧастьШтрихкода) + 7);
        
        Штрихкод = ЛеваяЧастьШтрихкода + СредняЧастьШтрихкода + ПраваяЧастьШтрихкода;
        
    Иначе    
        Возврат ДанныеКодаТовара.ШтрихкодBase64;
    КонецЕсли;    
    
    Возврат ШтрихкодВBase64(Штрихкод);
    
КонецФункции
Показать



4. В этом же модуле в процедуре "СформироватьXMLПакетДляФискализацияЧека" изменил:
 Если ПараметрыФискализации.РевизияИнтерфейса >= 3004 Тогда
						//MAScorporation - закоментил условие и добавил свое условие
						//Если Не ПустаяСтрока(ТекущаяПозиция.КонтрольнаяМарка) Тогда
						//	ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ТекущаяПозиция.КонтрольнаяМарка));
						//КонецЕсли;
						Если НЕ ПустаяСтрока(ТекущаяПозиция.ШтрихкодBase64) Тогда
							ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(ТекущаяПозиция.ШтрихкодBase64, Истина);
							РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
							Если НЕ ПустаяСтрока(РеквизитКодаТовара) И Не ПустаяСтрока(ДанныеКодаТовара.ШтрихкодBase64) Тогда // Запись тега 1163
	                			ШтрихкодBase64 = ВставкаСимволаРазделителяGS1ВШтрихкод(ДанныеКодаТовара);
								ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ШтрихкодBase64));
							КонецЕсли;
						КонецЕсли;
						
						Если Не ПустаяСтрока(ТекущаяПозиция.КодЕдиницыИзмерения) Тогда
Показать




5. В модуле "МенеджерОборудованияКлиент" в процедуре "НачатьВыполнениеКомандыТО" вставил попытку перед выполнением команды:
Попытка
				Если ЗначениеЗаполнено(ВходныеПараметры.КонтрольнаяМарка) Тогда	//MAScorporation - запишим правильно ШК
					ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(ВходныеПараметры.КонтрольнаяМарка, Истина);
					РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
					Если НЕ ПустаяСтрока(РеквизитКодаТовара) И Не ПустаяСтрока(ДанныеКодаТовара.ШтрихкодBase64) Тогда // Запись тега 1163
		    			ШтрихкодBase64 = МенеджерОборудованияВызовСервера.ВставкаСимволаРазделителяGS1ВШтрихкод(ДанныеКодаТовара);
						ВходныеПараметры.КонтрольнаяМарка	= ШтрихкодBase64;					
					КонецЕсли;  				
				КонецЕсли;
			Исключение	КонецПопытки;
			
			Если Команда = "RequestKM" Тогда
				Результат = ОбработкаОбслуживания.ЗапросКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			ИначеЕсли Команда = "GetProcessingKMResult" Тогда
				Результат = ОбработкаОбслуживания.ПолучитьРезультатыЗапросаКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			ИначеЕсли Команда = "ConfirmKM" Тогда
				Результат = ОбработкаОбслуживания.ПодтвердитьКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			КонецЕсли;
Показать




6. В модуле "РозничныеПродажиКлиент" процедура "ПроверитьКодМаркировкиСредствамиККТ" поставил попытку (обратил внимание, что всегда проверяемая марка имеет один и тотже статус и не важно продажа это или возврат):
  ПараметрыСканирования = ШтрихкодированиеИСКлиент.ПараметрыСканирования(ФормаВладелец);
	Попытка //MAScorporation - иначе всегда будет "Возврат в оборот при розничной реализации"
		Если ФормаВладелец.ВидОперации=Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
			ПараметрыСканирования.ВидОперацииИСМП	= Перечисления.ВидыОперацийИСМП.ВыводИзОборотаРозничнаяПродажа; 
		КонецЕсли
	Исключение КонецПопытки;
	Если ФормаПросмотра <> Неопределено



7. В модуль справочника "КассыККМ" функцию "ПараметрыКассыККМ" сделал правку в запросе, т.к. без этой правки всегда возвращается первая попавшаяся Касса ККМ и не факт что нужная вам.
Запрос.Текст ="ВЫБРАТЬ
	              |	КассыККМ.Ссылка КАК КассаККМ,
	              |	КассыККМ.Владелец КАК Организация,
	              |	КассыККМ.СерийныйНомер КАК СерийныйНомер,
	              |	ТорговоеОборудование.Идентификатор КАК ИдентификаторУстройства
	              |ИЗ
	              |	Справочник.КассыККМ КАК КассыККМ
	              |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТорговоеОборудование КАК ТорговоеОборудование
	              |		ПО КассыККМ.Ссылка = ТорговоеОборудование.КассаККМ
	              |ГДЕ
	              |	КассыККМ.Ссылка = &Ссылка
	              |	И ТорговоеОборудование.Компьютер = &Компьютер
	              |	И ТорговоеОборудование.Подключено = ИСТИНА"; 
	
	Запрос.УстановитьПараметр("Ссылка", КассаККМ);
	Запрос.УстановитьПараметр("Компьютер", ИмяКомпьютера());//MAScorporation - добавил это условие и еще: |	И ТорговоеОборудование.Подключено = ИСТИНА
Показать




8. В модуле справочника "ТорговоеОборудование" в функции "ПолучитьПараметрыРегистрацииУстройства" в конце добавил:
 РезультатОперации.ВерсияФФДККТ           = "1.2";	 //MAScorporation
	РезультатОперации.ВерсияФФДФН            = "1.2";	 //MAScorporation
	Возврат РезультатОперации;

Дело в том, что запрос который в этой функции отрабатывает, всегда будет возвращать пустоту, т.к. идет обращение к таблице справочника, которая на данный момент всегда пустая. Если не сделать эту правку (в моем случае), то не будет инициироваться процесс проверки кодов марки фискальником.


9. И на последок абсурдный косяк. В модуле документа "ЧекККМ" в функции "ПараметрыОперацииФискализацииЧека"
вместо строки:
ПараметрыОперацииФискализацииЧека.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств");


написал условие (без него всегда будут пробиваться чеки прихода ))))) ):

Если ВидОперации=Перечисления.ВидыОперацийЧекККМ.Возврат Тогда //MAScorporation
		ПараметрыОперацииФискализацииЧека.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ВозвратДенежныхСредств");
	Иначе
		ПараметрыОперацииФискализацииЧека.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств");
	КонецЕсли;


10. Небольшой совет. Если идет попытка пробить некорректную марку и фискальник стопориться с ошибкой:
"d3h код товара не распознан", то зайдите в свойства фискильника и исправьте:
Таблица 17 строка 41 "RUS принимать все КТ" = 1
В этом случае независимо от корректности марки чек будет печататься.



Вот как то так.
1carbon; корум; The Ant; naboko; andrew.ab; user1444721; lenwood; +7 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
96. user1444721 08.11.21 12:49 Сейчас в теме
(94)Драйвер последний стоит? В настройке оборудования(параметры фискализации) 3.4 значение или 3.2? (может надо вручную брать компоненту из папки с драйвером для 1с). Сам пока не тестил новый релиз, отпишусь как проверю.
97. user1444721 08.11.21 12:51 Сейчас в теме
(96)Ещё такой момент в информации по обновлению.Внимание! Для корректной работы механизма проверки кодов маркировки средствами ККТ в настройках пользователя необходимо указать значение настройки Основная касса ККМ.Прочее
100. kliman 09.11.21 15:09 Сейчас в теме
Получилось у кого-то запустить.

И где находится данная настройка, не смог найти.

Для корректной работы механизма проверки кодов маркировки средствами ККТ в настройках пользователя необходимо указать значение настройки Основная касса ККМ.Прочее
101. egorov_ivan 09.11.21 16:04 Сейчас в теме
(100) РС Настройки пользователей, для штриха нет нормальной обработки торгового обслуживания для УТ 10.3, в новый документ подставляется ККМ из настроек пользвоателя, так же в УТ 10.3 не корректно будет работать если используете несоклько касс с разным ФФД, т.к. поиск ид устройства идет по "модели"(получается или несколько разных обработок ККТ использовать, или пилить)
102. kliman 09.11.21 16:34 Сейчас в теме
(101) У нас Атол. В настройках пользователей должна появиться новая настройка? у нас ее нет после обновления.
103. kliman 09.11.21 16:34 Сейчас в теме
(101) Можете скрин сделать у себя, с этой насьройкой?
104. user1444721 09.11.21 20:30 Сейчас в теме
(100) Сервис - Настройки пользователя - Розничная торговля и торговое оборудование - Основная касса ККМ.
Сам не проверял ещё пробитие чеков ККТ Штрих. У кого-то получилось пробить без ошибок на последнем релизе и чтобы данные ушли в ЧЗ?
105. andrew.ab 211 10.11.21 08:05 Сейчас в теме
(104) "а воз и ныне там" в новом релизе. Теперь проблемы с кодированием марки в base64. После декодирования получается мусор.
Допиленную обработку под Штрих приложил. Там не было методов ЗапросКМ, ПолучитьРезультатыЗапросаКМ, ПодтвердитьКМ.
Прикрепленные файлы:
ShtrihMkkt_10_3_72_1.epf
109. egorov_ivan 10.11.21 22:17 Сейчас в теме
(105) да особо не помогло, т.к. AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C3 не поддерживает метод ОткрытьСессиюРегистрацииКМ
110. egorov_ivan 10.11.21 22:25 Сейчас в теме
(109)
ационнаяКомпонента.SMDrvFR1C3 не поддерживает метод ОткрытьСессиюРегистрацииКМ

даже если версия интерфейса поднять до 3004 принудительно, но оно и понятно нужен компонента SMDrvFR1C34, которая есть в Ут 11, но запихать ее в обработку торгового обслуживания ShtrihMkkt не получается не взлеатет почему то, не может создать объект драйвера
111. andrew.ab 211 11.11.21 09:54 Сейчас в теме
(110) У нас обработка взлетела, ревизию 3004 поднимать не нужно. Должно работать на 3003.
Сейчас решаем проблему с кодом марки, т.к. для штриха надо вставлять символ <0x1D> в марку. инструкия
115. egorov_ivan 11.11.21 23:40 Сейчас в теме
(111)подскажите какой драйвер штриха используете 4.15 или 5.16, а так же какую итеграционную компоненту используете? ФФД 1.2 как я понял требует 5.16 и новую интеграционную компоненту, правильно ли я понял что у вас получается передать в кассу марку при использовании ревизии 3003 и используя дописанную вами обработку обслуживания без проверки марки на ктт
137. user605516 22.11.21 20:08 Сейчас в теме
(115)
какой драйвер штриха используете 4.15 или 5.16,


Тоже интересен этот вопрос. В актуальном релизе УТ (11.4.13.282) используется 4.15.
106. ALEX22071987 10.11.21 10:32 Сейчас в теме
ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
стр64 = ЗакодироватьКодМаркировкиBase64(ТекущаяПозиция.ШК_ЧЗ, Ложь);
ЗаписьXML.ЗаписатьАтрибут("MarkingCode" , XMLСтрока(стр64));
ЗаписьXML.ЗаписатьКонецЭлемента();

Ни чего не понимаю, подскажите как правильно составить структуру отправки???
107. user1688205 10.11.21 11:19 Сейчас в теме
Подскажите списываются ли коды маркировки из ЧЗ через кассу АТОЛ в новом релизе? Пробовал кто-нибудь?
108. kliman 10.11.21 13:06 Сейчас в теме
112. andrew.ab 211 11.11.21 10:13 Сейчас в теме
В модуле МенеджерОборудованияВызовСервера надо закомментить:
Процедура ЗаписатьДанныеКодаТоварнойНоменклатуры(ЗаписьXML, Позиция, ПараметрыФискализации)
	
	ДанныеКодаТоварнойНоменклатуры = Позиция.ДанныеКодаТоварнойНоменклатуры;
	ДанныеКодаТовара = Неопределено;

	// Код товара заполняемся для "товара".   
	Если Позиция.ПризнакПредметаРасчета <> Перечисления.ПризнакиПредметаРасчета.Товар
		И Позиция.ПризнакПредметаРасчета <> Перечисления.ПризнакиПредметаРасчета.ПодакцизныйТовар Тогда
		Возврат;
	КонецЕсли;
	
	Если ПараметрыФискализации.РевизияИнтерфейса > 3001 Тогда 
		
		Если НЕ ПустаяСтрока(Позиция.КодВидаНоменклатурнойКлассификации) Тогда
			ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.КодВидаНоменклатурнойКлассификации);
			РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
		ИначеЕсли НЕ ПустаяСтрока(Позиция.ШтрихкодBase64) Тогда
			ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.ШтрихкодBase64, Истина);
			РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
		Иначе
			ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.Штрихкод);
			РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
		КонецЕсли;
		
		Если ПараметрыФискализации.РевизияИнтерфейса >= 3003 Тогда // 3.4 и выше
			// ФФД 1.2
			Если НЕ ПустаяСтрока(РеквизитКодаТовара) И Не ПустаяСтрока(ДанныеКодаТовара.ШтрихкодBase64) Тогда // Запись тега 1163
				//комментим
				//Если ПустаяСтрока(Позиция.КонтрольнаяМарка) Тогда
					ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
					ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ДанныеКодаТовара.ШтрихкодBase64));
					ЗаписьXML.ЗаписатьКонецЭлемента();
				//КонецЕсли;
				//комментим
			КонецЕсли; 
		Иначе
			// ФФД 1.1
Показать


в процедуре СформироватьXMLПакетДляФискализацияЧека комментим:
Если ПараметрыФискализации.РевизияИнтерфейса >= 3004 Тогда
						
						//комментим
						//Если Не ПустаяСтрока(ТекущаяПозиция.КонтрольнаяМарка) Тогда
						//	ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ТекущаяПозиция.КонтрольнаяМарка));
						//КонецЕсли;
						//комментим
						
						Если Не ПустаяСтрока(ТекущаяПозиция.КодЕдиницыИзмерения) Тогда
							МераКоличестваПредметаРасчета = МенеджерОборудованияКлиентСервер.МераКоличестваПредметаРасчетаПоКодуЕдиницыИзмерения(ТекущаяПозиция.КодЕдиницыИзмерения);
							МераКоличестваПредметаРасчета = МенеджерОборудованияКлиентСервер.КодМерыКоличестваПредметаРасчетаККТ(МераКоличестваПредметаРасчета);
							ЗаписьXML.ЗаписатьАтрибут("MeasureOfQuantity", XMLСтрока(МераКоличестваПредметаРасчета));
						КонецЕсли;
						
						ДробноеКоличество = ТекущаяПозиция.ДробноеКоличество;
						Если Не ПустаяСтрока(ДробноеКоличество.Числитель) И Не ПустаяСтрока(ДробноеКоличество.Знаменатель) Тогда
							Если Число(ДробноеКоличество.Числитель) > 0 И Число(ДробноеКоличество.Знаменатель) > 0 Тогда
								ЗаписьXML.ЗаписатьНачалоЭлемента("FractionalQuantity");
								ЗаписьXML.ЗаписатьАтрибут("Numerator", XMLСтрока(ДробноеКоличество.Числитель));
								ЗаписьXML.ЗаписатьАтрибут("Denominator", XMLСтрока(ДробноеКоличество.Знаменатель));
								ЗаписьXML.ЗаписатьКонецЭлемента();
							КонецЕсли;
						КонецЕсли;
						
						ЗаписатьОтраслевойРеквизит(ЗаписьXML, ТекущаяПозиция.ОтраслевойРеквизит);
					КонецЕсли;
Показать


Так же надо настроить сканер, чтобы он передевал символ <0x1D> в неизмененном виде при сканировании марки.
Это является обычным управляющим символом в кодировке ASCII, а точнее символом-разделителем.
Он уже зашифрован в QR-код, однако сканера по умолчанию не настроены на передачу после считывания управляющих символов.

Про символ тут Про символ <0x1D>
114. egorov_ivan 11.11.21 22:48 Сейчас в теме
(112)не совсем понимаю вы говорите что используете ревизию 3003, но приводите примпры где комментите куски кода где используется 3004+ можете пояснить?
117. andrew.ab 211 12.11.21 10:13 Сейчас в теме
(114) в первом приведенном коде ревизия => 3003. Второй код можно не комменить.
113. egorov_ivan 11.11.21 22:41 Сейчас в теме
(111)а у вас точно формат ффд 1.2, новый формат требует открыть сессию на ккт, сделать запрос, получить ответ, а потом уже фискализировать чек как я понял в этом и смысл чтобы проверять коды, на 3003 мне писала что касса не поддерживает операцию проверки.
А какую интеграционную компоненту используете в дописанном драйвере ?
116. egorov_ivan 12.11.21 00:53 Сейчас в теме
(113) или вернее при указывании полного шк на ревизии 3003 с вашими правками в модуле, касса выдает сообщение D3h, Ошибка привязки КМ
119. andrew.ab 211 12.11.21 10:20 Сейчас в теме
(116)
или вернее при указывании полного шк на ревизии 3003 с вашими правками в модуле, касса выдает сообщение D3h, Ошибка привязки КМ


Либо сканер настраивать, чтобы он не вырезал <0x1D> при считывании QR-кода, либо костыль дописывать в модуле МенеджерОборудованияВызовСервера:

Процедура ЗаписатьДанныеКодаТоварнойНоменклатуры(ЗаписьXML, Позиция, ПараметрыФискализации)
	
	ДанныеКодаТоварнойНоменклатуры = Позиция.ДанныеКодаТоварнойНоменклатуры;
	ДанныеКодаТовара = Неопределено;

	// Код товара заполняемся для "товара".   
	Если Позиция.ПризнакПредметаРасчета <> Перечисления.ПризнакиПредметаРасчета.Товар
		И Позиция.ПризнакПредметаРасчета <> Перечисления.ПризнакиПредметаРасчета.ПодакцизныйТовар Тогда
		Возврат;
	КонецЕсли;
	
	Если ПараметрыФискализации.РевизияИнтерфейса > 3001 Тогда 
		
		Если НЕ ПустаяСтрока(Позиция.КодВидаНоменклатурнойКлассификации) Тогда
			ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.КодВидаНоменклатурнойКлассификации);
			РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
		ИначеЕсли НЕ ПустаяСтрока(Позиция.ШтрихкодBase64) Тогда
			ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.ШтрихкодBase64, Истина);
			РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
		Иначе
			ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.Штрихкод);
			РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
		КонецЕсли;
		
		Если ПараметрыФискализации.РевизияИнтерфейса >= 3003 Тогда // 3.4 и выше
			// ФФД 1.2
			Если НЕ ПустаяСтрока(РеквизитКодаТовара) И Не ПустаяСтрока(ДанныеКодаТовара.ШтрихкодBase64) Тогда // Запись тега 1163
				//sweetand
				_ШтрихкодBase64 = ВставкаСимволаРазделителяGS1ВШтрихкод(ДанныеКодаТовара);
				//Если ПустаяСтрока(Позиция.КонтрольнаяМарка) Тогда
					ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
					ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(_ШтрихкодBase64));
					ЗаписьXML.ЗаписатьКонецЭлемента();
				//КонецЕсли;
				//sweetand
			КонецЕсли; 
		Иначе
			// ФФД 1.1
Показать



Функция ВставкаСимволаРазделителяGS1ВШтрихкод(ДанныеКодаТовара) Экспорт
	
	Штрихкод = Base64ВШтрихкод(ДанныеКодаТовара.ШтрихкодBase64);
	РазделительGS1 = "<0x1D>";
	
	Если Найти(Штрихкод, РазделительGS1) > 0 Тогда
		Возврат ДанныеКодаТовара.ШтрихкодBase64;
	КонецЕсли;
	
	//ДанныеКодаТовара.СерийныйНомер=5Bm2J/KPuYgVT
	ПозицияСерийногоНомера = Найти(Штрихкод, ДанныеКодаТовара.СерийныйНомер);
	ДлинаСерийногоНомера = СтрДлина(ДанныеКодаТовара.СерийныйНомер);
	
	Если ПозицияСерийногоНомера > 0 Тогда
		
		ЛеваяЧастьШтрихкода = Лев(Штрихкод, (ПозицияСерийногоНомера-1)+ДлинаСерийногоНомера);
		СредняЧастьШтрихкода = РазделительGS1 + Сред(Штрихкод, СтрДлина(ЛеваяЧастьШтрихкода) + 1, 8) + РазделительGS1;
		ПраваяЧастьШтрихкода = Сред(Штрихкод, СтрДлина(ЛеваяЧастьШтрихкода) + 9);
		
		Штрихкод = ЛеваяЧастьШтрихкода + СредняЧастьШтрихкода + ПраваяЧастьШтрихкода;
		
	Иначе	
		Возврат ДанныеКодаТовара.ШтрихкодBase64;
	КонецЕсли;	
	
	Возврат ШтрихкодВBase64(Штрихкод);
	
КонецФункции
Показать
118. andrew.ab 211 12.11.21 10:17 Сейчас в теме
(113) ффд 1.2, проверка КМ работает на ревизии 3003
120. andrew.ab 211 12.11.21 12:35 Сейчас в теме
(118)
фд 1.2, проверка КМ работает на ревизи

для этого в модуле ПодключаемоеОборудованиеУниверсальныйДрайверКлиент в Функции ФискализацияЧека(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВходныеПараметры, ВыходныеПараметры); понизить ревизию
Если ПараметрыФискализации.РевизияИнтерфейса >= 3003  Тогда//sweetand
				ТекущийСтатус = МенеджерОборудованияКлиент.ПроверкаКодаМаркировки(ПараметрыПодключения.ИДУстройства);//sweetand
				// Если есть текущая проверка КМ 
				Если НЕ ПустаяСтрока(ТекущийСтатус.ИдентификаторЗапроса) Тогда
					Попытка
						ОбъектДрайвера.ПодтвердитьКМ(ПараметрыПодключения.ИДУстройства, ТекущийСтатус.ИдентификаторЗапроса, 0);
						МенеджерОборудованияКлиент.УстановитьПроверкуКодаМаркировки(ПараметрыПодключения.ИДУстройства);
					Исключение
						СформироватьОшибкуДрайвера(ВыходныеПараметры, "ЗапросКМ", ОписаниеОшибки());
						Возврат Результат;
					КонецПопытки;
				КонецЕсли;
			КонецЕсли;
Показать
121. egorov_ivan 12.11.21 18:04 Сейчас в теме
(120) понизил версию до 3003, не помогает, т.к. обращение а итоге для проверки марки на ккм происходит все равно используя компоненту AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C3, а у нее нет методов ОткрытьСессиюРегистрацииКМ и т.д(которые связаны с проверкой ккм), у вас на листинге кода, есть параметр ТекущийСтатус.ИдентификаторЗапроса который без открытия сессии регистрации ККМ не получить, не понимаю как у вас работает, т.к. везде где идет вызовов методов проверки марки средствами ККМ используется ревизия 3004, понизил ее, но методов у компоненты нет, затык................
ПодключаемоеОборудованиеУниверсальныйДрайверКлиент-->ОткрытьСессиюРегистрацииКМ-->(строка 2189 метода Результат = ОбъектДрайвера.ОткрытьСессиюРегистрацииКМ(ПараметрыПодключения.ИдентификаторУстройства);
)
какая у вас версия компоненты в объекте ОбъектДрайвера(см.скрин)
Прикрепленные файлы:
122. user1444721 12.11.21 19:00 Сейчас в теме
10.3.72.2 вышел релиз, правда на 72.1 не встает, пишет нет доступных обновлений))
123. egorov_ivan 13.11.21 08:21 Сейчас в теме
(122)попробуйте целым cf-ником обновить
124. egorov_ivan 13.11.21 11:17 Сейчас в теме
(122) проверил нормально обновляется, особо нового там по чекам ничего нет, обработка обслуживания для ККМ так же старая с не верной компонентой
125. rsvp201 167 14.11.21 20:41 Сейчас в теме
Добрый день. Предстоит у клиента обновление УТ до релиза 10.3.72.2 и переход кассы атол на ФФД 1.2. У кого ни будь без программирования заработало продажа маркированного товара?
127. user733948 17.11.21 15:48 Сейчас в теме
У клиента 10.3.72.2 существенно дописана, но ее удалось нормально запустить. в чеках выходит М+ и в ЧЗ марки списываются. Пришлось тестировать всю схему пробития чека, вносить дописки, сделанные для клиента, исправлять косяки 1С ников. Клиент работает во фронте кассира, там вообще сильно пробитие чека переписали, без фронта не тестировали.
128. mai_k 17.11.21 17:46 Сейчас в теме
(127) Подскажите пожалуйста - какого вида xml? Полный код маркировке передаете в <FiscalString MarkingCode="">? Или <GoodCodeData GS1.M="">?
130. user733948 18.11.21 08:09 Сейчас в теме
(128)

в <FiscalString MarkingCode=""> - здесь полная марка в Base64

в <GoodCodeData GS1.M="">? - пусто
131. mai_k 18.11.21 14:39 Сейчас в теме
(130) т.е. и тот и тот тег есть? Странно
Мы сейчас удачно списываем отправляя вот такое
"<FiscalString Name="1005 полотенце махровое" Quantity="1" PriceWithDiscount="139" AmountWithDiscount="139" DiscountAmount="0" Department="1" VATRate="20" VATAmount="23.17" PaymentMethod="4" CalculationSubject="1" CountryOfOrigin="860" CustomsDeclaration="10323010/060421/0056365/1 " MarkingCode="полный код в base64">"
Решили проверить и написали в ЧЗ запрос на корректность.
Ответ:
"Формат Ваших уведомлений о реализации маркированного товара чеков ФД 71942 и ФД 71943 соответствует приказу ФНС России от 14.09.2020 n ед-7-20/662@ "об утверждении дополнительных реквизитов фискальных документов и форматов фискальных документов, обязательных к использованию" (зарегистрировано в минюсте россии 09.12.2020 n 61361) Приложение 2. Данные уведомления были успешно обработаны и указанные в них коды маркировки были выведены из оборота на основании корректного указания значения в теге 1162 productCode."
Но 1162 это же не ФФД 1.2. Толи они ошиблись, толи лыжи не едут.
135. user733948 19.11.21 09:47 Сейчас в теме
(131)

Нет <GoodCodeData GS1.M=""> - нет в выходной структуре.
129. webandroid 2 17.11.21 21:47 Сейчас в теме
(127)
исправлять косяки 1С ников.

какие именно косяки? можешь подробнее?
134. user733948 19.11.21 09:42 Сейчас в теме
(129)

Тестирование проводилось для фронта кассира с настройкой проверки марок ККТ -перед пробитием чека (вариант при сканировании не тестировали) ... ну и конфа сильно изменена , много дописок.

По поводу косяков 1С

Косяк 1й: Модуль ИнтеграцияИСУТКлиентСервер процедура ЗаполнитьПараметрыСканированияЧекККМ номер строки типового модуля - 372

	Если ШтрихкодированиеИСМПКлиентСервер.ЗаполнитьПараметрыСканированияДокументаРозничнойПродажи(ПараметрыСканирования, ВидПродукции) Тогда
		Если Контекст.ВидОперации <> Перечисления.ВидыОперацийЧекККМ.Продажа Тогда //Добавить условие
			ШтрихкодированиеИСМПКлиентСервер.ЗаполнитьПараметрыСканированияДокументаРозничногоВозврата(ПараметрыСканирования, ВидПродукции);
		КонецЕсли; //Добавить условие



Косяк 2й: ЧекККМ Модуль объекта процедура ПараметрыОперацииФискализацииЧека строка модуля 2111

	ПараметрыОперацииФискализацииЧека.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств");
	//Добавить условие +
	Если ВидОперации = Перечисления.ВидыОперацийЧекККМ.Возврат Тогда
		ПараметрыОперацииФискализацииЧека.ТипРасчета = Перечисления.ТипыРасчетаДенежнымиСредствами.ВозвратДенежныхСредств;
	КонецЕсли;
	//Добавить условие -
	ДанныеФискальнойОперации = РозничныеПродажи.СтруктураДанныеФискальнойОперации();

Показать


Косяк 3й: Чек ККМ ФормаРегистрацииПродаж процедура ПровестиИРаспечататьЧекВФорме номер строки 2423

			Результат = ФискализироватьЧекВФорме(ФУ, ДопДанные, Ответ, Отказ, ОшибкаТО, ПараметрыККТ);
			Возврат Истина; //Добавить строку
		Иначе



И пришлось добавить еще код в модуле РозничныеПродажиКлиент процедура ПроверитьКодМаркировкиСредствамиККТ строка 37

	Если ФормаПросмотра <> Неопределено
		И МенеджерОборудованияВызовСервера.ФискальноеУстройствоПоддерживаетПроверкуКодовМаркировки(ФормаПросмотра.ОборудованиеККТ, ПараметрыККТ) Тогда
		ПараметрыСканирования.ТребуетсяПроверкаСредствамиККТ = Истина;
		ПараметрыСканирования.ККТФФД12ИСМП                   = ФормаПросмотра.ОборудованиеККТ;
	//Добавить условие +
	ИначеЕсли ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ФормаВладелец, "КассаККМ") Тогда
	
		ПараметрыКассыККМ = РозничныеПродажиВызовСервера.ПараметрыКассыККМ(ФормаВладелец.КассаККМ);
		
		Если ПараметрыСканирования.ТребуетсяПроверкаСредствамиККТ <> Истина И ПараметрыКассыККМ <> Неопределено И ПараметрыКассыККМ.Свойство("ИдентификаторУстройства") И МенеджерОборудованияВызовСервера.ФискальноеУстройствоПоддерживаетПроверкуКодовМаркировки(ПараметрыКассыККМ.ИдентификаторУстройства, ПараметрыККТ) Тогда
			ПараметрыСканирования.ТребуетсяПроверкаСредствамиККТ = Истина;
			ПараметрыСканирования.ККТФФД12ИСМП                   = ПараметрыКассыККМ.ИдентификаторУстройства;
		КонецЕсли;
		
	//Добавить условие -	
	КонецЕсли;

Показать


На счет последней дописки ... может я че неправильно настроил ... не указал основную кассу. Хз , но так работает.

Это все, что вспомнил, касаемо типового кода. Но еще раз обращаю внимание, что конфа сильно переписана. Получение полной марки в ней свое, типовой механизм не используется.
Прикрепленные файлы:
webandroid; +1 Ответить
152. gesin 01.12.21 18:08 Сейчас в теме
(134) Спасибо за публикацию косяков 1С. С вашими правками на УТ 10.3.72.2 и обработкой обслуживания из данного релиза (с атоловскими дровами 10.9.0.8) всё работает. Хочу для других отметить: чтобы при сканировании марки форма подключила ККТ, нужно чтобы в РегистрСведений.ТорговоеОборудование была только одна запись с ресурсом "КассаККМ". Если будет несколько записей с одной и той же КассойККМ, то при сканировании марки может возникнуть ситуация, когда форма будет выводить сообщение о том, что касса не подключена (берется первая попавшаяся запись из РегистрСведений.ТорговоеОборудование). Не наступайте на мои грабли :) скопировал рабочую базу и запустился на другом компе, а форма пытается подключиться к кассе на другой машине. Из формы документа тоже всё работает, но нужно многое перенести из модуля формы регистрации продаж.
136. vadim227 3 21.11.21 16:36 Сейчас в теме
Здравствуйте, нужна ShtrihMkkt.epf с ревизией 3004 под ФФД 1.2, или переписанная 3002, для УТ10
138. G_116714950302264070686 23.11.21 11:20 Сейчас в теме
Кто может дать полный пример XML отправляемый в кассу с маркированной продукцией
140. user635667 113 24.11.21 16:19 Сейчас в теме
(138)
<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
	<Parameters CashierName="Сучкова О.Н." OperationType="1" TaxationSystem="5" CustomerEmail="" CustomerPhone="">
		<CorrectionData Type="0"/>
		<AgentData/>
		<VendorData/>
	</Parameters>
	<Positions>
		<FiscalString Name="Сигареты Bond street Blue selection" Quantity="1" PriceWithDiscount="145" AmountWithDiscount="145" DiscountAmount="0" Department="0" VATRate="none" VATAmount="" PaymentMethod="4" CalculationSubject="2" MarkingCode="MDQ2MDYyMDMdjfjgJDOFjjfjfDKDOFnQ5QUNWVUpubVk=">­
			<AgentData/>
			<VendorData/>
		</FiscalString>
	</Positions>
	<Payments Cash="145" ElectronicPayment="0" PrePayment="0" PostPayment="0" Barter="0"/>
</CheckPackage>
Показать
139. user635667 113 24.11.21 11:24 Сейчас в теме
(81)
СтатусЗапроса = -1;
РезультатОперацииXML = "";
                                    
Счетчик = 0;
                                    
Пока СтатусЗапроса <> 0 И СтатусЗапроса <> 2 И Счетчик < 10 Цикл
                                        
Результат = ОбъектДрайвера.ПолучитьРезультатыЗапросаКМ(ПараметрыПодключения.ИДУстройства, РезультатОперацииXML, СтатусЗапроса);
                                        
                                        Если НЕ Результат Тогда
                                            ОбъектДрайвера.ПолучитьОшибку(ОписаниеОшибки);
                                            Прервать;
                                        КонецЕсли;
                                        
                                        Если СтатусЗапроса = 0 Тогда 
                                            Прервать;
                                        КонецЕсли;
                                        
                                        ТекВремя = ТекущаяДата();
                                        Пока ТекВремя = ТекущаяДата() Цикл
                                        КонецЦикла;
                                        
                                        Счетчик = Счетчик + 1;
                                        
КонецЦикла;
                                    
Если СтатусЗапроса = 0 Тогда
Показать


Подскажите где тут СтатусЗапроса может принять = 0 ?????????????
У меня Результат выдает Истина. Но при этом через 10 секунд выбивает в ошибку что ответа нет. А ответ это СтатусЗапроса = 0. Но где в коде он принимает значение 0 я не пойму. Переделываю свою конфу под 1.2.
Еще вопрос - ну проверил я все эти коды и че дальше-то делать? как в чек передать что коды проверены и их можно списывать в ЧестномЗнаке ???
141. user635667 113 25.11.21 06:00 Сейчас в теме
Еще вопрос - я сделал и вроде как работает. Шифрую код марки сигарет в base64. провожу все проверки и отправляю. Сигареты списываются. А вот с молочкой че-то не выходит. В офд написано что код не распознан и на чеке М-. Молочка как-то по другому шифруется????
142. user1444721 25.11.21 06:36 Сейчас в теме
Что-то делали ещё кроме(139)?Атол или Штрих у вас?Обработка обслуживания типовая?На штрихе так и не получилось наладить работу с сигаретами и шинами релиз последний, драйвер последний и обработка из файла обновления последнего. Конфига не переписанная
143. user635667 113 25.11.21 06:48 Сейчас в теме
(142) У меня ВикиПринт 57Ф+. Как образец у меня есть моя же конфа актуальная. В ней все бьется как надо. Но моя рабочая конфа переписана и немного устарела. Я в ней сделал сигареты. А вот с молочкой не разобрался еще. Видимо что-то с символом GS. Пока не понял что с ним делать. В марках сигарет нет этого символа. Как разберусь напишу тут свой код который поправил.
144. user635667 113 25.11.21 07:40 Сейчас в теме
Товарищи, кто-нибудь может мне объяснить что надо сделать:
Код сигарет при сканировании 00000046209955WkouHVZACX8Ci2H, просто перевожу в base64. И в таком виде отправляю на проверку в кассу, и потом на чеке в xml. Чек бьется с [m+] и в офд и в честный знак все улетает.
НО
Код молочки при сканировании 0104606779667909215oQpmj\x1d93QR9h. В нем есть символ \x1d (он же GS). С ним такая схема не работает. И даже если заменить "\x1d" на "" тоже не работает. Что я делаю не так???
145. user635667 113 25.11.21 11:15 Сейчас в теме
Короче и этот момент победил. Но столкнулся с новой проблемой. Теперь марки Легкой промышленности проверку не проходят. Я так понял в марках ЛП надо менять на какой-то другой символ или тоже Символ(29)? В типовой конфе вместо GS подставляются какие-то "+" , я это понял дешифровав base64 из xml которая в чек уходит.
Код ЛП(полотенце) выглядит так 010462002085298221koQOFm*:oBcP\x1d91EE07\x1d92nZL1Q+BXqCkjiCNWhSPOUdENyy7NeD+XkMXzFc85­BBo=.
Вроде те же самые \x1d, но меняя их на Символ(29) проверку в ккт не проходит, пишет [m-].
146. user635667 113 26.11.21 06:52 Сейчас в теме
В общем я сделал у себя так. На супер качество и все варианты не рассчитываю. Замечания приветствуются. Слепил из кода взятого в интернете и немного подглядел как в типовых реализовано. Я тестировал на кодах от Сигарет, Молочка и ЛегкПром(полотенце). Если интернет есть выдает [M+], если нет то [M]. Проверяется во время пробития чека. В офд и честный знак все улетает. Также возвраты тоже работают.

В модуль ПодключаемоеОборудованиеУниверсальныйДрайверКлиент нужно вставить код в функцию ФискализацияЧека ПЕРЕД строкой "Если ПараметрыФискализации.СформироватьЧекКоррекции Тогда"
Если ПараметрыФискализации.РевизияИнтерфейса >= 3004  Тогда    
   	ПараметрыФискализацииЧека = ВходныеПараметры.ПозицииЧека;
	СессияОткрыта = ОбъектДрайвера.ОткрытьСессиюРегистрацииКМ(ПараметрыПодключения.ИДУстройства);
	Если СессияОткрыта Тогда
		ОписаниеОшибки = "";
		Для Каждого СтрокаЧека из ПараметрыФискализацииЧека Цикл
			Если ЗначениеЗаполнено(СтрокаЧека.ДанныеКодаТоварнойНоменклатуры.СерийныйНомер) Тогда
				
				ПроверяемыйКод = СтрЗаменить(СтрокаЧека.ШтрихКод, "\x1d", Символ(29)); 
				ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(ПроверяемыйКод);
				ШтрихКодBase64 = Base64Строка(ДвоичныеДанныеСтроки);
				ШтрихКодBase64 = СтрЗаменить(ШтрихКодBase64,Символ(10),"");
				ШтрихКодBase64 = СтрЗаменить(ШтрихКодBase64,Символ(13),"");
					
				ПараметрыОперации = Новый Структура("КонтрольнаяМарка,ИдентификаторЗапроса,ПланируемыйСтатусТовара,ОжидатьПолучениеОтветаОИСМ", ШтрихКодBase64, Новый УникальныйИдентификатор, ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ШтучныйТоварРеализован"),Ложь);
				ПараметрыОперацииXML = МенеджерОборудованияВызовСервера.СформироватьXMLДляЗапросаКМ(ПараметрыОперации);
				РезультатОперацииXML = "";
				Результат = ОбъектДрайвера.ЗапросКМ(ПараметрыПодключения.ИДУстройства, ПараметрыОперацииXML, РезультатОперацииXML);
				Если НЕ Результат Тогда                             
					ОбъектДрайвера.ПолучитьОшибку(ОписаниеОшибки);
					Прервать;
				Иначе
					РезультатПроверки = МенеджерОборудованияВызовСервера.ПолучитьРезультатыЗапросаКМИзXMLПакета(РезультатОперацииXML);
					СтатусЗапроса = -1;
					РезультатОперацииXML = "";	
					
					Результат = ОбъектДрайвера.ПолучитьРезультатыЗапросаКМ(ПараметрыПодключения.ИДУстройства, РезультатОперацииXML, СтатусЗапроса);
					Результат = ОбъектДрайвера.ПодтвердитьКМ(ПараметрыПодключения.ИДУстройства, Строка(ПараметрыОперации.ИдентификаторЗапроса), 0);
				КонецЕсли;	
			КонецЕсли;
		КонецЦикла;    
		
		Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
			Попытка
				ОбъектДрайвера.ЗакрытьСессиюРегистрацииКМ(ПараметрыПодключения.ИДУстройства);
			Исключение
			КонецПопытки;
			СформироватьОшибку(ВыходныеПараметры, ОписаниеОшибки);       
			Возврат Ложь;	
		КонецЕсли;	
	КонецЕсли;  
КонецЕсли;
Показать


Также в этот модуль надо добавить процедуру:
Процедура СформироватьОшибку(ВыходныеПараметры, СообщениеОбОшибке)
	
	ВыходныеПараметры.Очистить();
	ВыходныеПараметры.Добавить(999);
	ВыходныеПараметры.Добавить(СообщениеОбОшибке);
	
КонецПроцедуры


В модуль МенеджерОборудованияВызовСервера надо добавить 2 функции:
Функция СформироватьXMLДляЗапросаКМ(ПараметрыОперации) Экспорт
	
	ЗаписьXML = Новый ЗаписьXML();
	ЗаписьXML.УстановитьСтроку("UTF-8");
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	ЗаписьXML.ЗаписатьНачалоЭлемента("RequestKM");
	
	ИдентификаторЗапроса = ПараметрыОперации.ИдентификаторЗапроса;
	Если ПустаяСтрока(ИдентификаторЗапроса) Тогда
		ИдентификаторЗапроса =Новый УникальныйИдентификатор;
	КонецЕсли;
	
	ЗаписьXML.ЗаписатьАтрибут("GUID", XMLСтрока(ИдентификаторЗапроса));
	Если Не ПараметрыОперации.ОжидатьПолучениеОтветаОИСМ Тогда
		ЗаписьXML.ЗаписатьАтрибут("WaitForResult", "False");
	КонецЕсли;
	  
	ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ПараметрыОперации.КонтрольнаяМарка));
	
	ПланируемыйСтатусТовара = МенеджерОборудованияКлиентСервер.КодПланируемыйСтатусМаркируемогоТовара(ПараметрыОперации.ПланируемыйСтатусТовара);
	ЗаписьXML.ЗаписатьАтрибут("PlannedStatus", XMLСтрока(ПланируемыйСтатусТовара));
		
	ЗаписьXML.ЗаписатьКонецЭлемента();
	
	Возврат ЗаписьXML.Закрыть();
	
КонецФункции      


Функция ПолучитьРезультатыЗапросаКМИзXMLПакета(ДанныеXML) Экспорт
	
	Параметры = Новый Структура();
	Параметры.Вставить("КодМаркировкиПроверен", Ложь);
	Параметры.Вставить("РезультатПроверки", Ложь);
	
	Если Не ПустаяСтрока(ДанныеXML) Тогда
		ЧтениеXML = Новый ЧтениеXML; 
		ЧтениеXML.УстановитьСтроку(ДанныеXML);
		ЧтениеXML.ПерейтиКСодержимому();
		Если ЧтениеXML.Имя = "RequestKMResult" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			Параметры.КодМаркировкиПроверен = ВРег(ЧтениеXML.ЗначениеАтрибута("Checking")) = "TRUE";
			Параметры.РезультатПроверки = ВРег(ЧтениеXML.ЗначениеАтрибута("CheckingResult")) = "TRUE";
		КонецЕсли;
	КонецЕсли;
	
	Возврат Параметры;
	
КонецФункции
Показать


Также в этом модуле в Процедуре СформироватьXMLПакетДляФискализацияЧека нужно перед первым вызовом "ЗаписатьДанныеКодаТоварнойНоменклатуры" добавить код:
Если ПараметрыФискализации.РевизияИнтерфейса > 3003 Тогда
						Если Не ПустаяСтрока(ТекущаяПозиция.ДанныеКодаТоварнойНоменклатуры.СерийныйНомер) Тогда 
							ПроверяемыйКод = СтрЗаменить(ТекущаяПозиция.ШтрихКод, "\x1d", Символ(29));
							ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(ПроверяемыйКод);
							ШтрихКодBase64 = Base64Строка(ДвоичныеДанныеСтроки);
							ШтрихКодBase64 = СтрЗаменить(ШтрихКодBase64,Символ(10),"");
							ШтрихКодBase64 = СтрЗаменить(ШтрихКодBase64,Символ(13),"");
							ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ШтрихКодBase64));
						КонецЕсли; 
					КонецЕсли;
Показать


А в самой процедуре ЗаписатьДанныеКодаТоварнойНоменклатуры сразу после строки "// Реквизит кода товара (1162) для стандарта 3.2 и выше в ККТ передается в готовом виде." надо переделать код вот так:
Если ПараметрыФискализации.РевизияИнтерфейса < 3004 Тогда
		Если НЕ ПустаяСтрока(РеквизитКодаТовара) Тогда
			ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
			ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(РеквизитКодаТовара));
			ЗаписьXML.ЗаписатьКонецЭлемента();  
		КонецЕсли;
		КонецЕсли;

Это нужно что бы на кассе с ффд 1.05 печатал по старому.

В модуль МенеджерОборудованияКлиентСервер надо добавить функцию:

Функция КодПланируемыйСтатусМаркируемогоТовара(ПланируемыйСтатусМаркируемогоТовара) Экспорт
	
	Соответствие = Новый Соответствие(); 
	
	Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ШтучныйТоварРеализован")      , 1);
	Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.МерныйТоварВСтадииРеализации"), 2);
	Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ШтучныйТоварВозвращен")       , 3);
	Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ЧастьТовараВозвращена")       , 4);
	Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.СтатусТовараНеИзменился")     , 255);
	
	Возврат Соответствие.Получить(ПланируемыйСтатусМаркируемогоТовара);
	
КонецФункции
Показать


Еще надо добавить в Перечисления - ПланируемыйСтатусМаркируемогоТовара, а в него значение ШтучныйТоварРеализован.

Вот такой код получился у меня. До этого конфа работала только с ффд1.05. Версия от января 2020года.
Самый затык был вот с этим:
ПроверяемыйКод = СтрЗаменить(СтрокаЧека.ШтрихКод, "\x1d", Символ(29)); 
ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(ПроверяемыйКод);
 ШтрихКодBase64 = Base64Строка(ДвоичныеДанныеСтроки);
ШтрихКодBase64 = СтрЗаменить(ШтрихКодBase64,Символ(10),"");
ШтрихКодBase64 = СтрЗаменить(ШтрихКодBase64,Символ(13),"");

Потому-что код на сигаретах это просто код, код на молочке имеет невидимы символ GS и его тоже надо кодировать в base64, а код для легкой промышленности после перекодировки вставлял мне еще невидимые символы 10 и 13. Два дня убил что бы понять почему сигареты пробивались нормально, а все остальное нет. Но я решил эти затыки вот таким вот образом. Да и еще в моей конфигурации т.к. она старая, нет реквизитов КодМаркировки и ШтрихКодbase64. Поэтому я сам все кодирую из того что есть у меня.
Sothale; webandroid; +2 Ответить
147. user635667 113 26.11.21 07:47 Сейчас в теме
(146) Дополнение - проверил на Обуви - работает.
148. webandroid 2 26.11.21 09:28 Сейчас в теме
(146) на какой версии конфигурации тестировалось?
149. user635667 113 26.11.21 10:06 Сейчас в теме
191. GeRon 27.12.21 19:50 Сейчас в теме
(146)
Приветствую. УТ 10.3 сильно переписанная, поэтому обновления поставить нет возможности.
Доработал по вашему способу. В итого:
1. на чеке выводиться только [М] и все
2. в ЧЗ марка не уходит.
Запрос через ККМ уходит без ошибки. Запросы на состояние запроса и подтверждение продажи уходят тоже без ошибки. Но дальше никак. Марку читаем сканером в режиме "клавиатура", соответственно "допиливаю" штрихкод марки - добавляю разделители между блоками.
Пока вижу две возможные причины:
1. не корректно формирую XML для пробития, т.е. что-то не доделал.
2. дать больше время на обработку запроса, т.е. поместить в цикл проверку результата запроса пока не будет получен ответ от ЧЗ
192. user635667 113 28.12.21 01:34 Сейчас в теме
(191) у меня тоже сканеры как клавиатура. Не надо символы добавлять. Может сканер другой попробовать или настройки его проверить? Ну и перед шифрованием в base64 удалить символы переноса строки как я писал выше.
194. GeRon 28.12.21 07:26 Сейчас в теме
(192) в режим клавиатуры вывел вынужденно, при подключении по COM отваливался или тупо зависал. Пробовал несколько сканеров (правда одного типа, закуплены были партией).
Т.е. если код маркировки выглядит как "010460645306968521NsgF*RMQq2n.6", то не нужно добавлять символ(29) перед "21Nsg"?
Если считать сканером не в режиме "клавиатура", то там символ есть. Поэтому вопрос: при отправке запроса символы (29) должны быть в строке марки перед кодированием в Base64?
197. Neon.forum 28.12.21 08:24 Сейчас в теме
(194) https://честныйзнак.рф/upload/Структура%20DataMatrix.pdf тут все описано где должен быть служебный символ

Из файла выше пример:
Скрытый текст


Вы не сможете пробить чек с коротким кодом.
То что GS перед разделителем 21 такого не видел в описании
193. user635667 113 28.12.21 04:04 Сейчас в теме
(191) ой,я перепутал - после кодировки в base64 надо проверить и убрать символы переноса строки. почему-то платформа в моем случае добавляет иногда(не всегда) символы переноса.

ШтрихКодBase64 = СтрЗаменить(ШтрихКодBase64,Символ(10),"");
ШтрихКодBase64 = СтрЗаменить(ШтрихКодBase64,Символ(13),"");
succub1_5; +1 Ответить
195. GeRon 28.12.21 07:30 Сейчас в теме
(193)Это я сделал.
Вообще, можно посмотреть XML который уже на фискальник уходит?
succub1_5; +1 Ответить
196. user635667 113 28.12.21 07:33 Сейчас в теме
(195) в отладчике пройдись. Где-то в ФискализацияЧека. не помню уже.
150. ALEX22071987 26.11.21 14:08 Сейчас в теме
<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
<Parameters CashierName="Борисов Ф. М." OperationType="1" TaxationSystem="0" SaleAddress="ТутАдрес" SaleLocation="Магазин "Обувь" " CustomerEmail="" CustomerPhone="">
<AgentData/>
<VendorData/>
<CustomerDetail/>
<OperationalAttribute/>
<IndustryAttribute/>
</Parameters>
<Positions>
<FiscalString Name="111Куртка" Quantity="1" PriceWithDiscount="1.5" AmountWithDiscount="1.5" DiscountAmount="0" Department="1" VATRate="20" VATAmount="0.25" PaymentMethod="4" CalculationSubject="1" MeasurementUnit="" MarkingCode="ТУТ марировка в бейс 64" MeasureOfQuantity="0">
<AgentData/>
<VendorData/>
<IndustryAttribute/>
</FiscalString>
</Positions>
<Payments Cash="1.5" ElectronicPayment="0" PrePayment="0" PostPayment="0" Barter="0"/>
</CheckPackage>

Не уходит маркировка, есть подозрение что интеграционная компонента устарела, есть у кого свежая?
151. user635667 113 26.11.21 15:49 Сейчас в теме
(150) Ну у меня драйвер новый самый. Под свою кассу ищите новую компоненту. Кстати MeasureOfQuantity="0" не обязательный реквизит. У меня и без него все улетает.
153. buka99999 01.12.21 18:18 Сейчас в теме
Добрый день!
Хочу поделиться своим опытом трехдневного запуска ФФД 1.2. )))
Имеем: УТ 10.3.72.2 (все штатно, чеки бьем не из РМК, а из обычного интерфейса самого документа Чека ККМ), Штрих RR-01Ф (версия прошивки: C.3.41963 от 26.08.2021)

Сразу хочу сказать спасибо этой ветки и особенно "andrew.ab" - меня хотя бы направили на путь истинный.
Из коробки естественно ничего не заработало и чем дальше я начал вникать что не так, тем больше понимал, что много что не так. Когда я все для себя финишировал (начали нормально пробиваться чеки), то пришел к выводу, что куча людей доделывают эту программу и каждый из них не может все связать воедино. Элементарный пример:
"ПодключаемоеОборудованиеУниверсальныйДрайверКлиент" функция:"ФискализацияЧека":
Строка:
ДанныеЧека = МенеджерОборудованияВызовСервера.ПолучитьXMLПакетДляФискализацияЧека_ТО(ОбщиеПараметры, ВходныеПараметры, СуммаЧека, ШиринаСтроки, НовыйФормат, ВерсияФФД, ПараметрыФискализации);

В этой строке мы получаем XMLку для пробития чека, но на практике мы ее получаем просто так, так как эти данные нигде далее не используются (ну вот зачем вводить людей в заблуждение и загромождать код). Это лирика и эмоции!!!!
Теперь к делу.


1. Допилил обработку ShtrihMkkt.epf (файл прикреплю). А именно: запихнул в макет штриховскую компоненту от дайвера 5.16.0.886 (в драйвере было две компоненты, одна от ФФД1.1, другая от ФФД1.2); добавил три функции: ЗапросКМ; ПолучитьРезультатыЗапросаКМ; ПодтвердитьКМ (что интересно, в поставке Атоловской - они есть); подправил функцию "СоздатьОбъектДрайвера", чтобы попытка не валилась, т.к. компонента от ФФД1.2 теперь называется SMDrvFR1C34.


2. В общем модуле "МенеджерОборудованияВызовСервера" в функции "РевизияИнтерфейсаДрайверов" изменил:
РевизияИнтерфейса = 3004; //MAScorporation - было 3003
Не смотря на то, что после подмены компоненты (от последнего штриховского драйвера), в котором ревизия начинает определяться как 3004 (ФФД1.2), это место возвращает все на 3003 (ФФД1.1).

3. В этом же модуле добавил функцию (для добавление отсутствующего символа GS1, правда "andrew.ab", здесь немного ошибся и написал неверный символ разделения, точней он верный если драйверу напрямую подкидывать марку в виде строки, но в виде Base64 это не прокатывает):
Функция ВставкаСимволаРазделителяGS1ВШтрихкод(ДанныеКодаТовара) Экспорт //MAScorporation
    
    Штрихкод = Base64ВШтрихкод(ДанныеКодаТовара.ШтрихкодBase64);
    //РазделительGS1 = "<0x1D>";
	РазделительGS1 = Символ(29);
    
    Если Найти(Штрихкод, РазделительGS1) > 0 Тогда
        Возврат ДанныеКодаТовара.ШтрихкодBase64;
    КонецЕсли;
    
    //ДанныеКодаТовара.СерийныйНомер=5Bm2J/KPuYgVT
    ПозицияСерийногоНомера = Найти(Штрихкод, ДанныеКодаТовара.СерийныйНомер);
    ДлинаСерийногоНомера = СтрДлина(ДанныеКодаТовара.СерийныйНомер);
    
    Если ПозицияСерийногоНомера > 0 Тогда
        
        ЛеваяЧастьШтрихкода = Лев(Штрихкод, (ПозицияСерийногоНомера-1)+ДлинаСерийногоНомера);
        СредняЧастьШтрихкода = РазделительGS1 + Сред(Штрихкод, СтрДлина(ЛеваяЧастьШтрихкода) + 1, 6) + РазделительGS1;
        ПраваяЧастьШтрихкода = Сред(Штрихкод, СтрДлина(ЛеваяЧастьШтрихкода) + 7);
        
        Штрихкод = ЛеваяЧастьШтрихкода + СредняЧастьШтрихкода + ПраваяЧастьШтрихкода;
        
    Иначе    
        Возврат ДанныеКодаТовара.ШтрихкодBase64;
    КонецЕсли;    
    
    Возврат ШтрихкодВBase64(Штрихкод);
    
КонецФункции
Показать



4. В этом же модуле в процедуре "СформироватьXMLПакетДляФискализацияЧека" изменил:
 Если ПараметрыФискализации.РевизияИнтерфейса >= 3004 Тогда
						//MAScorporation - закоментил условие и добавил свое условие
						//Если Не ПустаяСтрока(ТекущаяПозиция.КонтрольнаяМарка) Тогда
						//	ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ТекущаяПозиция.КонтрольнаяМарка));
						//КонецЕсли;
						Если НЕ ПустаяСтрока(ТекущаяПозиция.ШтрихкодBase64) Тогда
							ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(ТекущаяПозиция.ШтрихкодBase64, Истина);
							РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
							Если НЕ ПустаяСтрока(РеквизитКодаТовара) И Не ПустаяСтрока(ДанныеКодаТовара.ШтрихкодBase64) Тогда // Запись тега 1163
	                			ШтрихкодBase64 = ВставкаСимволаРазделителяGS1ВШтрихкод(ДанныеКодаТовара);
								ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ШтрихкодBase64));
							КонецЕсли;
						КонецЕсли;
						
						Если Не ПустаяСтрока(ТекущаяПозиция.КодЕдиницыИзмерения) Тогда
Показать




5. В модуле "МенеджерОборудованияКлиент" в процедуре "НачатьВыполнениеКомандыТО" вставил попытку перед выполнением команды:
Попытка
				Если ЗначениеЗаполнено(ВходныеПараметры.КонтрольнаяМарка) Тогда	//MAScorporation - запишим правильно ШК
					ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(ВходныеПараметры.КонтрольнаяМарка, Истина);
					РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
					Если НЕ ПустаяСтрока(РеквизитКодаТовара) И Не ПустаяСтрока(ДанныеКодаТовара.ШтрихкодBase64) Тогда // Запись тега 1163
		    			ШтрихкодBase64 = МенеджерОборудованияВызовСервера.ВставкаСимволаРазделителяGS1ВШтрихкод(ДанныеКодаТовара);
						ВходныеПараметры.КонтрольнаяМарка	= ШтрихкодBase64;					
					КонецЕсли;  				
				КонецЕсли;
			Исключение	КонецПопытки;
			
			Если Команда = "RequestKM" Тогда
				Результат = ОбработкаОбслуживания.ЗапросКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			ИначеЕсли Команда = "GetProcessingKMResult" Тогда
				Результат = ОбработкаОбслуживания.ПолучитьРезультатыЗапросаКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			ИначеЕсли Команда = "ConfirmKM" Тогда
				Результат = ОбработкаОбслуживания.ПодтвердитьКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			КонецЕсли;
Показать




6. В модуле "РозничныеПродажиКлиент" процедура "ПроверитьКодМаркировкиСредствамиККТ" поставил попытку (обратил внимание, что всегда проверяемая марка имеет один и тотже статус и не важно продажа это или возврат):
  ПараметрыСканирования = ШтрихкодированиеИСКлиент.ПараметрыСканирования(ФормаВладелец);
	Попытка //MAScorporation - иначе всегда будет "Возврат в оборот при розничной реализации"
		Если ФормаВладелец.ВидОперации=Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
			ПараметрыСканирования.ВидОперацииИСМП	= Перечисления.ВидыОперацийИСМП.ВыводИзОборотаРозничнаяПродажа; 
		КонецЕсли
	Исключение КонецПопытки;
	Если ФормаПросмотра <> Неопределено



7. В модуль справочника "КассыККМ" функцию "ПараметрыКассыККМ" сделал правку в запросе, т.к. без этой правки всегда возвращается первая попавшаяся Касса ККМ и не факт что нужная вам.
Запрос.Текст ="ВЫБРАТЬ
	              |	КассыККМ.Ссылка КАК КассаККМ,
	              |	КассыККМ.Владелец КАК Организация,
	              |	КассыККМ.СерийныйНомер КАК СерийныйНомер,
	              |	ТорговоеОборудование.Идентификатор КАК ИдентификаторУстройства
	              |ИЗ
	              |	Справочник.КассыККМ КАК КассыККМ
	              |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТорговоеОборудование КАК ТорговоеОборудование
	              |		ПО КассыККМ.Ссылка = ТорговоеОборудование.КассаККМ
	              |ГДЕ
	              |	КассыККМ.Ссылка = &Ссылка
	              |	И ТорговоеОборудование.Компьютер = &Компьютер
	              |	И ТорговоеОборудование.Подключено = ИСТИНА"; 
	
	Запрос.УстановитьПараметр("Ссылка", КассаККМ);
	Запрос.УстановитьПараметр("Компьютер", ИмяКомпьютера());//MAScorporation - добавил это условие и еще: |	И ТорговоеОборудование.Подключено = ИСТИНА
Показать




8. В модуле справочника "ТорговоеОборудование" в функции "ПолучитьПараметрыРегистрацииУстройства" в конце добавил:
 РезультатОперации.ВерсияФФДККТ           = "1.2";	 //MAScorporation
	РезультатОперации.ВерсияФФДФН            = "1.2";	 //MAScorporation
	Возврат РезультатОперации;

Дело в том, что запрос который в этой функции отрабатывает, всегда будет возвращать пустоту, т.к. идет обращение к таблице справочника, которая на данный момент всегда пустая. Если не сделать эту правку (в моем случае), то не будет инициироваться процесс проверки кодов марки фискальником.


9. И на последок абсурдный косяк. В модуле документа "ЧекККМ" в функции "ПараметрыОперацииФискализацииЧека"
вместо строки:
ПараметрыОперацииФискализацииЧека.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств");


написал условие (без него всегда будут пробиваться чеки прихода ))))) ):

Если ВидОперации=Перечисления.ВидыОперацийЧекККМ.Возврат Тогда //MAScorporation
		ПараметрыОперацииФискализацииЧека.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ВозвратДенежныхСредств");
	Иначе
		ПараметрыОперацииФискализацииЧека.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств");
	КонецЕсли;


10. Небольшой совет. Если идет попытка пробить некорректную марку и фискальник стопориться с ошибкой:
"d3h код товара не распознан", то зайдите в свойства фискильника и исправьте:
Таблица 17 строка 41 "RUS принимать все КТ" = 1
В этом случае независимо от корректности марки чек будет печататься.



Вот как то так.
1carbon; корум; The Ant; naboko; andrew.ab; user1444721; lenwood; +7 Ответить
156. webandroid 2 05.12.21 21:41 Сейчас в теме
(153) Применил все твои рекомендации, но выходит ошибка
"Отсутствует полный код маркировки"
Не подскажешь куда смотреть?
157. webandroid 2 05.12.21 22:33 Сейчас в теме
(156) Забыл написать, работаем в РМК
159. andrew.ab 211 06.12.21 09:37 Сейчас в теме
(153) Спасибо огромное за правильный код!

Процедуру надо заменить:

Функция ВставкаСимволаРазделителяGS1ВШтрихкод(ДанныеКодаТовара) Экспорт
	
	Штрихкод = Base64ВШтрихкод(ДанныеКодаТовара.ШтрихкодBase64);
	//РазделительGS1 = "<0x1D>";
    РазделительGS1 = Символ(29);
	
	Если Найти(Штрихкод, РазделительGS1) > 0 Тогда
		Возврат ДанныеКодаТовара.ШтрихкодBase64;
	КонецЕсли;
	
	//ДанныеКодаТовара.СерийныйНомер=5Bm2J/KPuYgVT
	ПозицияСерийногоНомера = Найти(Штрихкод, ДанныеКодаТовара.СерийныйНомер);
	ДлинаСерийногоНомера = СтрДлина(ДанныеКодаТовара.СерийныйНомер);
	
	Если ПозицияСерийногоНомера > 0 Тогда
		
		ЛеваяЧастьШтрихкода = Лев(Штрихкод, (ПозицияСерийногоНомера-1)+ДлинаСерийногоНомера);
		
		ПраваяЧастьШтрихкода = Прав(Штрихкод, СтрДлина(Штрихкод) - СтрДлина(ЛеваяЧастьШтрихкода));
		ПраваяЧастьШтрихкода = СтрЗаменить(ПраваяЧастьШтрихкода, "91", РазделительGS1 + "91");
		ПраваяЧастьШтрихкода = СтрЗаменить(ПраваяЧастьШтрихкода, "92", РазделительGS1 + "92");
		
		Штрихкод = ЛеваяЧастьШтрихкода + ПраваяЧастьШтрихкода;
		
	Иначе	
		Возврат ДанныеКодаТовара.ШтрихкодBase64;
	КонецЕсли;	
	
	Возврат ШтрихкодВBase64(Штрихкод);
	
КонецФункции
Показать
200. user626670_fadanik34 09.01.22 21:29 Сейчас в теме
(153) Спасибо, Александр, за "инструкцию", действительно помогло, пробил в итоге чек с [м+]. Подкрутил побитие чека из реализации (клиент использует связку: заказ клиента - реализация - приходный ордер). на Атол 11ф завелось ..
154. buka99999 01.12.21 18:19 Сейчас в теме
Забыл файлик прикрепить )))
Прикрепленные файлы:
ShtrihMkkt_ФФД1.2.epf
155. Natali_77 03.12.21 18:37 Сейчас в теме
(154) Спасибо большое, в понедельник буду пробовать тоже и отпишусь.
158. user1444721 06.12.21 07:56 Сейчас в теме
(157)В чекахККМ тоже на какие-то коды выходит "Отсутствует полный код маркировки", а некоторые проходят проверку.
160. webandroid 2 06.12.21 12:13 Сейчас в теме
кто знает ошибка "Отсутствует полный код маркировки" связана с тем что длинна кода 31 символ ? Так маркируются остатки одежды и обуви.
161. webandroid 2 07.12.21 16:19 Сейчас в теме
(160)отвечаю сам себе. Код считанный сканером в рмк 1с и код вставленный в форму поиска штрих-кода по F7 дает разные результаты. Т.е. Проверить работоспособность системы можно только через считывание сканером кода. Все коды не пробовал , но несколько прошли проверку удачно, затык только с открытием закрытием смены.
162. user1444721 07.12.21 16:48 Сейчас в теме
Может кто-то подскажет, 10.3.72.2 в документе ЧекККМ при закрытии формы Проверки маркированного товара не заполняется табличная часть Товары?Номенклатура и количество только встает, цена ед.измерения и др. нет.Приходится склад перевыбирать и ед.измерения выбирать.Если не заходить в форму проверки и просто считывать F7 то заполняет ,но сканер настроен в режиме клавиатуры и через F7 не прокатывает без формы проверки.Перевести сканер конечно простое решение, но привыкли уже к форме проверки.
163. webandroid 2 07.12.21 20:02 Сейчас в теме
(162)с маркировкой лучше виртуальный com порт, сам долго упирался пока не понял.
164. user1444721 13.12.21 20:42 Сейчас в теме
Компоненту не нужно менять smdrvfr_34_5_16_0_886_win_32.dll? Если да то каким образом.
После всех 10 пунктов маркировка проходит проверку но Чек на кассе не выходит и если брать обычный товар то тоже не выходит. Обработку менял торгового оборудования, тест связи успешно проходит. База типовая была, релиз последний.Касса Штрих-лайт-01ф.
В итоге пока откатил изменения и перенастроил обратно торговое оборудование. До дописок хотя бы обычный товар пробивается)
Ещё заметил такой момент, после попытки пробить связь с кассой пропадает, порт становится недоступным или в случае RNDIS настройки нет связи. Прошивку проверяли.
165. webandroid 2 13.12.21 22:02 Сейчас в теме
вышло обновление ут 10.3.72.3 Касаемо маркировки НИЧЕГО! НИ КАКИХ ИЗМЕНЕНИЙ!
166. user1688205 14.12.21 14:08 Сейчас в теме
Добрый день. Подскажите, не получилось запустить выбытие маркированных товаров в связке УТ10.3 и Атол 30Ф без доп. доработок?
167. webandroid 2 14.12.21 17:16 Сейчас в теме
(166)
Добрый день. Подскажите, не получилось запустить выбытие маркированных товаров в связке УТ10.3 и Атол 30Ф без доп. доработок?


не стоит надеяться на 1С, ут10.3 , мне кажется , специально так делают чтобы все перешли на ут11. Ни с какими атолами, штрих-м и прочими кассами работать из коробки не будет. Для штрих-м buka99999 вроде доделал (не могу проверить) , а вот для атол несмотря на доработки чек не пробивается. Ошибка "не верный тип кода номенклатуры" и пока это никто победить не смог.
168. user1444721 15.12.21 06:11 Сейчас в теме
169. user1444721 15.12.21 09:41 Сейчас в теме
Документ Оплата платежной картой при пробитии ругается на тэг 1227, релиз 10.3.71.1.Пробовали ИНН менять, 1227 - наименование контрагента.Похоже в коде не добавлено.Драйвер штриха последний и обработка последняя.
170. ray1978 17.12.21 12:43 Сейчас в теме
(169) Я делал документ Рко и пробивал в нем чек. У меня ругалась программа тоже на тег 1227. Прищлось найти в коде это место, заодно почитать теорию про версии ФФД.
Вот что я выяснил.
- тэг 1227 (наименование покупателя) не является обязательным для ФФД 1.1
- для ФФД 1.2 является уже обязательным, но будет участвовать вместе с группой других тегов (там меняется формат передачи данных)

При этом, для ФФД 1.1 тег ИНН Покупателя обязателен.

ЧТО же делать мне, если я возвращаю деньги частному лицу?

Понятно, что если бы я возвращал деньги организации, то у нее был бы ИНН. А он обязателен. И название можно было бы вывести

С вязи с этим я понял, что для частного лица - выводить Наименование в тег 1227 (а так делает УТ 10.3.72.3) нет смысла, потому что к наименованию касса хочет обязательный реквизит ИНН. А ИНН у частного лица нет.

В связи с этим, я в коде 1С просто заремарил вывод Наименование Покупателя (в моем случае Частное лицо). И все стало ОК. Касса бьет чеки, ОФД их получает. А тэг для ИНН остался пустым.

Вывод,
думаю немного подправить логику, оттолкнувшись от ИНН.
Если в документе выбран Контрагент, у которого есть ИНН, тогда выводим два тега ИНН (он обязательный) и тег 1227 (НаименованиеПокупателя)

Если же ИНН контрагента пустой (подразумеваем что это частное лицо), то тег ИНН выводится пустым, и я для тега 1227 ставлю Покупатель=""; (т.е тег 1227 выводится, но с пустым значением)

---
Кассат Атол 50Ф,
ФФД 1.1
Платформа 5.8.17

---
тег ИНН, по памяти, мне кажется это тег 1228
171. Neon.forum 21.12.21 10:00 Сейчас в теме
А кто нибудь обращал внимание что CalculationSubject="1" ПризнакиПредметаРасчета = товар отправляется? вроде как 33 должен стоять...

4. В реквизит "Признак предмета расчета" (Тег 1212) добавлены новые значения (см. таблицу 101 приложения № 2 к приказу № 662):

"30" – если продается обязательный к маркировке подакцизный товар, который не имеет кода маркировки (в печатном чеке значение "АТНМ");
"31" – если продается обязательный к маркировке подакцизный товар, который имеет код маркировки (в печатном чеке значение "АТМ");
"32" – если продается обязательный к маркировке товар, который не имеет кода маркировки (кроме подакцизных товаров) (в печатном чеке значение "ТНМ");
"33" – если продается обязательный к маркировке товар, который имеет код маркировки (кроме подакцизных товаров) (в печатном чеке значение "ТМ").
Новый формат фискальных документов версии 1.2.
172. ray1978 21.12.21 11:15 Сейчас в теме
(171)
Прошел по ссылке и почитал.
Я так понял, что теперь продавец будет передавать в чекеККМ сведения о покупателе(физическое лицо)
не только ИНН и Наименование, но и
- документ, удостоверяющий личность (получается, паспорт)
- номер документа (номер паспорта)

Это теперь в магазин ходить с паспортом, а продавец будет переписывать мои сведения?
А как же защита персональных данных?
173. Neon.forum 21.12.21 11:19 Сейчас в теме
(172)Напомним, в настоящее время указывать в кассовом чеке (БСО) наименование и ИНН покупателя (клиента) необходимо при (п. 6.1, 6.2 ст. 4.7 Закона № 54-ФЗ):

расчетах между организациями (ИП) наличными и (или) с предъявлением электронного средства платежа (платежная карта);
выплате выигрыша в азартные игры, лотереи (15 000 руб. и более), получении страховой премии, страховой выплате.
174. ray1978 21.12.21 11:36 Сейчас в теме
(173)
расчетах между организациями (ИП) наличными и (или) с предъявлением электронного средства платежа (платежная карта);
выплате выигрыша в азартные игры, лотереи (15 000 руб. и более), получении страховой премии, страховой выплате


Еще раз заглянул и копирую как раз следующий абзац за тем абзацем, что скопировали Вы.

"...
Таким образом, реквизиты "покупатель (клиент)" (Тег 1227), "ИНН покупателя (клиента)" (Тег 1228) используются в кассовом чеке (БСО), сформированном ФН версии 1.2, как при расчетах между организациями (ИП), так и при расчетах с физлицами. При этом если при расчетах с физлицами в кассовом чеке нет ИНН покупателя, в кассовом чеке указываются: "дата рождения покупателя (клиента)" (Тег 1243), "код вида документа, удостоверяющего личность" (Тег 1245), "данные документа, удостоверяющего личность" (Тег 1246)
..."

Как понять здесь формулировку про физическое лицо?

Здесь явно указано разделение между организациями,ИП и физическим лицом.

Или же понимается так, что
- расчеты наличкой между организациями и ИП, ИП должно предъявить еще и паспорт?
- расчеты между организцацией и другой организацией, где физЛицо пришло, то здесь физлицо должно предъявить либо свой ИНН, либо Паспорт

а если это выплаты выигрыша, лотереи, получение страховой премии и т.д, то физЛицо должно предъявить ИНН или паспорт. (в принципе, здесь и раньше сведения паспорта брали)

В общем, не могу понять этот фрагмент:
"... Таким образом, реквизиты "покупатель (клиент)" (Тег 1227), "ИНН покупателя (клиента)" (Тег 1228) используются в кассовом чеке (БСО), сформированном ФН версии 1.2, как при расчетах между организациями (ИП), так и при расчетах с физлицами. ..."
- и вот в этом случае, если у физЛица нет ИНН, то пожалуйста, предъявите паспорт.

Ведь он относится к простым расчетам?
bambucho; +1 Ответить
175. Neon.forum 21.12.21 12:50 Сейчас в теме
Вчера допилил свою Ут 10 и тестировал на Атоле, так дало сделать 2 чека подряд с одним кодом, причем второй раз прошла проверка, вот вернуть дало только один раз... проверял что код выбыл и потом второй чек.
176. rusha77 22.12.21 17:06 Сейчас в теме
(175) Ну если подряд 2 чека с одним КМ пробивали, то данные просто не успели дойти до ЧЗ, поэтому пробитии второго чека еще успело выдать, что нормальный код маркировки
177. Neon.forum 23.12.21 08:54 Сейчас в теме
(176)Проверял что код выбыл(через приложение ЧЗ)после первого чека и потом второй чек.
183. Natali_77 24.12.21 10:17 Сейчас в теме
(175) А вы допиливали свою конфу на основании тех изменений, которые здесь выкладывали? Или сами разбирались?
184. rusha77 24.12.21 14:55 Сейчас в теме
(183) Да, код, который здесь пригодился. Там символов GS не хватает вроде как. А с этим кодом работает.
Пришлось убрать только строку "Возврат Истина;" в форме РМК, иначе не создавался новый чек.

Новое обновление 10.3.73.1 исправлений насчет сканирования кодов маркировки не имеет.

Еще обязательно заново переподключайте ККТ в торговом оборудовании, чтобы увидело новый драйвер.
Если у вас АТОЛ, то ставьте драйвер 10.9.1.0
187. webandroid 2 24.12.21 22:09 Сейчас в теме
(184)
Пришлось убрать только строку "Возврат Истина;" в форме РМК, иначе не создавался новый чек.

это он не для РМК делал, для чека из списка документов
186. Neon.forum 24.12.21 20:43 Сейчас в теме
(183) То что писал buka99999 только пункт 2 и 7. Плюс еще свое, тк конфа переписанная слишком...
Не стал использовать проверку кода и фискализацию в модуле Формы РМК оставил все в общем модуле. Еще была правка по сохранению полного кода тк иногда он в ПулКодовМаркировкиСУЗ заменялся коротким.
Одно можно сказать очень сыро и из коробки не работает.
178. rolin555 48 23.12.21 13:03 Сейчас в теме
Подскажите, можно ли пробивать чек с табачной продукцией на ФФД 1.2 без предварительной проверки?
179. webandroid 2 23.12.21 13:49 Сейчас в теме
(178)табак не знаю, а текстиль не получается без проверки
180. bambucho 23.12.21 17:11 Сейчас в теме
Если кассу АТОЛ зарегистрировать с ФФД 1.2,с годовалой конфой УТ10.3 (временно),касса будет работать (печатать и отправлять чеки в ОФД без маркировки)?
181. user1444721 23.12.21 17:32 Сейчас в теме
(180) Есть моменты связанные с передачей тэгов специфических, в целом думаю если только розничные продажи используются то все должно быть хорошо. Штрих и Viki Print на ФФД 1.2 нормально пробивают чеки. Сами решили перейти на УТ11 с нового года.
bambucho; +1 Ответить
182. Neon.forum 24.12.21 10:15 Сейчас в теме
(180) в ФФД 1.2 Реквизит "Единица измерения предмета расчета" (Тег 1197) не применяется. Вместо него используется "Мера количества предмета расчета" (Тег 2108). Всего значений – 24. Это может быть килограмм, метр, квадратный метр, литр, час, мегабайт и т.д. Для предметов расчета, которые реализуются поштучно или единицами, предусмотрено значение "0" (Таблица 114 Приложения 2 к приказу № 662).

Если на это касса не будет ругаться то заработает. Если касса подставит автоматически 0 то пойдет но единица везде будет Шт условно

https://its.1c.ru/db/newscomm/content/471190/hdoc
bambucho; +1 Ответить
185. Neon.forum 24.12.21 20:31 Сейчас в теме
Несколько дней ломал голову почему проверка кодов странно работала(первый раз отрабатывала потом если была ошибка то все коды уже не проходили проверку) а оказалось что сессия регистрацииКМ не закрывалась!
Вот что пришлось сделать. Может кому пригодится...

В МенеджерОборудованияКлиент :

Процедура НачатьЗакрытииСессииРегистрацииКМ(ОповещениеПриЗавершении, УникальныйИдентификатор, Параметры = Неопределено, ИдентификаторУстройства = Неопределено) Экспорт
	
	Контекст = Новый Структура;
	Контекст.Вставить("ОповещениеПриЗавершении" , ОповещениеПриЗавершении);
	Контекст.Вставить("УникальныйИдентификатор" , УникальныйИдентификатор);
	Контекст.Вставить("ВходныеПараметры"        , Параметры);
	Контекст.Вставить("ВыполняемаяКоманда"      , "CloseSessionRegistrationKM");
	//
	//Если ИдентификаторУстройства = Неопределено Тогда
	//	
	//	ПоддерживаемыеТипыВО = Новый Массив();
	//	ПоддерживаемыеТипыВО.Добавить("ККТ");
	//	ОписаниеОповещения = Новый ОписаниеОповещения("НачатьВыполнениеКоманды_ВыбратьУстройствоЗавершение", МенеджерОборудованияКлиент, Контекст);
	//	ПредложитьВыбратьУстройство(ОписаниеОповещения, ПоддерживаемыеТипыВО,
	//		НСтр("ru='Выберите ККТ'"), 
	//		НСтр("ru='ККТ не подключено.'"), 
	//		НСтр("ru='ККТ не выбрано.'"), 
	//		Истина);
	//Иначе
	//	НачатьВыполнениеКоманды_ВыбратьУстройствоЗавершение(ИдентификаторУстройства, Контекст);
	//КонецЕсли;
	
	//Neon++>
	Если ИдентификаторУстройства = Неопределено Тогда
		
		ВыводСообщений.ВывестиСообщениеВОкноСообщений(НСтр("ru='ККТ не подключено.'"),ПредопределенноеЗначение("Перечисление.ВидыСообщений.Ошибка"),,,Истина);
		
	Иначе
		НачатьВыполнениеКомандыТО(ОповещениеПриЗавершении, ИдентификаторУстройства, "CloseSessionRegistrationKM", Параметры);
	КонецЕсли;
//<++
КонецПроцедуры

Процедура НачатьОткрытиеСессииРегистрацииКМ(ОповещениеПриЗавершении, УникальныйИдентификатор, Параметры = Неопределено, ИдентификаторУстройства = Неопределено) Экспорт
	
	Контекст = Новый Структура;
	Контекст.Вставить("ОповещениеПриЗавершении" , ОповещениеПриЗавершении);
	Контекст.Вставить("УникальныйИдентификатор" , УникальныйИдентификатор);
	Контекст.Вставить("ВходныеПараметры"        , Параметры);
	Контекст.Вставить("ВыполняемаяКоманда"      , "OpenSessionRegistrationKM");
	
	//Если ИдентификаторУстройства = Неопределено Тогда
	//	
	//	ПоддерживаемыеТипыВО = Новый Массив();
	//	ПоддерживаемыеТипыВО.Добавить("ККТ");
	//	ОписаниеОповещения = Новый ОписаниеОповещения("НачатьВыполнениеКоманды_ВыбратьУстройствоЗавершение", МенеджерОборудованияКлиент, Контекст);
	//	ПредложитьВыбратьУстройство(ОписаниеОповещения, ПоддерживаемыеТипыВО,
	//		НСтр("ru='Выберите ККТ'"), 
	//		НСтр("ru='ККТ не подключено.'"), 
	//		НСтр("ru='ККТ не выбрано.'"), 
	//		Истина);
	//Иначе
	//	НачатьВыполнениеКоманды_ВыбратьУстройствоЗавершение(ИдентификаторУстройства, Контекст);
	//КонецЕсли;
	
	//Neon++>

	Если ИдентификаторУстройства = Неопределено Тогда
		
		ВыводСообщений.ВывестиСообщениеВОкноСообщений(НСтр("ru='ККТ не подключено.'"),ПредопределенноеЗначение("Перечисление.ВидыСообщений.Ошибка"),,,Истина);
		
	Иначе
		НачатьВыполнениеКомандыТО(ОповещениеПриЗавершении, ИдентификаторУстройства, "OpenSessionRegistrationKM", Параметры);
	КонецЕсли;
//<++
КонецПроцедуры
Показать


В Процедуре НачатьВыполнениеКомандыТО:


	Если Команда = "RequestKM" Тогда
				Результат = ОбработкаОбслуживания.ЗапросКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			ИначеЕсли Команда = "GetProcessingKMResult" Тогда
				Результат = ОбработкаОбслуживания.ПолучитьРезультатыЗапросаКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			ИначеЕсли Команда = "ConfirmKM" Тогда
				Результат = ОбработкаОбслуживания.ПодтвердитьКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
	//Neon 			
			ИначеЕсли Команда = "CloseSessionRegistrationKM" Тогда
				Результат = ОбработкаОбслуживания.ЗакрытьСессиюРегистрацииКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			ИначеЕсли Команда = "OpenSessionRegistrationKM" Тогда
				Результат = ОбработкаОбслуживания.ОткрытьСессиюРегистрацииКМ(ОбъектДрайвера, ПараметрыККТ, ВходныеПараметры, ВыходныеПараметры, Идентификатор);
			КонецЕсли;
	//Neon 				
Показать



И в обработку обслуживания добавил 2 функции:

Функция ОткрытьСессиюРегистрацииКМ(Объект, ПараметрыККТ, ПараметрыПроверки, ВыходныеПараметры, Идентификатор) Экспорт
	
	мПараметрыПодключения.Вставить("ПараметрыРегистрации", ПараметрыККТ);
	мПараметрыПодключения.Вставить("ТипОборудования", "ККТ");
	мПараметрыПодключения.Вставить("ИдентификаторУстройства", Идентификатор);
	
	РезультатВыполнения = ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ВыполнитьКоманду("ОткрытьСессиюРегистрацииКМ",
		ПараметрыПроверки, ВыходныеПараметры, Объект.Драйвер, мПараметрыУстройства, мПараметрыПодключения);

	Если Не РезультатВыполнения Тогда
		Результат = Ложь;
		Объект.ОписаниеОшибки = ВыходныеПараметры[1];
	Иначе
		Результат = Истина;
		Объект.Вставить("ВыходныеПараметры", ВыходныеПараметры);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ЗакрытьСессиюРегистрацииКМ(Объект, ПараметрыККТ, ПараметрыПроверки, ВыходныеПараметры, Идентификатор) Экспорт
	
	мПараметрыПодключения.Вставить("ПараметрыРегистрации", ПараметрыККТ);
	мПараметрыПодключения.Вставить("ТипОборудования", "ККТ");
	мПараметрыПодключения.Вставить("ИдентификаторУстройства", Идентификатор);
	                                                                                                   
	РезультатВыполнения = ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ВыполнитьКоманду("ЗакрытьСессиюРегистрацииКМ",
		ПараметрыПроверки, ВыходныеПараметры, Объект.Драйвер, мПараметрыУстройства, мПараметрыПодключения);

	Если Не РезультатВыполнения Тогда
		Результат = Ложь;
		Объект.ОписаниеОшибки = ВыходныеПараметры[1];
	Иначе
		Результат = Истина;
		Объект.Вставить("ВыходныеПараметры", ВыходныеПараметры);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Показать
webandroid; +1 Ответить
188. Natali_77 25.12.21 23:14 Сейчас в теме
(185) Тоже такая проблема, попробую ваше решение, отпишусь потом.
189. bambucho 27.12.21 15:42 Сейчас в теме
УТ10.последниеобновы на 27.12.2021 (в.ч. драйвер,обработка,прошивка и платформа), при попытке напечатать чек из реализации плюется ошибкой "Ошибка программирования реквизита 1256 (Ошибка программирования реквизита 1243) ут10"...слышал/вычитывал про данные покупателя,но где их вбить в базе что бы наверняка?
190. GeRon 27.12.21 19:37 Сейчас в теме
(189) Обратите внимание на покупателя. Если это юрлицо - нужен ИНН, если физлицо - нужна дата рождения, соответственно эти данные будут переданы как покупатель. По сути у вас ругается на то что вы передаете наименование покупателя, но нет обязательного ИНН или даты рождения.
собственно вот обсуждение на сайте атол подобной проблемы http://forum.atol.ru/index.php?showtopic=42254&st=0&p=317959&
bambucho; +1 Ответить
198. bambucho 28.12.21 10:36 Сейчас в теме
(190)
если физлицо - нужна дата рождения

-понять бы,где это поле заполнить,не ковыряя код...
199. bambucho 30.12.21 14:15 Сейчас в теме
Всех с наступающим! Теперь другая проблема,возврат сделать не могу (как из документа:Возврат товаров от покупателя,так и через РКО).
Касса в 1с возвращает только "Не поддерживается в данном режиме".Что не поддерживается,не понятно.
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Аналитик 1С
Санкт-Петербург
зарплата до 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 220 000 руб.
Полный день

1С Программист по 1С:Управление торговлей
Кострома
зарплата от 100 000 руб. до 110 000 руб.
Полный день

Руководитель отдела разработки
Москва
зарплата от 200 000 руб. до 230 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 150 000 руб.
Полный день