Входящие
При обработке входящих документов используется публичный метод ЭДО_ПолучитьТабличнуюЧастьИзКонтентаXML. Метод возвращает табличную часть электронного документа, в которой содержится элемент СведенияОМаркировке.
С версии модуля 4.69.2 в структуре появился новый элемент ПроизводственныеПартии. В нем хранятся данные ОСУ и партионного учета, если они переданы в явном виде.
Предупреждение
НомУпак — это коллекция не только для ОСУ. Если признаков ОСУ нет, модуль не считает содержимое НомУпак кодами ОСУ.
ПроизводственныеПартии заполняется при одном из условий:
для УПД 970: Заполнен <ГТИН> или <ПрПартМарк>,
для УКД 736: В <ИнфПолФХЖ2> файла обмена есть атрибут <Идентиф=«ПрПартМаркДо»> или <Идентиф=«ПрПартМаркПосле»>,
для УКД 29: Заполнен <ГТИН> или <ПрПартМарк>.
Сценарии
Алгоритм получения данных ОСУ и партий из УПД можно написать следующим образом.
Пример
Для Каждого СтрокаДанных Из ТоварнаяЧасть Цикл
Номенклатура = СопоставленнаяНоменклатура.Номенклатура;
Партии = СтрокаДанных.СведенияОМаркировке.ПроизводственныеПартии;
Если Партии.Количество() > 0 Тогда
Для Каждого Партия Из Партии Цикл
ДанныеМаркировки = Контракт_ДанныеМаркировки();
ДанныеМаркировки.НомерПартии = Партия.НомерПартии;
Если ЗначениеЗаполнено(Партия.ДанныеОСУ) Тогда
ДанныеМаркировки.GTIN = Партия.ДанныеОСУ.GTIN;
ДанныеМаркировки.Количество = Партия.ДанныеОСУ.Количество;
ДанныеМаркировки.Вес = Партия.ДанныеОСУ.Вес;
Иначе
ДанныеМаркировки.ИдентификаторУпаковки = Партия.ИдентификаторУпаковки;
КонецЕсли
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки);
КонецЦикла
Иначе
ИндивидуальныеУпаковки = СтрокаТЧ.СведенияОМаркировке.ИндивидуальныеУпаковки;
Для Каждого ИндивидуальнаяУпаковка Из ИндивидуальныеУпаковки Цикл
ДанныеМаркировки = Контракт_ДанныеМаркировки();
Если Лев(ИндивидуальнаяУпаковка, 2) = "02" Тогда
ДанныеМаркировки.ИдентификаторУпаковки = ИндивидуальнаяУпаковка;
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки);
КонецЕсли;
КонецЦикла;
КонецЕсли
КонецЦикла;
Как было
До обновления публичного метода алгоритм получения данных ОСУ мог быть написан следующим образом
Пример
ТоварнаяЧасть = ОсновнойМодуль.ЭДО_ПолучитьТабличнуюЧастьИзКонтентаXML(ХранилищеКонтента);
Для Каждого СтрокаДанных Из ТоварнаяЧасть Цикл
Номенклатура = СопоставленнаяНоменклатура.Номенклатура;
ЭтоВесовойТовар = ЭтоВесовойТовар(Номенклатура);
ГТИН = СтрокаДанных.НоменклатураДокумента.GTIN;
Если ЗначениеЗаполнено(ГТИН) Тогда // Один код на строку ТЧ
ДанныеМаркировки = Контракт_ДанныеМаркировки();
ДанныеМаркировки.GTIN = ГТИН;
ДанныеМаркировки.КоличествоТовара = СтрокаДанных.СведенияОМаркировке.КоличествоТовара;
Если ЭтоВесовойТовар Тогда
ДанныеМаркировки.ВесТовара = СтрокаДанных.Количество;
КонецЕсли
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки);
Иначе // Несколько кодов на строку ТЧ
ИндивидуальныеУпаковки = СтрокаДанных.СведенияОМаркировке.ИндивидуальныеУпаковки;
Для Каждого НомУпак Из ИндивидуальныеУпаковки Цикл
ДанныеМаркировки = Контракт_ДанныеМаркировки();
Если Лев(ИндивидуальнаяУпаковка, 2) = "02" Тогда
ДанныеМаркировки.ИдентификаторУпаковки = ИндивидуальнаяУпаковка;
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки);
КонецЕсли;
КонецЦикла
КонецЕсли;
КонецЦикла;
Алгоритм получения данных ОСУ и партий из УКД можно написать следующим образом.
Пример
ТоварнаяЧасть = ОсновнойМодуль.ЭДО_ПолучитьТабличнуюЧастьИзКонтентаXML(ХранилищеКонтента);
Для Каждого СтрокаДанных Из ТоварнаяЧасть Цикл
Номенклатура = СопоставленнаяНоменклатура.Номенклатура;
Партии_До = СтрокаДанных.СведенияОМаркировке_До.ПроизводственныеПартии;
Если Партии_До.Количество() > 0 Тогда
Для Каждого Партия Из Партии_До Цикл
ДанныеМаркировки = Контракт_ДанныеМаркировки();
ДанныеМаркировки.НомерПартии = Партия.НомерПартии;
Если ЗначениеЗаполнено(Партия.ДанныеОСУ) Тогда
ДанныеМаркировки.GTIN = Партия.ДанныеОСУ.GTIN;
ДанныеМаркировки.Количество = Партия.ДанныеОСУ.Количество;
ДанныеМаркировки.Вес = Партия.ДанныеОСУ.Вес;
Иначе
ДанныеМаркировки.ИдентификаторУпаковки = Партия.ИдентификаторУпаковки;
КонецЕсли
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки);
КонецЦикла
Иначе
ИндивидуальныеУпаковки_До = СтрокаТЧ.СведенияОМаркировке_До.ИндивидуальныеУпаковки;
Для Каждого ИндивидуальнаяУпаковка Из ИндивидуальныеУпаковки_До Цикл
ДанныеМаркировки = Контракт_ДанныеМаркировки();
Если Лев(ИндивидуальнаяУпаковка, 2) = "02" Тогда
ДанныеМаркировки.ИдентификаторУпаковки = ИндивидуальнаяУпаковка;
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки);
КонецЕсли;
КонецЦикла;
КонецЕсли
Партии_После = СтрокаДанных.СведенияОМаркировке.ПроизводственныеПартии;
Если Партии_После.Количество() > 0 Тогда
Для Каждого Партия Из Партии_После Цикл
ДанныеМаркировки = Контракт_ДанныеМаркировки();
ДанныеМаркировки.НомерПартии = Партия.НомерПартии;
Если ЗначениеЗаполнено(Партия.ДанныеОСУ) Тогда
ДанныеМаркировки.GTIN = Партия.ДанныеОСУ.GTIN;
ДанныеМаркировки.Количество = Партия.ДанныеОСУ.Количество;
ДанныеМаркировки.Вес = Партия.ДанныеОСУ.Вес;
Иначе
ДанныеМаркировки.ИдентификаторУпаковки = Партия.ИдентификаторУпаковки;
КонецЕсли
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки);
КонецЦикла
Иначе
ИндивидуальныеУпаковки_После = СтрокаТЧ.СведенияОМаркировке.ИндивидуальныеУпаковки;
Для Каждого ИндивидуальнаяУпаковка Из ИндивидуальныеУпаковки_После Цикл
ДанныеМаркировки = Контракт_ДанныеМаркировки();
Если Лев(ИндивидуальнаяУпаковка, 2) = "02" Тогда
ДанныеМаркировки.ИдентификаторУпаковки = ИндивидуальнаяУпаковка;
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки);
КонецЕсли;
КонецЦикла;
КонецЕсли
КонецЦикла;
Как было
До обновления публичного метода алгоритм получения данных ОСУ мог быть написан следующим образом.
Пример
ТоварнаяЧасть = ОсновнойМодуль.ЭДО_ПолучитьТабличнуюЧастьИзКонтентаXML(ХранилищеКонтента);
Для Каждого СтрокаДанных Из ТоварнаяЧасть Цикл
Номенклатура = СопоставленнаяНоменклатура.Номенклатура;
ВесТовара_До = СтрокаДанных.Количество_До;
ДополнительнаяИнформация = СтрокаДанных.ДополнительнаяИнформация;
НомерПартии_До = "";
Для Каждого ДопПоле Из ДополнительнаяИнформация Цикл
Если ДопПоле.Ключ = "ПрПартМаркДо" Тогда
НомерПартии_До = ДопПоле.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
ИндивидуальныеУпаковки_До = СтрокаДанных.СведенияОМаркировке_До.ИндивидуальныеУпаковки;
Для Каждого ИндивидуальнаяУпаковка Из ИндивидуальныеУпаковки_До Цикл
ДанныеМаркировки = Контракт_ДанныеМаркировки();
Если Лев(ИндивидуальнаяУпаковка, 2) = "02" Тогда
ДанныеМаркировки.ИдентификаторУпаковки = ИндивидуальнаяУпаковка;
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки, НомерПартии_До);
КонецЕсли;
КонецЦикла;
НомерПартии = "";
Для Каждого ДопПоле Из ДополнительнаяИнформация Цикл
Если ДопПоле.Ключ = "ПрПартМаркПосле" Тогда
НомерПартии_После = ДопПоле.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
ВесТовара = СтрокаДанных.Количество;
ИндивидуальныеУпаковки_После = СтрокаДанных.СведенияОМаркировке.ИндивидуальныеУпаковки;
Для Каждого ИндивидуальнаяУпаковка Из ИндивидуальныеУпаковки_После Цикл
ДанныеМаркировки = Контракт_ДанныеМаркировки();
Если Лев(ИндивидуальнаяУпаковка, 2) = "02" Тогда
ДанныеМаркировки.ИдентификаторУпаковки = ИндивидуальнаяУпаковка;
ЗагрузитьКодыВБазу(Номенклатура, ДанныеМаркировки, НомерПартии_После);
КонецЕсли;
КонецЦикла;
КонецЦикла;