Fix silent failure after delivery scan in StikerovkaMP.

Update row by id, reset scanned count on load, and improve delivery matching.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
kykaevv 2026-09-01 13:23:37 +03:00
parent 2879dae761
commit a0d5f17004
2 changed files with 172 additions and 46 deletions

View File

@ -21,6 +21,17 @@
конецесли;
КонецПроцедуры
&НаКлиенте
Перем ИдентСтрокиТовара;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИдентСтрокиТовара = 0;
Если Параметры.Свойство("ИдентСтрокиТовара") Тогда
ИдентСтрокиТовара = Параметры.ИдентСтрокиТовара;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Если ЭтаФорма.вводдоступен() Тогда
@ -75,8 +86,7 @@
Если ЗначениеЗаполнено(КодМаркировки) Тогда
ПараметрыТов.Вставить("КодМаркировки", КодМаркировки);
КонецЕсли;
Оповестить("НашлиТоварВПоставке", ПараметрыТов, ЭтаФорма);
ЭтаФорма.Закрыть();
ОповеститьОНайденномТоваре(ПараметрыТов);
//иначе
// Оповестить("НЕнашлиТоварВПоставке", , ЭтаФорма);
// ЭтаФорма.Закрыть();
@ -92,7 +102,6 @@
конецесли;
ИначеЕсли Событие="Штрихкод" И ЕстьТовар И Не ЭтоШтрихкодТовараПодбор(Данные) Тогда
структураПоиска=Новый структура();
ПараметрыТов = Новый Структура();
postingNumber = "";
если Маркет="YA" Тогда
postingNumber=ПривестиСтрокуВПорядок(Данные, "-");
@ -117,17 +126,8 @@
КонецЕсли;
РезПоиска=НайтиТоварВДокеПоШК(структураПоиска);
Если РезПоиска=истина Тогда
Если Маркет="WB" ИЛИ Маркет="FB" Тогда
ПараметрыТов.Вставить("ШтрихкодПоставки", postingNumber);
Иначе
ПараметрыТов.Вставить("КодМП", postingNumber);
КонецЕсли;
ПараметрыТов.Вставить("Номенклатура", ном);
Если ЗначениеЗаполнено(КодМаркировки) Тогда
ПараметрыТов.Вставить("КодМаркировки", КодМаркировки);
КонецЕсли;
Оповестить("НашлиТоварВПоставке", ПараметрыТов, ЭтаФорма);
ЭтаФорма.Закрыть();
ПараметрыТов = СформироватьПараметрыНайденногоТовара(структураПоиска, ном);
ОповеститьОНайденномТоваре(ПараметрыТов);
иначе
Оповестить("НЕнашлиТоварВПоставке", , ЭтаФорма);
ЭтаФорма.Закрыть();
@ -135,6 +135,33 @@
конецесли;
КонецПроцедуры
&НаКлиенте
Процедура ОповеститьОНайденномТоваре(ПараметрыТов)
Если ИдентСтрокиТовара <> 0 Тогда
ПараметрыТов.Вставить("ИдентСтрокиТовара", ИдентСтрокиТовара);
КонецЕсли;
Оповестить("НашлиТоварВПоставке", ПараметрыТов, ЭтаФорма);
ЭтаФорма.Закрыть();
КонецПроцедуры
&НаКлиенте
Функция СформироватьПараметрыНайденногоТовара(структураПоиска, КарточкаМП)
ПараметрыТов = Новый Структура();
ПараметрыТов.Вставить("Номенклатура", КарточкаМП);
Если структураПоиска.Свойство("КодМП") И ЗначениеЗаполнено(структураПоиска.КодМП) Тогда
ПараметрыТов.Вставить("КодМП", структураПоиска.КодМП);
КонецЕсли;
Если структураПоиска.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(структураПоиска.ШтрихкодПоставки) Тогда
ПараметрыТов.Вставить("ШтрихкодПоставки", структураПоиска.ШтрихкодПоставки);
КонецЕсли;
Если ЗначениеЗаполнено(КодМаркировки) Тогда
ПараметрыТов.Вставить("КодМаркировки", КодМаркировки);
КонецЕсли;
Возврат ПараметрыТов;
КонецФункции
Функция НайтиНомПоШКПоставки(НомерПоставки)
СсылкиПоставкиМП = ДокументОснование.ПоставкиМП.Выгрузить().ВыгрузитьКолонку("ПоставкаМП");
Запрос = Новый Запрос;

View File

@ -26,10 +26,17 @@
Запрос.УстановитьПараметр("СписокЗначений", СсылкиПоставкиМП);
ТоварыВирт.Загрузить(Запрос.Выполнить().Выгрузить());
Для Каждого строка Из ТоварыВирт Цикл
строка.Отсканировано = 0;
строка.МаркаСтрока = "";
строка.МаркаПредставление = "";
СтруктураПоиска = Новый Структура();
СтруктураПоиска.Вставить("КарточкаМП", строка.КарточкаМП);
СтруктураПоиска.Вставить("КодМП", строка.КодМП);
ТовКол=Объект.ТоварыТолькоКоличество.НайтиСтроки(СтруктураПоиска);
Если (ТовКол = Неопределено Или ТовКол.Количество() = 0) И ЗначениеЗаполнено(строка.ШтрихкодПоставки) Тогда
СтруктураПоиска = Новый Структура("КарточкаМП, ШтрихкодПоставки", строка.КарточкаМП, строка.ШтрихкодПоставки);
ТовКол = Объект.ТоварыТолькоКоличество.НайтиСтроки(СтруктураПоиска);
КонецЕсли;
Если ТовКол <> Неопределено И ТовКол.Количество() > 0 Тогда
строка.Отсканировано = ТовКол[0].Отсканировано;
строка.МаркаСтрока = ТовКол[0].МаркаСтрока;
@ -152,6 +159,7 @@
ПараметрыОткрытия.Вставить("ЕстьТовар", Истина);
ПараметрыОткрытия.Вставить("Маркет", МаркетПлейс);
ПараметрыОткрытия.Вставить("ЕстьПоставка", ложь);
ПараметрыОткрытия.Вставить("ИдентСтрокиТовара", тов.ПолучитьИдентификатор());
Если МаркаТовара <> Неопределено Тогда
ПараметрыОткрытия.Вставить("КодМаркировки",МаркаТовара);
КонецЕсли;
@ -246,43 +254,134 @@
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
если ИмяСобытия="НашлиТоварВПоставке" Тогда
НеВызыватьВС=истина;
структураПоиска=Новый структура();
если Параметр.Свойство("КодМП") И ЗначениеЗаполнено(Параметр.КодМП)
И Параметр.КодМП <> "Не определен" Тогда
структураПоиска.Вставить("КодМП", Параметр.КодМП);
Если Не ОбновитьСтрокуТовараВирт(Параметр) Тогда
Сообщить("Не удалось обновить строку товара в документе");
ВоспроизвестиЗвукСканирования("еррор");
КонецЕсли;
если Параметр.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(Параметр.ШтрихкодПоставки) Тогда
структураПоиска.Вставить("ШтрихкодПоставки", Параметр.ШтрихкодПоставки);
ИначеЕсли ИмяСобытия="НЕнашлиТоварВПоставке" Тогда
Сообщить("Нет соотвествия товара и поставки в данном документе!");
НеВызыватьВС=истина;
ВоспроизвестиЗвукСканирования("еррор");
КонецЕсли;
структураПоиска.Вставить("КарточкаМП", Параметр.Номенклатура);
тов=ТоварыВирт.НайтиСтроки(структураПоиска);
Если тов <> неопределено И тов.Количество() > 0 Тогда
Для каждого элемент из тов цикл
если элемент.Отсканировано >= элемент.Количество Тогда Продолжить; КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ОбновитьСтрокуТовараВирт(Параметр)
элемент = Неопределено;
Если Параметр.Свойство("ИдентСтрокиТовара") И Параметр.ИдентСтрокиТовара <> 0 Тогда
элемент = ТоварыВирт.НайтиПоИдентификатору(Параметр.ИдентСтрокиТовара);
Если элемент <> Неопределено И Не СтрокаСоответствуетПоставке(элемент, Параметр) Тогда
элемент = Неопределено;
КонецЕсли;
КонецЕсли;
Если элемент = Неопределено Тогда
НайденныеСтроки = НайтиСтрокиТовараВирт(Параметр);
Для Каждого СтрокаТов Из НайденныеСтроки Цикл
Если СтрокаТов.Отсканировано < СтрокаТов.Количество Тогда
элемент = СтрокаТов;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если элемент = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Если элемент.Отсканировано >= элемент.Количество Тогда
Возврат Ложь;
КонецЕсли;
элемент.Отсканировано = элемент.Отсканировано + 1;
если Параметр.Свойство("КодМаркировки") И ЗначениеЗаполнено(Параметр.КодМаркировки)
Если Параметр.Свойство("КодМаркировки") И ЗначениеЗаполнено(Параметр.КодМаркировки)
И Параметр.КодМаркировки <> "-" Тогда
элемент.МаркаСтрока = Параметр.КодМаркировки;
элемент.МаркаПредставление = ПредставлениеКодаМаркировки(Параметр.КодМаркировки);
КонецЕсли;
Элементы.ТоварыВиртНаФорме.ТекущаяСтрока = элемент.ПолучитьИдентификатор();
ФайлЗвука = ПолучитьАдресФайла("ок");
#Если МобильноеПриложениеКлиент Тогда
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
#КонецЕсли
Прервать;
ВоспроизвестиЗвукСканирования("ок");
Возврат Истина;
КонецФункции
&НаКлиенте
Функция НайтиСтрокиТовараВирт(Параметр)
Результат = Новый Массив;
Если Не Параметр.Свойство("Номенклатура") Или Не ЗначениеЗаполнено(Параметр.Номенклатура) Тогда
Возврат Результат;
КонецЕсли;
структураПоиска = Новый Структура("КарточкаМП", Параметр.Номенклатура);
Если Параметр.Свойство("КодМП") И ЗначениеЗаполнено(Параметр.КодМП)
И Параметр.КодМП <> "Не определен" Тогда
структураПоиска.Вставить("КодМП", Параметр.КодМП);
КонецЕсли;
Если Параметр.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(Параметр.ШтрихкодПоставки) Тогда
структураПоиска.Вставить("ШтрихкодПоставки", Параметр.ШтрихкодПоставки);
КонецЕсли;
тов = ТоварыВирт.НайтиСтроки(структураПоиска);
Если тов <> Неопределено И тов.Количество() > 0 Тогда
Для Каждого СтрокаТов Из тов Цикл
Результат.Добавить(СтрокаТов);
КонецЦикла;
Иначе
Сообщить("Не удалось обновить строку товара в документе");
Возврат Результат;
КонецЕсли;
ИначеЕсли ИмяСобытия="НЕнашлиТоварВПоставке" Тогда
Сообщить("Нет соотвествия товара и поставки в данном документе!");
НеВызыватьВС=истина;
ФайлЗвука = ПолучитьАдресФайла("еррор");
КодПоставки = "";
Если Параметр.Свойство("КодМП") И ЗначениеЗаполнено(Параметр.КодМП)
И Параметр.КодМП <> "Не определен" Тогда
КодПоставки = СокрЛП(Параметр.КодМП);
ИначеЕсли Параметр.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(Параметр.ШтрихкодПоставки) Тогда
КодПоставки = СокрЛП(Параметр.ШтрихкодПоставки);
КонецЕсли;
тов = ТоварыВирт.НайтиСтроки(Новый Структура("КарточкаМП", Параметр.Номенклатура));
Если тов = Неопределено Тогда
Возврат Результат;
КонецЕсли;
Для Каждого СтрокаТов Из тов Цикл
Если ЗначениеЗаполнено(КодПоставки)
И (СокрЛП(Строка(СтрокаТов.КодМП)) = КодПоставки
Или СокрЛП(Строка(СтрокаТов.ШтрихкодПоставки)) = КодПоставки) Тогда
Результат.Добавить(СтрокаТов);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиенте
Функция СтрокаСоответствуетПоставке(СтрокаТов, Параметр)
КодПоставки = "";
Если Параметр.Свойство("КодМП") И ЗначениеЗаполнено(Параметр.КодМП)
И Параметр.КодМП <> "Не определен" Тогда
КодПоставки = СокрЛП(Параметр.КодМП);
ИначеЕсли Параметр.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(Параметр.ШтрихкодПоставки) Тогда
КодПоставки = СокрЛП(Параметр.ШтрихкодПоставки);
КонецЕсли;
Если Не ЗначениеЗаполнено(КодПоставки) Тогда
Возврат Истина;
КонецЕсли;
Возврат СокрЛП(Строка(СтрокаТов.КодМП)) = КодПоставки
Или СокрЛП(Строка(СтрокаТов.ШтрихкодПоставки)) = КодПоставки;
КонецФункции
&НаКлиенте
Процедура ВоспроизвестиЗвукСканирования(ТипМакета)
ФайлЗвука = ПолучитьАдресФайла(ТипМакета);
#Если МобильноеПриложениеКлиент Тогда
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
#КонецЕсли
КонецЕсли;
КонецПроцедуры
&НаКлиенте