Update row by id, reset scanned count on load, and improve delivery matching. Co-authored-by: Cursor <cursoragent@cursor.com>
373 lines
22 KiB
Plaintext
373 lines
22 KiB
Plaintext
&НаСервере
|
||
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
|
||
элементы.СтатусКодаВПоставке.Заголовок=Параметры.СтатусКодаВПоставке;
|
||
элементы.Подсказка1.Заголовок=Параметры.Подсказка1;
|
||
КодМП=Параметры.КодМП;
|
||
ДокументОснование=Параметры.ДокументОснование;
|
||
ном=Параметры.ном;
|
||
ЕстьПоставка=параметры.ЕстьПоставка;
|
||
ЕстьТовар=параметры.ЕстьТовар;
|
||
Маркет=параметры.маркет;
|
||
НомерПоставкиМП = параметры.НомерПоставкиМП;
|
||
КодМаркировки = "";
|
||
Если параметры.Свойство("КодМаркировки") И ЗначениеЗаполнено(параметры.КодМаркировки)
|
||
И параметры.КодМаркировки <> "-" Тогда
|
||
КодМаркировки = параметры.КодМаркировки;
|
||
КонецЕсли;
|
||
если ЕстьТовар Тогда
|
||
элементы.КодМП.Видимость=ложь;
|
||
элементы.НаимНоменклатура.Видимость=Истина;
|
||
НаимНоменклатура=ном.Наименование
|
||
конецесли;
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Перем ИдентСтрокиТовара;
|
||
|
||
&НаКлиенте
|
||
Процедура ПриОткрытии(Отказ)
|
||
ИдентСтрокиТовара = 0;
|
||
Если Параметры.Свойство("ИдентСтрокиТовара") Тогда
|
||
ИдентСтрокиТовара = Параметры.ИдентСтрокиТовара;
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ВнешнееСобытие(Источник, Событие, Данные)
|
||
// Если ЭтаФорма.вводдоступен() Тогда
|
||
|
||
// Если отсканировали товар/марку и еще раз — ждём 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);
|
||
Если ЗначениеЗаполнено(НайденнаяКарточка) Тогда
|
||
структураПоиска.КарточкаМП = НайденнаяКарточка;
|
||
ном = НайденнаяКарточка;
|
||
КонецЕсли;
|
||
РезПоиска=НайтиТоварВДокеПоШК(структураПоиска);
|
||
Если РезПоиска=истина Тогда
|
||
ПараметрыТов = СформироватьПараметрыНайденногоТовара(структураПоиска, ном);
|
||
ОповеститьОНайденномТоваре(ПараметрыТов);
|
||
иначе
|
||
Оповестить("НЕнашлиТоварВПоставке", , ЭтаФорма);
|
||
ЭтаФорма.Закрыть();
|
||
конецесли;
|
||
конецесли;
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ОповеститьОНайденномТоваре(ПараметрыТов)
|
||
Если ИдентСтрокиТовара <> 0 Тогда
|
||
ПараметрыТов.Вставить("ИдентСтрокиТовара", ИдентСтрокиТовара);
|
||
КонецЕсли;
|
||
Оповестить("НашлиТоварВПоставке", ПараметрыТов, ЭтаФорма);
|
||
ЭтаФорма.Закрыть();
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Функция СформироватьПараметрыНайденногоТовара(структураПоиска, КарточкаМП)
|
||
|
||
ПараметрыТов = Новый Структура();
|
||
ПараметрыТов.Вставить("Номенклатура", КарточкаМП);
|
||
Если структураПоиска.Свойство("КодМП") И ЗначениеЗаполнено(структураПоиска.КодМП) Тогда
|
||
ПараметрыТов.Вставить("КодМП", структураПоиска.КодМП);
|
||
КонецЕсли;
|
||
Если структураПоиска.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(структураПоиска.ШтрихкодПоставки) Тогда
|
||
ПараметрыТов.Вставить("ШтрихкодПоставки", структураПоиска.ШтрихкодПоставки);
|
||
КонецЕсли;
|
||
Если ЗначениеЗаполнено(КодМаркировки) Тогда
|
||
ПараметрыТов.Вставить("КодМаркировки", КодМаркировки);
|
||
КонецЕсли;
|
||
Возврат ПараметрыТов;
|
||
|
||
КонецФункции
|
||
|
||
Функция НайтиНомПоШКПоставки(НомерПоставки)
|
||
СсылкиПоставкиМП = ДокументОснование.ПоставкиМП.Выгрузить().ВыгрузитьКолонку("ПоставкаМП");
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| ПоставкаМПТовары.Количество КАК Количество,
|
||
| ПоставкаМПТовары.Отсканировано КАК Отсканировано,
|
||
| ПоставкаМПТовары.КодМП КАК КодМП,
|
||
| ПоставкаМПТовары.ШтрихкодПоставки КАК ШтрихкодПоставки,
|
||
| ПоставкаМПТовары.КарточкаМП.Ссылка КАК КарточкаМП
|
||
|ИЗ
|
||
| Документ.ПоставкаМП.Товары КАК ПоставкаМПТовары
|
||
|ГДЕ
|
||
| ПоставкаМПТовары.Ссылка В (&СписокЗначений)";
|
||
Запрос.УстановитьПараметр("СписокЗначений", СсылкиПоставкиМП);
|
||
ТоварыНом = Запрос.Выполнить().Выгрузить();
|
||
если НЕ (Маркет="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.Выполнить().Выбрать();
|
||
Пока ВыборкаКарточек.Следующий() Цикл
|
||
Рез = НайтиТоварВДокеПоШК(Новый Структура("КодМП, КарточкаМП", КодМП, ВыборкаКарточек.Ссылка));
|
||
Если Рез = Истина Тогда
|
||
Возврат ВыборкаКарточек.Ссылка;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
|
||
КонецФункции
|
||
|
||
&НаСервереБезКонтекста
|
||
Функция ОпредМаркТовара(Товар)
|
||
Возврат Товар.МаркировкаМП;
|
||
КонецФункции
|
||
|
||
&НаСервере
|
||
Функция ПолучитьАдресФайла(ТипМакета)
|
||
Данные = ПолучитьОбщийМакет(ТипМакета);
|
||
Возврат Данные;
|
||
КонецФункции
|