Вывод GTIN в УПД Контура и проблема формата 970

Клиенту понадобилось заполнять в УПД GTIN.

Вроде бы ничего сложного, в этот раз обнаружил, что Номенклатуру можно получать из текущей строки Items через дополнительные параметры, удобно.

Как заполнять поле ГТИН нашел, просто введя в документацию поиск по слову ГТИН, попал на формат строки товара 970.

Но у меня в поле не было реквизита GTIN.

Начал разбираться.

Оказалось, Контур выводит УПД в формат 820, а затем конвертирует его в 970-й.

На форуме миста мне подсказали направление поиска решения.

Я поискал в регистре свойств свойство РежимСовместимостиФорматов820и970:

И поменял его с Авто на НеИспользуется:

Пришлось повозиться еще с кодом, нашел как добавлять элемент в список.

В итоге получилось как было задумано:

Отлаживал в коде в обработке конфигурации, для релиза выгрузил во внешнюю обработку:

Почему-то еще при смене типа на 970-й, в отладочной базе в настройках Организации поменялись пакеты на отправку, но в рабочей не менялись:

Код подключаемого модуля

Перем ОсновнойМодуль Экспорт;

Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт

	Если ИмяСобытия = "ПодготовитьЭлектронныйДокумент" Тогда

		Возврат ПодготовитьЭлектронныйДокумент(Параметры);

	ИначеЕсли ИмяСобытия = "ЗаполнитьРеквизитыДокумента" Тогда

		Возврат ЗаполнитьРеквизитыДокумента(Параметры);

	КонецЕсли;

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


Функция ПодготовитьЭлектронныйДокумент(Параметры)

	Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("Результат_ИМ") Тогда

		Документ1С = Параметры.Результат.Документ1С;

		Если Параметры.ВидДокументаРазвернутый.ID = "ID_УПД" Тогда
			//Сообщить("УПД");           
			
			Content		= Параметры.Результат.Content;    
			Items = Content.Table.Items;                                 
			УказыватьГод = истина;
			
			Для Каждого Item ИЗ Items Цикл
				//Артикул = Item.ItemVendorCode;
				//Наименование = Item.Product;
				Номенклатура = ЗначениеИзСтрокиВнутр(Item.СлужебнаяИнформация.Номенклатура);
				//Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Наименование);
				//Если Не ЗначениеЗаполнено(Номенклатура) Тогда
				//	ВызватьИсключение "Не найдена номенклатура по наименованию: " + Наименование;
				//КонецЕсли;      
				
				//Смотрим вид маркировки
				ВидМаркировки = Номенклатура.ВидПродукцииИС;			
				Если ЗначениеЗаполнено(ВидМаркировки) Тогда
					//ОсновнойМодуль.ДобавитьИнформационноеПоле(Item.StructedAdditionalInfos, "ГТИН", "0123");	
					ГТИН = ПолучитьGTINНоменклатуры(Номенклатура);
					Если ЗначениеЗаполнено(ГТИН) Тогда
						Item.GTIN = ГТИН;  //ОсновнойМодуль.ДобавитьИнформационноеПоле(Item, "ГТИН", ГТИН);
						//Добавляем КолВедМарк
						//ОсновнойМодуль.ДобавитьИнформационноеПоле(Item.ItemIdentificationNumbers, "MarkedItemsQuantity", Item.Quantity);
						//УстановитьЗначениеXDTO_Аналог(Item.ItemIdentificationNumbers, "MarkedItemsQuantity", Item.Quantity);
						//ТипЭлементаСписка = ФабрикаXDTO.Тип("http://diadoc.kontur.ru/dll_types", "ItemIdentificationNumber970");
						//ТипЭлементаСписка = ФабрикаXDTO.Тип("http://diadoc.kontur.ru/dll_types", "ItemIdentificationNumber970");
						//НовыйЭлементКоллекции = ФабрикаXDTO.Создать(Item.Тип().Свойства[31].Тип.БазовыйТип);
						//НовыйЭлементКоллекции.MarkedItemsQuantity = Item.Quantity;
						//Item.ItemIdentificationNumbers.Добавить(НовыйЭлементКоллекции);
						Эл = ОсновнойМодуль.НовыйЭлементСпискаXDTO(Item.ItemIdentificationNumbers);
						Эл.MarkedItemsQuantity = Item.Quantity;
						
					Иначе
						Сообщить("Не найден GTIN номенклатуры: " + Номенклатура);
					КонецЕсли;
					
					//Item.StructedAdditionalInfos.Добавить("ГТИН", "0123");	
				КонецЕсли;
			КонецЦикла;

			//ВПФ = Справочники.ВнешниеОбработки.НайтиПоКоду(""); // ДополнительныеОтчетыИОбработки
			//ДанныеПечатнойФормы = СформироватьВнешнююПечатнуюФорму(Документ1С, ВПФ, "");
			//Параметры.Результат.ДвоичныеДанные = Новый ДвоичныеДанные(ДанныеПечатнойФормы.ИмяВременногоФайла);
			//Параметры.Результат.ЗапрашиватьОтветнуюПодпись = Истина;
			//Параметры.Результат.Метаданные.FileName	= ДанныеПечатнойФормы.ИмяФайла;
			//Параметры.Результат.Метаданные.DocumentNumber	= Документ1С.Номер;
			//Параметры.Результат.Метаданные.DocumentDate	= Документ1С.Дата;

		КонецЕсли;

		Возврат Истина;

	КонецЕсли;

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

// Функция устанавливает значение свойства объекта XDTO по строковому пути (через точку).
// Аналог встроенной функции платформы УстановитьЗначениеXDTO().
//
// Параметры:
//  ОбъектXDTO - ОбъектXDTO - Объект, в котором нужно установить значение.
//  Путь       - Строка     - Путь к свойству, например: "Документ.СвПрод.Адрес.Индекс"
//  Значение   - Произвольный - Устанавливаемое значение.
//
Процедура УстановитьЗначениеXDTO_Аналог(ОбъектXDTO, Знач Путь, Значение) Экспорт
 
 // Разбиваем путь по точкам, используя стандартную замену
 Путь = СтрЗаменить(Путь, ".", Символы.ПС);
 КоличествоШагов = СтрЧислоСтрок(Путь);
 
 ТекущийОбъект = ОбъектXDTO;
 
 Для Шаг = 0 По КоличествоШагов Цикл
  ИмяСвойства = СтрПолучитьСтроку(Путь, Шаг);
  
  // Если это последний элемент в пути — просто присваиваем значение
  Если Шаг = КоличествоШагов Тогда
   ТекущийОбъект.Установить(ИмяСвойства, Значение);
   Прервать;
  КонецЕсли;
  
  // Если элемент промежуточный, проверяем, создан ли подобъект
  СледующийОбъект = ТекущийОбъект.Получить(ИмяСвойства);
  
  Если СледующийОбъект = Неопределено Тогда
   // Свойства еще нет, нужно инициализировать его по типу из фабрики XDTO
   СвойствоXDTO = ТекущийОбъект.Тип().Свойства.Получить(ИмяСвойства);
   
   Если СвойствоXDTO = Неопределено Тогда
    ВызватьИсключение "Свойство '" + ИмяСвойства + "' не найдено в типе XDTO " + ТекущийОбъект.Тип().Имя;
   КонецЕсли;
   
   // Создаем новый объект XDTO согласно его типу в схеме
   НовыйОбъект = ФабрикаXDTO.Создать(СвойствоXDTO.Тип);
   ТекущийОбъект.Установить(ИмяСвойства, НовыйОбъект);
   ТекущийОбъект = НовыйОбъект;
  Иначе
   // Подобъект уже существует, проваливаемся в него
   ТекущийОбъект = СледующийОбъект;
  КонецЕсли;
 КонецЦикла;
 
КонецПроцедуры


Функция ПолучитьGTINНоменклатуры(Номенклатура)
	З = Новый Запрос(
	"ВЫБРАТЬ
	|	Штрихкоды.Штрихкод
	|ИЗ
	|	РегистрСведений.Штрихкоды КАК Штрихкоды
	|ГДЕ
	|	Штрихкоды.Владелец = &Владелец"
	);
	
	З.УстановитьПараметр("Владелец", Номенклатура);
	Выборка = З.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат "0" + СокрЛП(Выборка.Штрихкод);
	КонецЕсли;
	
КонецФункции

Функция ЗаполнитьРеквизитыДокумента(Параметры)

	Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("Результат_ИМ") Тогда

		//Возврат Истина;

	КонецЕсли;

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


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

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
	
	НоваяКоманда						= ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление			= Представление;
	НоваяКоманда.Идентификатор			= Идентификатор;
	НоваяКоманда.Использование			= Использование;
	НоваяКоманда.ПоказыватьОповещение	= ПоказыватьОповещение;
	НоваяКоманда.Модификатор			= Модификатор;
	
КонецПроцедуры

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
	
	Если ИдентификаторКоманды = "ВыполнитьРегламентныеДействияПМ" Тогда
		ВыполнитьРегламентныеДействияПМ(ПараметрыВыполненияКоманды);
	КонецЕсли;
	
КонецПроцедуры

Процедура ВыполнитьРегламентныеДействияПМ(Параметры)
	// Регламентные действия, НЕ требующие инициализации основного модуля
КонецПроцедуры

Функция ЭДО_ВерсияAPIПодключаемогоМодуля() Экспорт
	
	Возврат 4;
	
КонецФункции

Среда: УТ 10.3.49.3. 1С 8.3.10.2580. Объем 4 час.

image_pdfimage_print

fixin

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

Вам может также понравиться...

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

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