Вывод 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 час.




Свежие комментарии