xmlTSDGalery/Documents/СтикеровкаМП/Forms/ПодборПоставкиТовара/Ext/Form/Module.bsl
kykaevv 2879dae761 Fix matching delivery after marking code scan in StikerovkaMP.
Correct marketplace lookup for WB/FB/YA and persist marking codes to the Codes tab.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 13:01:23 +03:00

346 lines
20 KiB
Plaintext
Raw 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.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
элементы.СтатусКодаВПоставке.Заголовок=Параметры.СтатусКодаВПоставке;
элементы.Подсказка1.Заголовок=Параметры.Подсказка1;
КодМП=Параметры.КодМП;
ДокументОснование=Параметры.ДокументОснование;
ном=Параметры.ном;
ЕстьПоставка=параметры.ЕстьПоставка;
ЕстьТовар=параметры.ЕстьТовар;
Маркет=параметры.маркет;
НомерПоставкиМП = параметры.НомерПоставкиМП;
КодМаркировки = "";
Если параметры.Свойство("КодМаркировки") И ЗначениеЗаполнено(параметры.КодМаркировки)
И параметры.КодМаркировки <> "-" Тогда
КодМаркировки = параметры.КодМаркировки;
КонецЕсли;
если ЕстьТовар Тогда
элементы.КодМП.Видимость=ложь;
элементы.НаимНоменклатура.Видимость=Истина;
НаимНоменклатура=ном.Наименование
конецесли;
КонецПроцедуры
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Если ЭтаФорма.вводдоступен() Тогда
// Если отсканировали товар/марку и еще раз — ждём QR поставки
Если Событие="Штрихкод" И ЕстьТовар
И (СтрДлина(Данные)=13 И НЕ СтрНайти(Данные, "-") ИЛИ ЭтоКодМаркировкиПодбор(Данные)) Тогда
#Если МобильноеПриложениеКлиент Тогда
СредстваМультимедиа.ВоспроизвестиАудио(ПолучитьАдресФайла("еррор"));
#КонецЕсли
Сообщить("Отсканируйте QR - код поставки");
Возврат;
КонецЕсли;
// Код маркировки после поставки: разбираем как ШК товара и сохраняем Base64
Если Событие="Штрихкод" И ЕстьПоставка И ЭтоКодМаркировкиПодбор(Данные) Тогда
РезультатРазбора = РазобратьКодМаркировкиПодбор(Данные);
Если Не ЗначениеЗаполнено(РезультатРазбора.ШтрихкодТовара) Тогда
#Если МобильноеПриложениеКлиент Тогда
СредстваМультимедиа.ВоспроизвестиАудио(ПолучитьАдресФайла("еррор"));
#КонецЕсли
Сообщить("Не удалось извлечь ШК из кода маркировки");
Возврат;
КонецЕсли;
КодМаркировки = РезультатРазбора.КодBase64;
Данные = РезультатРазбора.ШтрихкодТовара;
КонецЕсли;
Если Маркет="YA" Тогда
// Обрежем штрихкод поставки яндекса
Данные=ПривестиСтрокуВПорядок(Данные, "-");
postingNumber=Данные;
конецесли;
Если Событие="Штрихкод" И СтрДлина(Данные)=13 И ЕстьПоставка Тогда
РезПоиск=НайтиНомВБазе(Данные, КодМП);// находим товар в базе. Может быть не один // 27.04.2026
если ЗначениеЗаполнено(РезПоиск) тогда
Если ОпредМаркТовара(РезПоиск) И Не ЗначениеЗаполнено(КодМаркировки) Тогда
#Если МобильноеПриложениеКлиент Тогда
СредстваМультимедиа.ВоспроизвестиАудио(ПолучитьАдресФайла("еррор"));
#КонецЕсли
Сообщить("Это маркированый товар. Отсканируйте марку");
Возврат;
КонецЕсли;
//структураПоиска=Новый структура();
//структураПоиска.Вставить("КодМП", КодМП);
//структураПоиска.Вставить("КарточкаМП", номПоиск);
//Рез=НайтиТоварВДокеПоШК(структураПоиска);
//если рез=истина тогда
ПараметрыТов = Новый Структура();
ПараметрыТов.Вставить("КодМП", КодМП);
ПараметрыТов.Вставить("Номенклатура", РезПоиск);
Если ЗначениеЗаполнено(КодМаркировки) Тогда
ПараметрыТов.Вставить("КодМаркировки", КодМаркировки);
КонецЕсли;
Оповестить("НашлиТоварВПоставке", ПараметрыТов, ЭтаФорма);
ЭтаФорма.Закрыть();
//иначе
// Оповестить("НЕнашлиТоварВПоставке", , ЭтаФорма);
// ЭтаФорма.Закрыть();
//Конецесли;
иначе
Оповестить("НЕнашлиТоварВПоставке", , ЭтаФорма);
ЭтаФорма.Закрыть();
//#Если МобильноеПриложениеКлиент Тогда
// СредстваМультимедиа.ВоспроизвестиАудио(ПолучитьАдресФайла("еррор"));
//#КонецЕсли
//Сообщить("Не нашли товар в базе");
конецесли;
ИначеЕсли Событие="Штрихкод" И ЕстьТовар И Не ЭтоШтрихкодТовараПодбор(Данные) Тогда
структураПоиска=Новый структура();
ПараметрыТов = Новый Структура();
postingNumber = "";
если Маркет="YA" Тогда
postingNumber=ПривестиСтрокуВПорядок(Данные, "-");
структураПоиска.Вставить("КодМП", postingNumber);
ИначеЕсли Маркет="OZ" Тогда
ДанныеОтвета=СинхронизацияУТ.ЗапросДанныеДляМаркетов(ДокументОснование, Данные);
postingNumber=ДанныеОтвета.result.posting_number;
структураПоиска.Вставить("КодМП", postingNumber);
ИначеЕсли Маркет="WB" ИЛИ Маркет="FB" Тогда
postingNumber=Данные;
структураПоиска.Вставить("ШтрихкодПоставки", postingNumber);
Иначе
postingNumber=Данные;
структураПоиска.Вставить("КодМП", postingNumber);
конецесли;
структураПоиска.Вставить("КарточкаМП", ном);
// Если у нас несколько товаров с одинаковым ШК, уточним карточку по поставке
НайденнаяКарточка = НайтиНомПоШКПоставки(postingNumber);
Если ЗначениеЗаполнено(НайденнаяКарточка) Тогда
структураПоиска.КарточкаМП = НайденнаяКарточка;
ном = НайденнаяКарточка;
КонецЕсли;
РезПоиска=НайтиТоварВДокеПоШК(структураПоиска);
Если РезПоиска=истина Тогда
Если Маркет="WB" ИЛИ Маркет="FB" Тогда
ПараметрыТов.Вставить("ШтрихкодПоставки", postingNumber);
Иначе
ПараметрыТов.Вставить("КодМП", postingNumber);
КонецЕсли;
ПараметрыТов.Вставить("Номенклатура", ном);
Если ЗначениеЗаполнено(КодМаркировки) Тогда
ПараметрыТов.Вставить("КодМаркировки", КодМаркировки);
КонецЕсли;
Оповестить("НашлиТоварВПоставке", ПараметрыТов, ЭтаФорма);
ЭтаФорма.Закрыть();
иначе
Оповестить("НЕнашлиТоварВПоставке", , ЭтаФорма);
ЭтаФорма.Закрыть();
конецесли;
конецесли;
КонецПроцедуры
Функция НайтиНомПоШКПоставки(НомерПоставки)
СсылкиПоставкиМП = ДокументОснование.ПоставкиМП.Выгрузить().ВыгрузитьКолонку("ПоставкаМП");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоставкаМПТовары.Количество КАК Количество,
| ПоставкаМПТовары.Отсканировано КАК Отсканировано,
| ПоставкаМПТовары.КодМП КАК КодМП,
| ПоставкаМПТовары.ШтрихкодПоставки КАК ШтрихкодПоставки,
| ПоставкаМПТовары.КарточкаМП.Ссылка КАК КарточкаМП
|ИЗ
| Документ.ПоставкаМП.Товары КАК ПоставкаМПТовары
|ГДЕ
| ПоставкаМПТовары.Ссылка В (&СписокЗначений)";
Запрос.УстановитьПараметр("СписокЗначений", СсылкиПоставкиМП);
ТоварыНом = Запрос.Выполнить().Выгрузить();
если НЕ (Маркет="WB" ИЛИ Маркет="FB") Тогда
тов=ТоварыНом.НайтиСтроки(Новый Структура("КодМП", НомерПоставки));
Иначе
тов=ТоварыНом.НайтиСтроки(Новый Структура("ШтрихкодПоставки", НомерПоставки));
КонецЕсли;
если тов <> неопределено И тов.Количество() > 0 Тогда
возврат тов[0].КарточкаМП;
конецесли;
КонецФункции
&НаКлиенте
Функция ЭтоШтрихкодТовараПодбор(Данные)
Возврат СтрДлина(Данные) = 13 И СтрНайти(Данные, "-") = 0;
КонецФункции
&НаКлиенте
Функция ЭтоКодМаркировкиПодбор(Знач ДанныеСкана)
ДанныеСкана = СокрЛП(Строка(ДанныеСкана));
Если Не ЗначениеЗаполнено(ДанныеСкана) Тогда
Возврат Ложь;
КонецЕсли;
Если СтрДлина(ДанныеСкана) > 40 И СтрНайти(ДанныеСкана, "=") > 0
И СтрНайти("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", Лев(ДанныеСкана, 1)) > 0 Тогда
Попытка
Декод = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(ДанныеСкана));
Если СтрДлина(Декод) > 20 И Лев(Декод, 2) = "01" Тогда
Возврат Истина;
КонецЕсли;
Исключение
КонецПопытки;
КонецЕсли;
Возврат СтрДлина(ДанныеСкана) > 20 И Лев(ДанныеСкана, 2) = "01";
КонецФункции
&НаКлиенте
Функция РазобратьКодМаркировкиПодбор(Знач ДанныеСкана)
Результат = Новый Структура("ШтрихкодТовара, КодBase64", "", "");
СыройКод = СокрЛП(Строка(ДанныеСкана));
Если СтрДлина(СыройКод) > 40 И СтрНайти(СыройКод, "=") > 0 Тогда
Попытка
Декод = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(СыройКод));
Если СтрДлина(Декод) > 20 И Лев(Декод, 2) = "01" Тогда
Результат.КодBase64 = СтрЗаменить(СтрЗаменить(СыройКод, Символы.ПС, ""), Символы.ВК, "");
СыройКод = Декод;
КонецЕсли;
Исключение
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Результат.КодBase64) Тогда
Код64 = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(СыройКод));
Код64 = СтрЗаменить(Код64, Символы.ПС, "");
Код64 = СтрЗаменить(Код64, Символы.ВК, "");
Результат.КодBase64 = Код64;
КонецЕсли;
Если Лев(СыройКод, 2) = "01" И СтрДлина(СыройКод) >= 16 Тогда
Гтин14 = Сред(СыройКод, 3, 14);
Если СтрДлина(Гтин14) = 14 Тогда
ШтрихкодТовара = Сред(Гтин14, 2, 13);
Если ЭтоЦифровойШтрихкодПодбор(ШтрихкодТовара) Тогда
Результат.ШтрихкодТовара = ШтрихкодТовара;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Результат.ШтрихкодТовара) И СтрДлина(СыройКод) >= 16 Тогда
Кандидат = Сред(СыройКод, 4, 13);
Если ЭтоЦифровойШтрихкодПодбор(Кандидат) Тогда
Результат.ШтрихкодТовара = Кандидат;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиенте
Функция ЭтоЦифровойШтрихкодПодбор(Знач СтрокаШК)
СтрокаШК = СокрЛП(Строка(СтрокаШК));
Если СтрДлина(СтрокаШК) <> 13 Тогда
Возврат Ложь;
КонецЕсли;
Для Индекс = 1 По 13 Цикл
Если СтрНайти("0123456789", Сред(СтрокаШК, Индекс, 1)) = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Функция НайтиТоварВДокеПоШК(стрПоиска)
СсылкиПоставкиМП = ДокументОснование.ПоставкиМП.Выгрузить().ВыгрузитьКолонку("ПоставкаМП");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоставкаМПТовары.Количество КАК Количество,
| ПоставкаМПТовары.Отсканировано КАК Отсканировано,
| ПоставкаМПТовары.КодМП КАК КодМП,
| ПоставкаМПТовары.ШтрихкодПоставки КАК ШтрихкодПоставки,
| ПоставкаМПТовары.КарточкаМП.Ссылка КАК КарточкаМП
|ИЗ
| Документ.ПоставкаМП.Товары КАК ПоставкаМПТовары
|ГДЕ
| ПоставкаМПТовары.Ссылка В (&СписокЗначений)";
Запрос.УстановитьПараметр("СписокЗначений", СсылкиПоставкиМП);
ТоварыНом = Запрос.Выполнить().Выгрузить();
тов=ТоварыНом.НайтиСтроки(стрПоиска);
если тов <> неопределено И тов.Количество() > 0 Тогда
Возврат Истина;
конецесли;
Возврат Ложь;
КонецФункции
Функция ПривестиСтрокуВПорядок(Строка, СтрокаПоиска)
ДлинаСтрокиПоиска = СтрДлина(СтрокаПоиска)-1;
ПозицияСтрокиПоиска = СтрНайти(Строка, СтрокаПоиска);
если ПозицияСтрокиПоиска=0 тогда возврат Строка; конецесли;
ДлинаСтроки = ПозицияСтрокиПоиска + ДлинаСтрокиПоиска - 1;
НоваяСтрока = Лев(Строка, ДлинаСтроки);
возврат НоваяСтрока;
КонецФункции
Функция НайтиНомВБазе(штрих, КодМП)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыУпаковок.Номенклатура.Ссылка КАК НоменклатураСсылка
|ИЗ
| РегистрСведений.ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
|ГДЕ
| ШтрихкодыУпаковок.Штрихкод = &Штрихкод
| И ТИПЗНАЧЕНИЯ(ШтрихкодыУпаковок.Номенклатура.Ссылка) = ТИП(Справочник.КарточкиМП)";
Запрос.УстановитьПараметр("Штрихкод", штрих);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
Рез=НайтиТоварВДокеПоШК(Новый Структура("КодМП, КарточкаМП", КодМП, РезультатЗапроса.НоменклатураСсылка));
Если Рез=истина Тогда Возврат РезультатЗапроса.НоменклатураСсылка; Иначе ПродолжитЬ; КонецЕсли;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыУпаковок.Номенклатура.Ссылка КАК НоменклатураСсылка
|ИЗ
| РегистрСведений.ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
|ГДЕ
| ШтрихкодыУпаковок.Штрихкод = &Штрихкод
| И ТИПЗНАЧЕНИЯ(ШтрихкодыУпаковок.Номенклатура.Ссылка) = ТИП(Справочник.Номенклатура)";
Запрос.УстановитьПараметр("Штрихкод", штрих);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
Запрос1 = Новый Запрос;
Запрос1.Текст =
"ВЫБРАТЬ
| КарточкиМП.Ссылка КАК Ссылка
|ИЗ
| Справочник.КарточкиМП КАК КарточкиМП
|ГДЕ
| КарточкиМП.Номенклатура = &Номенклатура";
Запрос1.УстановитьПараметр("Номенклатура", РезультатЗапроса.НоменклатураСсылка);
ВыборкаКарточек = Запрос1.Выполнить().Выбрать();
Пока ВыборкаКарточек.Следующий() Цикл
Рез = НайтиТоварВДокеПоШК(Новый Структура("КодМП, КарточкаМП", КодМП, ВыборкаКарточек.Ссылка));
Если Рез = Истина Тогда
Возврат ВыборкаКарточек.Ссылка;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецФункции
&НаСервереБезКонтекста
Функция ОпредМаркТовара(Товар)
Возврат Товар.МаркировкаМП;
КонецФункции
&НаСервере
Функция ПолучитьАдресФайла(ТипМакета)
Данные = ПолучитьОбщийМакет(ТипМакета);
Возврат Данные;
КонецФункции