Correct marketplace lookup for WB/FB/YA and persist marking codes to the Codes tab. Co-authored-by: Cursor <cursoragent@cursor.com>
526 lines
32 KiB
Plaintext
526 lines
32 KiB
Plaintext
&НаКлиенте
|
||
Перем НеВызыватьВС, МаркаТовара;
|
||
&НаСервере
|
||
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
|
||
ТекущийОбъект.ТоварыТолькоКоличество.Загрузить(ТоварыВирт.Выгрузить());
|
||
КонецПроцедуры
|
||
|
||
&НаСервере
|
||
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
|
||
Если Объект.ПоставкиМП.Количество() > 0 Тогда
|
||
СсылкиПоставкиМП = Объект.ПоставкиМП.Выгрузить().ВыгрузитьКолонку("ПоставкаМП");
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| ПоставкаМПТовары.Количество КАК Количество,
|
||
| ПоставкаМПТовары.Отсканировано КАК Отсканировано,
|
||
| ПоставкаМПТовары.КодМП КАК КодМП,
|
||
| ПоставкаМПТовары.ШтрихкодПоставки КАК ШтрихкодПоставки,
|
||
| ПоставкаМПТовары.КарточкаМП.Ссылка КАК КарточкаМП,
|
||
| ПоставкаМПТовары.Ссылка.Номер КАК Номер,
|
||
| ПоставкаМПТовары.Ячейка КАК Ячейка
|
||
|ИЗ
|
||
| Документ.ПоставкаМП.Товары КАК ПоставкаМПТовары
|
||
|ГДЕ
|
||
| ПоставкаМПТовары.Ссылка В(&СписокЗначений)";
|
||
Запрос.УстановитьПараметр("СписокЗначений", СсылкиПоставкиМП);
|
||
ТоварыВирт.Загрузить(Запрос.Выполнить().Выгрузить());
|
||
Для Каждого строка Из ТоварыВирт Цикл
|
||
СтруктураПоиска = Новый Структура();
|
||
СтруктураПоиска.Вставить("КарточкаМП", строка.КарточкаМП);
|
||
СтруктураПоиска.Вставить("КодМП", строка.КодМП);
|
||
ТовКол=Объект.ТоварыТолькоКоличество.НайтиСтроки(СтруктураПоиска);
|
||
Если ТовКол <> Неопределено И ТовКол.Количество() > 0 Тогда
|
||
строка.Отсканировано = ТовКол[0].Отсканировано;
|
||
строка.МаркаСтрока = ТовКол[0].МаркаСтрока;
|
||
строка.МаркаПредставление = ПредставлениеКодаМаркировкиНаСервере(ТовКол[0].МаркаСтрока);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
ПечататьШКТовара=Истина;
|
||
КонецПроцедуры
|
||
&НаКлиенте
|
||
Процедура ВнешнееСобытие(Источник, Событие, Данные)
|
||
// Каким то непонятным методом вызывается два раза внешнее событие
|
||
// на этой форме из другой формы. сделали через переменную
|
||
Если НеВызыватьВС Тогда
|
||
НеВызыватьВС = Ложь;
|
||
Возврат;
|
||
конецесли;
|
||
МаркаТовара = Неопределено;
|
||
МаркетПлейс=ИдентификаторМаркетПлейса();
|
||
// Это максимальный костыль. При закрытии второй формы не отрабатывает функция ВводДоступен()
|
||
// на это форме из Windows клиента. ХЗ почему. Пока работаем так
|
||
#Если НЕ МобильноеПриложениеКлиент Тогда
|
||
Если ЭтаФорма.ИмяФормы = "Документ.СтикеровкаМП.Форма.ФормаДокумента" Тогда
|
||
#Иначе
|
||
Если ВводДоступен() тогда
|
||
#КонецЕсли
|
||
Если Событие="Штрихкод" Тогда // это поставка маркета CODE128
|
||
// Код маркировки (DataMatrix): достаём ШК товара (GTIN→EAN13) и сохраняем КМ в Base64
|
||
Если ЭтоКодМаркировки(Данные) Тогда
|
||
РезультатРазбора = РазобратьКодМаркировки(Данные);
|
||
Если Не ЗначениеЗаполнено(РезультатРазбора.ШтрихкодТовара) Тогда
|
||
ФайлЗвука = ПолучитьАдресФайла("еррор");
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
Сообщить("Не удалось извлечь ШК товара из кода маркировки");
|
||
Возврат;
|
||
КонецЕсли;
|
||
МаркаТовара = РезультатРазбора.КодBase64;
|
||
Данные = РезультатРазбора.ШтрихкодТовара;
|
||
КонецЕсли;
|
||
Если НЕ СтрДлина(Данные)=13 ИЛИ СтрДлина(Данные)=13 И СтрНайти(Данные, "-") > 0 Тогда
|
||
// Обрежем штрихкод поставки яндекса
|
||
Если МаркетПлейс="YA" Тогда
|
||
Данные=ПривестиСтрокуВПорядок(Данные, "-");
|
||
postingNumber=Данные;
|
||
тов=ТоварыВирт.НайтиСтроки(новый Структура("КодМП",postingNumber));
|
||
// Отправим запрос по api в ОЗОН для получения поставки
|
||
ИначеЕсли МаркетПлейс="OZ" Тогда
|
||
ДанныеОтвета=СинхронизацияУТ.ЗапросДанныеДляМаркетов(Объект.Ссылка, Данные);
|
||
postingNumber=ДанныеОтвета.result.posting_number;
|
||
тов=ТоварыВирт.НайтиСтроки(новый Структура("КодМП",postingNumber));
|
||
ИначеЕсли МаркетПлейс="WB" ИЛИ МаркетПлейс="FB" Тогда
|
||
postingNumber=Данные;
|
||
тов=ТоварыВирт.НайтиСтроки(новый Структура("ШтрихкодПоставки",postingNumber));
|
||
КонецЕсли;
|
||
Если тов <> неопределено И тов.Количество() > 0 Тогда
|
||
Если тов[0].Отсканировано= тов[0].Количество тогда
|
||
ФайлЗвука = ПолучитьАдресФайла("еррор");
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
Сообщить("Данную поставку уже отсканированили");
|
||
возврат;
|
||
конецЕсли;
|
||
ПараметрыОткрытия=Новый структура();
|
||
ПараметрыОткрытия.Вставить("КодМП", тов[0].КодМП);
|
||
ПараметрыОткрытия.Вставить("НомерПоставкиМП", тов[0].Номер);
|
||
ПараметрыОткрытия.Вставить("ДокументОснование", Объект.Ссылка);
|
||
ПараметрыОткрытия.Вставить("СтатусКодаВПоставке", "Данная поставка найдена в документе");
|
||
ПараметрыОткрытия.Вставить("Подсказка1", "Отсканируйте штрихкод товара в поставке");
|
||
ПараметрыОткрытия.Вставить("ном", неопределено);
|
||
ПараметрыОткрытия.Вставить("ЕстьПоставка", Истина);
|
||
ПараметрыОткрытия.Вставить("ЕстьТовар", ложь);
|
||
ПараметрыОткрытия.Вставить("Маркет", МаркетПлейс);
|
||
ФайлЗвука = ПолучитьАдресФайла("ок");
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
// СинхронизацияУТ.РаспечататьКодПоставкиНаПринтере(тов[0].КодМП);
|
||
ОткрытьФорму("Документ.СтикеровкаМП.Форма.ПодборПоставкиТовара", ПараметрыОткрытия, ЭтаФорма);
|
||
иначе
|
||
ФайлЗвука = ПолучитьАдресФайла("еррор");
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
Сообщить("Данной поставки нет в документе!");
|
||
возврат;
|
||
КонецЕсли;
|
||
ИначеЕсли СтрДлина(Данные)=13 Тогда
|
||
МассивДляПечати = Новый Массив();
|
||
идент = НайтиНомВБазе(Данные);
|
||
если идент <> Неопределено Тогда
|
||
тов = ТоварыВирт.НайтиПоИдентификатору(идент);
|
||
КонецЕсли;
|
||
если тов <> неопределено Тогда
|
||
Если ОпредМаркТовара(тов.КарточкаМП) И МаркаТовара = Неопределено Тогда
|
||
ФайлЗвука = ПолучитьАдресФайла("еррор");
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
Сообщить("Это маркированый товар. Отсканируйте марку");
|
||
Возврат;
|
||
КонецЕсли;
|
||
если тов.Отсканировано= тов.Количество тогда
|
||
ФайлЗвука = ПолучитьАдресФайла("еррор");
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
Сообщить("Данный товар в поставке уже отсканированили");
|
||
возврат;
|
||
конецесли;
|
||
ПараметрыОткрытия=Новый структура();
|
||
ПараметрыОткрытия.Вставить("КодМП", "Не определен");
|
||
ПараметрыОткрытия.Вставить("НомерПоставкиМП", тов.Номер);
|
||
ПараметрыОткрытия.Вставить("ДокументОснование", Объект.Ссылка);
|
||
ПараметрыОткрытия.Вставить("СтатусКодаВПоставке", "Данный товар найден в документе");
|
||
ПараметрыОткрытия.Вставить("Подсказка1", "Отсканируйте qr-код поставки");
|
||
ПараметрыОткрытия.Вставить("ном", тов.КарточкаМП);
|
||
ПараметрыОткрытия.Вставить("ЕстьТовар", Истина);
|
||
ПараметрыОткрытия.Вставить("Маркет", МаркетПлейс);
|
||
ПараметрыОткрытия.Вставить("ЕстьПоставка", ложь);
|
||
Если МаркаТовара <> Неопределено Тогда
|
||
ПараметрыОткрытия.Вставить("КодМаркировки",МаркаТовара);
|
||
КонецЕсли;
|
||
ФайлЗвука = ПолучитьАдресФайла("ок");
|
||
СтруктураПечати=Новый Структура;
|
||
СтруктураПечати.Вставить("Ссылка",строка(Объект.Ссылка.УникальныйИдентификатор()));
|
||
СтруктураПечати.Вставить("ПечататьШКТовара", ПечататьШКТовара);
|
||
МассивДляПечати.Добавить(тов.КодМП);
|
||
СтруктураПечати.Вставить("СписокКодМП",МассивДляПечати);
|
||
Если МаркаТовара <> Неопределено Тогда
|
||
СтруктураПечати.Вставить("КодМаркировки",МаркаТовара);
|
||
КонецЕсли;
|
||
СинхронизацияУТ.РаспечататьКодПоставкиНаПринтере(СтруктураПечати);
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
ОткрытьФорму("Документ.СтикеровкаМП.Форма.ПодборПоставкиТовара", ПараметрыОткрытия, ЭтаФорма);
|
||
иначе
|
||
ФайлЗвука = ПолучитьАдресФайла("еррор");
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
Сообщить("Такого товара нет в документе либо по нему все отсканировали");
|
||
КонецЕсли;
|
||
Конецесли;
|
||
конецесли;
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
Функция НайтиНомВБазе(штрих)
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| ШтрихкодыУпаковок.Номенклатура.Ссылка КАК НоменклатураСсылка
|
||
|ИЗ
|
||
| РегистрСведений.ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
|
||
|ГДЕ
|
||
| ШтрихкодыУпаковок.Штрихкод = &Штрихкод
|
||
| И ТИПЗНАЧЕНИЯ(ШтрихкодыУпаковок.Номенклатура.Ссылка) = ТИП(Справочник.КарточкиМП)";
|
||
|
||
Запрос.УстановитьПараметр("Штрихкод", штрих);
|
||
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
|
||
Если РезультатЗапроса.Количество()>0 Тогда
|
||
Для Каждого строка из РезультатЗапроса Цикл
|
||
СтрПоиск= Новый Структура();
|
||
СтрПоиск.Вставить("КарточкаМП",строка.НоменклатураСсылка);
|
||
СтрПоиск.Вставить("Отсканировано", 0);
|
||
тов=ТоварыВирт.НайтиСтроки(СтрПоиск);
|
||
Если тов <> неопределено И тов.Количество() > 0 Тогда
|
||
возврат тов[0].ПолучитьИдентификатор();
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
Запрос = Новый Запрос;
|
||
Запрос.Текст =
|
||
"ВЫБРАТЬ
|
||
| ШтрихкодыУпаковок.Номенклатура.Ссылка КАК НоменклатураСсылка
|
||
|ИЗ
|
||
| РегистрСведений.ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
|
||
|ГДЕ
|
||
| ШтрихкодыУпаковок.Штрихкод = &Штрихкод
|
||
| И ТИПЗНАЧЕНИЯ(ШтрихкодыУпаковок.Номенклатура.Ссылка) = ТИП(Справочник.Номенклатура)";
|
||
|
||
Запрос.УстановитьПараметр("Штрихкод", Штрих);
|
||
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
|
||
Если РезультатЗапроса.Количество() > 0 Тогда
|
||
Запрос1 = Новый Запрос;
|
||
Запрос1.Текст =
|
||
"ВЫБРАТЬ
|
||
| КарточкиМП.Ссылка КАК Ссылка
|
||
|ИЗ
|
||
| Справочник.КарточкиМП КАК КарточкиМП
|
||
|ГДЕ
|
||
| КарточкиМП.Номенклатура = &Номенклатура";
|
||
Запрос1.УстановитьПараметр("Номенклатура", РезультатЗапроса[0].НоменклатураСсылка);
|
||
РезультатЗапроса1 = Запрос1.Выполнить().Выгрузить();
|
||
Для Каждого строка из РезультатЗапроса1 Цикл
|
||
СтрПоиск= Новый Структура();
|
||
СтрПоиск.Вставить("КарточкаМП",строка.Ссылка);
|
||
СтрПоиск.Вставить("Отсканировано", 0);
|
||
тов=ТоварыВирт.НайтиСтроки(СтрПоиск);
|
||
если тов <> неопределено И тов.Количество() > 0 Тогда
|
||
Возврат тов[0].ПолучитьИдентификатор();
|
||
КОнецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
КонецФункции
|
||
|
||
|
||
&НаКлиенте
|
||
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
|
||
если ИмяСобытия="НашлиТоварВПоставке" Тогда
|
||
НеВызыватьВС=истина;
|
||
структураПоиска=Новый структура();
|
||
если Параметр.Свойство("КодМП") И ЗначениеЗаполнено(Параметр.КодМП)
|
||
И Параметр.КодМП <> "Не определен" Тогда
|
||
структураПоиска.Вставить("КодМП", Параметр.КодМП);
|
||
КонецЕсли;
|
||
если Параметр.Свойство("ШтрихкодПоставки") И ЗначениеЗаполнено(Параметр.ШтрихкодПоставки) Тогда
|
||
структураПоиска.Вставить("ШтрихкодПоставки", Параметр.ШтрихкодПоставки);
|
||
КонецЕсли;
|
||
структураПоиска.Вставить("КарточкаМП", Параметр.Номенклатура);
|
||
тов=ТоварыВирт.НайтиСтроки(структураПоиска);
|
||
Если тов <> неопределено И тов.Количество() > 0 Тогда
|
||
Для каждого элемент из тов цикл
|
||
если элемент.Отсканировано >= элемент.Количество Тогда Продолжить; КонецЕсли;
|
||
элемент.Отсканировано = элемент.Отсканировано + 1;
|
||
если Параметр.Свойство("КодМаркировки") И ЗначениеЗаполнено(Параметр.КодМаркировки)
|
||
И Параметр.КодМаркировки <> "-" Тогда
|
||
элемент.МаркаСтрока = Параметр.КодМаркировки;
|
||
элемент.МаркаПредставление = ПредставлениеКодаМаркировки(Параметр.КодМаркировки);
|
||
КонецЕсли;
|
||
Элементы.ТоварыВиртНаФорме.ТекущаяСтрока = элемент.ПолучитьИдентификатор();
|
||
ФайлЗвука = ПолучитьАдресФайла("ок");
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
Прервать;
|
||
КонецЦикла;
|
||
Иначе
|
||
Сообщить("Не удалось обновить строку товара в документе");
|
||
КонецЕсли;
|
||
ИначеЕсли ИмяСобытия="НЕнашлиТоварВПоставке" Тогда
|
||
Сообщить("Нет соотвествия товара и поставки в данном документе!");
|
||
НеВызыватьВС=истина;
|
||
ФайлЗвука = ПолучитьАдресФайла("еррор");
|
||
#Если МобильноеПриложениеКлиент Тогда
|
||
СредстваМультимедиа.ВоспроизвестиАудио(ФайлЗвука);
|
||
#КонецЕсли
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Функция ЭтоКодМаркировки(Знач ДанныеСкана)
|
||
|
||
ДанныеСкана = СокрЛП(Строка(ДанныеСкана));
|
||
Если Не ЗначениеЗаполнено(ДанныеСкана) Тогда
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
|
||
// Уже Base64-строка марки (из печати/повторного скана)
|
||
Если СтрДлина(ДанныеСкана) > 40 И СтрНайти(ДанныеСкана, "=") > 0
|
||
И СтрНайти("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", Лев(ДанныеСкана, 1)) > 0 Тогда
|
||
Попытка
|
||
Декод = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(ДанныеСкана));
|
||
Если СтрДлина(Декод) > 20 И Лев(Декод, 2) = "01" Тогда
|
||
Возврат Истина;
|
||
КонецЕсли;
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
|
||
Возврат СтрДлина(ДанныеСкана) > 20 И Лев(ДанныеСкана, 2) = "01";
|
||
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Функция РазобратьКодМаркировки(Знач ДанныеСкана)
|
||
|
||
Результат = Новый Структура("ШтрихкодТовара, КодBase64, Представление", "", "", "");
|
||
ДанныеСкана = СокрЛП(Строка(ДанныеСкана));
|
||
|
||
СыройКод = ДанныеСкана;
|
||
// Если пришла уже Base64 — декодируем для разбора GTIN
|
||
Если СтрДлина(ДанныеСкана) > 40 И СтрНайти(ДанныеСкана, "=") > 0 Тогда
|
||
Попытка
|
||
Декод = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(ДанныеСкана));
|
||
Если СтрДлина(Декод) > 20 И Лев(Декод, 2) = "01" Тогда
|
||
СыройКод = Декод;
|
||
Результат.КодBase64 = СтрЗаменить(СтрЗаменить(ДанныеСкана, Символы.ПС, ""), Символы.ВК, "");
|
||
КонецЕсли;
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецЕсли;
|
||
|
||
Если Не ЗначениеЗаполнено(Результат.КодBase64) Тогда
|
||
Результат.КодBase64 = ЗакодироватьМаркуВ64(ПолучитьДвоичныеДанныеИзСтроки(СыройКод));
|
||
КонецЕсли;
|
||
|
||
// AI 01 + GTIN-14 → EAN-13 = 13 цифр начиная с позиции 4 (без ведущей цифры GTIN)
|
||
Гтин14 = "";
|
||
Если Лев(СыройКод, 2) = "01" И СтрДлина(СыройКод) >= 16 Тогда
|
||
Гтин14 = Сред(СыройКод, 3, 14);
|
||
КонецЕсли;
|
||
|
||
ШтрихкодТовара = "";
|
||
Если СтрДлина(Гтин14) = 14 Тогда
|
||
ШтрихкодТовара = Сред(Гтин14, 2, 13); // типичный EAN-13 из GTIN-14
|
||
Если Не ЭтоЦифровойШтрихкод(ШтрихкодТовара) Тогда
|
||
ШтрихкодТовара = "";
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Если Не ЗначениеЗаполнено(ШтрихкодТовара) И СтрДлина(СыройКод) >= 16 Тогда
|
||
Кандидат = Сред(СыройКод, 4, 13);
|
||
Если ЭтоЦифровойШтрихкод(Кандидат) Тогда
|
||
ШтрихкодТовара = Кандидат;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
Результат.ШтрихкодТовара = ШтрихкодТовара;
|
||
Результат.Представление = ПредставлениеСырогоКодаМаркировки(СыройКод);
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Функция ЭтоЦифровойШтрихкод(Знач СтрокаШК)
|
||
|
||
СтрокаШК = СокрЛП(Строка(СтрокаШК));
|
||
Если СтрДлина(СтрокаШК) <> 13 Тогда
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
Для Индекс = 1 По 13 Цикл
|
||
Если СтрНайти("0123456789", Сред(СтрокаШК, Индекс, 1)) = 0 Тогда
|
||
Возврат Ложь;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат Истина;
|
||
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Функция ПредставлениеСырогоКодаМаркировки(Знач СыройКод)
|
||
|
||
Текст = СтрЗаменить(Строка(СыройКод), Символ(29), " ");
|
||
Текст = СтрЗаменить(Текст, Символы.ПС, " ");
|
||
Текст = СтрЗаменить(Текст, Символы.ВК, " ");
|
||
Если СтрДлина(Текст) > 80 Тогда
|
||
Возврат Лев(Текст, 77) + "...";
|
||
КонецЕсли;
|
||
Возврат Текст;
|
||
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Функция ПредставлениеКодаМаркировки(Знач КодBase64)
|
||
|
||
Если Не ЗначениеЗаполнено(КодBase64) Или КодBase64 = "-" Тогда
|
||
Возврат "";
|
||
КонецЕсли;
|
||
Попытка
|
||
СыройКод = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(КодBase64));
|
||
Возврат ПредставлениеСырогоКодаМаркировки(СыройКод);
|
||
Исключение
|
||
Возврат Лев(Строка(КодBase64), 40);
|
||
КонецПопытки;
|
||
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Функция ПолучитьШкТовараИзМарки(данные)
|
||
// Совместимость: возвращает только ШК, Base64 кладёт в МаркаТовара
|
||
РезультатРазбора = РазобратьКодМаркировки(данные);
|
||
МаркаТовара = РезультатРазбора.КодBase64;
|
||
Возврат РезультатРазбора.ШтрихкодТовара;
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Функция ЗакодироватьМаркуВ64(ДД)
|
||
// Взято из БСП
|
||
Base64 = Base64Строка(ДД);
|
||
Base64 = СтрЗаменить(Base64, Символы.ПС, "");
|
||
Base64 = СтрЗаменить(Base64, Символы.ВК, "");
|
||
Возврат Base64;
|
||
КонецФункции
|
||
|
||
&НаСервереБезКонтекста
|
||
Функция ПредставлениеКодаМаркировкиНаСервере(Знач КодBase64)
|
||
|
||
Если Не ЗначениеЗаполнено(КодBase64) Или КодBase64 = "-" Тогда
|
||
Возврат "";
|
||
КонецЕсли;
|
||
Попытка
|
||
СыройКод = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(КодBase64));
|
||
Текст = СтрЗаменить(Строка(СыройКод), Символ(29), " ");
|
||
Текст = СтрЗаменить(Текст, Символы.ПС, " ");
|
||
Текст = СтрЗаменить(Текст, Символы.ВК, " ");
|
||
Если СтрДлина(Текст) > 80 Тогда
|
||
Возврат Лев(Текст, 77) + "...";
|
||
КонецЕсли;
|
||
Возврат Текст;
|
||
Исключение
|
||
Возврат Лев(Строка(КодBase64), 40);
|
||
КонецПопытки;
|
||
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Процедура ПриОткрытии(Отказ)
|
||
НеВызыватьВС=ложь;
|
||
КонецПроцедуры
|
||
|
||
Функция ПривестиСтрокуВПорядок(Строка, СтрокаПоиска)
|
||
ДлинаСтрокиПоиска = СтрДлина(СтрокаПоиска)-1;
|
||
ПозицияСтрокиПоиска = СтрНайти(Строка, СтрокаПоиска);
|
||
если ПозицияСтрокиПоиска=0 тогда возврат Строка; конецесли;
|
||
ДлинаСтроки = ПозицияСтрокиПоиска + ДлинаСтрокиПоиска - 1;
|
||
НоваяСтрока = Лев(Строка, ДлинаСтроки);
|
||
возврат НоваяСтрока;
|
||
КонецФункции
|
||
|
||
&НаСервере
|
||
Функция ПолучитьАдресФайла(ТипМакета)
|
||
Данные = ПолучитьОбщийМакет(ТипМакета);
|
||
Возврат Данные;
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
|
||
Если НЕ Объект.Проведен Тогда
|
||
//Если ОбъектМодифицирован(Объект.Ссылка) Тогда
|
||
// Сообщить("Сохраните документ!");
|
||
// Отказ=Истина;
|
||
//КонецЕсли;
|
||
КонецЕсли
|
||
КонецПроцедуры
|
||
|
||
Функция ОбъектМодифицирован(СсылкаОбъект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина)
|
||
Объект.ТоварыТолькоКоличество.Загрузить(ТоварыВирт.Выгрузить());
|
||
Ссылка = СсылкаОбъект;
|
||
Метаданное = СсылкаОбъект.Метаданные();
|
||
|
||
Для каждого Реквизит из Метаданное.Реквизиты Цикл
|
||
Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
|
||
Возврат Истина;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
Если ПроверятьСтандартные Тогда
|
||
Для каждого Реквизит из Метаданное.СтандартныеРеквизиты Цикл
|
||
Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
|
||
Возврат Истина;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
|
||
Если ПроверятьТабличныеЧасти Тогда
|
||
Для каждого ТЧ из Метаданное.ТабличныеЧасти Цикл
|
||
|
||
Если Объект[ТЧ.Имя].Количество() <> Ссылка[ТЧ.Имя].Количество() Тогда
|
||
Возврат Истина;
|
||
КонецЕсли;
|
||
|
||
Для Индекс = 0 по Объект[ТЧ.Имя].Количество()-1 Цикл
|
||
ОбъектСтрокаТЧ = Объект[ТЧ.Имя][Индекс];
|
||
СсылкаСтрокаТЧ = Ссылка[ТЧ.Имя][Индекс];
|
||
Для каждого РеквизитТЧ из ТЧ.Реквизиты Цикл
|
||
Если ОбъектСтрокаТЧ[РеквизитТЧ.Имя] <> СсылкаСтрокаТЧ[РеквизитТЧ.Имя] Тогда
|
||
Возврат Истина;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
Возврат Ложь;
|
||
|
||
КонецФункции
|
||
|
||
&НаСервере
|
||
Функция ИдентификаторМаркетПлейса()
|
||
МК=Лев(Объект.ПоставкиМП[0].ПоставкаМП.Номер, 2);
|
||
возврат МК;
|
||
КонецФункции
|
||
|
||
Функция ОпредМаркТовара(Товар)
|
||
Возврат Товар.МаркировкаМП;
|
||
КонецФункции |