&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) элементы.СтатусКодаВПоставке.Заголовок=Параметры.СтатусКодаВПоставке; элементы.Подсказка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.Выполнить().Выбрать(); Пока ВыборкаКарточек.Следующий() Цикл Рез = НайтиТоварВДокеПоШК(Новый Структура("КодМП, КарточкаМП", КодМП, ВыборкаКарточек.Ссылка)); Если Рез = Истина Тогда Возврат ВыборкаКарточек.Ссылка; КонецЕсли; КонецЦикла; КонецЦикла; КонецФункции &НаСервереБезКонтекста Функция ОпредМаркТовара(Товар) Возврат Товар.МаркировкаМП; КонецФункции &НаСервере Функция ПолучитьАдресФайла(ТипМакета) Данные = ПолучитьОбщийМакет(ТипМакета); Возврат Данные; КонецФункции