From a0d5f170045ec32b5a60d17429dc96b5f20d0e12 Mon Sep 17 00:00:00 2001 From: kykaevv Date: Tue, 1 Sep 2026 13:23:37 +0300 Subject: [PATCH] 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 --- .../Forms/ПодборПоставкиТовара/Ext/Form/Module.bsl | 55 ++++-- .../Forms/ФормаДокумента/Ext/Form/Module.bsl | 163 ++++++++++++++---- 2 files changed, 172 insertions(+), 46 deletions(-) diff --git a/Documents/СтикеровкаМП/Forms/ПодборПоставкиТовара/Ext/Form/Module.bsl b/Documents/СтикеровкаМП/Forms/ПодборПоставкиТовара/Ext/Form/Module.bsl index dffbc34..6135b40 100644 --- a/Documents/СтикеровкаМП/Forms/ПодборПоставкиТовара/Ext/Form/Module.bsl +++ b/Documents/СтикеровкаМП/Forms/ПодборПоставкиТовара/Ext/Form/Module.bsl @@ -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 Тогда + ПараметрыТов.Вставить("ИдентСтрокиТовара", ИдентСтрокиТовара); + КонецЕсли; + Оповестить("НашлиТоварВПоставке", ПараметрыТов, ЭтаФорма); + ЭтаФорма.Закрыть(); +КонецПроцедуры + +&НаКлиенте +Функция СформироватьПараметрыНайденногоТовара(структураПоиска, КарточкаМП) + + ПараметрыТов = Новый Структура(); + ПараметрыТов.Вставить("Номенклатура", КарточкаМП); + Если структураПоиска.Свойство("КодМП") И ЗначениеЗаполнено(структураПоиска.КодМП) Тогда + ПараметрыТов.Вставить("КодМП", структураПоиска.КодМП); + КонецЕсли; + Если структураПоиска.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(структураПоиска.ШтрихкодПоставки) Тогда + ПараметрыТов.Вставить("ШтрихкодПоставки", структураПоиска.ШтрихкодПоставки); + КонецЕсли; + Если ЗначениеЗаполнено(КодМаркировки) Тогда + ПараметрыТов.Вставить("КодМаркировки", КодМаркировки); + КонецЕсли; + Возврат ПараметрыТов; + +КонецФункции + Функция НайтиНомПоШКПоставки(НомерПоставки) СсылкиПоставкиМП = ДокументОснование.ПоставкиМП.Выгрузить().ВыгрузитьКолонку("ПоставкаМП"); Запрос = Новый Запрос; diff --git a/Documents/СтикеровкаМП/Forms/ФормаДокумента/Ext/Form/Module.bsl b/Documents/СтикеровкаМП/Forms/ФормаДокумента/Ext/Form/Module.bsl index 41ae9ee..be1a954 100644 --- a/Documents/СтикеровкаМП/Forms/ФормаДокумента/Ext/Form/Module.bsl +++ b/Documents/СтикеровкаМП/Forms/ФормаДокумента/Ext/Form/Module.bsl @@ -26,10 +26,17 @@ Запрос.УстановитьПараметр("СписокЗначений", СсылкиПоставкиМП); ТоварыВирт.Загрузить(Запрос.Выполнить().Выгрузить()); Для Каждого строка Из ТоварыВирт Цикл + строка.Отсканировано = 0; + строка.МаркаСтрока = ""; + строка.МаркаПредставление = ""; СтруктураПоиска = Новый Структура(); СтруктураПоиска.Вставить("КарточкаМП", строка.КарточкаМП); СтруктураПоиска.Вставить("КодМП", строка.КодМП); ТовКол=Объект.ТоварыТолькоКоличество.НайтиСтроки(СтруктураПоиска); + Если (ТовКол = Неопределено Или ТовКол.Количество() = 0) И ЗначениеЗаполнено(строка.ШтрихкодПоставки) Тогда + СтруктураПоиска = Новый Структура("КарточкаМП, ШтрихкодПоставки", строка.КарточкаМП, строка.ШтрихкодПоставки); + ТовКол = Объект.ТоварыТолькоКоличество.НайтиСтроки(СтруктураПоиска); + КонецЕсли; Если ТовКол <> Неопределено И ТовКол.Количество() > 0 Тогда строка.Отсканировано = ТовКол[0].Отсканировано; строка.МаркаСтрока = ТовКол[0].МаркаСтрока; @@ -152,6 +159,7 @@ ПараметрыОткрытия.Вставить("ЕстьТовар", Истина); ПараметрыОткрытия.Вставить("Маркет", МаркетПлейс); ПараметрыОткрытия.Вставить("ЕстьПоставка", ложь); + ПараметрыОткрытия.Вставить("ИдентСтрокиТовара", тов.ПолучитьИдентификатор()); Если МаркаТовара <> Неопределено Тогда ПараметрыОткрытия.Вставить("КодМаркировки",МаркаТовара); КонецЕсли; @@ -246,45 +254,136 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) если ИмяСобытия="НашлиТоварВПоставке" Тогда НеВызыватьВС=истина; - структураПоиска=Новый структура(); - если Параметр.Свойство("КодМП") И ЗначениеЗаполнено(Параметр.КодМП) - И Параметр.КодМП <> "Не определен" Тогда - структураПоиска.Вставить("КодМП", Параметр.КодМП); - КонецЕсли; - если Параметр.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(Параметр.ШтрихкодПоставки) Тогда - структураПоиска.Вставить("ШтрихкодПоставки", Параметр.ШтрихкодПоставки); - КонецЕсли; - структураПоиска.Вставить("КарточкаМП", Параметр.Номенклатура); - тов=ТоварыВирт.НайтиСтроки(структураПоиска); - Если тов <> неопределено И тов.Количество() > 0 Тогда - Для каждого элемент из тов цикл - если элемент.Отсканировано >= элемент.Количество Тогда Продолжить; КонецЕсли; - элемент.Отсканировано = элемент.Отсканировано + 1; - если Параметр.Свойство("КодМаркировки") И ЗначениеЗаполнено(Параметр.КодМаркировки) - И Параметр.КодМаркировки <> "-" Тогда - элемент.МаркаСтрока = Параметр.КодМаркировки; - элемент.МаркаПредставление = ПредставлениеКодаМаркировки(Параметр.КодМаркировки); - КонецЕсли; - Элементы.ТоварыВиртНаФорме.ТекущаяСтрока = элемент.ПолучитьИдентификатор(); - ФайлЗвука = ПолучитьАдресФайла("ок"); - #Если МобильноеПриложениеКлиент Тогда - СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука); - #КонецЕсли - Прервать; - КонецЦикла; - Иначе + Если Не ОбновитьСтрокуТовараВирт(Параметр) Тогда Сообщить("Не удалось обновить строку товара в документе"); - КонецЕсли; + ВоспроизвестиЗвукСканирования("еррор"); + КонецЕсли; ИначеЕсли ИмяСобытия="НЕнашлиТоварВПоставке" Тогда Сообщить("Нет соотвествия товара и поставки в данном документе!"); НеВызыватьВС=истина; - ФайлЗвука = ПолучитьАдресФайла("еррор"); - #Если МобильноеПриложениеКлиент Тогда - СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука); - #КонецЕсли + ВоспроизвестиЗвукСканирования("еррор"); КонецЕсли; КонецПроцедуры +&НаКлиенте +Функция ОбновитьСтрокуТовараВирт(Параметр) + + элемент = Неопределено; + Если Параметр.Свойство("ИдентСтрокиТовара") И Параметр.ИдентСтрокиТовара <> 0 Тогда + элемент = ТоварыВирт.НайтиПоИдентификатору(Параметр.ИдентСтрокиТовара); + Если элемент <> Неопределено И Не СтрокаСоответствуетПоставке(элемент, Параметр) Тогда + элемент = Неопределено; + КонецЕсли; + КонецЕсли; + + Если элемент = Неопределено Тогда + НайденныеСтроки = НайтиСтрокиТовараВирт(Параметр); + Для Каждого СтрокаТов Из НайденныеСтроки Цикл + Если СтрокаТов.Отсканировано < СтрокаТов.Количество Тогда + элемент = СтрокаТов; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Если элемент = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если элемент.Отсканировано >= элемент.Количество Тогда + Возврат Ложь; + КонецЕсли; + + элемент.Отсканировано = элемент.Отсканировано + 1; + Если Параметр.Свойство("КодМаркировки") И ЗначениеЗаполнено(Параметр.КодМаркировки) + И Параметр.КодМаркировки <> "-" Тогда + элемент.МаркаСтрока = Параметр.КодМаркировки; + элемент.МаркаПредставление = ПредставлениеКодаМаркировки(Параметр.КодМаркировки); + КонецЕсли; + Элементы.ТоварыВиртНаФорме.ТекущаяСтрока = элемент.ПолучитьИдентификатор(); + ВоспроизвестиЗвукСканирования("ок"); + Возврат Истина; + +КонецФункции + +&НаКлиенте +Функция НайтиСтрокиТовараВирт(Параметр) + + Результат = Новый Массив; + Если Не Параметр.Свойство("Номенклатура") Или Не ЗначениеЗаполнено(Параметр.Номенклатура) Тогда + Возврат Результат; + КонецЕсли; + + структураПоиска = Новый Структура("КарточкаМП", Параметр.Номенклатура); + Если Параметр.Свойство("КодМП") И ЗначениеЗаполнено(Параметр.КодМП) + И Параметр.КодМП <> "Не определен" Тогда + структураПоиска.Вставить("КодМП", Параметр.КодМП); + КонецЕсли; + Если Параметр.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(Параметр.ШтрихкодПоставки) Тогда + структураПоиска.Вставить("ШтрихкодПоставки", Параметр.ШтрихкодПоставки); + КонецЕсли; + + тов = ТоварыВирт.НайтиСтроки(структураПоиска); + Если тов <> Неопределено И тов.Количество() > 0 Тогда + Для Каждого СтрокаТов Из тов Цикл + Результат.Добавить(СтрокаТов); + КонецЦикла; + Возврат Результат; + КонецЕсли; + + КодПоставки = ""; + Если Параметр.Свойство("КодМП") И ЗначениеЗаполнено(Параметр.КодМП) + И Параметр.КодМП <> "Не определен" Тогда + КодПоставки = СокрЛП(Параметр.КодМП); + ИначеЕсли Параметр.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(Параметр.ШтрихкодПоставки) Тогда + КодПоставки = СокрЛП(Параметр.ШтрихкодПоставки); + КонецЕсли; + + тов = ТоварыВирт.НайтиСтроки(Новый Структура("КарточкаМП", Параметр.Номенклатура)); + Если тов = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Для Каждого СтрокаТов Из тов Цикл + Если ЗначениеЗаполнено(КодПоставки) + И (СокрЛП(Строка(СтрокаТов.КодМП)) = КодПоставки + Или СокрЛП(Строка(СтрокаТов.ШтрихкодПоставки)) = КодПоставки) Тогда + Результат.Добавить(СтрокаТов); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция СтрокаСоответствуетПоставке(СтрокаТов, Параметр) + + КодПоставки = ""; + Если Параметр.Свойство("КодМП") И ЗначениеЗаполнено(Параметр.КодМП) + И Параметр.КодМП <> "Не определен" Тогда + КодПоставки = СокрЛП(Параметр.КодМП); + ИначеЕсли Параметр.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(Параметр.ШтрихкодПоставки) Тогда + КодПоставки = СокрЛП(Параметр.ШтрихкодПоставки); + КонецЕсли; + + Если Не ЗначениеЗаполнено(КодПоставки) Тогда + Возврат Истина; + КонецЕсли; + + Возврат СокрЛП(Строка(СтрокаТов.КодМП)) = КодПоставки + Или СокрЛП(Строка(СтрокаТов.ШтрихкодПоставки)) = КодПоставки; + +КонецФункции + +&НаКлиенте +Процедура ВоспроизвестиЗвукСканирования(ТипМакета) + ФайлЗвука = ПолучитьАдресФайла(ТипМакета); + #Если МобильноеПриложениеКлиент Тогда + СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука); + #КонецЕсли +КонецПроцедуры + &НаКлиенте Функция ЭтоКодМаркировки(Знач ДанныеСкана)