xmlTSDGalery/Documents/СтикеровкаМП/Forms/ФормаДокумента/Ext/Form/Module.bsl
kykaevv 2879dae761 Fix matching delivery after marking code scan in StikerovkaMP.
Correct marketplace lookup for WB/FB/YA and persist marking codes to the Codes tab.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 13:01:23 +03:00

526 lines
32 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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