xmlTSDGalery/CommonModules/СинхронизацияУТ/Ext/Module.bsl
kykaevv 88098aa86f Initial commit: конфигурация ТСД с обменом УНФ.
Включает перемещение по ячейкам, стикеровку МП, синхронизацию справочников и обработку кодов маркировки.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 12:50:57 +03:00

1180 lines
72 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Функция ЗапроситьДокументыСборкиСтикеровкиНаСервере(Номер) Экспорт
Пользователь = "admin1c";
Пароль = "A400943@!";
HTTPСоединение = Новый HTTPСоединение("technozonee.itinalog.ru",5443,Пользователь,Пароль,,,Новый ЗащищенноеСоединениеOpenSSL());
// HTTPСоединение = Новый HTTPСоединение("127.0.0.1",80,Пользователь,Пароль,,,);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type","application/xml_request");
// Получали один док, теперь массив доков
ТелоЗапроса = ПолучитьОбщийМакет(Метаданные.ОбщиеМакеты.ШаблонGetArrayDoc);
HTTPЗапрос = Новый HTTPЗапрос("/unf/ws/tsdsync", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса.ТекущаяОбласть.Текст);
РезультатЗапроса = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Возврат ТекстОтвета;
КонецФункции
//
Функция getDocInvent(Номер) Экспорт // не используется в данной конфе
СтрокаURI = "http://192.168.1.155/unf/ws/tsdsync";
Пользователь = "802165066";
Пароль = "5tg77h90ik";
HTTPСоединение = Новый HTTPСоединение("192.168.1.155",80,Пользователь,Пароль,,,);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type","application/xml_request");
ТелоЗапроса = ПолучитьОбщийМакет(Метаданные.ОбщиеМакеты.ШаблонGetDocInvent);
HTTPЗапрос = Новый HTTPЗапрос("/unf/ws/tsdsync", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрЗаменить(ТелоЗапроса.ТекущаяОбласть.Текст,"$Штрихкод",Номер));
РезультатЗапроса = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Возврат ТекстОтвета;
КонецФункции
Функция ВыгрузитьДокументыСборкиСтикеровкиНаСервер(Док, ТипДока) Экспорт // Отправляем Док СборкиМП
Пользователь = "admin1c";
Пароль = "A400943@!";
HTTPСоединение = Новый HTTPСоединение("technozonee.itinalog.ru", 5443, Пользователь, Пароль, , ,
Новый ЗащищенноеСоединениеOpenSSL);
// HTTPСоединение = Новый HTTPСоединение("127.0.0.1",80,Пользователь,Пароль,,,);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/xml_request");
ТелоЗапроса = ПолучитьОбщийМакет("ШаблонSetDoc").ТекущаяОбласть.Текст;
ТелоЗапроса=СтрЗаменить(ТелоЗапроса, "$ДокСсылка", Док.Ссылка.УникальныйИдентификатор());
ТелоЗапроса=СтрЗаменить(ТелоЗапроса, "$Дата", Строка(Формат(Док.Дата, "ДФ=""гггг-ММ-дд'T'ЧЧ:мм:сс""")));
ТелоЗапроса=СтрЗаменить(ТелоЗапроса, "$Номер", Док.Номер);
ТелоЗапроса=СтрЗаменить(ТелоЗапроса, "$ТипДокумента", ТипЗнч(Док.Ссылка));
//ТелоЗапроса=СтрЗаменить(ТелоЗапроса, "$КонтрагентСсылка", Док.Партнер.УникальныйИдентификатор());
ТелоЗапроса=СтрЗаменить(ТелоЗапроса, "$АвторСсылка", Док.Автор.УникальныйИдентификатор());
СтрокиЗапроса="";
Для Каждого строка Из Док.ТоварыТолькоКоличество Цикл
ТелоСтроки = ПолучитьОбщийМакет("ШаблонSetDocPostup").ТекущаяОбласть.Текст;
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$Строка", Формат(Строка.НомерСтроки,"ЧГ=0"));
Если ТипДока = "Сборка МП" Тогда
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$НоменклатураСсылка", Строка.Номенклатура.УникальныйИдентификатор());
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$ЕдСсылка", "00-00-00");
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$КодКлас", "00-00-00"); // чтобы не было ошибки при выгрузке
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$КодМаркировки", "");
ИначеЕсли ТипДока = "Стикеровка МП" Тогда
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$НоменклатураСсылка", Строка.КарточкаМП.УникальныйИдентификатор());
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$ЕдСсылка", строка.КодМП);
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$КодКлас", строка.ШтрихкодПоставки); // чтобы не было ошибки при выгрузке
КодМаркировкиВыгрузки = "";
Если ЗначениеЗаполнено(строка.МаркаСтрока) И строка.МаркаСтрока <> "-" Тогда
КодМаркировкиВыгрузки = XMLСтрока(строка.МаркаСтрока);
КонецЕсли;
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$КодМаркировки", КодМаркировкиВыгрузки);
КонецЕсли;
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$НаимКлас", "00-00-00"); // чтобы не было ошибки при выгрузке
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$Количество", Строка.Отсканировано);
ТелоСтроки= СтрЗаменить(ТелоСтроки, "$типз", "СобственныеТовары");
СтрокиЗапроса=СтрокиЗапроса + ТелоСтроки;
КонецЦикла;
ТелоЗапроса=СтрЗаменить(ТелоЗапроса, "$Запасы", СтрокиЗапроса);
//HTTPЗапрос = Новый HTTPЗапрос("/unf/ws/tsdsync", Заголовки);
HTTPЗапрос = Новый HTTPЗапрос("/unf/ws/tsdsync", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
РезультатЗапроса = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Возврат ТекстОтвета;
КонецФункции
Функция SetDocInvent(Док) Экспорт // // не используется в данной конфе
СтрокаURI = "http://localhost/unf/ws/tsdsync";
Пользователь = "802165066";
Пароль = "5tg77h90ik";
HTTPСоединение = Новый HTTPСоединение("192.168.1.155",80,Пользователь,Пароль,,,);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type","application/xml_request");
ТелоЗапроса = ПолучитьОбщийМакет("ШаблонSetDocInvent").ТекущаяОбласть.Текст;
ТелоЗапроса=СтрЗаменить(ТелоЗапроса,"$ДокСсылка",Док.Ссылка.УникальныйИдентификатор());
ТелоЗапроса=СтрЗаменить(ТелоЗапроса,"$Дата",Строка(Формат(Док.Дата,"ДФ=""гггг-ММ-дд'T'ЧЧ:мм:сс""")) );
ТелоЗапроса=СтрЗаменить(ТелоЗапроса,"$Номер",Док.Номер);
СтрокиЗапроса="";
Для каждого строка из Док.Запасы Цикл
ТелоСтроки = ПолучитьОбщийМакет("ШаблонSetDocInventTov").ТекущаяОбласть.Текст;
ТелоСтроки= СтрЗаменить(ТелоСтроки,"$Строка",Строка.НомерСтроки);
ТелоСтроки= СтрЗаменить(ТелоСтроки,"$НоменклатураСсылка",Строка.Номенклатура.УникальныйИдентификатор());
ТелоСтроки= СтрЗаменить(ТелоСтроки,"$ЕдСсылка",Строка.Номенклатура.ЕдиницаИзмерения.УникальныйИдентификатор());
ТелоСтроки= СтрЗаменить(ТелоСтроки,"$КодКлас",Строка.Номенклатура.ЕдиницаИзмерения.Код);
ТелоСтроки= СтрЗаменить(ТелоСтроки,"$НаимКлас",Строка.Номенклатура.ЕдиницаИзмерения.Наименование);
ТелоСтроки= СтрЗаменить(ТелоСтроки,"$Количество",Строка.Количество);
ТелоСтроки= СтрЗаменить(ТелоСтроки,"$Колуч",Строка.КоличествоУчет);
ТелоСтроки= СтрЗаменить(ТелоСтроки,"$типз","СобственныеТовары");
СтрокиЗапроса=СтрокиЗапроса+ТелоСтроки;
КонецЦикла;
ТелоЗапроса=СтрЗаменить(ТелоЗапроса,"$Запасы",СтрокиЗапроса);
HTTPЗапрос = Новый HTTPЗапрос("/unf/ws/tsdsync", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
РезультатЗапроса = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Возврат ТекстОтвета;
КонецФункции
Функция КодироватьСтрокуВBase64(Знач Строка,
Знач Кодировка = Неопределено,
Знач ЗаписатьBOM = Ложь) Экспорт
// Устанавливаем кодировку по умолчанию, если не указана
Если Не ЗначениеЗаполнено(Кодировка) Тогда
Кодировка = КодировкаТекста.UTF8;
КонецЕсли;
// Преобразуем строку в двоичные данные
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(Строка, Кодировка, ЗаписатьBOM);
// Кодируем двоичные данные в Base64
Результат = Base64Строка(ДвоичныеДанные);
Возврат Результат;
КонецФункции
Функция РаспечататьКодПоставкиНаПринтере(ДанныеОтправки) Экспорт
СтрокаURI = "/unf/hs/prints/PrintUp";
хост="technozonee.itinalog.ru";
//Хост = "127.0.0.1";
HTTPСоединение = Новый HTTPСоединение(хост,5443,"admin1c","A400943@!",,,Новый ЗащищенноеСоединениеOpenSSL());
//HTTPСоединение = Новый HTTPСоединение(хост,80,"admin1c","A400943@!",,,);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type","application/json");
//ДанныеОтправки=Новый Структура();
ПринтерПоУмолчанию = Константы.ПринтерПоУмолчанию.Получить();
Если ЗначениеЗаполнено(ПринтерПоУмолчанию) Тогда
ДанныеОтправки.Вставить("Printer", ПринтерПоУмолчанию.ИдентификаторРабМеста + ";" + ПринтерПоУмолчанию.ИмяПринтера);
Иначе
ДанныеОтправки.Вставить("Printer", "");
КонецЕсли;
ЗапросJSON = ПростаяЗаписьJSON(ДанныеОтправки);
HTTPЗапрос = Новый HTTPЗапрос(СтрокаURI, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON);
РезультатЗапроса = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
КонецФункции
Функция ЗапросДанныеДляМаркетов(Док, Шк) Экспорт //
МаркетПлейс=Лев(Док.ПоставкиМП[0].ПоставкаМП.Номер, 2);
СтрокаURI = "/unf/hs/tsd/MarketPlace/";
хост="technozonee.itinalog.ru";
HTTPСоединение = Новый HTTPСоединение(хост,5443,"admin1c","A400943@!",,,Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type","application/json");
ДанныеОтправки=Новый Структура();
ДанныеОтправки.Вставить("barcode", Шк);
ДанныеОтправки.Вставить("TypeMarket", МаркетПлейс);
ДанныеОтправки.Вставить("integra", СтроковыйМассивДокОЗОН(Док));
ПринтерПоУмолчанию = Константы.ПринтерПоУмолчанию.Получить();
Если ЗначениеЗаполнено(ПринтерПоУмолчанию) Тогда
ДанныеОтправки.Вставить("Printer", ПринтерПоУмолчанию.ИдентификаторРабМеста + ";" + ПринтерПоУмолчанию.ИмяПринтера);
Иначе
ДанныеОтправки.Вставить("Printer", "");
КонецЕсли;
ЗапросJSON = ПростаяЗаписьJSON(ДанныеОтправки);
HTTPЗапрос = Новый HTTPЗапрос(СтрокаURI, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON);
РезультатЗапроса = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Попытка
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
Данные = ПрочитатьJSON(ЧтениеJSON);
Исключение
Сообщить(ТекстОтвета + Символы.ПС + ОписаниеОшибки());
КонецПопытки;
ЧтениеJSON.Закрыть();
Возврат Данные;
КонецФункции
Функция СтроковыйМассивДокОЗОН(Док)
МассивСтрок = "";
Для Каждого строка из Док.ПоставкиМП Цикл
МассивСтрок = МассивСтрок + строка.ПоставкаМП.Номер + ";";
КонецЦикла;
Возврат МассивСтрок;
КонецФункции
Функция ПростаяЗаписьJSON(ДанныеОтправки)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON,ДанныеОтправки);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Функция GetUsers() Экспорт
Пользователь = "admin1c";
Пароль = "A400943@!";
HTTPСоединение = Новый HTTPСоединение("technozonee.itinalog.ru",5443,Пользователь,Пароль,,,Новый ЗащищенноеСоединениеOpenSSL());
// HTTPСоединение = Новый HTTPСоединение("127.0.0.1",80,Пользователь,Пароль,,,);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type","application/xml_request");
ТелоЗапроса = ПолучитьОбщийМакет(Метаданные.ОбщиеМакеты.ШаблонGetUsers);
HTTPЗапрос = Новый HTTPЗапрос("/unf/ws/tsdsync", Заголовки);
//HTTPЗапрос = Новый HTTPЗапрос("/unfgal/ws/tsdsync", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса.ТекущаяОбласть.Текст);
РезультатЗапроса = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Возврат ТекстОтвета;
КонецФункции
Функция GetPrints() Экспорт
СтрокаURI = "/unf/hs/prints/GetPrintstoTSD";
хост="technozonee.itinalog.ru";
HTTPСоединение = Новый HTTPСоединение(хост,5443,"admin1c","A400943@!",,,Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type","application/json");
ДанныеОтправки=Новый Структура();
ЗапросJSON = ПростаяЗаписьJSON(ДанныеОтправки);
HTTPЗапрос = Новый HTTPЗапрос(СтрокаURI, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON);
РезультатЗапроса = HTTPСоединение.ВызватьHTTPМетод("GET",HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Возврат Данные;
КонецФункции
Функция ОтправитьДокШтрихкодов(Док) Экспорт
//СтрокаURI = "http://localhost/unf/ws/tsdsync";
Пользователь = "admin1c";
Пароль = "A400943@!";
HTTPСоединение = Новый HTTPСоединение("technozonee.itinalog.ru",5443,Пользователь,Пароль,,,Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type","application/xml_request");
ТелоЗапроса = ПолучитьОбщийМакет("ШаблонSetDocBarcode").ТекущаяОбласть.Текст;
ТелоЗапроса=СтрЗаменить(ТелоЗапроса,"$ДокСсылка",Строка(Док.Ссылка.УникальныйИдентификатор()));
ТелоЗапроса=СтрЗаменить(ТелоЗапроса,"$Дата",Строка(Формат(Док.Дата,"ДФ=""гггг-ММ-дд'T'ЧЧ:мм:сс""")) );
ТелоЗапроса=СтрЗаменить(ТелоЗапроса,"$Номер",Док.Номер);
СтрокиЗапроса="";
Для каждого строка из Док.Штрихкоды Цикл
ТелоСтроки = ПолучитьОбщийМакет("ШаблонSetDocBarcodeLine").ТекущаяОбласть.Текст;
// Отключили, так как будем все передавать в кодированном варианте
// ТелоСтроки= СтрЗаменить(ТелоСтроки,"$ШтрихкодВСтроке", Строка.ШтрихкодСтрока);
ТелоСтроки= СтрЗаменить(ТелоСтроки,"$ШтрихкодКодированный", Строка.ШтрихкодКодированный);
СтрокиЗапроса=СтрокиЗапроса+ТелоСтроки;
КонецЦикла;
ТелоЗапроса=СтрЗаменить(ТелоЗапроса,"$СтрокаШК",СтрокиЗапроса);
HTTPЗапрос = Новый HTTPЗапрос("/unf/ws/tsdsync", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
РезультатЗапроса = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Возврат ТекстОтвета;
КонецФункции
#Область ЯчейкиИПеремещение
Функция ПолучитьHTTPСоединениеТСД()
Возврат Новый HTTPСоединение("technozonee.itinalog.ru", 5443, "admin1c", "A400943@!", , ,
Новый ЗащищенноеСоединениеOpenSSL());
КонецФункции
Функция ВыполнитьSOAPЗапросТСД(ИмяМакета) Экспорт
HTTPСоединение = ПолучитьHTTPСоединениеТСД();
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/xml_request");
ПараметрыЗапроса = ПараметрыSOAPЗапросаТСД(ИмяМакета);
HTTPЗапрос = Новый HTTPЗапрос(ПараметрыЗапроса.АдресРесурса, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыЗапроса.Тело);
РезультатЗапроса = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Возврат РезультатЗапроса.ПолучитьТелоКакСтроку();
КонецФункции
// Параметры для асинхронного HTTP на клиенте (без блокировки UI).
Функция ПараметрыSOAPЗапросаТСД(ИмяМакета) Экспорт
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("Хост", "technozonee.itinalog.ru");
ПараметрыЗапроса.Вставить("Порт", 5443);
ПараметрыЗапроса.Вставить("Пользователь", "admin1c");
ПараметрыЗапроса.Вставить("Пароль", "A400943@!");
ПараметрыЗапроса.Вставить("АдресРесурса", "/unf/ws/tsdsync");
ПараметрыЗапроса.Вставить("Тело", ПолучитьОбщийМакет(ИмяМакета).ТекущаяОбласть.Текст);
Возврат ПараметрыЗапроса;
КонецФункции
Процедура ЗагрузитьЯчейкиПартииИОстатки() Экспорт
ЗагрузитьОрганизацииИзУНФ();
ЗагрузитьЯчейкиИзУНФ();
ЗагрузитьПартииИзУНФ();
ЗагрузитьОстаткиПоЯчейкамИзУНФ();
ЗагрузитьШтрихкодыИзУНФ();
КонецПроцедуры
Функция GetCells() Экспорт
Возврат ВыполнитьSOAPЗапросТСД("ШаблонGetCells");
КонецФункции
Функция GetOrganizations() Экспорт
Возврат ВыполнитьSOAPЗапросТСД("ШаблонGetOrganizations");
КонецФункции
Функция GetBatches() Экспорт
Возврат ВыполнитьSOAPЗапросТСД("ШаблонGetBatches");
КонецФункции
Функция GetStockInCells() Экспорт
Возврат ВыполнитьSOAPЗапросТСД("ШаблонGetStockInCells");
КонецФункции
Функция GetNom() Экспорт
Возврат ВыполнитьSOAPЗапросТСД("ШаблонGetNom");
КонецФункции
Процедура ЗагрузитьОрганизацииИзУНФ() Экспорт
ЗагрузитьОрганизацииИзОтвета(GetOrganizations());
КонецПроцедуры
Процедура ЗагрузитьОрганизацииИзОтвета(XmlОтвет) Экспорт
Попытка
ОбXDTO = ПрочитатьReturnОперацииТСД(XmlОтвет, "GetOrganizationsResponse");
Исключение
Сообщить("Ошибка GetOrganizations: " + ОписаниеОшибки() + Символы.ПС + XmlОтвет);
Возврат;
КонецПопытки;
Если ОбXDTO = Неопределено Тогда
Возврат;
КонецЕсли;
МассивЗначений = МассивValueИзОтветаТСД(ОбXDTO);
Если ТипЗнч(МассивЗначений) = Тип("СписокXDTO") Тогда
Для Индекс = 0 По МассивЗначений.Количество() - 1 Цикл
ЗаписатьОрганизациюИзXDTO(МассивЗначений.Получить(Индекс));
КонецЦикла;
ИначеЕсли МассивЗначений <> Неопределено Тогда
ЗаписатьОрганизациюИзXDTO(МассивЗначений);
КонецЕсли;
КонецПроцедуры
Процедура ЗаписатьОрганизациюИзXDTO(Элемент)
Если Элемент = Неопределено Тогда
Возврат;
КонецЕсли;
// GetOrganizations: 0-ссылка, 1-наименование, 2-код
СсылкаUUID = ЗначениеСвойстваXDTO(Элемент, 0);
Наименование = ЗначениеСвойстваXDTO(Элемент, 1);
Код = ЗначениеСвойстваXDTO(Элемент, 2);
Если Не ЗначениеЗаполнено(СсылкаUUID) Тогда
Возврат;
КонецЕсли;
Ссылка = Справочники.Организации.ПолучитьСсылку(Новый УникальныйИдентификатор(СсылкаUUID));
ОбъектОрганизации = Ссылка.ПолучитьОбъект();
Если ОбъектОрганизации = Неопределено Тогда
ОбъектОрганизации = Справочники.Организации.СоздатьЭлемент();
ОбъектОрганизации.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
Если ЗначениеЗаполнено(Наименование) Тогда
ОбъектОрганизации.Наименование = Наименование;
ИначеЕсли Не ЗначениеЗаполнено(ОбъектОрганизации.Наименование) Тогда
ОбъектОрганизации.Наименование = "Организация " + Лев(СсылкаUUID, 8);
КонецЕсли;
Если ЗначениеЗаполнено(Код) Тогда
Попытка
ОбъектОрганизации.Код = Код;
Исключение
КонецПопытки;
КонецЕсли;
ОбъектОрганизации.Записать();
КонецПроцедуры
Процедура ЗагрузитьЯчейкиИзУНФ() Экспорт
ЗагрузитьЯчейкиИзОтвета(GetCells());
КонецПроцедуры
Процедура ЗагрузитьЯчейкиИзОтвета(XmlОтвет) Экспорт
Попытка
ОбXDTO = ПрочитатьReturnОперацииТСД(XmlОтвет, "GetCellsResponse");
Исключение
Сообщить("Ошибка GetCells: " + ОписаниеОшибки() + Символы.ПС + XmlОтвет);
Возврат;
КонецПопытки;
Если ОбXDTO = Неопределено Тогда
Возврат;
КонецЕсли;
МассивЗначений = МассивValueИзОтветаТСД(ОбXDTO);
Если ТипЗнч(МассивЗначений) = Тип("СписокXDTO") Тогда
Для Индекс = 0 По МассивЗначений.Количество() - 1 Цикл
ЗаписатьЯчейкуИзXDTO(МассивЗначений.Получить(Индекс));
КонецЦикла;
ИначеЕсли МассивЗначений <> Неопределено Тогда
ЗаписатьЯчейкуИзXDTO(МассивЗначений);
КонецЕсли;
КонецПроцедуры
Процедура ЗаписатьЯчейкуИзXDTO(Элемент)
Если Элемент = Неопределено Тогда
Возврат;
КонецЕсли;
// GetCells: 0-ссылка, 1-наименование, 2-код, 3-склад UUID, 4-штрихкод, 5-наименование склада
СсылкаUUID = ЗначениеСвойстваXDTO(Элемент, 0);
Наименование = ЗначениеСвойстваXDTO(Элемент, 1);
Код = ЗначениеСвойстваXDTO(Элемент, 2);
СкладUUID = ЗначениеСвойстваXDTO(Элемент, 3);
Штрихкод = ЗначениеСвойстваXDTO(Элемент, 4);
НаименованиеСклада = ЗначениеСвойстваXDTO(Элемент, 5);
Если Не ЗначениеЗаполнено(СсылкаUUID) Тогда
Возврат;
КонецЕсли;
СкладСсылка = ОбеспечитьСкладПоUUID(СкладUUID, НаименованиеСклада);
Ссылка = Справочники.Ячейки.ПолучитьСсылку(Новый УникальныйИдентификатор(СсылкаUUID));
ОбъектЯчейки = Ссылка.ПолучитьОбъект();
Если ОбъектЯчейки = Неопределено Тогда
ОбъектЯчейки = Справочники.Ячейки.СоздатьЭлемент();
ОбъектЯчейки.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
ОбъектЯчейки.Наименование = Наименование;
Если ЗначениеЗаполнено(Код) Тогда
ОбъектЯчейки.Код = Код;
КонецЕсли;
ОбъектЯчейки.Владелец = СкладСсылка;
ОбъектЯчейки.Штрихкод = Штрихкод;
ОбъектЯчейки.Записать();
КонецПроцедуры
// Создаёт/обновляет склад по UUID. Наименование обязательно из УНФ (индекс 5 GetCells),
// иначе в представлении остаётся заглушка с куском идентификатора.
Функция ОбеспечитьСкладПоUUID(СкладUUID, НаименованиеСклада) Экспорт
Если Не ЗначениеЗаполнено(СкладUUID) Тогда
Возврат Справочники.СтруктурныеЕдиницы.ПустаяСсылка();
КонецЕсли;
СкладСсылка = Справочники.СтруктурныеЕдиницы.ПолучитьСсылку(Новый УникальныйИдентификатор(СкладUUID));
СкладОбъект = СкладСсылка.ПолучитьОбъект();
ЭтоНовый = (СкладОбъект = Неопределено);
Если ЭтоНовый Тогда
СкладОбъект = Справочники.СтруктурныеЕдиницы.СоздатьЭлемент();
СкладОбъект.УстановитьСсылкуНового(СкладСсылка);
КонецЕсли;
ИмяСклада = СокрЛП(НаименованиеСклада);
Если Не ЗначениеЗаполнено(ИмяСклада) Тогда
ИмяСклада = СокрЛП(СкладОбъект.Наименование);
КонецЕсли;
Если Не ЗначениеЗаполнено(ИмяСклада) Или ЭтоЗаглушкаИмениСклада(ИмяСклада, СкладUUID) Тогда
ИмяСклада = "Склад";
КонецЕсли;
НужнаЗапись = ЭтоНовый Или СкладОбъект.Наименование <> ИмяСклада;
Если НужнаЗапись Тогда
СкладОбъект.Наименование = ИмяСклада;
СкладОбъект.Записать();
КонецЕсли;
Возврат СкладОбъект.Ссылка;
КонецФункции
Функция ЭтоЗаглушкаИмениСклада(ИмяСклада, СкладUUID)
ПрефиксUUID = ВРег(Лев(СкладUUID, 8));
Если ВРег(ИмяСклада) = "СКЛАД " + ПрефиксUUID Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Процедура ЗагрузитьПартииИзУНФ() Экспорт
ЗагрузитьПартииИзОтвета(GetBatches());
КонецПроцедуры
Процедура ЗагрузитьПартииИзОтвета(XmlОтвет) Экспорт
Попытка
ОбXDTO = ПрочитатьReturnОперацииТСД(XmlОтвет, "GetBatchesResponse");
Исключение
Сообщить("Ошибка GetBatches: " + ОписаниеОшибки() + Символы.ПС + XmlОтвет);
Возврат;
КонецПопытки;
Если ОбXDTO = Неопределено Тогда
Возврат;
КонецЕсли;
МассивЗначений = МассивValueИзОтветаТСД(ОбXDTO);
Если ТипЗнч(МассивЗначений) = Тип("СписокXDTO") Тогда
Для Индекс = 0 По МассивЗначений.Количество() - 1 Цикл
ЗаписатьПартиюИзXDTO(МассивЗначений.Получить(Индекс));
КонецЦикла;
ИначеЕсли МассивЗначений <> Неопределено Тогда
ЗаписатьПартиюИзXDTO(МассивЗначений);
КонецЕсли;
КонецПроцедуры
Процедура ЗаписатьПартиюИзXDTO(Элемент)
Если Элемент = Неопределено Тогда
Возврат;
КонецЕсли;
СсылкаUUID = ЗначениеСвойстваXDTO(Элемент, 0);
Наименование = ЗначениеСвойстваXDTO(Элемент, 1);
НоменклатураUUID = ЗначениеСвойстваXDTO(Элемент, 2);
Если Не ЗначениеЗаполнено(СсылкаUUID) Или Не ЗначениеЗаполнено(НоменклатураUUID) Тогда
Возврат;
КонецЕсли;
НоменклатураСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(НоменклатураUUID));
Если НоменклатураСсылка.ПолучитьОбъект() = Неопределено Тогда
Возврат;
КонецЕсли;
Ссылка = Справочники.ПартииНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор(СсылкаUUID));
ОбъектПартии = Ссылка.ПолучитьОбъект();
Если ОбъектПартии = Неопределено Тогда
ОбъектПартии = Справочники.ПартииНоменклатуры.СоздатьЭлемент();
ОбъектПартии.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
ОбъектПартии.Наименование = Наименование;
ОбъектПартии.Владелец = НоменклатураСсылка;
ОбъектПартии.Записать();
КонецПроцедуры
Процедура ЗагрузитьОстаткиПоЯчейкамИзУНФ() Экспорт
ЗагрузитьОстаткиПоЯчейкамИзОтвета(GetStockInCells());
КонецПроцедуры
Процедура ЗагрузитьШтрихкодыИзУНФ() Экспорт
ЗагрузитьШтрихкодыИзОтвета(GetNom());
КонецПроцедуры
Функция ИнтервалАктуальностиДанныхУНФСекунд()
Возврат 30 * 60; // 30 минут
КонецФункции
Функция НужнаЗагрузкаДанныхУНФ() Экспорт
ДатаЗагрузки = Константы.ДатаПоследнейЗагрузкиДанныхУНФ.Получить();
Если Не ЗначениеЗаполнено(ДатаЗагрузки) Тогда
Возврат Истина;
КонецЕсли;
Возврат (ТекущаяДата() - ДатаЗагрузки) >= ИнтервалАктуальностиДанныхУНФСекунд();
КонецФункции
Процедура ЗафиксироватьДатуЗагрузкиДанныхУНФ() Экспорт
Константы.ДатаПоследнейЗагрузкиДанныхУНФ.Установить(ТекущаяДата());
КонецПроцедуры
Функция ДатаПоследнейЗагрузкиДанныхУНФСтрокой() Экспорт
ДатаЗагрузки = Константы.ДатаПоследнейЗагрузкиДанныхУНФ.Получить();
Если Не ЗначениеЗаполнено(ДатаЗагрузки) Тогда
Возврат "";
КонецЕсли;
Возврат Формат(ДатаЗагрузки, "ДФ='dd.MM.yyyy HH:mm'");
КонецФункции
// Готовит таблицу ШК во временном хранилище и очищает старые записи.
// Возврат: Адрес, Количество (элементов-владельцев)
Функция ПодготовитьЗагрузкуШтрихкодов(УникальныйИдентификаторФормы) Экспорт
XmlОтвет = GetNom();
Попытка
ОбXDTO = ПрочитатьReturnОперацииТСД(XmlОтвет, "getNomResponse");
Исключение
Попытка
ОбXDTO = ПрочитатьReturnОперацииТСД(XmlОтвет, "GetNomResponse");
Исключение
ВызватьИсключение("Ошибка GetNom: " + ОписаниеОшибки());
КонецПопытки;
КонецПопытки;
Если ОбXDTO = Неопределено Тогда
ВызватьИсключение("GetNom: пустой ответ УНФ. Штрихкоды не изменены.");
КонецЕсли;
МассивЗначений = МассивValueИзОтветаТСД(ОбXDTO);
Если ТипЗнч(МассивЗначений) = Тип("СписокXDTO") Тогда
Если МассивЗначений.Количество() > 0 И Не ЭтоЭлементОтветаValueProperty(МассивЗначений.Получить(0)) Тогда
ВызватьИсключение("GetNom: неверный формат ответа (ожидается Value/Property). Штрихкоды не изменены.");
КонецЕсли;
ИначеЕсли Не ЭтоЭлементОтветаValueProperty(МассивЗначений) Тогда
ВызватьИсключение("GetNom: неверный формат ответа (ожидается Value/Property). Штрихкоды не изменены.");
КонецЕсли;
ТаблицаДанных = НовыйТаблицаДанныхШтрихкодов();
Если ТипЗнч(МассивЗначений) = Тип("СписокXDTO") Тогда
Для Индекс = 0 По МассивЗначений.Количество() - 1 Цикл
ДобавитьЭлементШтрихкодовВТаблицу(ТаблицаДанных, МассивЗначений.Получить(Индекс));
КонецЦикла;
ИначеЕсли МассивЗначений <> Неопределено Тогда
ДобавитьЭлементШтрихкодовВТаблицу(ТаблицаДанных, МассивЗначений);
КонецЕсли;
ОчиститьШтрихкодыНоменклатурыИКарточекМП();
Результат = Новый Структура;
Результат.Вставить("Адрес", ПоместитьВоВременноеХранилище(ТаблицаДанных, УникальныйИдентификаторФормы));
Результат.Вставить("Количество", ТаблицаДанных.Количество());
Возврат Результат;
КонецФункции
// Пишет порцию владельцев ШК из временного хранилища.
// Возврат: Записано, СледующийИндекс, Готово
Функция ЗаписатьПорциюШтрихкодов(АдресДанных, ИндексНачала, РазмерПорции = 40) Экспорт
ТаблицаДанных = ПолучитьИзВременногоХранилища(АдресДанных);
Если ТипЗнч(ТаблицаДанных) <> Тип("ТаблицаЗначений") Тогда
ВызватьИсключение("Нет данных штрихкодов для записи (временное хранилище пусто).");
КонецЕсли;
Всего = ТаблицаДанных.Количество();
Если ИндексНачала >= Всего Тогда
Результат = Новый Структура;
Результат.Вставить("Записано", 0);
Результат.Вставить("СледующийИндекс", ИндексНачала);
Результат.Вставить("Готово", Истина);
Возврат Результат;
КонецЕсли;
ИндексКонца = Мин(ИндексНачала + РазмерПорции - 1, Всего - 1);
КоличествоЗаписано = 0;
НаборЗаписей = РегистрыСведений.ШтрихкодыУпаковок.СоздатьНаборЗаписей();
Для Индекс = ИндексНачала По ИндексКонца Цикл
СтрокаДанных = ТаблицаДанных[Индекс];
ВладелецШтрихкода = Неопределено;
Если ВРег(СтрокаДанных.ТипОбъекта) = "КАРТОЧКИМП" Или ВРег(СтрокаДанных.ТипОбъекта) = "КАРТОЧКАМП" Тогда
ВладелецШтрихкода = ОбеспечитьКарточкуМППоUUID(СтрокаДанных.СсылкаUUID, СтрокаДанных.Наименование, СтрокаДанных.СвязаннаяНоменклатураUUID);
Иначе
ВладелецШтрихкода = ОбеспечитьНоменклатуруПоUUID(СтрокаДанных.СсылкаUUID, СтрокаДанных.Наименование);
КонецЕсли;
Если Не ЗначениеЗаполнено(ВладелецШтрихкода) Тогда
Продолжить;
КонецЕсли;
МассивШК = СтрРазделить(СтрокаДанных.СтрокаШтрихкодов, ";", Ложь);
Для Каждого Штрихкод Из МассивШК Цикл
Штрихкод = СокрЛП(Штрихкод);
Если Не ЗначениеЗаполнено(Штрихкод) Или Штрихкод = "0" Тогда
Продолжить;
КонецЕсли;
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Штрихкод = Штрихкод;
НоваяЗапись.Номенклатура = ВладелецШтрихкода;
КоличествоЗаписано = КоличествоЗаписано + 1;
КонецЦикла;
КонецЦикла;
Если НаборЗаписей.Количество() > 0 Тогда
НаборЗаписей.Записать(Ложь);
КонецЕсли;
СледующийИндекс = ИндексКонца + 1;
Результат = Новый Структура;
Результат.Вставить("Записано", КоличествоЗаписано);
Результат.Вставить("СледующийИндекс", СледующийИндекс);
Результат.Вставить("Готово", СледующийИндекс >= Всего);
Возврат Результат;
КонецФункции
Функция НовыйТаблицаДанныхШтрихкодов()
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("СсылкаUUID", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(36)));
ТаблицаДанных.Колонки.Добавить("ТипОбъекта", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50)));
ТаблицаДанных.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));
ТаблицаДанных.Колонки.Добавить("СтрокаШтрихкодов", Новый ОписаниеТипов("Строка"));
ТаблицаДанных.Колонки.Добавить("СвязаннаяНоменклатураUUID", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(36)));
Возврат ТаблицаДанных;
КонецФункции
Процедура ДобавитьЭлементШтрихкодовВТаблицу(ТаблицаДанных, Элемент)
Если Элемент = Неопределено Тогда
Возврат;
КонецЕсли;
СсылкаUUID = СокрЛП(ЗначениеСвойстваXDTO(Элемент, 0));
ТипОбъекта = СокрЛП(ЗначениеСвойстваXDTO(Элемент, 1));
Наименование = СокрЛП(ЗначениеСвойстваXDTO(Элемент, 2));
СтрокаШтрихкодов = СокрЛП(ЗначениеСвойстваXDTO(Элемент, 3));
СвязаннаяНоменклатураUUID = СокрЛП(ЗначениеСвойстваXDTO(Элемент, 4));
Если Не ЭтоUUID(СсылкаUUID) Тогда
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаШтрихкодов) Или СтрокаШтрихкодов = "0" Тогда
Возврат; // без ШК не пишем и не создаём справочник
КонецЕсли;
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.СсылкаUUID = СсылкаUUID;
НоваяСтрока.ТипОбъекта = ТипОбъекта;
НоваяСтрока.Наименование = Наименование;
НоваяСтрока.СтрокаШтрихкодов = СтрокаШтрихкодов;
НоваяСтрока.СвязаннаяНоменклатураUUID = СвязаннаяНоменклатураUUID;
КонецПроцедуры
// GetNom: 0-UUID, 1-тип (Номенклатура/КарточкиМП), 2-наименование, 3-ШК через ";", 4-UUID связанной номенклатуры
Процедура ЗагрузитьШтрихкодыИзОтвета(XmlОтвет) Экспорт
Попытка
ОбXDTO = ПрочитатьReturnОперацииТСД(XmlОтвет, "getNomResponse");
Исключение
Попытка
ОбXDTO = ПрочитатьReturnОперацииТСД(XmlОтвет, "GetNomResponse");
Исключение
ВызватьИсключение("Ошибка GetNom: " + ОписаниеОшибки());
КонецПопытки;
КонецПопытки;
Если ОбXDTO = Неопределено Тогда
ВызватьИсключение("GetNom: пустой ответ УНФ. Штрихкоды не изменены.");
КонецЕсли;
МассивЗначений = МассивValueИзОтветаТСД(ОбXDTO);
Если ТипЗнч(МассивЗначений) = Тип("СписокXDTO") Тогда
Если МассивЗначений.Количество() > 0 И Не ЭтоЭлементОтветаValueProperty(МассивЗначений.Получить(0)) Тогда
ВызватьИсключение("GetNom: неверный формат ответа (ожидается Value/Property). Обновите getNom() на УНФ. Штрихкоды не изменены.");
КонецЕсли;
ИначеЕсли Не ЭтоЭлементОтветаValueProperty(МассивЗначений) Тогда
ВызватьИсключение("GetNom: неверный формат ответа (ожидается Value/Property). Обновите getNom() на УНФ. Штрихкоды не изменены.");
КонецЕсли;
ТаблицаДанных = НовыйТаблицаДанныхШтрихкодов();
Если ТипЗнч(МассивЗначений) = Тип("СписокXDTO") Тогда
Для Индекс = 0 По МассивЗначений.Количество() - 1 Цикл
ДобавитьЭлементШтрихкодовВТаблицу(ТаблицаДанных, МассивЗначений.Получить(Индекс));
КонецЦикла;
ИначеЕсли МассивЗначений <> Неопределено Тогда
ДобавитьЭлементШтрихкодовВТаблицу(ТаблицаДанных, МассивЗначений);
КонецЕсли;
ОчиститьШтрихкодыНоменклатурыИКарточекМП();
КоличествоЗаписано = 0;
Если ТаблицаДанных.Количество() > 0 Тогда
Адрес = ПоместитьВоВременноеХранилище(ТаблицаДанных);
Индекс = 0;
Пока Истина Цикл
РезультатПорции = ЗаписатьПорциюШтрихкодов(Адрес, Индекс, 200);
КоличествоЗаписано = КоличествоЗаписано + РезультатПорции.Записано;
Индекс = РезультатПорции.СледующийИндекс;
Если РезультатПорции.Готово Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если КоличествоЗаписано = 0 Тогда
Сообщить("GetNom: ответ получен, но штрихкодов для записи нет.");
Иначе
Сообщить("Записано штрихкодов: " + Формат(КоличествоЗаписано, "ЧГ=0"));
КонецЕсли;
КонецПроцедуры
Функция ЭтоЭлементОтветаValueProperty(Элемент)
Если Элемент = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Попытка
Свойства = Элемент.Property;
Возврат Свойства <> Неопределено;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Процедура ОчиститьШтрихкодыНоменклатурыИКарточекМП()
// Полная очистка регистра (используется только для номенклатуры/карточек МП)
НаборЗаписей = РегистрыСведений.ШтрихкодыУпаковок.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
КонецПроцедуры
Функция ЗаписатьШтрихкодыИзXDTO(Элемент)
ТаблицаДанных = НовыйТаблицаДанныхШтрихкодов();
ДобавитьЭлементШтрихкодовВТаблицу(ТаблицаДанных, Элемент);
Если ТаблицаДанных.Количество() = 0 Тогда
Возврат 0;
КонецЕсли;
Адрес = ПоместитьВоВременноеХранилище(ТаблицаДанных);
РезультатПорции = ЗаписатьПорциюШтрихкодов(Адрес, 0, 1000);
Возврат РезультатПорции.Записано;
КонецФункции
Функция ОбеспечитьНоменклатуруПоUUID(НоменклатураUUID, Наименование) Экспорт
Если Не ЭтоUUID(НоменклатураUUID) Тогда
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(НоменклатураUUID));
ОбъектНоменклатуры = Ссылка.ПолучитьОбъект();
Если ОбъектНоменклатуры = Неопределено Тогда
ОбъектНоменклатуры = Справочники.Номенклатура.СоздатьЭлемент();
ОбъектНоменклатуры.УстановитьСсылкуНового(Ссылка);
ОбъектНоменклатуры.Наименование = ?(ЗначениеЗаполнено(Наименование), Наименование, "Номенклатура " + Лев(НоменклатураUUID, 8));
ОбъектНоменклатуры.Записать();
ИначеЕсли ЗначениеЗаполнено(Наименование) И ОбъектНоменклатуры.Наименование <> Наименование Тогда
ОбъектНоменклатуры.Наименование = Наименование;
ОбъектНоменклатуры.Записать();
КонецЕсли;
Возврат Ссылка;
КонецФункции
Функция ОбеспечитьКарточкуМППоUUID(КарточкаUUID, Наименование, НоменклатураUUID = "") Экспорт
Если Не ЭтоUUID(КарточкаUUID) Тогда
Возврат Справочники.КарточкиМП.ПустаяСсылка();
КонецЕсли;
Ссылка = Справочники.КарточкиМП.ПолучитьСсылку(Новый УникальныйИдентификатор(КарточкаUUID));
ОбъектКарточки = Ссылка.ПолучитьОбъект();
Если ОбъектКарточки = Неопределено Тогда
ОбъектКарточки = Справочники.КарточкиМП.СоздатьЭлемент();
ОбъектКарточки.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
Если ЗначениеЗаполнено(Наименование) Тогда
ОбъектКарточки.Наименование = Наименование;
ИначеЕсли Не ЗначениеЗаполнено(ОбъектКарточки.Наименование) Тогда
ОбъектКарточки.Наименование = "Карточка " + Лев(КарточкаUUID, 8);
КонецЕсли;
Если ЭтоUUID(НоменклатураUUID) Тогда
НоменклатураСсылка = ОбеспечитьНоменклатуруПоUUID(НоменклатураUUID, "");
Попытка
ОбъектКарточки.Номенклатура = НоменклатураСсылка;
Исключение
КонецПопытки;
КонецЕсли;
ОбъектКарточки.Записать();
Возврат Ссылка;
КонецФункции
Функция ЭтоUUID(Знач СтрокаUUID)
СтрокаUUID = СокрЛП(Строка(СтрокаUUID));
Если СтрДлина(СтрокаUUID) <> 36 Тогда
Возврат Ложь;
КонецЕсли;
Попытка
Проверка = Новый УникальныйИдентификатор(СтрокаUUID);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Процедура ЗагрузитьОстаткиПоЯчейкамИзОтвета(XmlОтвет) Экспорт
Попытка
ОбXDTO = ПрочитатьReturnОперацииТСД(XmlОтвет, "GetStockInCellsResponse");
Исключение
Сообщить("Ошибка GetStockInCells: " + ОписаниеОшибки() + Символы.ПС + XmlОтвет);
Возврат;
КонецПопытки;
НаборОчистки = РегистрыСведений.ЗапасыНаСкладах.СоздатьНаборЗаписей();
НаборОчистки.Прочитать();
НаборОчистки.Очистить();
НаборОчистки.Записать();
Если ОбXDTO = Неопределено Тогда
Возврат;
КонецЕсли;
МассивЗначений = МассивValueИзОтветаТСД(ОбXDTO);
Если ТипЗнч(МассивЗначений) = Тип("СписокXDTO") Тогда
Для Индекс = 0 По МассивЗначений.Количество() - 1 Цикл
ЗаписатьОстатокИзXDTO(МассивЗначений.Получить(Индекс));
КонецЦикла;
ИначеЕсли МассивЗначений <> Неопределено Тогда
ЗаписатьОстатокИзXDTO(МассивЗначений);
КонецЕсли;
КонецПроцедуры
Процедура ЗаписатьОстатокИзXDTO(Элемент)
Если Элемент = Неопределено Тогда
Возврат;
КонецЕсли;
СкладUUID = ЗначениеСвойстваXDTO(Элемент, 0);
ЯчейкаUUID = ЗначениеСвойстваXDTO(Элемент, 1);
НоменклатураUUID = ЗначениеСвойстваXDTO(Элемент, 2);
ПартияUUID = ЗначениеСвойстваXDTO(Элемент, 3);
КоличествоСтр = ЗначениеСвойстваXDTO(Элемент, 4);
Если Не ЗначениеЗаполнено(СкладUUID) Или Не ЗначениеЗаполнено(ЯчейкаUUID)
Или Не ЗначениеЗаполнено(НоменклатураUUID) Тогда
Возврат;
КонецЕсли;
МенеджерЗаписи = РегистрыСведений.ЗапасыНаСкладах.СоздатьМенеджерЗаписи();
МенеджерЗаписи.СтруктурнаяЕдиница = Справочники.СтруктурныеЕдиницы.ПолучитьСсылку(Новый УникальныйИдентификатор(СкладUUID));
МенеджерЗаписи.Ячейка = Справочники.Ячейки.ПолучитьСсылку(Новый УникальныйИдентификатор(ЯчейкаUUID));
МенеджерЗаписи.Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(НоменклатураUUID));
Если ЗначениеЗаполнено(ПартияUUID) И ПартияUUID <> "00000000-0000-0000-0000-000000000000" Тогда
МенеджерЗаписи.Партия = Справочники.ПартииНоменклатуры.ПолучитьСсылку(Новый УникальныйИдентификатор(ПартияUUID));
КонецЕсли;
Попытка
МенеджерЗаписи.Количество = Число(КоличествоСтр);
Исключение
МенеджерЗаписи.Количество = 0;
КонецПопытки;
МенеджерЗаписи.Записать();
КонецПроцедуры
Функция ЗначениеСвойстваXDTO(Элемент, Индекс)
Попытка
Возврат Строка(Элемент.Property.Получить(Индекс).Value);
Исключение
КонецПопытки;
Возврат "";
КонецФункции
// return операции Get* имеет тип string: внутри — XML с узлами Value/Property,
// либо уже объект XDTO (как у части ответов). Нормализуем оба варианта.
Функция ПрочитатьReturnОперацииТСД(XmlОтвет, ИмяResponse) Экспорт
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XmlОтвет);
Фабрика = Новый ФабрикаXDTO;
Тело = Фабрика.ПрочитатьXML(Чтение).Body[ИмяResponse].return;
Если Тело = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(Тело) = Тип("Строка") Тогда
Если Не ЗначениеЗаполнено(СокрЛП(Тело)) Тогда
Возврат Неопределено;
КонецЕсли;
ЧтениеВложенный = Новый ЧтениеXML;
ЧтениеВложенный.УстановитьСтроку(Тело);
Возврат Фабрика.ПрочитатьXML(ЧтениеВложенный);
КонецЕсли;
Возврат Тело;
КонецФункции
Функция МассивValueИзОтветаТСД(ОбXDTO)
Если ОбXDTO = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Попытка
Возврат ОбXDTO.Value;
Исключение
Возврат ОбXDTO;
КонецПопытки;
КонецФункции
Функция ВыгрузитьПеремещениеПоЯчейкам(СсылкаДокумента) Экспорт
Док = СсылкаДокумента.ПолучитьОбъект();
Если Док = Неопределено Тогда
Возврат "Документ не найден";
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.Организация) Тогда
Возврат "Не заполнена организация";
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.Автор) Тогда
Возврат "Не заполнен автор";
КонецЕсли;
HTTPСоединение = ПолучитьHTTPСоединениеТСД();
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/xml_request");
ТелоЗапроса = ПолучитьОбщийМакет("ШаблонSetDocCellMove").ТекущаяОбласть.Текст;
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$ДокСсылка", Строка(Док.Ссылка.УникальныйИдентификатор()));
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$Дата", Формат(Док.Дата, "ДФ=""гггг-ММ-дд'T'ЧЧ:мм:сс"""));
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$Номер", Док.Номер);
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$СкладСсылка", Строка(Док.СтруктурнаяЕдиница.УникальныйИдентификатор()));
Если Док.ВидОперации = Перечисления.ВидыОперацийПеремещенияПоЯчейкам.ИзНесколькихВОдну Тогда
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$ВидОперации", "ИзНесколькихВОдну");
Иначе
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$ВидОперации", "ИзОднойВНесколько");
КонецЕсли;
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$АвторСсылка",
?(ЗначениеЗаполнено(Док.Автор), Строка(Док.Автор.УникальныйИдентификатор()),
"00000000-0000-0000-0000-000000000000"));
Если ЗначениеЗаполнено(Док.Организация) Тогда
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$ОрганизацияСсылка",
Строка(Док.Организация.УникальныйИдентификатор()));
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$ОрганизацияНаименование",
XMLСтрока(Строка(Док.Организация)));
Иначе
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$ОрганизацияСсылка",
"00000000-0000-0000-0000-000000000000");
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$ОрганизацияНаименование", "Организация");
КонецЕсли;
// Обязательное свойство XDTO поступления ТМУ (в ТСД контрагента нет)
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$КонтрагентСсылка", "00000000-0000-0000-0000-000000000000");
// Сортировка по ячейке-источнику: в УНФ одна ячейка-источник = один документ
ТаблицаСтрок = Новый ТаблицаЗначений;
ТаблицаСтрок.Колонки.Добавить("ЯчейкаИсточник");
ТаблицаСтрок.Колонки.Добавить("Ячейка");
ТаблицаСтрок.Колонки.Добавить("Номенклатура");
ТаблицаСтрок.Колонки.Добавить("Партия");
ТаблицаСтрок.Колонки.Добавить("Количество");
ТаблицаСтрок.Колонки.Добавить("ЕдиницаИзмерения");
ТаблицаСтрок.Колонки.Добавить("Штрихкод");
ТаблицаСтрок.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
НомерСтроки = 0;
Для Каждого СтрокаТЧ Из Док.Запасы Цикл
НомерСтроки = НомерСтроки + 1;
НовСтр = ТаблицаСтрок.Добавить();
НовСтр.ЯчейкаИсточник = СтрокаТЧ.ЯчейкаИсточник;
НовСтр.Ячейка = СтрокаТЧ.Ячейка;
НовСтр.Номенклатура = СтрокаТЧ.Номенклатура;
НовСтр.Партия = СтрокаТЧ.Партия;
НовСтр.Количество = СтрокаТЧ.Количество;
НовСтр.ЕдиницаИзмерения = СтрокаТЧ.ЕдиницаИзмерения;
НовСтр.Штрихкод = СтрокаТЧ.Штрихкод;
НовСтр.НомерСтроки = НомерСтроки;
КонецЦикла;
ТаблицаСтрок.Сортировать("ЯчейкаИсточник, Номенклатура, Ячейка");
СтрокиЗапроса = "";
НомерСтрокиВыгрузки = 0;
Для Каждого СтрокаТЧ Из ТаблицаСтрок Цикл
НомерСтрокиВыгрузки = НомерСтрокиВыгрузки + 1;
ТелоСтроки = ПолучитьОбщийМакет("ШаблонSetDocCellMoveLine").ТекущаяОбласть.Текст;
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$Строка", Формат(НомерСтрокиВыгрузки, "ЧГ=0"));
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$НоменклатураСсылка", Строка(СтрокаТЧ.Номенклатура.УникальныйИдентификатор()));
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$НоменклатураНаименование", XMLСтрока(Строка(СтрокаТЧ.Номенклатура)));
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$ПартияСсылка",
?(ЗначениеЗаполнено(СтрокаТЧ.Партия), Строка(СтрокаТЧ.Партия.УникальныйИдентификатор()),
"00000000-0000-0000-0000-000000000000"));
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$Количество", Формат(СтрокаТЧ.Количество, "ЧРД=.; ЧГ=0"));
Если ЗначениеЗаполнено(СтрокаТЧ.ЕдиницаИзмерения) Тогда
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$ЕдСсылка", Строка(СтрокаТЧ.ЕдиницаИзмерения.УникальныйИдентификатор()));
Попытка
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$КодКлас", Строка(СтрокаТЧ.ЕдиницаИзмерения.Код));
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$НаимКлас", Строка(СтрокаТЧ.ЕдиницаИзмерения.Наименование));
Исключение
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$КодКлас", "796");
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$НаимКлас", XMLСтрока(Строка(СтрокаТЧ.ЕдиницаИзмерения)));
КонецПопытки;
Иначе
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$ЕдСсылка", "00000000-0000-0000-0000-000000000000");
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$КодКлас", "796");
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$НаимКлас", "шт");
КонецЕсли;
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$типз", "СобственныеТовары");
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$ЯчейкаИсточникСсылка",
?(ЗначениеЗаполнено(СтрокаТЧ.ЯчейкаИсточник), Строка(СтрокаТЧ.ЯчейкаИсточник.УникальныйИдентификатор()),
"00000000-0000-0000-0000-000000000000"));
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$ЯчейкаСтрокиСсылка",
?(ЗначениеЗаполнено(СтрокаТЧ.Ячейка), Строка(СтрокаТЧ.Ячейка.УникальныйИдентификатор()),
"00000000-0000-0000-0000-000000000000"));
ТелоСтроки = СтрЗаменить(ТелоСтроки, "$Штрихкод", XMLСтрока(СтрокаТЧ.Штрихкод));
СтрокиЗапроса = СтрокиЗапроса + ТелоСтроки;
КонецЦикла;
ТелоЗапроса = СтрЗаменить(ТелоЗапроса, "$Запасы", СтрокиЗапроса);
HTTPЗапрос = Новый HTTPЗапрос("/unf/ws/tsdsync", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
РезультатЗапроса = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ТекстОтвета = РезультатЗапроса.ПолучитьТелоКакСтроку();
Док.Статус = Перечисления.Статус.Отправлен;
Док.Записать();
Возврат ТекстОтвета;
КонецФункции
#КонецОбласти