Загрузка данных
#Область ПрограммныйИнтерфейс
#Область Работа_с_товарами
// Функция - Вернуть ссылку на товар на сайте торговой площадке
//
// Параметры:
// Товар - Товар, по которому требуется получить адрес страницы -
//
// Возвращаемое значение:
// - Адрес интернет-страницы товара
//
Функция ВернутьСсылкуНаТовар(Товар) Экспорт
Если Товар.ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
Возврат "https://www.wildberries.ru/catalog/"+СтрЗаменить(Товар.ID," ","")+"/detail.aspx";
ИначеЕсли Товар.ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.OZON Тогда
Возврат "https://www.ozon.ru/context/detail/id/"+СтрЗаменить(?(ЗначениеЗаполнено(Товар.sku_fbo), Товар.sku_fbo, Товар.sku_fbs)," ","");
Иначе
Возврат "";
КонецЕсли
КонецФункции
// Функция - Вернуть цены товара
//
// Параметры:
// Товар - Товар, по которому требуется получить цены -
//
// Возвращаемое значение:
// - Структура, хранящая в себе данные по ценам
//
Функция ВернутьЦеныТовара(Товар) Экспорт
СтруктураЦен = Новый Структура("ЦенаСоСкидкой,ЦенаАкционная,ЦенаПремиум,ЦенаБезСкидок",0,0,0,0);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Топ_ЦеныТоваровСрезПоследних.ЦенаСоСкидкой КАК ЦенаСоСкидкой,
| Топ_ЦеныТоваровСрезПоследних.ЦенаАкционная КАК ЦенаАкционная,
| Топ_ЦеныТоваровСрезПоследних.ЦенаПремиум КАК ЦенаПремиум,
| Топ_ЦеныТоваровСрезПоследних.ЦенаБезСкидок КАК ЦенаБезСкидок
|ИЗ
| РегистрСведений.Топ_ЦеныТоваров.СрезПоследних КАК Топ_ЦеныТоваровСрезПоследних
|ГДЕ
| Топ_ЦеныТоваровСрезПоследних.ЛичныйКабинет = &ЛичныйКабинет
| И Топ_ЦеныТоваровСрезПоследних.Товар = &Товар";
Запрос.УстановитьПараметр("ЛичныйКабинет", Товар.ЛичныйКабинет);
Запрос.УстановитьПараметр("Товар", Товар);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ЗаполнитьЗначенияСвойств(СтруктураЦен, Выборка);
Возврат СтруктураЦен;
КонецФункции
// Функция - Вернуть цены товара
//
// Параметры:
// Товар - Товар, по которому требуется получить цены -
//
// Возвращаемое значение:
// - Структура, хранящая в себе данные по ценам
//
Функция ВернутьЦеныТовараТП(Товар) Экспорт
СтруктураЦен = Новый Структура("ЦенаСоСкидкой,ЦенаАкционная,ЦенаПремиум,ЦенаБезСкидок",0,0,0,0);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_ЦеныТоваровНаТорговыхПлощадках.ЦенаСоСкидкой КАК ЦенаСоСкидкой,
| топ_ЦеныТоваровНаТорговыхПлощадках.ЦенаАкционная КАК ЦенаАкционная,
| топ_ЦеныТоваровНаТорговыхПлощадках.ЦенаПремиум КАК ЦенаПремиум,
| топ_ЦеныТоваровНаТорговыхПлощадках.ЦенаБезСкидок КАК ЦенаБезСкидок
|ИЗ
| РегистрСведений.топ_ЦеныТоваровНаТорговыхПлощадках КАК топ_ЦеныТоваровНаТорговыхПлощадках
|ГДЕ
| топ_ЦеныТоваровНаТорговыхПлощадках.ЛичныйКабинет = &ЛичныйКабинет
| И топ_ЦеныТоваровНаТорговыхПлощадках.Товар = &Товар";
Запрос.УстановитьПараметр("ЛичныйКабинет", Товар.ЛичныйКабинет);
Запрос.УстановитьПараметр("Товар", Товар);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ЗаполнитьЗначенияСвойств(СтруктураЦен, Выборка);
Возврат СтруктураЦен;
КонецФункции
Функция ВернутьСтатусМодерацииТовара(ТекущийТовар) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_СостояниеТоваров.Состояние КАК Состояние
|ИЗ
| РегистрСведений.топ_СостояниеТоваров КАК топ_СостояниеТоваров
|ГДЕ
| топ_СостояниеТоваров.Товар = &Товар";
Запрос.УстановитьПараметр("Товар", ТекущийТовар);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Состояние;
КонецФункции
&НаСервере
Функция ВернутьШтрихкодыТовара(Товар, РазмерWB = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.топ_Штрихкоды КАК топ_Штрихкоды
|ГДЕ
| топ_Штрихкоды.ЛичныйКабинет = &ЛичныйКабинет
| И топ_Штрихкоды.Товар = &Товар
// ++ Бойков BSLR-2454
| И (&РазмерWB = НЕОПРЕДЕЛЕНО
| ИЛИ топ_Штрихкоды.РазмерWB = &РазмерWB)";
// -- Бойков BSLR-2454
Запрос.УстановитьПараметр("Товар" , Товар);
Запрос.УстановитьПараметр("ЛичныйКабинет" , Товар.ЛичныйКабинет);
// ++ Бойков BSLR-2454
Запрос.УстановитьПараметр("РазмерWB", РазмерWB);
// -- Бойков BSLR-2454
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Штрихкод");
КонецФункции
// ++ Бойков BSLR-2576
//
Процедура НастроитьФормуРегистраСопоставлениеТоваров(Форма, ВидФормы, ПараметрыРазмещения = Неопределено) Экспорт
ОбщийМодуль = топ_ОбщийВызовСервера.ПолучитьМодульПоКонфигурации();
Если ТипЗнч(ОбщийМодуль) = Тип("Строка") Тогда
ВызватьИсключение ОбщийМодуль;
Иначе
ОбщийМодуль.НастроитьФормуРегистраСопоставлениеТоваров(Форма, ВидФормы, ПараметрыРазмещения);
КонецЕсли;
КонецПроцедуры // -- Бойков BSLR-2576
// ++ Бойков BSLR-2576
//
Функция ПараметрыРазмещенияЭлементовФормыРегистраСопоставленияТоваров() Экспорт
ПараметрыРазмещения = Новый Структура;
ПараметрыРазмещения.Вставить("ЭлементРодитель");
ПараметрыРазмещения.Вставить("СледующийЭлемент");
ПараметрыРазмещения.Вставить("ИмяДинамическогоСписка", "Список");
Возврат ПараметрыРазмещения;
КонецФункции // -- Бойков BSLR-2576
#КонецОбласти
#Область Работа_с_ценами
Функция ПолучитьЦенуПоВидуЦены(Товар, ВидЦены, Период) Экспорт
Если НЕ ЗначениеЗаполнено(ВидЦены) Тогда
Возврат 0;
КонецЕсли;
// письмерова 09.02.2024 BSLR-3179 - получим цену товара типовым механизмом
Данные = новый Структура("Товар,Размер", Товар, Справочники.топ_РазмерыТоваровWB.ПустаяСсылка());
ДанныеТовара = топ_РаботаСМаркетплейсамиОбщий_ВызовСервера.ПолучитьДанныеСвязаннойНомеклатурыПоТовару(Данные);
Если ДанныеТовара.Номенклатура <> Справочники.Номенклатура.ПустаяСсылка() Тогда // нашли сопоставление
Цена = 0;
СтруктураПараметровОтбора = Новый Структура;
СтруктураПараметровОтбора.Вставить("Дата",Период);
СтруктураПараметровОтбора.Вставить("Валюта",Справочники.Валюты.НайтиПоКоду("643"));
СтруктураПараметровОтбора.Вставить("Номенклатура",ДанныеТовара.Номенклатура);
СтруктураПараметровОтбора.Вставить("Характеристика",ДанныеТовара.Характеристика);
СтруктураПараметровОтбора.Вставить("Упаковка",ДанныеТовара.Упаковка);
СтруктураПараметровОтбора.Вставить("Серия",Справочники.СерииНоменклатуры.ПустаяСсылка());
СтруктураПараметровОтбора.Вставить("ВидЦены",ВидЦены);
// ут 11.5
ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер = Метаданные.ОбщиеМодули.Найти("ЦеныПредприятияЗаполнениеСервер");
Если ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер <> Неопределено Тогда
ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер = ОбщегоНазначения.ОбщийМодуль("ЦеныПредприятияЗаполнениеСервер");
Цена = ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
Иначе
// ут 11.4
ОбщийМодуль_ПродажиСервер = Метаданные.ОбщиеМодули.Найти("ПродажиСервер");
Если ОбщийМодуль_ПродажиСервер <> Неопределено Тогда
ОбщийМодуль_ПродажиСервер = ОбщегоНазначения.ОбщийМодуль("ПродажиСервер");
СтруктураПараметровОтбора.Вставить("ВернутьМногооборотнуюТару",Ложь);
СтруктураПараметровОтбора.Вставить("НалогообложениеНДС",Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС);
Цена = ОбщийМодуль_ПродажиСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
КонецЕсли;
КонецЕсли;
Если ДанныеТовара.Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор Тогда
// если цену не получили (нет установленной цены на набор) тогда, расчитаем по составу набора
Если Цена = 0 Тогда
ПараметрыВариантаКомплектацииНоменклатуры = НаборыВызовСервера.ПараметрыВариантаКомплектацииНоменклатуры(
ДанныеТовара.Номенклатура,
ДанныеТовара.Характеристика);
Если ПараметрыВариантаКомплектацииНоменклатуры = Неопределено Тогда // состав набора не настроен
Возврат 0;
КонецЕсли;
ВариантКомплектацииНоменклатуры = ПараметрыВариантаКомплектацииНоменклатуры.ВариантКомплектацииНоменклатуры;
ПараметрыКомплектующих = Новый Структура;
ПараметрыКомплектующих.Вставить("НоменклатураНабора", ДанныеТовара.Номенклатура);
ПараметрыКомплектующих.Вставить("ХарактеристикаНабора", ДанныеТовара.Характеристика);
ПараметрыКомплектующих.Вставить("ВариантКомплектацииНоменклатуры", ВариантКомплектацииНоменклатуры);
ПараметрыКомплектующих.Вставить("ВидЦены", ВидЦены);
ПараметрыКомплектующих.Вставить("Валюта", Справочники.Валюты.НайтиПоКоду("643"));
ПараметрыКомплектующих.Вставить("КоличествоУпаковок", 1);
ПараметрыКомплектующих.Вставить("ПроцентРучнойСкидки", 0);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Дата", Период);
ДополнительныеПараметры.Вставить("Валюта", Справочники.Валюты.НайтиПоКоду("643"));
ДополнительныеПараметры.Вставить("ВидЦены", ВидЦены);
ДополнительныеПараметры.Вставить("Цена", 0);
ПодобранныеТовары = НаборыВызовСервера.Комплектующие(ПараметрыКомплектующих, ДополнительныеПараметры);
Для каждого ПодТов Из ПодобранныеТовары Цикл
Цена = Цена + ПодТов.Цена * ПодТов.КоличествоУпаковок;
КонецЦикла;
Если ДанныеТовара.Упаковка <> Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка() Тогда // есть упаковка
Цена = Цена * ?(ДанныеТовара.Упаковка.Числитель = 0,1,ДанныеТовара.Упаковка.Числитель) /
?(ДанныеТовара.Упаковка.Знаменатель = 0,1,ДанныеТовара.Упаковка.Знаменатель);
КонецЕсли;
Возврат Цена;
КонецЕсли;
КонецЕсли;
Возврат Цена;
Иначе
// проверить, возможно это товар вб с размерами, которому сопоставлены различные номенклатуры без характеристик
// тогда берем макс цену товара без учета размера
Если Данные.Товар.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries И
Данные.Товар.ИспользуютсяРазмерыWB Тогда
// получим массив номеклатур, без учета размеров
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_СоответствиеТоваров.Номенклатура КАК Номенклатура,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика,
| топ_СоответствиеТоваров.Упаковка КАК Упаковка,
| 0 КАК Цена
|ИЗ
| РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
|ГДЕ
| топ_СоответствиеТоваров.Товар = &Товар");
Запрос.УстановитьПараметр("Товар",Данные.Товар);
ТаблицаНоменклатур = Запрос.Выполнить().Выгрузить();
Для каждого Стр Из ТаблицаНоменклатур Цикл
СтруктураПараметровОтбора = Новый Структура;
СтруктураПараметровОтбора.Вставить("Дата",Период);
СтруктураПараметровОтбора.Вставить("Валюта",Справочники.Валюты.НайтиПоКоду("643"));
СтруктураПараметровОтбора.Вставить("Номенклатура",Стр.Номенклатура);
СтруктураПараметровОтбора.Вставить("Характеристика",Стр.Характеристика);
СтруктураПараметровОтбора.Вставить("Упаковка",Стр.Упаковка);
СтруктураПараметровОтбора.Вставить("Серия",Справочники.СерииНоменклатуры.ПустаяСсылка());
СтруктураПараметровОтбора.Вставить("ВидЦены",ВидЦены);
// ут 11.5
ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер = Метаданные.ОбщиеМодули.Найти("ЦеныПредприятияЗаполнениеСервер");
Если ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер <> Неопределено Тогда
ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер = ОбщегоНазначения.ОбщийМодуль("ЦеныПредприятияЗаполнениеСервер");
Стр.Цена = ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
Иначе
// ут 11.4
ОбщийМодуль_ПродажиСервер = Метаданные.ОбщиеМодули.Найти("ПродажиСервер");
Если ОбщийМодуль_ПродажиСервер <> Неопределено Тогда
ОбщийМодуль_ПродажиСервер = ОбщегоНазначения.ОбщийМодуль("ПродажиСервер");
СтруктураПараметровОтбора.Вставить("ВернутьМногооборотнуюТару",Ложь);
СтруктураПараметровОтбора.Вставить("НалогообложениеНДС",Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС);
Стр.Цена = ОбщийМодуль_ПродажиСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ТаблицаНоменклатур.Сортировать("Цена Убыв");
Если ТаблицаНоменклатур.Количество() ТОгда
Возврат ТаблицаНоменклатур[0].Цена;
Иначе
Возврат 0;
КонецЕсли;
КонецЕсли; // товар вб
КонецЕсли; // есть номенклатура
// письмерова - код устарел
#Область СтарыйКод
Запрос = Новый Запрос;
Если топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей", "11.4")
ИЛИ топ_ОбщийМодульСервер.ЭтаКонфигурация("КомплекснаяАвтоматизация", "2.4.")
ИЛИ топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеПредприятием", "2.4.")
ИЛИ ПолучитьФункциональнуюОпцию("ИспользуетсяЦенообразование20") Тогда
Запрос.Текст =
"ВЫБРАТЬ
| топ_СоответствиеТоваров.Номенклатура КАК Номенклатура,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика,
// ++ Бойков BSLR-2290
| топ_СоответствиеТоваров.Упаковка КАК Упаковка,
| ВЫБОР
| КОГДА топ_СоответствиеТоваров.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА 1
| КОГДА топ_СоответствиеТоваров.Упаковка.Числитель = 0 ИЛИ топ_СоответствиеТоваров.Упаковка.Знаменатель = 0
| ТОГДА 1
| ИНАЧЕ топ_СоответствиеТоваров.Упаковка.Числитель / топ_СоответствиеТоваров.Упаковка.Знаменатель
| КОНЕЦ КАК КоэффициентУпаковки
// -- Бойков BSLR-2290
|ПОМЕСТИТЬ ВТНоменклатура
|ИЗ
| РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
|ГДЕ
| топ_СоответствиеТоваров.Товар = &Товар
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
// ++ Бойков BSLR-2290
| ЦеныНоменклатурыСрезПоследних.Упаковка КАК Упаковка,
// -- Бойков BSLR-2290
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ПОМЕСТИТЬ ВТЦены
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период,
//| Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка) И // письмерова 09.02.2023 BSLR-1359
| Валюта.Код = &ВалютаКод
| И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
// ++ Бойков BSLR-2290
|ВЫБРАТЬ
| ВТНоменклатура.Номенклатура КАК Номенклатура,
| ЕСТЬNULL(ВТЦены.Цена, 0) КАК Цена,
| 1 КАК Приоритет
|ПОМЕСТИТЬ ВТ_ЦеныНоменклатурыПредварительно
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ВТЦены КАК ВТЦены
| ПО ВТНоменклатура.Номенклатура = ВТЦены.Номенклатура
| И ВТНоменклатура.Характеристика = ВТЦены.Характеристика
| И ВТНоменклатура.Упаковка = ВТЦены.Упаковка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВТНоменклатура.Номенклатура,
| ЕСТЬNULL(ВТЦены.Цена, 0) * ВТНоменклатура.КоэффициентУпаковки,
| 2
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ВТЦены КАК ВТЦены
| ПО ВТНоменклатура.Номенклатура = ВТЦены.Номенклатура
| И ВТНоменклатура.Характеристика = ВТЦены.Характеристика
| И ВТЦены.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ЦеныНоменклатурыПредварительно.Номенклатура КАК Номенклатура,
| МИНИМУМ(ВТ_ЦеныНоменклатурыПредварительно.Приоритет) КАК Приоритет
|ПОМЕСТИТЬ ВТ_ПриоритетыЦенНоменклатуры
|ИЗ
| ВТ_ЦеныНоменклатурыПредварительно КАК ВТ_ЦеныНоменклатурыПредварительно
|ГДЕ
| ВТ_ЦеныНоменклатурыПредварительно.Цена <> 0
|
|СГРУППИРОВАТЬ ПО
| ВТ_ЦеныНоменклатурыПредварительно.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ЦеныНоменклатурыПредварительно.Номенклатура КАК Номенклатура,
| ВТ_ЦеныНоменклатурыПредварительно.Цена КАК Цена
|ИЗ
| ВТ_ЦеныНоменклатурыПредварительно КАК ВТ_ЦеныНоменклатурыПредварительно
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПриоритетыЦенНоменклатуры КАК ВТ_ПриоритетыЦенНоменклатуры
| ПО ВТ_ЦеныНоменклатурыПредварительно.Номенклатура = ВТ_ПриоритетыЦенНоменклатуры.Номенклатура
| И ВТ_ЦеныНоменклатурыПредварительно.Приоритет = ВТ_ПриоритетыЦенНоменклатуры.Приоритет
// -- Бойков BSLR-2290
//БИТ Смирнов А.П. 16.11.2022 BSLR-971 (
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВТНоменклатура.Номенклатура КАК НоменклатураНабора,
| ВТНоменклатура.Характеристика КАК ХарактеристикаНабора,
| СоставНаборов.Номенклатура КАК Номенклатура,
| СоставНаборов.Характеристика КАК Характеристика,
| СУММА(СоставНаборов.КоличествоУпаковок) КАК Количество
|ПОМЕСТИТЬ ВТСоставНабора
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК СоставНаборов
| ПО (ВТНоменклатура.Номенклатура = СоставНаборов.Ссылка.Владелец
| И ВТНоменклатура.Характеристика = СоставНаборов.Ссылка.Характеристика)
|ГДЕ
| ВТНоменклатура.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)
|
|СГРУППИРОВАТЬ ПО
| СоставНаборов.Номенклатура,
| СоставНаборов.Характеристика,
| ВТНоменклатура.Номенклатура,
| ВТНоменклатура.Характеристика
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| СоставНабора.НоменклатураНабора КАК Номенклатура,
| СоставНабора.ХарактеристикаНабора КАК Характеристика,
| СУММА(ВЫРАЗИТЬ(ЦеныНоменклатурыСрезПоследних.Цена * СоставНабора.Количество КАК ЧИСЛО(15, 2))) КАК Цена
|ПОМЕСТИТЬ ВТЦеныНаборов
|ИЗ
| ВТСоставНабора КАК СоставНабора
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| &Период,
| (ВидЦены, Номенклатура, Характеристика) В
| (ВЫБРАТЬ
| &ВидЦены,
| ВТСоставНабора.Номенклатура,
| ВТСоставНабора.Характеристика
| ИЗ
| ВТСоставНабора)) КАК ЦеныНоменклатурыСрезПоследних
| ПО СоставНабора.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
| И СоставНабора.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
|ГДЕ
| НЕ ЦеныНоменклатурыСрезПоследних.ВидЦены ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
| СоставНабора.НоменклатураНабора,
| СоставНабора.ХарактеристикаНабора
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТНоменклатура.Номенклатура КАК Номенклатура,
| МАКСИМУМ(ВТЦеныНаборов.Цена * ВТНоменклатура.КоэффициентУпаковки) КАК Цена
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ВТЦеныНаборов КАК ВТЦеныНаборов
| ПО (ВТНоменклатура.Номенклатура = ВТЦеныНаборов.Номенклатура)
| И (ВТНоменклатура.Характеристика = ВТЦеныНаборов.Характеристика)
|
|СГРУППИРОВАТЬ ПО
| ВТНоменклатура.Номенклатура";
//БИТ Смирнов А.П. 16.11.2022 )
ИначеЕсли ПолучитьФункциональнуюОпцию("ИспользуетсяЦенообразование25") Тогда
Запрос.Текст =
"ВЫБРАТЬ
| топ_СоответствиеТоваров.Номенклатура КАК Номенклатура,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика,
// ++ Бойков BSLR-2290
| топ_СоответствиеТоваров.Упаковка КАК Упаковка,
| ВЫБОР
| КОГДА топ_СоответствиеТоваров.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА 1
| КОГДА топ_СоответствиеТоваров.Упаковка.Числитель = 0 ИЛИ топ_СоответствиеТоваров.Упаковка.Знаменатель = 0
| ТОГДА 1
| ИНАЧЕ топ_СоответствиеТоваров.Упаковка.Числитель / топ_СоответствиеТоваров.Упаковка.Знаменатель
| КОНЕЦ КАК КоэффициентУпаковки
// -- Бойков BSLR-2290
|ПОМЕСТИТЬ ВТНоменклатура
|ИЗ
| РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
|ГДЕ
| топ_СоответствиеТоваров.Товар = &Товар
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.ХарактеристикаЦО КАК ХарактеристикаЦО,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
// ++ Бойков BSLR-2290
| ЦеныНоменклатурыСрезПоследних.Упаковка КАК Упаковка,
// -- Бойков BSLR-2290
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ПОМЕСТИТЬ ВТЦены
|ИЗ
| РегистрСведений.ЦеныНоменклатуры25.СрезПоследних(
| &Период,
| Валюта.Код = &ВалютаКод
| И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
// ++ Бойков BSLR-2290
|ВЫБРАТЬ
| ВТНоменклатура.Номенклатура КАК Номенклатура,
| ЕСТЬNULL(ВТЦены.Цена, 0) КАК Цена,
| 1 КАК Приоритет
|ПОМЕСТИТЬ ВТ_ЦеныНоменклатурыПредварительно
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ВТЦены КАК ВТЦены
| ПО (ВТНоменклатура.Номенклатура = ВТЦены.Номенклатура
| И ВТНоменклатура.Упаковка = ВТЦены.Упаковка
| И ВЫБОР
| КОГДА ВТНоменклатура.Номенклатура.ВидНоменклатуры.НастройкиКлючаЦенПоХарактеристике = ЗНАЧЕНИЕ(Перечисление.ВариантОтбораДляКлючаЦен.НеИспользовать)
| ТОГДА ИСТИНА
| ИНАЧЕ ВТНоменклатура.Характеристика.ХарактеристикаНоменклатурыДляЦенообразования = ВТЦены.ХарактеристикаЦО
| КОНЕЦ)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВТНоменклатура.Номенклатура,
| ЕСТЬNULL(ВТЦены.Цена, 0) * ВТНоменклатура.КоэффициентУпаковки,
| 2
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ВТЦены КАК ВТЦены
| ПО (ВТНоменклатура.Номенклатура = ВТЦены.Номенклатура
| И ВТЦены.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| И ВЫБОР
| КОГДА ВТНоменклатура.Номенклатура.ВидНоменклатуры.НастройкиКлючаЦенПоХарактеристике = ЗНАЧЕНИЕ(Перечисление.ВариантОтбораДляКлючаЦен.НеИспользовать)
| ТОГДА ИСТИНА
| ИНАЧЕ ВТНоменклатура.Характеристика.ХарактеристикаНоменклатурыДляЦенообразования = ВТЦены.ХарактеристикаЦО
| КОНЕЦ)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ЦеныНоменклатурыПредварительно.Номенклатура КАК Номенклатура,
| МИНИМУМ(ВТ_ЦеныНоменклатурыПредварительно.Приоритет) КАК Приоритет
|ПОМЕСТИТЬ ВТ_ПриоритетыЦенНоменклатуры
|ИЗ
| ВТ_ЦеныНоменклатурыПредварительно КАК ВТ_ЦеныНоменклатурыПредварительно
|ГДЕ
| ВТ_ЦеныНоменклатурыПредварительно.Цена <> 0
|
|СГРУППИРОВАТЬ ПО
| ВТ_ЦеныНоменклатурыПредварительно.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ЦеныНоменклатурыПредварительно.Номенклатура КАК Номенклатура,
| ВТ_ЦеныНоменклатурыПредварительно.Цена КАК Цена
|ИЗ
| ВТ_ЦеныНоменклатурыПредварительно КАК ВТ_ЦеныНоменклатурыПредварительно
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПриоритетыЦенНоменклатуры КАК ВТ_ПриоритетыЦенНоменклатуры
| ПО ВТ_ЦеныНоменклатурыПредварительно.Номенклатура = ВТ_ПриоритетыЦенНоменклатуры.Номенклатура
| И ВТ_ЦеныНоменклатурыПредварительно.Приоритет = ВТ_ПриоритетыЦенНоменклатуры.Приоритет
// -- Бойков BSLR-2290
//БИТ Смирнов А.П. 16.11.2022 BSLR-971 (
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВТНоменклатура.Номенклатура КАК НоменклатураНабора,
| ВТНоменклатура.Характеристика КАК ХарактеристикаНабора,
// ++ Бойков BSLR-2290
| ВТНоменклатура.КоэффициентУпаковки КАК КоэффициентУпаковки,
// -- Бойков BSLR-2290
| СоставНаборов.Номенклатура КАК Номенклатура,
| СоставНаборов.Характеристика КАК Характеристика,
| СУММА(СоставНаборов.КоличествоУпаковок) КАК Количество
|ПОМЕСТИТЬ ВТСоставНабора
|ИЗ
| ВТНоменклатура КАК ВТНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК СоставНаборов
| ПО (ВТНоменклатура.Номенклатура = СоставНаборов.Ссылка.Владелец
| И ВТНоменклатура.Характеристика = СоставНаборов.Ссылка.Характеристика)
|ГДЕ
| ВТНоменклатура.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)
|
|СГРУППИРОВАТЬ ПО
| СоставНаборов.Номенклатура,
| СоставНаборов.Характеристика,
| ВТНоменклатура.Номенклатура,
| ВТНоменклатура.Характеристика,
| ВТНоменклатура.КоэффициентУпаковки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВТСоставНабора.НоменклатураНабора КАК НоменклатураНабора,
| ВТСоставНабора.ХарактеристикаНабора КАК ХарактеристикаНабора,
| ВТСоставНабора.Номенклатура КАК Номенклатура,
| ВТСоставНабора.Характеристика КАК Характеристика,
| МАКСИМУМ(ВТЦены.Цена) КАК Цена
|ПОМЕСТИТЬ ВТЦеныНаборов
|ИЗ
| ВТСоставНабора КАК ВТСоставНабора
| ЛЕВОЕ СОЕДИНЕНИЕ ВТЦены КАК ВТЦены
| ПО ВТСоставНабора.Номенклатура = ВТЦены.Номенклатура
| И (ЕСТЬNULL(ВТСоставНабора.Характеристика.ХарактеристикаНоменклатурыДляЦенообразования, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатурыДляЦенообразования.ПустаяСсылка)) = ВЫБОР
| КОГДА ВТСоставНабора.Номенклатура.ВидНоменклатуры.НастройкиКлючаЦенПоХарактеристике = ЗНАЧЕНИЕ(Перечисление.ВариантОтбораДляКлючаЦен.НеИспользовать)
| ТОГДА ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатурыДляЦенообразования.ПустаяСсылка)
| ИНАЧЕ ВТЦены.ХарактеристикаЦО
| КОНЕЦ)
|
|СГРУППИРОВАТЬ ПО
| ВТСоставНабора.Номенклатура,
| ВТСоставНабора.Характеристика,
| ВТСоставНабора.НоменклатураНабора,
| ВТСоставНабора.ХарактеристикаНабора
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТСоставНабора.НоменклатураНабора КАК Номенклатура,
| СУММА(ВЫРАЗИТЬ(ВТЦеныНаборов.Цена * ВТСоставНабора.Количество КАК ЧИСЛО(15, 2)) * ВТСоставНабора.КоэффициентУпаковки) КАК Цена
|ИЗ
| ВТСоставНабора КАК ВТСоставНабора
| ЛЕВОЕ СОЕДИНЕНИЕ ВТЦеныНаборов КАК ВТЦеныНаборов
| ПО (ВТСоставНабора.Номенклатура = ВТЦеныНаборов.Номенклатура)
| И (ВТСоставНабора.Характеристика = ВТЦеныНаборов.Характеристика)
|
|СГРУППИРОВАТЬ ПО
| ВТСоставНабора.НоменклатураНабора";
//БИТ Смирнов А.П. 16.11.2022 )
КонецЕсли;
Запрос.УстановитьПараметр("ВалютаКод", "643");
Запрос.УстановитьПараметр("Товар", Товар);
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Запрос.УстановитьПараметр("Период", Период);
//БИТ Смирнов А.П. 15.11.2022 BSLR-971 (
//РезультатЗапроса = Запрос.Выполнить().Выгрузить();
РезультатПакет = Запрос.ВыполнитьПакет();
РезультатЗапроса = РезультатПакет[4].Выгрузить(); // Бойков BSLR-2290
РезультатЗапросаНаборы = РезультатПакет[РезультатПакет.Количество()-1].Выгрузить();
//БИТ Смирнов А.П. 15.11.2022 )
Если РезультатЗапроса.Количество() > 1 Тогда
Сообщить("Ошибка при определении цены товара " + Товар);
Возврат 0;
ИначеЕсли РезультатЗапроса.Количество() Тогда
//БИТ Смирнов А.П. 15.11.2022 BSLR-971 (
//Возврат РезультатЗапроса[0].Цена;
ЦенаРезультат = 0;
Если ЗначениеЗаполнено(РезультатЗапроса[0].Цена) Тогда
ЦенаРезультат = РезультатЗапроса[0].Цена;
ИначеЕсли РезультатЗапросаНаборы.Количество() Тогда //BT BSLR-1219 Тетерин А.С. проверим что в наборах что-то есть
Если ЗначениеЗаполнено(РезультатЗапросаНаборы[0].Цена) Тогда
ЦенаРезультат = РезультатЗапросаНаборы[0].Цена;
КонецЕсли;
КонецЕсли;
Возврат ЦенаРезультат;
//БИТ Смирнов А.П. 15.11.2022 )
Иначе
Возврат 0;
КонецЕсли;
//Симонова 30.05.2022 )
#КонецОбласти
КонецФункции
// письмерова 12.02.2024 BSLR-3179
Функция ПолучитьТаблицуЦенИСкидок(ТаблицаТоваров, ВидЦены, Дата, ЛК, Валюта = Неопределено) Экспорт
Запрос = Новый Запрос("ВЫБРАТЬ
| Товары.Товар КАК Товар,
| Товары.НомерСтроки КАК НомерСтроки
|ПОМЕСТИТЬ ВТ_ТоварыДокумента
|ИЗ
| &ТаблицаТоваров КАК Товары
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| топ_ТоварыТорговыхПлощадок.Ссылка КАК Товар,
| топ_СоответствиеТоваров.Номенклатура КАК Номенклатура,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика,
| топ_СоответствиеТоваров.Упаковка КАК Упаковка,
| топ_ТоварыТорговыхПлощадок.ВидЦены КАК ВидЦены
|ПОМЕСТИТЬ ВТ_ТОварыИНоменклатура
|ИЗ
| ВТ_ТоварыДокумента КАК ВТ_ТоварыДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.топ_ТоварыТорговыхПлощадок КАК топ_ТоварыТорговыхПлощадок
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
| ПО (топ_СоответствиеТоваров.Товар = топ_ТоварыТорговыхПлощадок.Ссылка)
| ПО ВТ_ТоварыДокумента.Товар = топ_ТоварыТорговыхПлощадок.Ссылка
|
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТоварыДокумента.НомерСтроки КАК НомерСтроки,
| ВТ_ТОварыИНоменклатура.Товар КАК Товар,
| ЕСТЬNULL(ВТ_ТОварыИНоменклатура.Номенклатура, Значение(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура,
| ВТ_ТОварыИНоменклатура.Характеристика КАК Характеристика,
| ВТ_ТОварыИНоменклатура.Упаковка КАК Упаковка,
| ВТ_ТОварыИНоменклатура.ВидЦены КАК ВидЦены,
| ВТ_ТОварыИНоменклатура.Товар.ПроцентСкидки КАК ПроцентСкидки,
| 1 КАК Количество,
| 0 КАК Цена
|ИЗ
| ВТ_ТоварыДокумента КАК ВТ_ТоварыДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТОварыИНоменклатура КАК ВТ_ТОварыИНоменклатура
| ПО ВТ_ТоварыДокумента.Товар = ВТ_ТОварыИНоменклатура.Товар");
Запрос.УстановитьПараметр("ТаблицаТоваров",ТаблицаТоваров);
ОбщаяТабл = Запрос.Выполнить().Выгрузить();
// перезаполнить номера строк
Н = 1;
Для Каждого Стр Из ОбщаяТабл Цикл
Стр.НомерСтроки = Н;
Н = Н + 1;
КонецЦикла;
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Дата", Дата);
// BSLR-4810 ++
//ПараметрыЗаполнения.Вставить("Валюта", Справочники.Валюты.НайтиПоКоду("643"));
Если Валюта = Неопределено Или Валюта = "" ТОгда // BSLR-5097
ВалютаСпр = Справочники.Валюты.НайтиПоКоду("643");
Иначе
ВалютаСпр = Справочники.Валюты.НайтиПоНаименованию(Валюта);
Если ВалютаСпр = Неопределено Или ВалютаСпр = Справочники.Валюты.ПустаяСсылка() ТОгда // BSLR-5233
ВалютаСпр = Справочники.Валюты.НайтиПоКоду("643");
КонецЕсли;
КонецЕсли;
ПараметрыЗаполнения.Вставить("Валюта",ВалютаСпр);
// BSLR-4810 --
ПараметрыЗаполнения.Вставить("ВидЦены", ВидЦены);
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "Цена, ВидЦены");
// ут 11.5
ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер = Метаданные.ОбщиеМодули.Найти("ЦеныПредприятияЗаполнениеСервер");
Если ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер <> Неопределено Тогда
ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер = ОбщегоНазначения.ОбщийМодуль("ЦеныПредприятияЗаполнениеСервер");
ЦеныРассчитаны = ОбщийМодуль_ЦеныПредприятияЗаполнениеСервер.ЗаполнитьЦены(
ОбщаяТабл,
Неопределено, // Массив строк или структура отбора.
ПараметрыЗаполнения);
Иначе
// ут 11.4
ОбщийМодуль_ПродажиСервер = Метаданные.ОбщиеМодули.Найти("ПродажиСервер");
Если ОбщийМодуль_ПродажиСервер <> Неопределено Тогда
ОбщийМодуль_ПродажиСервер = ОбщегоНазначения.ОбщийМодуль("ПродажиСервер");
ЦеныРассчитаны = ОбщийМодуль_ПродажиСервер.ЗаполнитьЦены(
ОбщаяТабл,
Неопределено, // Массив строк или структура отбора.
ПараметрыЗаполнения);
КонецЕсли;
КонецЕсли;
// для наборов, цена которых должна быть расчитана по ценам составляющих нужно пересчитывать по строчно
Для Каждого ДанныеТовара из ОбщаяТабл Цикл
Если ДанныеТовара.Цена = 0 Тогда
Если ДанныеТовара.Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор Тогда
// если цену не получили (нет установленной цены на набор) тогда, расчитаем по составу набора
ПараметрыВариантаКомплектацииНоменклатуры = НаборыВызовСервера.ПараметрыВариантаКомплектацииНоменклатуры(
ДанныеТовара.Номенклатура,
ДанныеТовара.Характеристика);
Если ПараметрыВариантаКомплектацииНоменклатуры <> Неопределено Тогда // состав набора настроен
ВариантКомплектацииНоменклатуры = ПараметрыВариантаКомплектацииНоменклатуры.ВариантКомплектацииНоменклатуры;
ПараметрыКомплектующих = Новый Структура;
ПараметрыКомплектующих.Вставить("НоменклатураНабора", ДанныеТовара.Номенклатура);
ПараметрыКомплектующих.Вставить("ХарактеристикаНабора", ДанныеТовара.Характеристика);
ПараметрыКомплектующих.Вставить("ВариантКомплектацииНоменклатуры", ВариантКомплектацииНоменклатуры);
ПараметрыКомплектующих.Вставить("ВидЦены", ВидЦены);
ПараметрыКомплектующих.Вставить("Валюта", Справочники.Валюты.НайтиПоКоду("643"));
ПараметрыКомплектующих.Вставить("КоличествоУпаковок", 1);
ПараметрыКомплектующих.Вставить("ПроцентРучнойСкидки", 0);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Дата", Дата);
ДополнительныеПараметры.Вставить("Валюта", Справочники.Валюты.НайтиПоКоду("643"));
ДополнительныеПараметры.Вставить("ВидЦены", ВидЦены);
ДополнительныеПараметры.Вставить("Цена", 0);
ПодобранныеТовары = НаборыВызовСервера.Комплектующие(ПараметрыКомплектующих, ДополнительныеПараметры);
Для каждого ПодТов Из ПодобранныеТовары Цикл
ДанныеТовара.Цена = ДанныеТовара.Цена + ПодТов.Цена * ПодТов.КоличествоУпаковок;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// группировка по товару - по макс цене
ЗапросИтоговый = Новый Запрос("ВЫБРАТЬ
| Товары.Товар КАК Товар,
| Товары.ВидЦены КАК ВидЦены,
| Товары.Цена КАК Цена
|ПОМЕСТИТЬ ВТ_ТоварыДокумента
|ИЗ
| &ТаблицаТоваров КАК Товары
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТоварыДокумента.Товар КАК Товар,
| ВТ_ТоварыДокумента.ВидЦены КАК ВидЦены,
| МАКСИМУМ(ВТ_ТоварыДокумента.Цена) КАК Цена
|ИЗ
| ВТ_ТоварыДокумента КАК ВТ_ТоварыДокумента
|
|СГРУППИРОВАТЬ ПО
| ВТ_ТоварыДокумента.Товар,
| ВТ_ТоварыДокумента.ВидЦены");
ЗапросИтоговый.УстановитьПараметр("ТаблицаТоваров",ОбщаяТабл);
ТаблРезультат = ЗапросИтоговый.Выполнить().Выгрузить();
Возврат ТаблРезультат;
КонецФункции
Функция ПодобранныеТовары(Объект, СтрокаТоваров)
// письмерова 22.02.2023 BSLR-1428
Если Объект = Неопределено Тогда
Номенклатура = СтрокаТоваров.НоменклатураПоЗаказу;
Характеристика = СтрокаТоваров.ХарактеристикаПоЗаказу;
ВидЦены = Неопределено;
Валюта = СПравочники.Валюты.НайтиПоКоду(СтрокаТоваров.ЗаказТП.Кодвалюты);
Дата = СтрокаТоваров.ЗаказТП.Дата;
Склад = Справочники.Склады.ПустаяСсылка();
ДатаОтгрузки = Дата;
ПроцентРучнойСкидки = 0;
Иначе
Номенклатура = СтрокаТоваров.Номенклатура;
Характеристика = СтрокаТоваров.Характеристика;
ВидЦены = СтрокаТоваров.ВидЦены;
Валюта = Объект.Валюта;
Дата = Объект.Дата;
Склад = Объект.Склад ;
ДатаОтгрузки = СтрокаТоваров.ДатаОтгрузки;
ПроцентРучнойСкидки = СтрокаТоваров.ПроцентРучнойСкидки;
КонецЕсли;
// ++ БИТ Сергеев BSLR-845
ПараметрыВариантаКомплектацииНоменклатуры = НаборыВызовСервера.ПараметрыВариантаКомплектацииНоменклатуры(
Номенклатура,
Характеристика);
Если ПараметрыВариантаКомплектацииНоменклатуры = Неопределено Тогда
Возврат Новый Массив;
КонецЕсли;
ВариантКомплектацииНоменклатуры = ПараметрыВариантаКомплектацииНоменклатуры.ВариантКомплектацииНоменклатуры;
// -- БИТ Сергеев BSLR-845
ПараметрыКомплектующих = Новый Структура;
ПараметрыКомплектующих.Вставить("НоменклатураНабора", Номенклатура);
ПараметрыКомплектующих.Вставить("ХарактеристикаНабора", Характеристика);
ПараметрыКомплектующих.Вставить("ВариантКомплектацииНоменклатуры", ВариантКомплектацииНоменклатуры);
ПараметрыКомплектующих.Вставить("ВидЦены", ВидЦены);
ПараметрыКомплектующих.Вставить("Валюта", Валюта);
ПараметрыКомплектующих.Вставить("Склад", Склад);
// ++ Бойков BSLR-1968
//ПараметрыКомплектующих.Вставить("КоличествоУпаковок", СтрокаТоваров.КоличествоУпаковок);
ПараметрыКомплектующих.Вставить("КоличествоУпаковок", СтрокаТоваров.КоличествоПоЗаказу);
// -- Бойков BSLR-1968
ПараметрыКомплектующих.Вставить("ДатаОтгрузки", ДатаОтгрузки);
ПараметрыКомплектующих.Вставить("ПроцентРучнойСкидки", ПроцентРучнойСкидки);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Дата", Дата);
ДополнительныеПараметры.Вставить("Валюта", Валюта);
ДополнительныеПараметры.Вставить("Цена", СтрокаТоваров.Цена);
ДополнительныеПараметры.Вставить("ВидЦены", ВидЦены);
Если Объект <> Неопределено Тогда
Если ЗначениеЗаполнено(Объект.Соглашение) Тогда
ДополнительныеПараметры.Вставить("Соглашение", Объект.Соглашение);
КонецЕсли;
Иначе
ДополнительныеПараметры.Вставить("Соглашение",СтрокаТоваров.ЗаказТП.ЛичныйКабинет.Соглашение);
КонецЕсли;
ДополнительныеПараметры.Вставить("Склады", Склад);
ПодобранныеТовары = НаборыВызовСервера.Комплектующие(ПараметрыКомплектующих, ДополнительныеПараметры);
Возврат ПодобранныеТовары;
КонецФункции
// письмерова 26.09.2024 BSLR-3848
// для рег задания по шаблону и перезаписи элементов справочника топ_ШаблоныУстановкиЦен
Функция ПолучитьШаблоныУстановкиЦен() Экспорт
Результат = Новый Структура("Шаблон_ПолучениеДанных, Шаблон_ОбработкаСтрок","","");
Обр = Обработки.топ_УстановкаЦен.Создать();
пНастройки = ХранилищеОбщихНастроек.Загрузить(Обр.СведенияОВнешнейОбработке().Наименование, "Шаблон");
пДанные = Десериализовать(пНастройки);
Результат.Шаблон_ПолучениеДанных = пДанные.Шаблон_ПолучениеДанных;
Результат.Шаблон_ОбработкаСтрок = пДанные.Шаблон_ОбработкаСтрок;
Возврат Результат;
КонецФункции
// письмерова 26.09.2024 BSLR-3848
Функция Десериализовать(Текст) Экспорт
пЧтениеJSON = Новый ЧтениеJSON;
пЧтениеJSON.УстановитьСтроку(Текст);
пДанные = ПолучитьЗначениеИзJSON(пЧтениеJSON);
пЧтениеJSON.Закрыть();
Возврат пДанные;
КонецФункции
Функция ПолучитьЗначениеИзJSON(ЧтениеJSON)
Пока ЧтениеJSON.Прочитать() Цикл
Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда
Возврат ЧтениеJSON.ТекущееЗначение;
ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоМассива Тогда
Возврат ПолучитьМассивИзJSON(ЧтениеJSON);
ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта Тогда
Возврат ПолучитьСтруктуруИзJSON(ЧтениеJSON);
ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.КонецМассива
ИЛИ ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.КонецОбъекта Тогда
Возврат Null;
КонецЕсли;
КонецЦикла;
КонецФункции
Функция ПолучитьМассивИзJSON(ЧтениеJSON)
пМассив = Новый Массив;
Пока ЧтениеJSON.Прочитать() Цикл
Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.КонецМассива Тогда
Возврат пМассив;
ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда
пМассив.Добавить(ЧтениеJSON.ТекущееЗначение);
ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоМассива Тогда
пМассив.Добавить(ПолучитьМассивИзJSON(ЧтениеJSON));
ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта Тогда
пМассив.Добавить(ПолучитьСтруктуруИзJSON(ЧтениеJSON));
КонецЕсли;
КонецЦикла;
КонецФункции
Функция ПолучитьСтруктуруИзJSON(ЧтениеJSON)
пСтруктура = Новый Структура;
Пока ЧтениеJSON.Прочитать() Цикл
Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.КонецОбъекта Тогда
Возврат пСтруктура;
ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
пКлюч = ЧтениеJSON.ТекущееЗначение;
пСтруктура.Вставить(пКлюч, ПолучитьЗначениеИзJSON(ЧтениеJSON));
пКлюч = Неопределено;
Иначе
ВызватьИсключение "Ошибка десериализации";
КонецЕсли;
КонецЦикла;
КонецФункции
#КонецОбласти
// ++ Бойков BSLR-3730
//
Процедура ИнициализироватьВременныеТаблицыДляПланированияПоставокFBO(МенеджерВременныхТаблиц, ПараметрыЗапроса) Экспорт
ОбщийМодуль = топ_ОбщийВызовСервера.ПолучитьМодульПоКонфигурации();
Если ТипЗнч(ОбщийМодуль) = Тип("Строка") Тогда
ВызватьИсключение ОбщийМодуль;
Иначе
ОбщийМодуль.ИнициализироватьВременныеТаблицыДляПланированияПоставокFBO(МенеджерВременныхТаблиц, ПараметрыЗапроса);
КонецЕсли;
КонецПроцедуры // -- Бойков BSLR-3730
// ++ Бойков BSLR-3730
//
Функция ТекстЗапросаПредопределенногоИсточникаДанныхВыручка() Экспорт
ОбщийМодуль = топ_ОбщийВызовСервера.ПолучитьМодульПоКонфигурации();
Если ТипЗнч(ОбщийМодуль) = Тип("Строка") Тогда
ВызватьИсключение ОбщийМодуль;
Иначе
Возврат ОбщийМодуль.ТекстЗапросаПредопределенногоИсточникаДанныхВыручка();
КонецЕсли;
КонецФункции // -- Бойков BSLR-3730
// ++ Бойков BSLR-3730
//
Функция ТекстЗапросаПредопределенногоИсточникаДанныхСебестоимость() Экспорт
ОбщийМодуль = топ_ОбщийВызовСервера.ПолучитьМодульПоКонфигурации();
Если ТипЗнч(ОбщийМодуль) = Тип("Строка") Тогда
ВызватьИсключение ОбщийМодуль;
Иначе
Возврат ОбщийМодуль.ТекстЗапросаПредопределенногоИсточникаДанныхСебестоимость();
КонецЕсли;
КонецФункции // -- Бойков BSLR-3730
#Область Сообщить_Пользователю
#Если Сервер ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
// Формирует и выводит сообщение, которое может быть связано с элементом управления формы.
//
// Параметры:
// ТекстСообщенияПользователю - Строка - текст сообщения.
// КлючДанных - ЛюбаяСсылка - объект или ключ записи информационной базы, к которому это сообщение относится.
// Поле - Строка - наименование реквизита формы.
// ПутьКДанным - Строка - путь к данным (путь к реквизиту формы).
// Отказ - Булево - выходной параметр, всегда устанавливается в значение Истина.
//
// Пример:
//
// 1. Для вывода сообщения у поля управляемой формы, связанного с реквизитом объекта:
// топ_ОбщийМодульСервер.СообщитьПользователю(
// НСтр("ru = 'Сообщение об ошибке.'"), ,
// "ПолеВРеквизитеФормыОбъект",
// "Объект");
//
// Альтернативный вариант использования в форме объекта:
// топ_ОбщийМодульСервер.СообщитьПользователю(
// НСтр("ru = 'Сообщение об ошибке.'"), ,
// "Объект.ПолеВРеквизитеФормыОбъект");
//
// 2. Для вывода сообщения рядом с полем управляемой формы, связанным с реквизитом формы:
// топ_ОбщийМодульСервер.СообщитьПользователю(
// НСтр("ru = 'Сообщение об ошибке.'"), ,
// "ИмяРеквизитаФормы");
//
// 3. Для вывода сообщения связанного с объектом информационной базы:
// топ_ОбщийМодульСервер.СообщитьПользователю(
// НСтр("ru = 'Сообщение об ошибке.'"), ОбъектИнформационнойБазы, "Ответственный",,Отказ);
//
// 4. Для вывода сообщения по ссылке на объект информационной базы:
// топ_ОбщийМодульСервер.СообщитьПользователю(
// НСтр("ru = 'Сообщение об ошибке.'"), Ссылка, , , Отказ);
//
// Случаи некорректного использования:
// 1. Передача одновременно параметров КлючДанных и ПутьКДанным.
// 2. Передача в параметре КлючДанных значения типа отличного от допустимого.
// 3. Установка ссылки без установки поля (и/или пути к данным).
//
Процедура СообщитьПользователю(
Знач ТекстСообщенияПользователю,
Знач КлючДанных = Неопределено,
Знач Поле = "",
Знач ПутьКДанным = "",
Отказ = Ложь) Экспорт
ЭтоОбъект = Ложь;
Если КлючДанных <> Неопределено
И XMLТипЗнч(КлючДанных) <> Неопределено Тогда
ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;
ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
КонецЕсли;
СообщитьПользователю_Служебная(
ТекстСообщенияПользователю,
КлючДанных,
Поле,
ПутьКДанным,
Отказ,
ЭтоОбъект);
КонецПроцедуры
#КонецЕсли
Процедура СообщитьПользователю_Служебная(
Знач ТекстСообщенияПользователю,
Знач КлючДанных,
Знач Поле,
Знач ПутьКДанным = "",
Отказ = Ложь,
ЭтоОбъект = Ложь) Экспорт
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщенияПользователю;
Сообщение.Поле = Поле;
Если ЭтоОбъект Тогда
Сообщение.УстановитьДанные(КлючДанных);
Иначе
Сообщение.КлючДанных = КлючДанных;
КонецЕсли;
Если НЕ ПустаяСтрока(ПутьКДанным) Тогда
Сообщение.ПутьКДанным = ПутьКДанным;
КонецЕсли;
Сообщение.Сообщить();
Отказ = Истина;
КонецПроцедуры
#КонецОбласти
#Область Статусы
&НаСервере
Функция ВернутьСтатусЗаказаТорговойПлощадки(ЗаказТорговойПлощадки) Экспорт
//BSLR-2881, Чупраков А.Н., 08.02.24
//Запрос = Новый Запрос;
//Запрос.Текст = "ВЫБРАТЬ
// | топ_СтатусыЗаказовТорговойПлощадкиСрезПоследних.Статус КАК Статус,
// | топ_СтатусыЗаказовТорговойПлощадкиСрезПоследних.УнифицированныйСтатус КАК УнифицированныйСтатус
// |ИЗ
// | РегистрСведений.топ_СтатусыЗаказовТорговойПлощадки.СрезПоследних(, ЗаказТорговойПлощадки = &ЗаказТорговойПлощадки) КАК топ_СтатусыЗаказовТорговойПлощадкиСрезПоследних";
//
//Запрос.УстановитьПараметр("ЗаказТорговойПлощадки", ЗаказТорговойПлощадки);
СтруктураСтатусов = Новый Структура("Статус,УнифицированныйСтатус");
СтруктураСтатусов.Статус = Справочники.топ_СтатусыЗаказовНаТорговыхПлощадках.ПустаяСсылка();
СтруктураСтатусов.УнифицированныйСтатус = Справочники.топ_УнифицированныеСтатусыТорговыхПлощадок.ПустаяСсылка();
//РезультатЗапроса = Запрос.Выполнить();
//Если РезультатЗапроса.Пустой() Тогда
// Возврат СтруктураСтатусов;
//КонецЕсли;
МенеджерЗаписи = РегистрыСведений.топ_СтатусыЗаказовТорговойПлощадкиАктуальные.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ЗаказТорговойПлощадки = ЗаказТорговойПлощадки;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() = Ложь Тогда
Возврат СтруктураСтатусов;
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтруктураСтатусов, МенеджерЗаписи);
//Выборка = РезультатЗапроса.Выбрать();
//Выборка.Следующий();
//ЗаполнитьЗначенияСвойств(СтруктураСтатусов, Выборка);
Возврат СтруктураСтатусов;
КонецФункции
#КонецОбласти
#Область Создание_номенклатур_на_основании_товара
// Функция - Вернуть связанную номенклатуру
//
// Параметры:
// Товар - Товар торговой площадки -
//
// Возвращаемое значение:
// - Структура, содержащая связанную номенклатуру и характеристику с товаром
//
&НаСервере
Функция ВернутьСвязаннуюНоменклатуру(Товар) Экспорт
СтруктураНоменклатуры = Новый Структура("Номенклатура,Характеристика");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(топ_СоответствиеТоваров.Номенклатура) КАК Номенклатура,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика
|ИЗ
| РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
|ГДЕ
| топ_СоответствиеТоваров.Товар = &Товар
|
|СГРУППИРОВАТЬ ПО
| топ_СоответствиеТоваров.Характеристика";
Запрос.УстановитьПараметр("Товар", Товар);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ЗаполнитьЗначенияСвойств(СтруктураНоменклатуры,Выборка);
Возврат СтруктураНоменклатуры;
КонецФункции
// Функция - Вернуть связанную номенклатуру
//
// Параметры:
// Товар - Товар торговой площадки -
//
// Возвращаемое значение:
// - Структура, содержащая связанную номенклатуру и характеристику с товаром
//
&НаСервере
Функция ВернутьСвязаннуюНоменклатуруРазмерWB(Товар, РазмерWB = Неопределено) Экспорт
СтруктураНоменклатуры = Новый Структура("Номенклатура,Характеристика,Упаковка");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(топ_СоответствиеТоваров.Номенклатура) КАК Номенклатура,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика,
| топ_СоответствиеТоваров.Упаковка КАК Упаковка
|ИЗ
| РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
|ГДЕ
| топ_СоответствиеТоваров.Товар = &Товар
| И топ_СоответствиеТоваров.РазмерWB = &РазмерWB
|
|СГРУППИРОВАТЬ ПО
| топ_СоответствиеТоваров.Характеристика,
| топ_СоответствиеТоваров.Упаковка";
Запрос.УстановитьПараметр("Товар", Товар);
// ++ Бойков BSLR-2454
Запрос.УстановитьПараметр("РазмерWB", ?(РазмерWB = Неопределено, Справочники.топ_РазмерыТоваровWB.ПустаяСсылка(), РазмерWB));
// -- Бойков BSLR-2454
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ЗаполнитьЗначенияСвойств(СтруктураНоменклатуры,Выборка);
Возврат СтруктураНоменклатуры;
КонецФункции
&НаСервере
Функция ВернутьСвязанныйТовар(Номенклатура, ЛичныйКабинет) Экспорт
СтруктураНоменклатуры = Новый Структура("Товар,Характеристика");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(топ_СоответствиеТоваров.Товар) КАК Товар,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика
|ИЗ
| РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
|ГДЕ
| топ_СоответствиеТоваров.Номенклатура = &Номенклатура
| И топ_СоответствиеТоваров.Товар.ЛичныйКабинет = &ЛичныйКабинет
|
|СГРУППИРОВАТЬ ПО
| топ_СоответствиеТоваров.Характеристика";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("ЛичныйКабинет", ЛичныйКабинет);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ЗаполнитьЗначенияСвойств(СтруктураНоменклатуры,Выборка);
Возврат СтруктураНоменклатуры;
КонецФункции
// Функция - Создать (или заменить существующую) номенклатуру на основании товара.
//
// Параметры:
// ПараметрыСвязи - структура с необходимыми данными
//
// Возвращаемое значение:
// - Создает элемент справочника номенклатуры (или обновляет уже существующий) и возвращает его ссылку. Устанавливает связь в регистре
//
&НаСервере
Функция СоздатьНоменклатуруНаОснованииТовара(ПараметрыСвязи) Экспорт
ДанныеПоТекущейСвязи = ВернутьСвязаннуюНоменклатуруРазмерWB(ПараметрыСвязи.Товар, ПараметрыСвязи.РазмерWB);
// письмерова 13.04.2023 BSLR-1720
Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
ПараметрыСвязи.Вставить("ТекущаяНоменклатура" , ДанныеПоТекущейСвязи.Номенклатура);
ПараметрыСвязи.Вставить("ТекущаяХарактеристика" , ДанныеПоТекущейСвязи.Характеристика);
// ++ Бойков BSLR-3054
Если ПараметрыСвязи.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.СберМегаМаркет Тогда
КодТовара = СтрЗаменить(СтрЗаменить(Строка(ПараметрыСвязи.Товар.offer_id), " ", ""), " ", "");
Иначе
КодТовара = СтрЗаменить(СтрЗаменить(Строка(ПараметрыСвязи.Товар.ID), " ", ""), " ", "");
КонецЕсли;
// -- Бойков BSLR-3054
Если ПараметрыСвязи.НоваяНоменклатура.Пустая() Тогда
Если ЗначениеЗаполнено(ПараметрыСвязи.Товар.КодПоставщика) Тогда
АртикулТовара = ПараметрыСвязи.Товар.КодПоставщика;
ИначеЕсли ЗначениеЗаполнено(ПараметрыСвязи.Товар.АртикулЦвета) Тогда
АртикулТовара = ПараметрыСвязи.Товар.АртикулЦвета;
КонецЕсли;
Если ПараметрыСвязи.ВариантСвязиКарточек = Перечисления.топ_ВариантСвязиКарточек.ПоАртикулу Тогда
Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",Строка(АртикулТовара));
//БИТ Смирнов А.П. 21.11.2022 BSLR-978 (
Если Номенклатура.Пустая() Тогда
Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("топ_АртикулПоставщика",Строка(ПараметрыСвязи.Товар.КодПоставщика));
КонецЕсли;
ИначеЕсли ПараметрыСвязи.ВариантСвязиКарточек = Перечисления.топ_ВариантСвязиКарточек.ПоКодуIDТовара Тогда
Номенклатура = Справочники.Номенклатура.НайтиПоКоду(Строка(КодТовара));
ИначеЕсли ПараметрыСвязи.ВариантСвязиКарточек = Перечисления.топ_ВариантСвязиКарточек.ПоКодуАртикулуТовара Тогда
Номенклатура = Справочники.Номенклатура.НайтиПоКоду(Строка(АртикулТовара));
ИначеЕсли ПараметрыСвязи.ВариантСвязиКарточек = Перечисления.топ_ВариантСвязиКарточек.ПоШтрихкоду Тогда
// письмерова 13.04.2023 BSLR-1720
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_Штрихкоды.Штрихкод КАК Штрихкод,
// ++ Бойков BSLR-2411
| ИСТИНА КАК ПодобратьХарактеристикуПоШтрихкоду
// -- Бойков BSLR-2411
|ПОМЕСТИТЬ ВТШтрихкодыТовара
|ИЗ
| РегистрСведений.топ_Штрихкоды КАК топ_Штрихкоды
|ГДЕ
| топ_Штрихкоды.Товар = &Товар
| И топ_Штрихкоды.РазмерWB = &РазмерWB
// ++ Бойков BSLR-2411. Если у товара несколько размеров с разными штрихкодами, номенклатура дублируется (создается новая под каждый штрихкод)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| топ_Штрихкоды.Штрихкод,
| ЛОЖЬ
|ИЗ
| РегистрСведений.топ_Штрихкоды КАК топ_Штрихкоды
|ГДЕ
| топ_Штрихкоды.Товар = &Товар
| И НЕ топ_Штрихкоды.РазмерWB = &РазмерWB
// -- Бойков BSLR-2411
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
// ++ Бойков BSLR-2411
| ВЫБОР
| КОГДА ВТШтрихкодыТовара.ПодобратьХарактеристикуПоШтрихкоду
| ТОГДА ШтрихкодыНоменклатуры.Характеристика
| ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
| КОНЕЦ КАК Характеристика
// -- Бойков BSLR-2411
|ИЗ
| ВТШтрихкодыТовара КАК ВТШтрихкодыТовара
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
| ПО ВТШтрихкодыТовара.Штрихкод = ШтрихкодыНоменклатуры.Штрихкод
|ГДЕ
| НЕ ШтрихкодыНоменклатуры.Номенклатура ЕСТЬ NULL
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура,
| ВТШтрихкодыТовара.ПодобратьХарактеристикуПоШтрихкоду УБЫВ");
Запрос.УстановитьПараметр("Товар", ПараметрыСвязи.Товар);
Запрос.УстановитьПараметр("РазмерWB", ?(ПараметрыСвязи.РазмерWB = Неопределено, Справочники.топ_РазмерыТоваровWB.ПустаяСсылка(), ПараметрыСвязи.РазмерWB)); // BSLR-1887
ВЫборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Номенклатура = Выборка.Номенклатура;
Характеристика = Выборка.Характеристика;
КонецЕсли;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Номенклатура) Тогда
Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
Номенклатура.Артикул = Строка(АртикулТовара); //Для ВБ это поле согласуется с артикулом цвета товара (может быть не уникальным) торговой площадки
Номенклатура.топ_АртикулПоставщика = Строка(ПараметрыСвязи.Товар.КодПоставщика);
ПараметрыСвязи.Вставить("ЭтоНовый", Истина);
Иначе
//BSLR-3676+
Сообщить("Для товара """ + ПараметрыСвязи.Товар + """ новая номенклатура не создана. Выполнено сопоставление с уже существующей номенклатурой. Для создания новой номенклатуры удалите существующую");
//BSLR-3676-
Номенклатура = Номенклатура.ПолучитьОбъект();
ПараметрыСвязи.Вставить("ЭтоНовый", Ложь);
КонецЕсли;
Иначе // Новая номенклатура указана
Номенклатура = ПараметрыСвязи.НоваяНоменклатура.ПолучитьОбъект();
ПараметрыСвязи.Вставить("ЭтоНовый", Ложь);
КонецЕсли;
Если ПараметрыСвязи.ИспользуютсяХарактеристики Тогда
Если ПараметрыСвязи.НоваяХарактеристика.Пустая() Тогда
Если ПараметрыСвязи.ВидНоменклатуры.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры Тогда
// письмерова 13.04.2023 BSLR-1720 - на случай если получили размер из запроса по шк
Если Характеристика.Пустая() Тогда
//+БИТ Тверитин
Если ЗначениеЗаполнено(ПараметрыСвязи.РазмерWB) Тогда
НаименованиеДляПоиска = ПараметрыСвязи.РазмерWB.Наименование;
Если ПараметрыСвязи.Свойство("АртикулЦвета") И ЗначениеЗаполнено(ПараметрыСвязи.АртикулЦвета) Тогда
НаименованиеДляПоиска = ПараметрыСвязи.АртикулЦвета + " " + НаименованиеДляПоиска;
КонецЕсли;
Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеДляПоиска,,,ПараметрыСвязи.ВидНоменклатуры);
//БИТ Смирнов А.П. 13.12.2022 )
Иначе
Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ПараметрыСвязи.Товар.КодПоставщика,,,ПараметрыСвязи.ВидНоменклатуры);
КонецЕсли;
КонецЕсли;
Если Характеристика.Пустая() Тогда
Характеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
Иначе
Характеристика = Характеристика.ПолучитьОбъект();
КонецЕсли;
ИначеЕсли ПараметрыСвязи.ВидНоменклатуры.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры Тогда
// письмерова 13.04.2023 BSLR-1720 - на случай если получили размер из запроса по шк
Если Характеристика.Пустая() Тогда
Если ЗначениеЗаполнено(ПараметрыСвязи.РазмерWB) Тогда
Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ПараметрыСвязи.РазмерWB.Наименование,,,ПараметрыСвязи.НоваяНоменклатура);
Иначе
Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ПараметрыСвязи.Товар.КодПоставщика,,,ПараметрыСвязи.НоваяНоменклатура);
КонецЕсли;
КонецЕсли;
// письмерова 13.04.2023 BSLR-1720 - если нашли номенклатуру - искать с привязкой к ней
Если Характеристика.Пустая() и Не ПараметрыСвязи.ЭтоНовый Тогда
Если ЗначениеЗаполнено(ПараметрыСвязи.РазмерWB) Тогда
Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ПараметрыСвязи.РазмерWB.Наименование,,,Номенклатура.Ссылка);
Иначе
Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ПараметрыСвязи.Товар.КодПоставщика,,,Номенклатура.Ссылка);
КонецЕсли;
КонецЕсли;
Если Характеристика.Пустая() Тогда
Характеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
Иначе
Характеристика = Характеристика.ПолучитьОбъект();
КонецЕсли;
ИначеЕсли ПараметрыСвязи.ВидНоменклатуры.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры Тогда
// письмерова 13.04.2023 BSLR-1720 - на случай если получили размер из запроса по шк
Если Характеристика.Пустая() Тогда
Если ЗначениеЗаполнено(ПараметрыСвязи.РазмерWB) Тогда
Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ПараметрыСвязи.РазмерWB.Наименование,,,ПараметрыСвязи.ВидНоменклатуры.ВладелецХарактеристик);
Иначе
Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ПараметрыСвязи.Товар.КодПоставщика,,,ПараметрыСвязи.ВидНоменклатуры.ВладелецХарактеристик);
КонецЕсли;
КонецЕсли;
Если Характеристика.Пустая() Тогда
Характеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
Иначе
Характеристика = Характеристика.ПолучитьОбъект();
КонецЕсли;
ИначеЕсли ПараметрыСвязи.ВидНоменклатуры.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать Тогда // письмерова 13.04.2023 BSLR-1720
Характеристика = Неопределено;
КонецЕсли;
//если характеристики не используются для данного вида, то ничего не создаётся
//-БИТ Тверитин
Иначе
Характеристика = ПараметрыСвязи.НоваяХарактеристика;
КонецЕсли;
Иначе //БИТ Тверитин
Характеристика = Неопределено; // письмерова 13.04.2023 BSLR-1720
КонецЕсли;
//передаются объекты к заполнению
ЗаполнитьРеквизитыНоменклатурыНаОснованииТовара(Номенклатура, Характеристика, ПараметрыСвязи);
Возврат Номенклатура.Ссылка;
КонецФункции
// Процедура - Удалить информацию по старой связи
//
// Параметры:
// ПараметрыСвязи - структура с необходимыми данными
//
&НаСервере
Процедура УдалитьИнформациюПоСтаройСвязи(ПараметрыСвязи)
// Очистка прошлой связи
ЗаписьРегистра = РегистрыСведений.топ_СоответствиеТоваров.СоздатьМенеджерЗаписи();
ЗаписьРегистра.Номенклатура = ПараметрыСвязи.ТекущаяНоменклатура;
ЗаписьРегистра.Характеристика = ПараметрыСвязи.ТекущаяХарактеристика;
ЗаписьРегистра.Товар = ПараметрыСвязи.Товар;
//> БИТ - КондращенкоМ
ЗаписьРегистра.РазмерWB = ПараметрыСвязи.РазмерWB;
//< БИТ - КондращенкоМ
//БИТ Смирнов А.П. 16.12.2022 BSLR-958 (
Если ПараметрыСвязи.Свойство("Упаковка") Тогда
ЗаписьРегистра.Упаковка = ПараметрыСвязи.Упаковка;
КонецЕсли;
//БИТ Смирнов А.П. 16.12.2022 )
ЗаписьРегистра.Прочитать();
Если ЗаписьРегистра.Выбран() Тогда
ЗаписьРегистра.Удалить();
КонецЕсли;
// ++ Бойков BSLR-3205
Если ПараметрыСвязи.ДобавлятьШК Тогда
// Удаление старого штрихкода
// ++ Бойков BSLR-2454. Для товара возвращается массив штрихкодов, некорректно заполнялась запись регистра
МассивШтрихкодов = ВернутьШтрихкодыТовара(ПараметрыСвязи.Товар, ПараметрыСвязи.РазмерWB);
Для Каждого Штрихкод Из МассивШтрихкодов Цикл
// Считываем ШК через набор записей. В УТ и УНФ разные структуры регистров, менеджер записи отрабатывает некорректно
НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Штрихкод.Установить(Штрихкод);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() Тогда
ЗаписиКУдалению = Новый Массив;
Для Каждого Запись Из НаборЗаписей Цикл
// Удаляем запись ШК только для неактуальных номенклатуры и характеристики
Если Не (Запись.Номенклатура = ПараметрыСвязи.НоваяНоменклатура И Запись.Характеристика = ПараметрыСвязи.НоваяХарактеристика) Тогда
ЗаписиКУдалению.Добавить(Запись);
КонецЕсли;
КонецЦикла;
Для Каждого Запись Из ЗаписиКУдалению Цикл
НаборЗаписей.Удалить(Запись);
КонецЦикла;
Если НаборЗаписей.Модифицированность() Тогда
НаборЗаписей.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
// -- Бойков BSLR-2454
КонецЕсли;
// -- Бойков BSLR-3205
КонецПроцедуры
// Процедура - Связать номенклатуру и товар
//
// Параметры:
// Номенклатура - Элемент справочника номенклатуры -
// Товар - Элемент справочника товаров торговых площадок -
//
&НаСервере
Процедура СвязатьНоменклатуруИТовар(Номенклатура, Характеристика, ПараметрыСвязи)
ЗаписьРегистра = РегистрыСведений.топ_СоответствиеТоваров.СоздатьМенеджерЗаписи();
//BSLR-1713
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_СоответствиеТоваров.Товар КАК Товар,
| топ_СоответствиеТоваров.Номенклатура КАК Номенклатура,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика,
| топ_СоответствиеТоваров.РазмерWB КАК РазмерWB,
| топ_СоответствиеТоваров.Упаковка КАК Упаковка
|ИЗ
| РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
|ГДЕ
| топ_СоответствиеТоваров.Товар = &Товар
| И топ_СоответствиеТоваров.РазмерWB = &РазмерWB
| И топ_СоответствиеТоваров.Номенклатура <> &Номенклатура");
Запрос.УстановитьПараметр("Товар", ПараметрыСвязи.Товар);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("РазмерWB", ?(ЗначениеЗаполнено(ПараметрыСвязи.РазмерWB), ПараметрыСвязи.РазмерWB, Справочники.топ_РазмерыТоваровWB.ПустаяСсылка()));
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
ТекстСообщения = СтрШаблон("Товар(%1) уже связан с другой номенклатурой", ПараметрыСвязи.Товар);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Возврат;
КонецЕсли;
//BSLR-1713
ЗаписьРегистра.Номенклатура = Номенклатура;
ЗаписьРегистра.Характеристика = Характеристика;
ЗаписьРегистра.Товар = ПараметрыСвязи.Товар;
//> БИТ - КондращенкоМ
ЗаписьРегистра.РазмерWB = ПараметрыСвязи.РазмерWB;
//< БИТ - КондращенкоМ
//БИТ Смирнов А.П. 16.12.2022 BSLR-958 (
Если ПараметрыСвязи.Свойство("Упаковка") Тогда
ЗаписьРегистра.Упаковка = ПараметрыСвязи.Упаковка;
КонецЕсли;
//БИТ Смирнов А.П. 16.12.2022 )
//> БИТ - ТверитинД
ЗаписиКЗамещению = РегистрыСведений.топ_СоответствиеТоваров.СоздатьНаборЗаписей();
ЗаписиКЗамещению.Отбор.Товар.Установить(ПараметрыСвязи.Товар);
ЗаписиКЗамещению.Отбор.РазмерWB.Установить(ПараметрыСвязи.РазмерWB);
ЗаписиКЗамещению.Записать();
//< БИТ - ТверитинД
ЗаписьРегистра.Записать(Истина);
ТекстСообщения = "Номенклатура " + Номенклатура + " и карточка МП " + ПараметрыСвязи.Товар + " успешно связаны!";
СообщитьПользователю(ТекстСообщения);
КонецПроцедуры
// Процедура - Связать номенклатуру и товар при создании товара
//
// Параметры:
// Номенклатура - Элемент справочника номенклатуры -
// Товар - Элемент справочника товаров торговых площадок -
//
&НаСервере
Процедура СвязатьНоменклатуруИТоварПриСозданииТовара(Номенклатура, Характеристика, Размер, Товар) Экспорт
ЗаписьРегистра = РегистрыСведений.топ_СоответствиеТоваров.СоздатьМенеджерЗаписи();
ЗаписьРегистра.Номенклатура = Номенклатура;
ЗаписьРегистра.Характеристика = Характеристика;
ЗаписьРегистра.РазмерWB = Размер;
ЗаписьРегистра.Товар = Товар;
// Упаковку не заполняем по умолчанию единицей измерения из номенклатуры, т.к. у нее тип измеряемой величины не соответствует значению для упаковки.
// Но визуально в форме списка и записи регистра, если упаковка пустая, она будет отображаться, как и в типовом функционале
ЗаписьРегистра.Записать(Истина);
КонецПроцедуры
//< БИТ - сопоставление_штрихкоды - КондращенкоМ
// Процедура - Скопировать штрихкод товара в номенклатуру
//
// Параметры:
// Номенклатура - Элемент справочника номенклатуры -
// Товар - Элемент справочника товаров торговых площадок -
//
&НаСервере
Процедура СкопироватьШтрихкод(Номенклатура, Характеристика, ПараметрыСвязи) Экспорт
// ++ Бойков BSLR-3205
ДобавлятьШК = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыСвязи, "ДобавлятьШК", Ложь);
Если Не ДобавлятьШК Тогда
Возврат;
КонецЕсли;
// -- Бойков BSLR-3205
// письмерова 13.04.2023 BSLR-1720
Если ПараметрыСвязи.РазмерWB = Неопределено ТОгда
РазмерWB = Справочники.топ_РазмерыТоваровWB.ПустаяСсылка();
Иначе
РазмерWB = ПараметрыСвязи.РазмерWB;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_Штрихкоды.Штрихкод КАК Штрихкод,
| &Номенклатура КАК Номенклатура,
| &ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| РегистрСведений.топ_Штрихкоды КАК топ_Штрихкоды
|ГДЕ
| топ_Штрихкоды.Товар = &Товар
| И топ_Штрихкоды.РазмерWB = &РазмерWB";
Запрос.УстановитьПараметр("Товар" , ПараметрыСвязи.Товар);
Запрос.УстановитьПараметр("РазмерWB" , РазмерWB);
Запрос.УстановитьПараметр("Номенклатура" , Номенклатура);
Запрос.УстановитьПараметр("ЕдиницаИзмерения", Номенклатура.ЕдиницаИзмерения);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// ++ Бойков BSLR-2454. Считываем ШК через набор записей. В УТ и УНФ разные структуры регистров, менеджер записи отрабатывает некорректно
НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Штрихкод.Установить(Выборка.Штрихкод);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() Тогда
Продолжить;
КонецЕсли;
ЗаписьРегистра = НаборЗаписей.Добавить();
Если ПараметрыСвязи.Свойство("Упаковка") Тогда
ЗаписьРегистра.Упаковка = ПараметрыСвязи.Упаковка;
КонецЕсли;
// -- Бойков BSLR-2454
ЗаписьРегистра.Номенклатура = Номенклатура;
ЗаписьРегистра.Характеристика = Характеристика;
ЗаписьРегистра.Штрихкод = Выборка.Штрихкод;
Попытка
//Чупраков А.Н. 26.12.22
//При ограниченном доступе к штрихкодам, может вознакть ошибка - добавлен привилегированный режим
УстановитьПривилегированныйРежим(Истина);
Если Выборка.Штрихкод <> "" Тогда // письмерова, проверка на пустой ШК
//ЗаписьРегистра.Записать(Истина);
НаборЗаписей.Записать();
Иначе
ОбщегоНазначения.СообщитьПользователю("У товара " + ПараметрыСвязи.Товар + " (ID" + ПараметрыСвязи.Товар.ID + ") обнаружен пустой штрихкод");
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
Исключение
ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ОбработатьЗначениеПоТипуДанных(ДополнительныйРеквизит, ЗначениеТовара, СоздаватьЗначение)
ЗначениеРеквизита = Неопределено;
//Ищем среди возможных значений справочника
Если ОбщегоНазначения.ЗначениеСсылочногоТипа(ДополнительныйРеквизит) Тогда
Для Каждого ТипДопРеквизита Из ДополнительныйРеквизит.ТипЗначения.Типы() Цикл
Если ОбщегоНазначения.ЭтоСсылка(ТипДопРеквизита) = Ложь Тогда
Продолжить;
КонецЕсли;
ДопРеквизитСсылка = Новый(ТипДопРеквизита);
ОбщегоНазначения.МенеджерОбъектаПоСсылке(ДопРеквизитСсылка);
Имя = ДопРеквизитСсылка.Метаданные().Имя;
Если ОбщегоНазначения.ВидОбъектаПоСсылке(ДопРеквизитСсылка) = "Справочник" Тогда
ПоискЗначения = Справочники[Имя].НайтиПоНаименованию(ЗначениеТовара);
Если ЗначениеЗаполнено(ПоискЗначения) Тогда
Возврат ПоискЗначения;
Иначе
//Здесь создание новых элементов справочника
//Или же делать подбор из классифакатора УпаковкиЕдиницыИзмерения, Валюты, Страны мира и т.д.
Если ТипЗнч(ПоискЗначения) = Тип("СправочникСсылка.ЗначенияСвойствОбъектов") И СоздаватьЗначение Тогда
НовыйЭлемент = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
НовыйЭлемент.Наименование = ЗначениеТовара;
НовыйЭлемент.ПолноеНаименование = ЗначениеТовара;
НовыйЭлемент.Владелец = ДополнительныйРеквизит;
НовыйЭлемент.Записать();
Возврат НовыйЭлемент.Ссылка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Если не найдено подходящее значение, смотрим, есть ли примитивные типы
Если ДополнительныйРеквизит.ТипЗначения.СодержитТип(Тип("Число")) Или ДополнительныйРеквизит.ТипЗначения.СодержитТип(Тип("Строка"))
Или ДополнительныйРеквизит.ТипЗначения.СодержитТип(Тип("Булево")) Или ДополнительныйРеквизит.ТипЗначения.СодержитТип(Тип("Дата")) Тогда
ЗначениеРеквизита = ЗначениеТовара;
КонецЕсли;
Возврат ЗначениеРеквизита;
КонецФункции
// Процедура - Заполнить реквизиты номенклатуры на основании товара
//
// Параметры:
// Номенклатура_Объект - Объект элемента справочника номенклатуры -
// Товар - Элемент справочника товаров торговых площадок -
// КатегорияНоменклатуры - Ссылка на элемент справочника категории номенклатуры -
//
&НаСервере
Процедура ЗаполнитьРеквизитыНоменклатурыНаОснованииТовара(Номенклатура, Характеристика, ПараметрыСвязи)
#Область Создание_номенклатуры
ЛичныйКабинет = ПараметрыСвязи.ЛичныйКабинет;
ТорговаяПлощадка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЛичныйКабинет, "ТорговаяПлощадка");
НовыйМеханизмСвойств = топ_КатегорииСвойстваТоваров.НовыйМеханизмСвойств(ТорговаяПлощадка);
Если (ПараметрыСвязи.ОбновлятьРеквизитыНоменклатуры = Истина или ПараметрыСвязи.ЭтоНовый) Тогда
// ++ Бойков BSLR-2527. Переместил часть кода.
// Заполнение по виду/категории номенклатуры может перезаписывать реквизиты, заполненные через сопоставление свойств
ИмяКонфигурации = Метаданные.Имя;
Если топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей")
ИЛИ топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеПредприятием")
ИЛИ топ_ОбщийМодульСервер.ЭтаКонфигурация("КомплекснаяАвтоматизация")Тогда
Номенклатура.ВидНоменклатуры = ПараметрыСвязи.ВидНоменклатуры;
Справочники.Номенклатура.ЗаполнитьРеквизитыПоВидуНоменклатуры(Номенклатура, Ложь, Ложь, Неопределено, Ложь);
Иначе
Номенклатура.КатегорияНоменклатуры = ПараметрыСвязи.ВидНоменклатуры;
ОбщийМодуль = ОбщегоНазначения.ОбщийМодуль("КатегорииНоменклатурыСервер");
ОбщийМодуль.ЗаполнитьСвойстваНоменклатурыПоКатегории(Номенклатура);
КонецЕсли;
// -- Бойков BSLR-2527
Если НовыйМеханизмСвойств Тогда
ТаблицаДопСвойств = Новый ТаблицаЗначений;
ТаблицаДопСвойств.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаДопСвойств.Колонки.Добавить("Значение");
ОбработатьСвойстваТовара(Номенклатура, ЛичныйКабинет, ПараметрыСвязи, ТаблицаДопСвойств);
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ДопРеквизитыСведения.Свойство КАК Свойство,
| ДопРеквизитыСведения.Свойство.Заголовок КАК ПредставлениеРеквизита,
| ЛОЖЬ КАК ОбщееСвойство,
| ДопРеквизитыСведения.НомерСтроки КАК НомерСтрокиДляСортировки,
| ВЫБОР
| КОГДА ДопРеквизитыСведения.ПометкаУдаления
| ТОГДА 4
| ИНАЧЕ 1
| КОНЕЦ КАК ИндексКартинки
|ПОМЕСТИТЬ ВтНаборы
|ИЗ
| Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДопРеквизитыСведения
|ГДЕ
| ДопРеквизитыСведения.Ссылка = &НаборСвойств
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ОбщиеДопРеквизитыСведения.Свойство,
| ОбщиеДопРеквизитыСведения.Свойство.Заголовок,
| ИСТИНА,
| ОбщиеДопРеквизитыСведения.НомерСтроки,
| ВЫБОР
| КОГДА ОбщиеДопРеквизитыСведения.ПометкаУдаления
| ТОГДА 4
| ИНАЧЕ 1
| КОНЕЦ
|ИЗ
| Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ОбщиеДопРеквизитыСведения
|ГДЕ
| ОбщиеДопРеквизитыСведения.Ссылка = &НаборОбщихСвойств
|;
|
|////////////////////////////////////////////////////////////////////////////////
// ++ Бойков BSLR-2140
|ВЫБРАТЬ
| топ_ЗначенияСвойствТоваров.Свойство КАК Свойство,
| топ_ЗначенияСвойствТоваров.Значение КАК Значение,
| ЕСТЬNULL(топ_СопоставлениеСвойствНоменклатурыИТовара.РеквизитНоменклатуры, """") КАК РеквизитНоменклатуры,
| ДополнительныеРеквизитыИСведения.Ссылка КАК СвойствоСсылка,
| ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(топ_СопоставлениеСвойствНоменклатурыИТовара.СвойствоТовара) = ТИП(СТРОКА)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ЭтоРеквизитТовара,
| топ_СопоставлениеСвойствНоменклатурыИТовара.СвойствоТовара КАК СвойствоТовара
|ПОМЕСТИТЬ ВтСвойства
|ИЗ
| РегистрСведений.топ_СопоставлениеСвойствНоменклатурыИТовара КАК топ_СопоставлениеСвойствНоменклатурыИТовара
| ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
| ПО топ_СопоставлениеСвойствНоменклатурыИТовара.РеквизитНоменклатуры = ДополнительныеРеквизитыИСведения.Имя
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_ЗначенияСвойствТоваров КАК топ_ЗначенияСвойствТоваров
| ПО топ_ЗначенияСвойствТоваров.Свойство = топ_СопоставлениеСвойствНоменклатурыИТовара.СвойствоТовара
| И топ_ЗначенияСвойствТоваров.Товар = &Товар
|ГДЕ
| топ_СопоставлениеСвойствНоменклатурыИТовара.ЛичныйКабинет = &ЛичныйКабинет
// -- Бойков BSLR-2140
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВтСвойства.Свойство КАК Свойство,
| ВтСвойства.Значение КАК Значение,
| ВтСвойства.РеквизитНоменклатуры КАК РеквизитНоменклатуры,
| ВтСвойства.СвойствоСсылка КАК СвойствоСсылка,
// ++ Бойков BSLR-2140
| ВтСвойства.СвойствоТовара КАК СвойствоТовара,
| ВтСвойства.ЭтоРеквизитТовара КАК ЭтоРеквизитТовара,
// -- Бойков BSLR-2140
| ВЫБОР
| КОГДА НЕ ВтСвойства.СвойствоСсылка ЕСТЬ NULL
| ТОГДА ВЫБОР
| КОГДА ВтНаборы.Свойство ЕСТЬ NULL
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК Исключить
|ИЗ
| ВтСвойства КАК ВтСвойства
| ЛЕВОЕ СОЕДИНЕНИЕ ВтНаборы КАК ВтНаборы
| ПО (ВтСвойства.СвойствоСсылка = ВтНаборы.Свойство)";
ТорговаяПлощадка = ПараметрыСвязи.ЛичныйКабинет.ТорговаяПлощадка;
// ++ Бойков BSLR-2140
Запрос.УстановитьПараметр("ЛичныйКабинет", ПараметрыСвязи.ЛичныйКабинет);
// -- Бойков BSLR-2140
Запрос.УстановитьПараметр("Товар", ПараметрыСвязи.Товар);
Запрос.УстановитьПараметр("НаборОбщихСвойств", УправлениеСвойствами.НаборСвойствПоИмени("Справочник_Номенклатура_Общие"));
Если ПараметрыСвязи.ЭтоНовый = Истина Тогда
// Бойков BSLR-2140
Запрос.УстановитьПараметр("НаборСвойств", ПараметрыСвязи.ВидНоменклатуры.НаборСвойств);
Иначе
Запрос.УстановитьПараметр("НаборСвойств", Номенклатура.ВидНоменклатуры.НаборСвойств);
КонецЕсли;
//Выборка сопоставленных свойств с карточкой товара
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() цикл
Если НовыйМеханизмСвойств Тогда
Прервать;
КонецЕсли;
Если Выборка.РеквизитНоменклатуры = "" Тогда
Продолжить;
КонецЕсли;
// ++ Бойков BSLR-2141
Если Выборка.РеквизитНоменклатуры = "Наименование" Тогда
ПараметрыСвязи.Вставить("НаименованиеЗаполненоЧерезСоответствиеСвойств", Истина);
КонецЕсли;
Если Выборка.РеквизитНоменклатуры = "Код" Тогда
ПараметрыСвязи.Вставить("КодЗаполненЧерезСоответствиеСвойств", Истина);
КонецЕсли;
Если Выборка.РеквизитНоменклатуры = "Наименование" Или Выборка.РеквизитНоменклатуры = "Код" Тогда
Если ПараметрыСвязи.ЭтоНовый = Истина Или
(ПараметрыСвязи.НеПерезаписыватьСтандартныеРеквизиты = Ложь И ПараметрыСвязи.ОбновлятьРеквизитыНоменклатуры) Тогда
// Стандартные реквизиты заполняем для новых объектов или при обновлении (выбраны соответствующие настройки)
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;
// -- Бойков BSLR-2141
Если Выборка.Исключить Тогда
Продолжить;
КонецЕсли;
//Заполнение дополнительных реквизитов
ДопРеквизит = Выборка.СвойствоСсылка;
Если ЗначениеЗаполнено(Выборка.СвойствоСсылка) Тогда
ДополнительныйРеквизит = Номенклатура.ДополнительныеРеквизиты.Найти(ДопРеквизит);
Если ДополнительныйРеквизит = Неопределено Тогда
ДополнительныйРеквизит = Номенклатура.ДополнительныеРеквизиты.Добавить();
ДополнительныйРеквизит.Свойство = ДопРеквизит;
КонецЕсли;
// ++ Бойков BSLR-2140
Если Выборка.ЭтоРеквизитТовара Тогда
ДополнительныйРеквизит.Значение = ОбработатьЗначениеПоТипуДанных(ДопРеквизит, ПараметрыСвязи.Товар[Выборка.СвойствоТовара], ПараметрыСвязи.СоздаватьЗначенияДополнительныхРеквизитов);
Иначе
ДополнительныйРеквизит.Значение = ОбработатьЗначениеПоТипуДанных(ДопРеквизит, Выборка.Значение, ПараметрыСвязи.СоздаватьЗначенияДополнительныхРеквизитов);
КонецЕсли;
// -- Бойков BSLR-2140
Продолжить;
КонецЕсли;
//Заполнение реквизитов номенклатуры
// ++ Бойков BSLR-2140
Если Выборка.ЭтоРеквизитТовара Тогда
Значение = ПараметрыСвязи.Товар[Выборка.СвойствоТовара];
Иначе
Значение = Выборка.Значение;
КонецЕсли;
// -- Бойков BSLR-2140
Реквизит = Номенклатура[Выборка.РеквизитНоменклатуры];
Если ОбщегоНазначения.ЗначениеСсылочногоТипа(Реквизит) Тогда
МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Реквизит);
ВариантПоиска = "";
Если ОбщегоНазначения.ВидОбъектаПоСсылке(Реквизит) = "Справочник" Тогда
МетаданныеОбъекта = Реквизит.Метаданные();
Если МетаданныеОбъекта.ДлинаНаименования > 0 Тогда
ЭлемеменСправочника = МенеджерОбъекта.НайтиПоНаименованию(Значение);
Если ЭлемеменСправочника.Пустая() Тогда
ЭлемеменСправочника_Объект = МенеджерОбъекта.СоздатьЭлемент();
ЭлемеменСправочника_Объект.Наименование = Значение;
ЭлемеменСправочника_Объект.ОбменДанными.Загрузка = Истина;
ЭлемеменСправочника_Объект.Записать();
ЭлемеменСправочника = ЭлемеменСправочника_Объект.Ссылка;
КонецЕсли;
ИначеЕсли МетаданныеОбъекта.ДлинаКода > 0 Тогда
СсылкаНаЭлемент = МенеджерОбъекта.НайтиПоКоду(Значение);
Если ЭлемеменСправочника.Пустая() Тогда
ЭлемеменСправочника_Объект = МенеджерОбъекта.СоздатьЭлемент();
ЭлемеменСправочника_Объект.Код = Значение;
ЭлемеменСправочника_Объект.ОбменДанными.Загрузка = Истина;
Если ЭлемеменСправочника_Объект.Код <> "" Тогда
ЭлемеменСправочника_Объект.Записать();
ЭлемеменСправочника = ЭлемеменСправочника_Объект.Ссылка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если НЕ ЭлемеменСправочника.Пустая() Тогда
Номенклатура[Выборка.РеквизитНоменклатуры] = ЭлемеменСправочника;
КонецЕсли;
КонецЕсли;
Если ОбщегоНазначения.ВидОбъектаПоСсылке(Реквизит) = "Перечисление" Тогда
КонецЕсли;
Иначе
Если ТипЗНЧ(Реквизит) = Тип("Число") Тогда
Значение = топ_ОбщийМодульСервер.ПреобразоватьСтрокуВЧисло(Значение);
КонецЕсли;
Номенклатура[Выборка.РеквизитНоменклатуры] = Значение;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ПараметрыСвязи.Товар.КодПоставщика) Тогда
АртикулТовара = ПараметрыСвязи.Товар.КодПоставщика;
ИначеЕсли ЗначениеЗаполнено(ПараметрыСвязи.Товар.АртикулЦвета) Тогда
АртикулТовара = ПараметрыСвязи.Товар.АртикулЦвета;
КонецЕсли;
Если ПараметрыСвязи.ВариантСвязиКарточек = Перечисления.топ_ВариантСвязиКарточек.ПоАртикулу Тогда
Если Номенклатура.топ_АртикулПоставщика <> АртикулТовара Тогда
Номенклатура.топ_АртикулПоставщика = АртикулТовара;
КонецЕсли;
КонецЕсли;
//Не перезаписывать наименование и наименование полное при установленной пометке НеПерезаписыватьСтандартныеРеквизиты
Если (ПараметрыСвязи.НеПерезаписыватьСтандартныеРеквизиты = Ложь И ПараметрыСвязи.ОбновлятьРеквизитыНоменклатуры
И ПараметрыСвязи.ЭтоНовый = Ложь) Или ПараметрыСвязи.ЭтоНовый = Истина Тогда
// ++ Бойков BSLR-2141
НаименованиеЗаполненоЧерезСоответствиеСвойств = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыСвязи,
"НаименованиеЗаполненоЧерезСоответствиеСвойств", Ложь);
Если Не НаименованиеЗаполненоЧерезСоответствиеСвойств Тогда
Номенклатура.Наименование = ПараметрыСвязи.Товар.Наименование;
КонецЕсли;
// -- Бойков BSLR-2141
Если ПараметрыСвязи.УникальноеНаименование Тогда
Номенклатура.Наименование = Номенклатура.Наименование + " (" + ПараметрыСвязи.Товар.КодПоставщика + ")";
КонецЕсли;
//Наименование номенклатруы по шаблону
//Проверить
ЗаполнитьНаименованиеПоШаблону = Ложь;
Если ПараметрыСвязи.Свойство("ЗаполнитьНаименованиеПоШаблону", ЗаполнитьНаименованиеПоШаблону) Тогда
ШаблонРабочегоНаименованияНоменклатуры = ПараметрыСвязи.ВидНоменклатуры.ШаблонРабочегоНаименованияНоменклатуры;
Если ПараметрыСвязи.ЗаполнитьНаименованиеПоШаблону И ШаблонРабочегоНаименованияНоменклатуры <> "" Тогда
Номенклатура.Наименование = НоменклатураСервер.НаименованиеПоШаблону(ПараметрыСвязи.ВидНоменклатуры.ШаблонРабочегоНаименованияНоменклатуры, Номенклатура);
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Номенклатура.НаименованиеПолное) Тогда
Номенклатура.НаименованиеПолное = Номенклатура.Наименование;
КонецЕсли;
Если ПараметрыСвязи.ВариантСвязиКарточек = Перечисления.топ_ВариантСвязиКарточек.ПоАртикулу Тогда
Если Номенклатура.Артикул <> АртикулТовара Тогда
Номенклатура.Артикул = АртикулТовара;
КонецЕсли;
КонецЕсли;
//LAShadrin 26/06/23
Если ПараметрыСвязи.ВариантСвязиКарточек = Перечисления.топ_ВариантСвязиКарточек.ПоКодуIDТовара Тогда
// ++ Бойков BSLR-3054
Если ПараметрыСвязи.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.СберМегаМаркет Тогда
КодТовара = СтрЗаменить(СтрЗаменить(Строка(ПараметрыСвязи.Товар.offer_id), " ", ""), " ", "");
Иначе
КодТовара = СтрЗаменить(СтрЗаменить(Строка(ПараметрыСвязи.Товар.ID), " ", ""), " ", "");
КонецЕсли;
// -- Бойков BSLR-3054
Если Номенклатура.Код <> КодТовара Тогда
Номенклатура.Код = КодТовара;
КонецЕсли;
КонецЕсли;
Если ПараметрыСвязи.ВариантСвязиКарточек = Перечисления.топ_ВариантСвязиКарточек.ПоКодуАртикулуТовара Тогда
Если Номенклатура.Код <> АртикулТовара Тогда
Номенклатура.Код = АртикулТовара;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ПараметрыСвязи.ИспользуютсяХарактеристики Тогда
Номенклатура.ИспользованиеХарактеристик = ПараметрыСвязи.ВидНоменклатуры.ИспользованиеХарактеристик;
Номенклатура.ВладелецХарактеристик = ПараметрыСвязи.ВидНоменклатуры.ВладелецХарактеристик;
Иначе
Номенклатура.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать;
КонецЕсли;
// ++ Бойков BSLR-2140
Если ЗначениеЗаполнено(ПараметрыСвязи.Товар.Категория) Тогда
//Добавление товарных категорий
ТоварнаяКатегория = Справочники.ТоварныеКатегории.НайтиПоНаименованию(ПараметрыСвязи.Товар.Категория.Наименование);
Если Не ЗначениеЗаполнено(ТоварнаяКатегория) Тогда
ТоварнаяКатегория = Справочники.ТоварныеКатегории.СоздатьЭлемент();
ТоварнаяКатегория.Наименование = ПараметрыСвязи.Товар.Категория.Наименование;
ТоварнаяКатегория.Владелец = ПараметрыСвязи.ВидНоменклатуры;
ТоварнаяКатегория.Записать();
КонецЕсли;
Если ЗначениеЗаполнено(Номенклатура.ТоварнаяКатегория) Тогда
Номенклатура.ТоварнаяКатегория = ТоварнаяКатегория;
КонецЕсли;
КонецЕсли;
// -- Бойков BSLR-2140
Попытка
Номенклатура.ОбменДанными.Загрузка = Истина;
Если Не ЗначениеЗаполнено(Номенклатура.Код) Тогда
Номенклатура.УстановитьНовыйКод();
КонецЕсли;
Номенклатура.Записать();
Если НовыйМеханизмСвойств Тогда
Если ТаблицаДопСвойств.Количество() Тогда
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Номенклатура.Ссылка, ТаблицаДопСвойств);
КонецЕсли;
КонецЕсли;
Исключение
ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецЕсли;
Номенклатура = Номенклатура.Ссылка;
// ++ Бойков BSLR-2454
ПараметрыСвязи.Вставить("НоваяНоменклатура", Номенклатура);
// -- Бойков BSLR-2454
#КонецОбласти
#Область Создание_характеристики
Если ЗначениеЗаполнено(ПараметрыСвязи.РазмерWB) Тогда
НаименованиеХарактеристики = ПараметрыСвязи.РазмерWB.Наименование;
Если ПараметрыСвязи.Свойство("АртикулЦвета") И ЗначениеЗаполнено(ПараметрыСвязи.АртикулЦвета) Тогда
НаименованиеХарактеристики = ПараметрыСвязи.АртикулЦвета + " " + НаименованиеХарактеристики;
КонецЕсли;
Иначе
НаименованиеХарактеристики = ПараметрыСвязи.Товар.КодПоставщика;
КонецЕсли;
Если ПараметрыСвязи.ИспользуютсяХарактеристики И Характеристика <> Неопределено И ПараметрыСвязи.СоздаватьНоменклатуру Тогда
Если Не ЗначениеЗаполнено(Характеристика.Ссылка) Тогда
ИспользованиеХарактеристикНоменклатуры = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "ИспользованиеХарактеристик");
// письмерова BSLR-1720 - падает при повторной связи товаров БЕЗ характеристик 26.04.2023
Если ИспользованиеХарактеристикНоменклатуры <> ПредопределенноеЗначение("Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать") Тогда
Характеристика.Наименование = НаименованиеХарактеристики;
Если ИспользованиеХарактеристикНоменклатуры = ПредопределенноеЗначение("Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры") Тогда
Характеристика.Владелец = Номенклатура;
ИначеЕсли ИспользованиеХарактеристикНоменклатуры = ПредопределенноеЗначение("Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры") Тогда
Характеристика.Владелец = ПараметрыСвязи.ВидНоменклатуры;
ИначеЕсли ИспользованиеХарактеристикНоменклатуры = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры Тогда
Характеристика.Владелец = ПараметрыСвязи.ВидНоменклатуры.ВладелецХарактеристик;
Иначе
Характеристика.Владелец = Номенклатура; // письмерова 30.01.2023 BSLR-1278 - падала при некорректных учетных данных
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Характеристика.Наименование) И ЗначениеЗаполнено(ПараметрыСвязи.Товар) Тогда
ОбщегоНазначения.СообщитьПользователю("Невозможно создать характеристику! Не заполнен код поставщика или отсутствуют размеры у товара: " + ПараметрыСвязи.Товар.Наименование);
Возврат;
КонецЕсли;
Попытка
Характеристика.Записать();
Исключение
ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки());
Возврат; //если делать возврат, то не обновятся связи и не перевяжется номенклатура
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Характеристика <> Неопределено Тогда //получение ссылки объекта
Характеристика = Характеристика.Ссылка;
КонецЕсли;
// ++ Бойков BSLR-2454
Если ТипЗнч(Характеристика) = Тип("СправочникСсылка.ХарактеристикиНоменклатуры") Тогда
ПараметрыСвязи.Вставить("НоваяХарактеристика", Характеристика);
Иначе
ПараметрыСвязи.Вставить("НоваяХарактеристика", Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
КонецЕсли;
// -- Бойков BSLR-2454
#КонецОбласти
УдалитьИнформациюПоСтаройСвязи(ПараметрыСвязи);
СвязатьНоменклатуруИТовар(Номенклатура, Характеристика, ПараметрыСвязи);
Если ПараметрыСвязи.ДобавлятьШК Тогда//LAShadrin BSLR-2548+
СкопироватьШтрихкод(Номенклатура, Характеристика, ПараметрыСвязи);
КонецЕсли;//LAShadrin BSLR-2548-
КонецПроцедуры
Процедура ОбработатьСвойстваТовара(Номенклатура, ЛичныйКабинет, ПараметрыСвязи, ТаблицаДопСвойств)
Товар = ПараметрыСвязи.Товар;
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_СопоставлениеСвойствНоменклатурыИТовара.РеквизитНоменклатуры КАК РеквизитНоменклатуры,
| топ_СопоставлениеСвойствНоменклатурыИТовара.СвойствоТовара КАК СвойствоТовара,
| ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(топ_СопоставлениеСвойствНоменклатурыИТовара.СвойствоТовара) = ТИП(СТРОКА)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ЭтоРеквизитТовара
|ПОМЕСТИТЬ ВТ_Свойства
|ИЗ
| РегистрСведений.топ_СопоставлениеСвойствНоменклатурыИТовара КАК топ_СопоставлениеСвойствНоменклатурыИТовара
|ГДЕ
| топ_СопоставлениеСвойствНоменклатурыИТовара.ЛичныйКабинет = &ЛичныйКабинет
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| топ_ТоварыТорговыхПлощадокЗначенияАтрибутовТоваровТП.Ссылка КАК Ссылка,
| топ_ТоварыТорговыхПлощадокЗначенияАтрибутовТоваровТП.НомерСтроки КАК НомерСтроки,
| топ_ТоварыТорговыхПлощадокЗначенияАтрибутовТоваровТП.Атрибут КАК Атрибут,
| топ_ТоварыТорговыхПлощадокЗначенияАтрибутовТоваровТП.Значение КАК Значение,
| ВТ_Свойства.РеквизитНоменклатуры КАК РеквизитНоменклатуры
|ИЗ
| Справочник.топ_ТоварыТорговыхПлощадок.ЗначенияАтрибутовТоваровТП КАК топ_ТоварыТорговыхПлощадокЗначенияАтрибутовТоваровТП
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Свойства КАК ВТ_Свойства
| ПО (топ_ТоварыТорговыхПлощадокЗначенияАтрибутовТоваровТП.Атрибут = ВТ_Свойства.СвойствоТовара)
|ГДЕ
| топ_ТоварыТорговыхПлощадокЗначенияАтрибутовТоваровТП.Ссылка = &Товар");
Запрос.УстановитьПараметр("ЛичныйКабинет", ЛичныйКабинет);
Запрос.УстановитьПараметр("Товар", Товар);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Значение = Выборка.Значение;
ЭтоДопРеквизит = Ложь;
Попытка
Реквизит = Номенклатура[Выборка.РеквизитНоменклатуры];
Исключение
ЭтоДопРеквизит = Истина;
Реквизит = неопределено;
КонецПопытки;
// ++ Бойков BSLR-2141
Если Выборка.РеквизитНоменклатуры = "Наименование" Тогда
ПараметрыСвязи.Вставить("НаименованиеЗаполненоЧерезСоответствиеСвойств", Истина);
КонецЕсли;
Если Выборка.РеквизитНоменклатуры = "Код" Тогда
ПараметрыСвязи.Вставить("КодЗаполненЧерезСоответствиеСвойств", Истина);
КонецЕсли;
Если Выборка.РеквизитНоменклатуры = "Наименование" Или Выборка.РеквизитНоменклатуры = "Код" Тогда
Если ПараметрыСвязи.ЭтоНовый = Истина Или
(ПараметрыСвязи.НеПерезаписыватьСтандартныеРеквизиты = Ложь И ПараметрыСвязи.ОбновлятьРеквизитыНоменклатуры) Тогда
// Стандартные реквизиты заполняем для новых объектов или при обновлении (выбраны соответствующие настройки)
Иначе
Продолжить;
КонецЕсли;
КонецЕсли;
// -- Бойков BSLR-2141
Если ОбщегоНазначения.ЗначениеСсылочногоТипа(Реквизит) Тогда
МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Реквизит);
ВариантПоиска = "";
Если ОбщегоНазначения.ВидОбъектаПоСсылке(Реквизит) = "Справочник" Тогда
МетаданныеОбъекта = Реквизит.Метаданные();
Если МетаданныеОбъекта.ДлинаНаименования > 0 Тогда
ЭлемеменСправочника = МенеджерОбъекта.НайтиПоНаименованию(Значение);
Если ЭлемеменСправочника.Пустая() Тогда
ЭлемеменСправочника_Объект = МенеджерОбъекта.СоздатьЭлемент();
ЭлемеменСправочника_Объект.Наименование = Значение;
ЭлемеменСправочника_Объект.ОбменДанными.Загрузка = Истина;
ЭлемеменСправочника_Объект.Записать();
ЭлемеменСправочника = ЭлемеменСправочника_Объект.Ссылка;
КонецЕсли;
ИначеЕсли МетаданныеОбъекта.ДлинаКода > 0 Тогда
СсылкаНаЭлемент = МенеджерОбъекта.НайтиПоКоду(Значение);
Если ЭлемеменСправочника.Пустая() Тогда
ЭлемеменСправочника_Объект = МенеджерОбъекта.СоздатьЭлемент();
ЭлемеменСправочника_Объект.Код = Значение;
ЭлемеменСправочника_Объект.ОбменДанными.Загрузка = Истина;
Если ЭлемеменСправочника_Объект.Код <> "" Тогда
ЭлемеменСправочника_Объект.Записать();
ЭлемеменСправочника = ЭлемеменСправочника_Объект.Ссылка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если НЕ ЭлемеменСправочника.Пустая() Тогда
Номенклатура[Выборка.РеквизитНоменклатуры] = ЭлемеменСправочника;
КонецЕсли;
КонецЕсли;
Если ОбщегоНазначения.ВидОбъектаПоСсылке(Реквизит) = "Перечисление" Тогда
КонецЕсли;
ИначеЕсли ЭтоДопРеквизит Тогда
ДопРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", Выборка.РеквизитНоменклатуры);
НоваяСтрока = ТаблицаДопСвойств.Добавить();
НоваяСтрока.Свойство = ДопРеквизит;
НоваяСтрока.Значение = Значение;
Иначе
Если ТипЗНЧ(Реквизит) = Тип("Число") Тогда
Значение = топ_ОбщийМодульСервер.ПреобразоватьСтрокуВЧисло(Значение);
КонецЕсли;
Номенклатура[Выборка.РеквизитНоменклатуры] = Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПроверитьЗаполнениеПредопределенныеЭлементыИРегламентныеЗаданияПриНачалеРаботыСистемы() Экспорт
УстановитьПривилегированныйРежим(Истина);// БИТ_Козырев ++ 2022-06-09
//БИТ Симонова 17.06.2022 (
РасширенияМассив = РасширенияКонфигурации.Получить(Новый Структура("Имя", "БИТ_УправлениеМаркетплейсами"));
ПерезаписыватьСправочники = Ложь;
НачальноеЗаполнение = Ложь;
Если РасширенияМассив.Количество() Тогда
//проверяем версию
АктуальнаяВерсияРасширения = РасширенияМассив[0].Версия;
СохраненнаяВерсияРасширения = Константы.топ_ТекущаяВерсияРасширения.Получить();
НачальноеЗаполнение = Не ЗначениеЗаполнено(СохраненнаяВерсияРасширения); //Чупраков А.Н., 16.05.23, передать команду на создание справочников
Если НЕ АктуальнаяВерсияРасширения = СохраненнаяВерсияРасширения Тогда
ПерезаписыватьСправочники = Истина;
//записываем текущую версию
КонстантаВерсияРасширения = Константы.топ_ТекущаяВерсияРасширения.СоздатьМенеджерЗначения();
КонстантаВерсияРасширения.Значение = АктуальнаяВерсияРасширения;
КонстантаВерсияРасширения.Записать();
//> БИТ - обработчики_обновления - КондращенкоМ
//выполняем обработчики обновления
Если ЗначениеЗаполнено(СохраненнаяВерсияРасширения) Тогда
// ++ Бойков BSLR-2579. Передаем номер установленной версии расширения, чтобы не выполнять обработчики более старших релизов
топ_ОбновлениеИнформационнойБазы.ВыполнитьОбновление(СохраненнаяВерсияРасширения, АктуальнаяВерсияРасширения);
// -- Бойков BSLR-2579
КонецЕсли;
//< БИТ - обработчики_обновления - КондращенкоМ
КонецЕсли;
// ++ Бойков BSLR-2129
Если НачальноеЗаполнение Тогда
ОбработкаСтартовыйПомощник = Обработки.топ_СтартовыйПомощникSeller.Создать();
ОбработкаСтартовыйПомощник.ЗаполнитьРегистрИспользованиеУправлениеМаркетплейсами();
КонецЕсли;
// -- Бойков BSLR-2129
КонецЕсли;
Если ПерезаписыватьСправочники Тогда
ОбработкаСтартовыйПомощник = Обработки.топ_СтартовыйПомощникSeller.Создать();
ОбработкаСтартовыйПомощник.ЗаполнитьРегламентныеПроцедурыПоУмолчаниюНаСервере();
ОбработкаСтартовыйПомощник.ЗагрузитьСправочники(НачальноеЗаполнение); //Чупраков А.Н., 16.05.23, при старте записываем справочники
КонецЕсли;
//БИТ Симонова 17.06.2022 )
УстановитьПривилегированныйРежим(Ложь); // БИТ_Козырев ++ 2022-06-09
КонецПроцедуры
//-- БИТ_Козырев при переносе доработок в Расширение топ_
Функция ПолучитьВыборкуОдногоЭлементаСправочника(Ссылка, ИмяСсылки = Неопределено) Экспорт
МТД = Ссылка.Метаданные();
ИмяСправочника = МТД.Имя;
ТекстПолейЗапроса = ИмяСправочника + ".Ссылка" + ?(ЗначениеЗаполнено(ИмяСсылки), " КАК " + ИмяСсылки, "") + ",";
Если МТД.Иерархический тогда
ТекстПолейЗапроса = ТекстПолейЗапроса + Символы.ПС + " " + ИмяСправочника + ".Родитель,";
Конецесли;
ТекстПолейЗапроса = ТекстПолейЗапроса + Символы.ПС + " " + ИмяСправочника + ".ПометкаУдаления";
Для Каждого Реквизит Из МТД.Реквизиты Цикл
ТекстПолейЗапроса = ТекстПолейЗапроса + ",
| " + ИмяСправочника + "." + Реквизит.Имя;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| " + ТекстПолейЗапроса + "
| ИЗ
| Справочник." + ИмяСправочника + " КАК " + ИмяСправочника + "
|ГДЕ
| " + ИмяСправочника + ".Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Возврат Запрос.Выполнить();
КонецФункции
Функция ПолучитьМатрицуХарактеристик(УровеньХарактеристик = Неопределено, ВариантПолученияДанных = Неопределено, КатегорияТовара = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| топ_КатегорииТоваровWB.РеквизитМаркетплейс КАК ХарактеристикаMP,
| топ_КатегорииТоваровWB.ВариантПолученияДанных КАК ВариантПолученияДанных,
| топ_КатегорииТоваровWB.ПутьКДанным КАК ПутьКДанным,
| топ_КатегорииТоваровWB.Обязательный КАК Обязательный,
| топ_КатегорииТоваровWB.value КАК value,
| топ_КатегорииТоваровWB.units КАК units,
| топ_КатегорииТоваровWB.isNumber КАК isNumber,
| топ_КатегорииТоваровWB.useOnlyDictionaryValues КАК useOnlyDictionaryValues,
| топ_КатегорииТоваровWB.maxCount КАК maxCount,
| топ_КатегорииТоваровWB.ИдентификаторХарактеристики КАК ИдентификаторХарактеристики,
| топ_КатегорииТоваровWB.ЭтоРеквизитКарточки КАК ЭтоРеквизитКарточки
|ИЗ
| Справочник.топ_КатегорииТоваровWB.СоответствиеХарактеристикWBИРеквизитовНоменклатуры КАК топ_КатегорииТоваровWB
|ГДЕ
| ВЫБОР
| КОГДА &ВсеУровни
| ТОГДА ИСТИНА
| ИНАЧЕ топ_КатегорииТоваровWB.УровеньХарактеристики = &УровеньХарактеристик
| КОНЕЦ
| И ВЫБОР
| КОГДА &ВсеВарианты
| ТОГДА ИСТИНА
| ИНАЧЕ топ_КатегорииТоваровWB.ВариантПолученияДанных = &ВариантПолученияДанных
| КОНЕЦ
| И топ_КатегорииТоваровWB.Ссылка = &КатегорияТовара
|
|УПОРЯДОЧИТЬ ПО
| ХарактеристикаMP";
Запрос.УстановитьПараметр("ВсеУровни", УровеньХарактеристик = Неопределено);
Запрос.УстановитьПараметр("УровеньХарактеристик", УровеньХарактеристик);
Запрос.УстановитьПараметр("ВсеВарианты", ВариантПолученияДанных = Неопределено);
Запрос.УстановитьПараметр("ВариантПолученияДанных", ВариантПолученияДанных);
Запрос.УстановитьПараметр("КатегорияТовара", КатегорияТовара);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
//> БИТ - BSLR-781 - КондращенкоМ
Функция ПолучитьМатрицуХарактеристикOZON(Категория) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Категория", Категория);
Запрос.Текст =
"ВЫБРАТЬ
| топ_КатегорииТоваровOZONХарактеристики.Ссылка КАК Ссылка,
| топ_КатегорииТоваровOZONХарактеристики.Характеристика КАК Характеристика,
| топ_КатегорииТоваровOZONХарактеристики.Характеристика.Код КАК ХарактеристикаКод,
| топ_КатегорииТоваровOZONХарактеристики.Характеристика.НаборЗначений КАК НаборЗначений,
| топ_КатегорииТоваровOZONХарактеристики.ВариантПолученияДанных КАК ВариантПолученияДанных,
| топ_КатегорииТоваровOZONХарактеристики.ПутьКДанным КАК ПутьКДанным,
| топ_КатегорииТоваровOZONХарактеристики.Обязательная КАК Обязательная,
| топ_КатегорииТоваровOZONХарактеристики.НеИспользовать КАК НеИспользовать
|ИЗ
| Справочник.топ_КатегорииТоваровOZON.Характеристики КАК топ_КатегорииТоваровOZONХарактеристики
|ГДЕ
| топ_КатегорииТоваровOZONХарактеристики.Ссылка = &Категория
| И топ_КатегорииТоваровOZONХарактеристики.Ссылка.Используется
| И топ_КатегорииТоваровOZONХарактеристики.Ссылка.ЯвляетсяТоваром
| И НЕ топ_КатегорииТоваровOZONХарактеристики.ПутьКДанным = НЕОПРЕДЕЛЕНО";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Функция ПолучитьТаблицуСоответствияОбщихРеквизитовOZON(Категория) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Категория", Категория);
Запрос.Текст =
"ВЫБРАТЬ
| топ_КатегорииТоваровOZONОбщиеРеквизиты.Ссылка КАК Ссылка,
| топ_КатегорииТоваровOZONОбщиеРеквизиты.РеквизитOZON КАК РеквизитOZON,
| топ_КатегорииТоваровOZONОбщиеРеквизиты.ВариантПолученияДанных КАК ВариантПолученияДанных,
| топ_КатегорииТоваровOZONОбщиеРеквизиты.ПутьКДанным КАК ПутьКДанным
|ИЗ
| Справочник.топ_КатегорииТоваровOZON.ОбщиеРеквизиты КАК топ_КатегорииТоваровOZONОбщиеРеквизиты
|ГДЕ
| топ_КатегорииТоваровOZONОбщиеРеквизиты.Ссылка = &Категория
| И топ_КатегорииТоваровOZONОбщиеРеквизиты.Ссылка.Используется
| И топ_КатегорииТоваровOZONОбщиеРеквизиты.Ссылка.ЯвляетсяТоваром
| И НЕ топ_КатегорииТоваровOZONОбщиеРеквизиты.ПутьКДанным = НЕОПРЕДЕЛЕНО";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
//< БИТ - BSLR-781 - КондращенкоМ
Функция ПолучитьКартинкиНоменклатуры(Номенклатура) Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураПрисоединенныеФайлы.Ссылка КАК Ссылка
|ИЗ
| Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
|ГДЕ
| НоменклатураПрисоединенныеФайлы.ВладелецФайла = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Возврат Запрос.Выполнить();
КонецФункции
//БИТ Смирнов А.П. 13.12.2022 BSLR-1057 (
Процедура УстановитьСвязиКарточекИНоменклатуры_СозданиеОбщейПоЦветамИРазмерамWB(ЛичныйКабинет, ВидНоменклатуры) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| топ_ТоварыТорговыхПлощадок.Ссылка КАК Товар,
| топ_ТоварыТорговыхПлощадок.ImtID КАК ImtID,
| топ_ТоварыТорговыхПлощадок.КодПоставщика КАК КодПоставщика,
| топ_РазмерыТоваровWB.Ссылка КАК РазмерWB,
| топ_ТоварыТорговыхПлощадок.АртикулЦвета КАК АртикулЦвета
|ПОМЕСТИТЬ ВТТовары
|ИЗ
| Справочник.топ_РазмерыТоваровWB КАК топ_РазмерыТоваровWB
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.топ_ТоварыТорговыхПлощадок КАК топ_ТоварыТорговыхПлощадок
| ПО топ_РазмерыТоваровWB.Владелец = топ_ТоварыТорговыхПлощадок.Ссылка
|ГДЕ
| топ_ТоварыТорговыхПлощадок.ЛичныйКабинет = &ЛичныйКабинет
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТТовары.Товар КАК Товар,
| ВТТовары.ImtID КАК ImtID,
| ВТТовары.КодПоставщика КАК КодПоставщика,
| ВТТовары.РазмерWB КАК РазмерWB,
| ВТТовары.АртикулЦвета КАК АртикулЦвета,
| топ_СоответствиеТоваров.Номенклатура КАК Номенклатура
|ИЗ
| ВТТовары КАК ВТТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
| ПО ВТТовары.Товар = топ_СоответствиеТоваров.Товар
| И ВТТовары.РазмерWB = топ_СоответствиеТоваров.РазмерWB
|
|УПОРЯДОЧИТЬ ПО
| ImtID
|ИТОГИ
| МАКСИМУМ(Номенклатура)
|ПО
| ImtID,
| Товар";
Запрос.УстановитьПараметр("ЛичныйКабинет", ЛичныйКабинет);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаImtID = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ПараметрыСвязи = Новый Структура();
ПараметрыСвязи.Вставить("ЛичныйКабинет" , ЛичныйКабинет);
ПараметрыСвязи.Вставить("ОбновлятьРеквизитыНоменклатуры", Истина);
ПараметрыСвязи.Вставить("УникальноеНаименование" , Истина);
ПараметрыСвязи.Вставить("ВидНоменклатуры" , ВидНоменклатуры);
ПараметрыСвязи.Вставить("ИспользуютсяХарактеристики" , топ_ОбщийВызовСервера.ИспользуютсяХарактеристики());
ПараметрыСвязи.Вставить("СоздаватьНоменклатуру" , Истина);
НоменклатураПустаяСсылка = ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка");
ХарактеристикаПустаяСсылка = ПредопределенноеЗначение("Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка");
Пока ВыборкаImtID.Следующий() Цикл
ПараметрыСвязи.Вставить("НоваяНоменклатура" , НоменклатураПустаяСсылка);
ПараметрыСвязи.Вставить("НоваяХарактеристика", ХарактеристикаПустаяСсылка);
Номенклатура = Неопределено;
Если ЗначениеЗаполнено(ВыборкаImtID.Номенклатура) Тогда
Номенклатура = ВыборкаImtID.Номенклатура;
КонецЕсли;
ВыборкаТовар = ВыборкаImtID.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаТовар.Следующий() Цикл
ВыборкаРазмер = ВыборкаТовар.Выбрать();
Пока ВыборкаРазмер.Следующий() Цикл
ПараметрыСвязи.Вставить("Товар" , ВыборкаРазмер.Товар);
ПараметрыСвязи.Вставить("РазмерWB" , ВыборкаРазмер.РазмерWB);
ПараметрыСвязи.Вставить("АртикулЦвета", ВыборкаРазмер.АртикулЦвета);
Если ЗначениеЗаполнено(Номенклатура) Тогда
ПараметрыСвязи.Вставить("НоваяНоменклатура", Номенклатура);
КонецЕсли;
Номенклатура = топ_ОбщийМодульСервер.СоздатьНоменклатуруНаОснованииТовара(ПараметрыСвязи);
КонецЦикла;
КонецЦикла;
//Прервать; //////////////////////////////////////////////
КонецЦикла;
КонецПроцедуры
//БИТ Смирнов А.П. 13.12.2022 )
#КонецОбласти
#Область Операции_с_заказами_торговых_площадок
&НаСервере
Функция РассчитатьОстатокВремениНаДоставку(МаксимальноеВремяДоставки, ДатаЗаказа, ВключаяСекунды = Истина) Экспорт
Если МаксимальноеВремяДоставки = 0 Тогда
Возврат "--:--";
КонецЕсли;
МаксимальныйЛимит = МаксимальноеВремяДоставки * 3600;
ВсегоСекунд = МаксимальныйЛимит - (ТекущаяДата() - ДатаЗаказа);
Если ВсегоСекунд < 0 Тогда
Возврат "--:--";
КонецЕсли;
Часов = Цел(ВсегоСекунд / 3600);
Минут = Цел((ВсегоСекунд - Часов * 3600) / 60 );
Минут = ?(Минут < 0, -Минут, Минут);
ВремяТекстом = Формат(Часов, "ЧЦ=2; ЧН=0; ЧВН=") + ":" + Формат(Минут, "ЧЦ=2; ЧН=0; ЧВН=");
Если ВключаяСекунды Тогда
Секунд = ВсегоСекунд - (Часов * 3600) - (Минут * 60);
Секунд = ?(Секунд < 0, -Секунд, Секунд);
ВремяТекстом = ВремяТекстом + ":" + Формат(Секунд, "ЧЦ=2; ЧН=0; ЧВН=");
КонецЕсли;
Возврат ВремяТекстом;
КонецФункции
&НаСервере
Функция ВернутьМаксимальноеВремяДоставки(ЛичныйКабинет,ДатаЗаказа,ДатаДоставки) Экспорт
Если ЛичныйКабинет.Пустая() Тогда
Возврат 0;
КонецЕсли;
Если ДатаДоставки = Дата(1,1,1) Тогда
МаксимальноеВремяДоставки = ЛичныйКабинет.МаксимальноеВремяДоставки;
Иначе
МаксимальноеВремяДоставки = (ДатаДоставки - ДатаЗаказа) / 3600;
КонецЕсли;
Возврат МаксимальноеВремяДоставки;
КонецФункции
&НаСервере
Функция ВернутьДатуДоставки(СсылкаНаДокумент) Экспорт
Если СсылкаНаДокумент.ДатаДоставки = Дата(1,1,1) Тогда
Возврат СсылкаНаДокумент.ДатаЗаказа + (СсылкаНаДокумент.ЛичныйКабинет.МаксимальноеВремяДоставки * 3600);
Иначе
Если СсылкаНаДокумент.ЛичныйКабинет.ТорговаяПлощадка = ПредопределенноеЗначение("Перечисление.топ_ТорговыеПлощадки.СберМегаМаркет") Тогда
Возврат СсылкаНаДокумент.ДатаОтгрузкиС
Иначе
Возврат СсылкаНаДокумент.ДатаДоставки;
КонецЕсли;
КонецЕсли;
КонецФункции
&НаСервере
Функция ВернутьЛогистическуюЭтикетку(ЗаказТорговойПлощадки) Экспорт
Структура = Новый Структура("Штрихкод, ID, ТабличныйДокумент");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_ЛогистическиеЭтикетки.Хранилище КАК Хранилище,
| топ_ЛогистическиеЭтикетки.Штрихкод КАК Штрихкод,
| топ_ЛогистическиеЭтикетки.ПутьКФайлу КАК ПутьКФайлу,
| топ_ЛогистическиеЭтикетки.СохраненоВБазе КАК СохраненоВБазе,
| топ_ЛогистическиеЭтикетки.ID КАК ID
|ИЗ
| РегистрСведений.топ_ЛогистическиеЭтикетки КАК топ_ЛогистическиеЭтикетки
|ГДЕ
| топ_ЛогистическиеЭтикетки.ЗаказТорговойПлощадки = &ЗаказТорговойПлощадки";
Запрос.УстановитьПараметр("ЗаказТорговойПлощадки", ЗаказТорговойПлощадки);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Структура.Штрихкод = Выборка.Штрихкод;
Структура.ID = Выборка.ID;
ТабДок = Новый ТабличныйДокумент;
ТабДок.ПолеСверху = 1;
ТабДок.ПолеСнизу = 1;
ТабДок.ПолеСлева = 1;
ТабДок.ПолеСправа = 1;
ТабДок.РазмерСтраницы = "Custom";
//BSLR-4027, Чупраков А.Н., 31.10.24, макет через БСП
//Макет = Документы.топ_ЗаказТорговойПлощадки.ПолучитьМакет("ПФ_MXL_ЛогЭтикетка");
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.топ_ЗаказТорговойПлощадки.ПФ_MXL_ЛогЭтикетка");
ОбластьПечати = Макет.ПолучитьОбласть("ОбластьГор|ОбластьВерт");
Если ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
ТабДок.ШиринаСтраницы = 55;
ТабДок.ВысотаСтраницы = 35;
Иначе
ТабДок.ШиринаСтраницы = 75;
ТабДок.ВысотаСтраницы = 120;
КонецЕсли;
Рисунок = ОбластьПечати.Рисунки[0];
Если Выборка.СохраненоВБазе Тогда
Рисунок.Картинка = Новый Картинка(Base64Значение(Выборка.Хранилище.Получить()));
Иначе
Рисунок.Картинка = Новый Картинка(Выборка.ПутьКФайлу);
КонецЕсли;
Рисунок.Ширина = ТабДок.ШиринаСтраницы;
Рисунок.Высота = ТабДок.ВысотаСтраницы;
Рисунок.РазмерКартинки = РазмерКартинки.Растянуть;
ТабДок.Вывести(ОбластьПечати);
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЛогЭтикетка";
Структура.ТабличныйДокумент = ТабДок;
КонецЕсли;
Возврат Структура;
КонецФункции
&НаСервере
Функция ВернутьПодчиненныйЗаказКлиента(ЗаказТорговойПлощадки) Экспорт
//БИТ Смирнов А.П. 19.10.2022 BSLR-791 (
//Запрос = Новый Запрос;
//Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
// | топ_СоответствиеЗаказов.ЗаказКлиента КАК ЗаказКлиента
// |ИЗ
// | РегистрСведений.топ_СоответствиеЗаказов КАК топ_СоответствиеЗаказов
// |ГДЕ
// | топ_СоответствиеЗаказов.ЗаказТорговойПлощадки = &ЗаказТорговойПлощадки
// | И НЕ топ_СоответствиеЗаказов.ЗаказКлиента.ПометкаУдаления";
//
//Запрос.УстановитьПараметр("ЗаказТорговойПлощадки", ЗаказТорговойПлощадки);
//
//Выборка = Запрос.Выполнить().Выбрать();
//Выборка.Следующий();
//
//Возврат Выборка.ЗаказКлиента;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_СоответствиеЗаказов.ЗаказКлиента КАК ЗаказКлиента
|ИЗ
| РегистрСведений.топ_СоответствиеЗаказов КАК топ_СоответствиеЗаказов
|ГДЕ
| топ_СоответствиеЗаказов.ЗаказТорговойПлощадки = &ЗаказТорговойПлощадки
| И НЕ топ_СоответствиеЗаказов.ЗаказКлиента.ПометкаУдаления";
Запрос.УстановитьПараметр("ЗаказТорговойПлощадки", ЗаказТорговойПлощадки);
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ЗаказКлиента");
//БИТ Смирнов А.П. 19.10.2022 )
КонецФункции
&НаСервере
Функция ВернутьВидЗаказаКлиента()
ПозицияРазделителя = СтрНайти(Метаданные.Имя,"_");
Если ПозицияРазделителя > 0 Тогда
ИмяОригинальнойКонфигурации = Лев(Метаданные.Имя, ПозицияРазделителя-1);
Иначе
ИмяОригинальнойКонфигурации = Метаданные.Имя;
КонецЕсли;
Если ИмяОригинальнойКонфигурации = "УправлениеНебольшойФирмой" Тогда
Возврат "ЗаказПокупателя";
Иначе
Возврат "ЗаказКлиента";
КонецЕсли;
КонецФункции
&НаСервере
Функция ВернутьСтруктуруНакопленныхДанных()
Возврат Новый Структура("Успешно,ОписаниеОшибки,Документ,Статус,УнифицированныйСтатус",Ложь,"")
КонецФункции
&НаСервере
Функция ЗаписатьПодчиненныйДокумент(ЗаказТорговойПлощадки, ЗаказКлиента) Экспорт
Если ТипЗнч(ЗаказТорговойПлощадки) = Тип("ДокументСсылка.топ_ЗаказТорговойПлощадки") Тогда
МассивЗаказовТП = Новый Массив;
МассивЗаказовТП.Добавить(ЗаказТорговойПлощадки);
ИначеЕсли ТипЗнч(ЗаказТорговойПлощадки) = Тип("Массив") Тогда
МассивЗаказовТП = ЗаказТорговойПлощадки;
Иначе
Возврат Неопределено;
КонецЕсли;
Для каждого ЗаказТП из МассивЗаказовТП Цикл
Если НЕ ЗначениеЗаполнено(ЗаказКлиента) Тогда
Продолжить;
КонецЕсли;
ЗаписьРегистра = РегистрыСведений.топ_СоответствиеЗаказов.СоздатьМенеджерЗаписи();
ЗаписьРегистра.ЗаказТорговойПлощадки = ЗаказТП;
ЗаписьРегистра.ЗаказКлиента = ЗаказКлиента;
ЗаписьРегистра.Записать(Истина);
КонецЦикла;
КонецФункции
&НаСервере
Функция СоздатьПодчиненныйДокумент(ЗаказТорговойПлощадки, Выборка, НакопленныеДанные)
Операция = Выборка.Операция;
Если ПустаяСтрока(Операция.ВидСоздаваемогоДокумента) Тогда
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: " + Операция + " не задан вид создаваемого документа";
Возврат Ложь;
КонецЕсли;
#Область Заказ_клиента
Если Операция.ВидСоздаваемогоДокумента = "ЗаказКлиента" Тогда
Если ЗначениеЗаполнено(Выборка.ЗаказКлиента) Тогда
ЗаказКлиента = Выборка.ЗаказКлиента;
Иначе
ЗаказКлиента = ВернутьПодчиненныйЗаказКлиента(ЗаказТорговойПлощадки);
КонецЕсли;
Если ЗначениеЗаполнено(ЗаказКлиента) Тогда
Если Операция.ПровестиДокумент и НЕ ЗаказКлиента.Проведен Тогда
ЗаказКлиента_Объект = ЗаказКлиента.ПолучитьОбъект();
Попытка
ЗаказКлиента_Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "Не удалось провести: " + ОписаниеОшибки();
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Иначе
ЛичныйКабинет = ЗаказТорговойПлощадки.ЛичныйКабинет;
ВидЗаказаКлиента = ВернутьВидЗаказаКлиента();
ЗаказКлиента_Объект = топ_ОбщийВызовСервера.СоздатьЗаписатьТиповойЗаказПокупателя(ЛичныйКабинет, ЗаказТорговойПлощадки, НакопленныеДанные, Операция);
Если ЗаказКлиента_Объект <> Неопределено Тогда
Если Операция.ПровестиДокумент Тогда
РежимЗаписи = РежимЗаписиДокумента.Проведение;
Иначе
РежимЗаписи = РежимЗаписиДокумента.Запись;
КонецЕсли;
Попытка
ЗаказКлиента_Объект.Записать(РежимЗаписи);
Исключение
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "Не удалось записать: "+ОписаниеОшибки();
Возврат Ложь;
КонецПопытки;
ЗаказКлиента = ЗаказКлиента_Объект.Ссылка;
ЗаписатьПодчиненныйДокумент(ЗаказТорговойПлощадки, ЗаказКлиента);
Иначе
Возврат Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
#КонецОбласти
НакопленныеДанные.Успешно = Истина;
НакопленныеДанные.Документ = ЗаказКлиента;
Возврат Истина;
КонецФункции
&НаСервере
Функция ИзменитьСтатусЗаказаКлиента(ЗаказТорговойПлощадки, Операция, НакопленныеДанные)
Если ПустаяСтрока(Операция.СтатусЗаказаКлиента) Тогда
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" не задан вид нового статуса";
Возврат Ложь;
КонецЕсли;
ЗаказКлиента = НакопленныеДанные.Документ;
// ++ БИТ Сергеев BSLR-997
//Если ЗаказКлиента = Неопределено Тогда
// ЗаказКлиента = топ_ОбщийМодульСервер.ВернутьПодчиненныйЗаказКлиента(ЗаказТорговойПлощадки);
//КонецЕсли;
Если ЗаказКлиента = Неопределено Тогда
ЗаказыКлиента = топ_ОбщийМодульСервер.ВернутьПодчиненныйЗаказКлиента(ЗаказТорговойПлощадки);
Иначе
ЗаказыКлиента = Новый Массив(1);
ЗаказыКлиента[0] = ЗаказКлиента;
КонецЕсли;
//Если НЕ ЗначениеЗаполнено(ЗаказКлиента) Тогда
Если НЕ ЗаказыКлиента.Количество() Тогда
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" при смене статуса не найден заказ клиента";
Возврат Ложь;
КонецЕсли;
НачатьТранзакцию();
Для Каждого ЗаказКлиента Из ЗаказыКлиента Цикл
// -- БИТ Сергеев BSLR-997
ЗаписьРегистра = РегистрыСведений.топ_СтатусыЗаказовКлиента.СоздатьМенеджерЗаписи();
ЗаписьРегистра.Период = ТекущаяДата();
ЗаписьРегистра.ЗаказКлиента = ЗаказКлиента;
ЗаписьРегистра.Статус = Операция.СтатусЗаказаКлиента;
Попытка
ЗаписьРегистра.Записать(Истина);
Исключение
// ++ БИТ Сергеев BSLR-997
ОтменитьТранзакцию();
// -- БИТ Сергеев BSLR-997
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" при смене статуса обнаружена ошибка:"+ОписаниеОшибки();
Возврат НакопленныеДанные;
КонецПопытки;
// ++ БИТ Сергеев BSLR-997
КонецЦикла;
ЗафиксироватьТранзакцию();
// -- БИТ Сергеев BSLR-997
НакопленныеДанные.Успешно = Истина;
НакопленныеДанные.Статус = Операция.СтатусЗаказаКлиента;
Возврат Истина;
КонецФункции
&НаСервере
Функция ВернутьСтатусЗаказаНаПорталеПоУнифицированномуСтатусу(ЛичныйКабинет, УнифицированныйСтатус)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
| топ_СтатусыЗаказовНаТорговыхПлощадках.Ссылка КАК Ссылка
|ИЗ
| Справочник.топ_СтатусыЗаказовНаТорговыхПлощадках КАК топ_СтатусыЗаказовНаТорговыхПлощадках
|ГДЕ
| топ_СтатусыЗаказовНаТорговыхПлощадках.НаименованиеДляПоиска = &СобственныйСтатус
| И топ_СтатусыЗаказовНаТорговыхПлощадках.ТорговаяПлощадка = &ТорговаяПлощадка
| И НЕ топ_СтатусыЗаказовНаТорговыхПлощадках.ПометкаУдаления";
Запрос.УстановитьПараметр("СобственныйСтатус", УнифицированныйСтатус);
Запрос.УстановитьПараметр("ТорговаяПлощадка", ЛичныйКабинет.ТорговаяПлощадка);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецФункции
&НаСервере
Функция ВернутьПараметрыЗапросаИсходяИзКатегории(Операция, ЛичныйКабинет, ЗапросКСерверу, ЗаказТорговойПлощадки, Отказ)
ПараметрыЗапроса = Новый Структура();
Если ЗапросКСерверу.КатегорияЗапроса = Справочники.топ_КатегорииЗапросов.НайтиПоРеквизиту("НаименованиеДляПоиска","ЗапросНаСменуСтатуса") Тогда
Если ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
СтатусЗаказаНаПортале = ВернутьСтатусЗаказаНаПорталеПоУнифицированномуСтатусу(ЛичныйКабинет, Операция.УнифицированныйСтатус);
Если ЗначениеЗаполнено(СтатусЗаказаНаПортале) Тогда
ПараметрыЗапроса.Вставить("orderId", ЗаказТорговойПлощадки.НомерЗаказа);
ПараметрыЗапроса.Вставить("Status" , СтатусЗаказаНаПортале.ID);
Иначе
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЗапросКСерверу.КатегорияЗапроса = Справочники.топ_КатегорииЗапросов.НайтиПоРеквизиту("НаименованиеДляПоиска","ЗапросЛогЭтикеток") Тогда
Если ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
Массив = Новый Массив();
Массив.Добавить(Число(ЗаказТорговойПлощадки.НомерЗаказа));
ПараметрыЗапроса.Вставить("Array", Массив);
КонецЕсли;
Если ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.OZON Тогда
Массив = Новый Массив();
Массив.Добавить(ЗаказТорговойПлощадки.НомерОтправления);
ПараметрыЗапроса.Вставить("Array", Массив);
КонецЕсли;
Если ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.ЯндексМаркет Тогда
Массив = Новый Массив();
Массив.Добавить(ЗаказТорговойПлощадки.НомерЗаказа);
ПараметрыЗапроса.Вставить("Array", Массив);
КонецЕсли;
КонецЕсли;
Возврат ПараметрыЗапроса;
КонецФункции
&НаСервере
Функция УстановитьСтатусЗаказаТорговойПЛощадки(ЗаказТорговойПлощадки, Статус)
Если ТипЗНЧ(Статус) = Тип("ПеречислениеСсылка.топ_УнифицированныеСтатусыТорговыхПлощадок") Тогда
СтатусТорговойПлощадки = ВернутьСтатусЗаказаНаПорталеПоУнифицированномуСтатусу(ЗаказТорговойПлощадки.ЛичныйКабинет, Статус);
Иначе
СтатусТорговойПлощадки = Статус;
Конецесли;
ЗаписьРегистра = РегистрыСведений.топ_СтатусыЗаказовТорговойПлощадки.СоздатьМенеджерЗаписи();
ЗаписьРегистра.ЗаказТорговойПлощадки = ЗаказТорговойПлощадки;
ЗаписьРегистра.Период = ТекущаяДата();
ЗаписьРегистра.Статус = Статус;
Попытка
ЗаписьРегистра.Записать(Истина);
РезультатСменыСтатуса = Истина;
Исключение
РезультатСменыСтатуса = Ложь;
КонецПопытки;
Возврат РезультатСменыСтатуса;
КонецФункции
&НаСервере
Функция СохранитьДвоичныеДанныеВКаталог(НомерЗаказа, Каталог, ДанныеBase64, ФорматФайла)
РезультатЗаписи = Истина;
ID = Новый УникальныйИдентификатор();
ИмяФайла = НомерЗаказа+"_"+СокрЛП(ID)+"."+ФорматФайла;
ДвоичныеДанные = Base64Значение(ДанныеBase64);
ИмяВременногоФайла = Каталог+"\"+ИмяФайла;
Попытка
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Исключение
// ++ Бойков BSLR-1972
ОбщегоНазначения.СообщитьПользователю("Ошибка сохранения этикетки в каталог: " + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ИмяВременногоФайла = Ложь;
// -- Бойков BSLR-1972
РезультатЗаписи = Ложь;
КонецПопытки;
Возврат ИмяВременногоФайла;
КонецФункции
&НаСервере
Функция КонвертироватьPDFвJPG(ДвоичныеДанные) Экспорт //БИТ Смирнов А.П. 05.09.2022 BSLR-648
// ++ Бойков BSLR-2906
УстановитьПривилегированныйРежим(Истина);
ПутьКПриложению = Константы.топ_ПутьКПриложениюКонвертацииИзображений.Получить();
УстановитьПривилегированныйРежим(Ложь);
// -- Бойков BSLR-2906
Если ПустаяСтрока(ПутьКПриложению) Тогда
Возврат Неопределено;
КонецЕсли;
ФайлПриложения = Новый Файл(ПутьКПриложению);
Если НЕ ФайлПриложения.Существует() Тогда
Возврат Неопределено;
КонецЕсли;
ИмяВременногойФайлаPDF = ПолучитьИмяВременногоФайла("PDF");
Попытка
ДвоичныеДанные.Записать(ИмяВременногойФайлаPDF);
Исключение
Возврат Неопределено;
КонецПопытки;
ИмяКонвертированногоФайлаJPG = ПолучитьИмяВременногоФайла("JPG");
ЗапуститьПриложение("""" + ПутьКПриложению + """ -density 200 "+ИмяВременногойФайлаPDF+" "+ИмяКонвертированногоФайлаJPG,,Истина);
ВременныйФайлPDF = Новый Файл(ИмяКонвертированногоФайлаJPG);
//▼ Чупраков А.Н. 08.08.22
МассивДвоичныхДанных = Новый Массив;
Если ВременныйФайлPDF.Существует() Тогда
Возврат МассивДвоичныхДанных.Добавить(Base64Строка(Новый ДвоичныеДанные(ВременныйФайлPDF.ПолноеИмя)));
Иначе
ИмяИсходногоФайлаБезРасширения = СтрЗаменить(ИмяКонвертированногоФайлаJPG, КаталогВременныхФайлов(), "");
ИмяИсходногоФайлаБезРасширения = СтрЗаменить(ИмяИсходногоФайлаБезРасширения, ".JPG", "");
РезультатПоиска = НайтиФайлы(КаталогВременныхФайлов(), ИмяИсходногоФайлаБезРасширения + "-*.JPG", Ложь);
Для Каждого СтрокаПоиска Из РезультатПоиска Цикл
Если СтрокаПоиска.Существует() Тогда
МассивДвоичныхДанных.Добавить(Base64Строка(Новый ДвоичныеДанные(СтрокаПоиска.ПолноеИмя)));
КонецЕсли;
КонецЦикла;
Если МассивДвоичныхДанных.Количество() <> 0 Тогда
Возврат МассивДвоичныхДанных;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
//▲ Чупраков А.Н.
КонецФункции
//-- БИТ_Тверитин
&НаСервере
Функция ЗагрузитьЛогистическуюЭтикетку(ЗаказТорговойПлощадки, ДанныеСТорговойПлощадки) Экспорт
ДанныеПоЭтикеткеПолучены = Ложь;
ДанныеПоЭтикетке = Неопределено;
ЛичныйКабинет = ЗаказТорговойПлощадки.ЛичныйКабинет;
МассивЛогЭтикеток = Новый Массив; //Чупраков А.Н. 08.08.22
#Область Wildberries
Если ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
Если ТипЗНЧ(ДанныеСТорговойПлощадки) = Тип("Структура") Тогда
Если ДанныеСТорговойПлощадки.Свойство("data") Тогда
//БИТ Симонова 19.09.2022 (
ДанныеПоЭтикетке = ДанныеСТорговойПлощадки.Data.file;
Штрихкод = ЗаказТорговойПлощадки.Товары[0].Штрихкод;
ID = ЗаказТорговойПлощадки.Товар.ID;
ФорматФайла = "PDF";
МассивЛогЭтикеток.Добавить(ДанныеПоЭтикетке);
//БИТ Симонова 19.09.2022 )
КонецЕсли;
КонецЕсли;
КонецЕсли;
#КонецОбласти
#Область OZON
Если ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.OZON Или
ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.ЯндексМаркет Тогда
Если ТипЗНЧ(ДанныеСТорговойПлощадки) = Тип("ДвоичныеДанные") Тогда
ДанныеПоЭтикетке = Истина;
МассивЛогЭтикеток = КонвертироватьPDFвJPG(ДанныеСТорговойПлощадки);
Если МассивЛогЭтикеток = Неопределено Тогда
//+битТверитин
МассивЛогЭтикеток = Новый Массив;
//-битТверитин
МассивЛогЭтикеток.Добавить(Base64Строка(ДанныеСТорговойПлощадки));
ФорматФайла = "PDF";
Иначе
ФорматФайла = "JPG"
КонецЕсли;
КонецЕсли;
КонецЕсли;
#КонецОбласти
Если Не ДанныеПоЭтикетке = Неопределено Тогда
Для Каждого СтрокаЛогЭтикетка Из МассивЛогЭтикеток Цикл
ЗаписьРегистра = РегистрыСведений.топ_ЛогистическиеЭтикетки.СоздатьМенеджерЗаписи();
ЗаписьРегистра.ЗаказТорговойПлощадки = ЗаказТорговойПлощадки;
ЗаписьРегистра.ИдентификаторЭтикетки = Строка((Новый УникальныйИдентификатор()));
ЗаписьРегистра.Штрихкод = Штрихкод;
ЗаписьРегистра.ID = ID;
ЗаписьРегистра.ФорматФайла = ФорматФайла;
Если ЛичныйКабинет.СохранятьЛогЭтикеткиВКаталог Тогда
ПутьКФайлу = СохранитьДвоичныеДанныеВКаталог(ЗаказТорговойПлощадки.Номерзаказа,
ЛичныйКабинет.КаталогЛогистическихЭтикеток, СтрокаЛогЭтикетка, форматФайла);
РезультатСохранения = Ложь;
Если ПутьКФайлу <> Ложь Тогда
ЗаписьРегистра.ПутьКФайлу = ПутьКФайлу;
РезультатСохранения = Истина;
КонецЕсли;
Иначе
ЗаписьРегистра.Хранилище = Новый ХранилищеЗначения(СтрокаЛогЭтикетка, Новый СжатиеДанных(9));
РезультатСохранения = Истина;
ЗаписьРегистра.СохраненоВБазе = Истина;
КонецЕсли;
Если РезультатСохранения = Истина Тогда
Попытка
ЗаписьРегистра.Записать(Истина);
ДанныеПоЭтикеткеПолучены = Истина;
Исключение
ДанныеПоЭтикеткеПолучены = Ложь;
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат ДанныеПоЭтикеткеПолучены;
КонецФункции
&НаСервере
Функция ВыполнитьЗапрос(ЗаказТорговойПлощадки, Операция, ЛичныйКабинет, НакопленныеДанные)
Если Операция.Запрос.Пустая() Тогда
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" не задан запрос";
Возврат Ложь;
КонецЕсли;
Отказ = Ложь;
ЗапросКСерверу = Операция.Запрос;
Если ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
HTTP_Соединение = топ_ИнтеграцияСервер.ВернутьСоединение(ЛичныйКабинет, Справочники.Топ_СервераПлощадок.НайтиПоРеквизиту("НаименованиеДляПоиска","WildBerries"));
ИначеЕсли ЛичныйКабинет.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.OZON Тогда
HTTP_Соединение = топ_ИнтеграцияСервер.ВернутьСоединение(ЛичныйКабинет, Справочники.Топ_СервераПлощадок.НайтиПоРеквизиту("НаименованиеДляПоиска","OZON"));
Иначе
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" запрос по "+ЛичныйКабинет.ТорговаяПлощадка+" не предусмотрен";
Возврат Ложь;
КонецЕсли;
Если HTTP_Соединение.Ошибка Тогда
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" не удалось сформировать HTTP соединение из за ошибки "+HTTP_Соединение.ОписаниеОшибки;
Возврат Ложь;
КонецЕсли;
ПараметрыЗапроса = ВернутьПараметрыЗапросаИсходяИзКатегории(Операция, ЛичныйКабинет, ЗапросКСерверу, ЗаказТорговойПлощадки, Отказ);
Если Отказ Тогда
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" не удалось сформировать параметры запроса";
Возврат Ложь;
КонецЕсли;
РезультатЗапроса = топ_ИнтеграцияСервер.ВыполнитьЗапросКСерверу(HTTP_Соединение, ЗапросКСерверу, Ложь, ПараметрыЗапроса);
// Обработка результатов запроса
Если РезультатЗапроса.КодСостояния = ЗапросКСерверу.КодУспешногоВыполнения Тогда
ОбработкаРезультатовВыполнена = Ложь;
Если ЗапросКСерверу.КатегорияЗапроса = Справочники.топ_КатегорииЗапросов.НайтиПоРеквизиту("НаименованиеДляПоиска","ЗапросНаСменуСтатуса") Тогда
ОбработкаРезультатовВыполнена = УстановитьСтатусЗаказаТорговойПЛощадки(ЗаказТорговойПлощадки, Операция.УнифицированныйСтатус);
КонецЕсли;
Если ЗапросКСерверу.КатегорияЗапроса = Справочники.топ_КатегорииЗапросов.НайтиПоРеквизиту("НаименованиеДляПоиска","ЗапросЛогЭтикеток") Тогда
ОбработкаРезультатовВыполнена = ЗагрузитьЛогистическуюЭтикетку(ЗаказТорговойПлощадки, РезультатЗапроса.Данные);
КонецЕсли;
Если НЕ ОбработкаРезультатовВыполнена Тогда
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" при успешном запросе не удалось выполнить обработку результатов запроса";
Возврат Ложь;
КонецЕсли;
Иначе
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" при запросе сервер вернул код состояния: " + РезультатЗапроса.КодСостояния + " " + топ_ИнтеграцияСервер.ПояснитьКодСостоянияПриОшибке(РезультатЗапроса.КодСостояния);
Возврат Ложь;
КонецЕсли;
НакопленныеДанные.Успешно = Истина;
Возврат Истина;
КонецФункции
&НаСервере
Функция ОтправитьСообщениевTelegram(ЗаказТорговойПлощадки, Операция, СообщениеОВыполнении)
УчетнаяЗапись = Справочники.топ_ГруппыTelegram.НайтиПоРеквизиту("НаименованиеДляПоиска","СистемнаяУчетнаяЗапись");
Если СокрЛП(УчетнаяЗапись.ID) = "" или СокрЛП(УчетнаяЗапись.Ключ) = "" Тогда
Возврат Ложь;
КонецЕсли;
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows,
Новый СертификатыУдостоверяющихЦентровWindows);
СообщениеПользователю = Операция.ТекстСообщенияПользователю +
?(Операция.ДобавитьСообщениеОВыполении, Символы.ПС+СообщениеОВыполнении, "");
Ресурс = "bot" + УчетнаяЗапись.Ключ + "/sendMessage?chat_id=" +
СтрЗаменить(Формат(УчетнаяЗапись.ID, "ЧДЦ=; ЧС=; ЧРГ=."), ".", "")+
"&text= " + СообщениеПользователю;
Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 тогда
Возврат Истина
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
&НаСервере
Функция ОтправитьПисьмо(ЗаказТорговойПлощадки, Операция, СообщениеОВыполнении)
УчетнаяЗапись = Операция.УчетнаяЗаписьЭлектроннойПочты;
Если УчетнаяЗапись.Пустая() Тогда
Возврат Ложь;
КонецЕсли;
Если РаботаСПочтовымиСообщениями.УчетнаяЗаписьНастроена(УчетнаяЗапись, Истина) Тогда
СтруктураПисьма = Новый Структура("Кому,Тема,Тело");
СтруктураПисьма.Кому = Операция.Почта;
СтруктураПисьма.Тема = "Уведомление по операции: "+Операция.Наименование;
СтруктураПисьма.Тело = "Документ: "+ЗаказТорговойПлощадки+Символы.ПС+Операция.ТекстПисьмаПользователю;
Если Операция.ДобавитьСообщениеОВыполении Тогда
СтруктураПисьма.Тело = СтруктураПисьма.Тело + Символы.ПС + СообщениеОВыполнении;
КонецЕсли;
Попытка
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись,СтруктураПисьма);
Исключение
Сообщить("При выполнении операции: "+Операция+" возникла ошибка при отправке письма: "+ОписаниеОшибки());
КонецПопытки;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
&НаСервере
Функция ВыполнитьОперациюПоЗаказуТорговойПлошадки(ДанныеОперации, Операция)
РезультатВыполнения = Истина;
РезультатВыполненияОперации = Новый Структура("Успешно,ОписаниеОшибки", Ложь, "");
СообщениеОВыполнении = "";
ЗаказТорговойПлощадки = ДанныеОперации.ЗаказТорговойПлощадки;
ЛичныйКабинет = ДанныеОперации.ЛичныйКабинет;
НакопленныеДанные = ВернутьСтруктуруНакопленныхДанных();
// 1. Создание подчиненного документа
Если РезультатВыполнения Тогда
Если Операция.СоздатьДокумент Тогда
РезультатВыполнения = СоздатьПодчиненныйДокумент(ЗаказТорговойПлощадки, ДанныеОперации, НакопленныеДанные);
Если РезультатВыполнения = Истина Тогда
СообщениеОВыполнении = СообщениеОВыполнении + "Создание документа: Создан "+НакопленныеДанные.Документ;
Иначе
СообщениеОВыполнении = СообщениеОВыполнении + "Создание документа: "+НакопленныеДанные.ОписаниеОшибки;
КонецЕсли;
СообщениеОВыполнении = СообщениеОВыполнении + Символы.ПС;
КонецЕсли;
КонецЕсли;
// 2. Смена статуса заказа клиента
Если РезультатВыполнения Тогда
Если Операция.УстановитьСтатусЗаказаКлиента Тогда
РезультатВыполнения = ИзменитьСтатусЗаказаКлиента(ЗаказТорговойПлощадки, Операция, НакопленныеДанные);
Если РезультатВыполнения = Истина Тогда
СообщениеОВыполнении = СообщениеОВыполнении + "Смена статуса заказа: Успешно установлен статус "+НакопленныеДанные.Статус;
Иначе
СообщениеОВыполнении = СообщениеОВыполнении + "Смена статуса заказа: "+НакопленныеДанные.ОписаниеОшибки;
КонецЕсли;
СообщениеОВыполнении = СообщениеОВыполнении + Символы.ПС;
КонецЕсли;
КонецЕсли;
//BSLR-2575, Чупраков А.Н., 16.11.23, оптимизация по статусам заказов торговых площадки, отказ от РС топ_УнифицированныеСтатусыЗаказов
//// 3. Смена унифицированного статуса
//Если РезультатВыполнения Тогда
// Если Операция.УстановитьУнифицированныйСтатус Тогда
//
// РезультатВыполнения = ИзменитьУнифицированныйСтатус(ЗаказТорговойПлощадки, Операция, НакопленныеДанные);
//
// Если РезультатВыполнения = Истина Тогда
// СообщениеОВыполнении = СообщениеОВыполнении + "Смена унифицированного статуса заказа: Успешно установлен статус "+НакопленныеДанные.УнифицированныйСтатус;
// Иначе
// СообщениеОВыполнении = СообщениеОВыполнении + "Смена унифицированного статуса заказа: "+НакопленныеДанные.ОписаниеОшибки;
// КонецЕсли;
//
// СообщениеОВыполнении = СообщениеОВыполнении + Символы.ПС;
//
// КонецЕсли;
//КонецЕсли;
// 3. Выполнить запрос
Если РезультатВыполнения Тогда
Если Операция.ВыполнитьЗапрос Тогда
РезультатВыполнения = ВыполнитьЗапрос(ЗаказТорговойПлощадки, Операция, ЛичныйКабинет, НакопленныеДанные);
Если РезультатВыполнения = Истина Тогда
СообщениеОВыполнении = СообщениеОВыполнении + "Запрос: Успешно выполнен запрос "+Операция.Запрос;
Иначе
СообщениеОВыполнении = СообщениеОВыполнении + "Запрос: "+НакопленныеДанные.ОписаниеОшибки;
КонецЕсли;
СообщениеОВыполнении = СообщениеОВыполнении + Символы.ПС;
Если НЕ РезультатВыполнения Тогда // Откатим прошлые изменения по операции
ОткатитьДействияПоОперации(ЗаказТорговойПлощадки, Операция, НакопленныеДанные);
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Уведомить в Telegram
Если Операция.УведомитьПользователя Тогда
Результат = ОтправитьСообщениевTelegram(ЗаказТорговойПлощадки, Операция, СообщениеОВыполнении);
КонецЕсли;
// Уведомить через почту
Если Операция.УведомитьВПочту Тогда
Результат = ОтправитьПисьмо(ЗаказТорговойПлощадки, Операция, СообщениеОВыполнении);
КонецЕсли;
Если РезультатВыполнения Тогда
НакопленныеДанные.Успешно = Истина;
КонецЕсли;
Возврат НакопленныеДанные;
КонецФункции
&НаСервере
Функция ПолучитьЗаписьРегистраОчередиВыполненияОпераций(Выборка)
ЗаписьРегистра = РегистрыСведений.топ_ОчередьОперацийДокументооборота.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(ЗаписьРегистра, Выборка);
ЗаписьРегистра.Прочитать();
Возврат ЗаписьРегистра;
КонецФункции
&НаСервере
Процедура ЗаполнитьОчередьЗаказовНаОбработку() Экспорт
МассивИсключений = Новый Массив;
МассивИсключений.Добавить(Справочники.топ_УнифицированныеСтатусыТорговыхПлощадок.НайтиПоРеквизиту("НаименованиеДляПоиска","Отгружен"));
МассивИсключений.Добавить(Справочники.топ_УнифицированныеСтатусыТорговыхПлощадок.НайтиПоРеквизиту("НаименованиеДляПоиска","Отменен"));
//BSLR-2575, Чупраков А.Н., 16.11.23, оптимизация по статусам заказов торговых площадки, отказ от РС топ_УнифицированныеСтатусыЗаказов
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| НастройкиОпераций.УнифицированныйСтатус КАК УнифицированныйСтатус,
| НастройкиОпераций.СтатусЗаказКлиента КАК СтатусЗаказКлиента,
| НастройкиОпераций.Операция КАК Операция,
| НастройкиОпераций.АльтернативнаяОперация КАК АльтернативнаяОперация,
| НастройкиОпераций.ЛичныйКабинет КАК ЛичныйКабинет,
| НастройкиОпераций.ВключитьОтборПоСтатусуЗаказаКлиента КАК ВключитьОтборПоСтатусуЗаказаКлиента
|ПОМЕСТИТЬ втНастройкиОпераций
|ИЗ
| РегистрСведений.топ_НастройкиОперацийДокументооборота КАК НастройкиОпераций
|ГДЕ
| НастройкиОпераций.Активная
// ++ Бойков BSLR-1852
| И &ОтборПоТорговойПлощадке
// -- Бойков BSLR-1852
// ++ Бойков BSLR-2012
| И НастройкиОпераций.ЛичныйКабинет.Используется
// -- Бойков BSLR-2012
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОчередьОпераций.ЗаказТорговойПлощадки КАК ЗаказТорговойПлощадки
|ПОМЕСТИТЬ втЗаказыВОчереди
|ИЗ
| РегистрСведений.топ_ОчередьОперацийДокументооборота КАК ОчередьОпераций
//|ГДЕ
//| ОчередьОпераций.ОперацияВыполнена = ИСТИНА
|
|ИНДЕКСИРОВАТЬ ПО
| ЗаказТорговойПлощадки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЕСТЬNULL(ЗаказыТорговойПлощадки.Ссылка, ЗНАЧЕНИЕ(Документ.топ_ЗаказТорговойПлощадки.ПустаяСсылка)) КАК ЗаказТорговойПлощадки,
| ЕСТЬNULL(СоответствиеЗаказов.ЗаказКлиента, ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка)) КАК ЗаказКлиента,
| втНастройкиОпераций.Операция КАК Операция,
| втНастройкиОпераций.АльтернативнаяОперация КАК АльтернативнаяОперация
|ИЗ
| Документ.топ_ЗаказТорговойПлощадки КАК ЗаказыТорговойПлощадки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ втНастройкиОпераций КАК втНастройкиОпераций
| ПО ЗаказыТорговойПлощадки.ЛичныйКабинет = втНастройкиОпераций.ЛичныйКабинет
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СтатусыЗаказовТорговойПлощадки.СрезПоследних КАК СтатусыЗаказовТорговойПлощадки
| ПО ЗаказыТорговойПлощадки.Ссылка = СтатусыЗаказовТорговойПлощадки.ЗаказТорговойПлощадки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеЗаказов КАК СоответствиеЗаказов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СтатусыЗаказовКлиента.СрезПоследних КАК СтатусыЗаказовКлиента
| ПО СоответствиеЗаказов.ЗаказКлиента = СтатусыЗаказовКлиента.ЗаказКлиента
| ПО ЗаказыТорговойПлощадки.Ссылка = СоответствиеЗаказов.ЗаказТорговойПлощадки
|ГДЕ
| НЕ ЗаказыТорговойПлощадки.ПометкаУдаления
| И НЕ ЗаказыТорговойПлощадки.Ссылка В
| (ВЫБРАТЬ
| втЗаказыВОчереди.ЗаказТорговойПлощадки
| ИЗ
| втЗаказыВОчереди КАК втЗаказыВОчереди)
| И ЕСТЬNULL(СтатусыЗаказовТорговойПлощадки.УнифицированныйСтатус, ЗНАЧЕНИЕ(Справочник.Топ_УнифицированныеСтатусыТорговыхПлощадок.ПустаяСсылка)) = втНастройкиОпераций.УнифицированныйСтатус
| И ВЫБОР
| КОГДА втНастройкиОпераций.ВключитьОтборПоСтатусуЗаказаКлиента
| ТОГДА ЕСТЬNULL(СтатусыЗаказовКлиента.Статус, ЗНАЧЕНИЕ(Справочник.топ_СтатусыЗаказовКлиентов.ПустаяСсылка)) = втНастройкиОпераций.СтатусЗаказКлиента
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| И ЗаказыТорговойПлощадки.Дата > НАЧАЛОПЕРИОДА(&МоментВремени, НЕДЕЛЯ)
| И ЗаказыТорговойПлощадки.Дата < КОНЕЦПЕРИОДА(&МоментВремени, НЕДЕЛЯ)";
// ++ Бойков BSLR-1852
Если Не ПолучитьФункциональнуюОпцию("топ_ЭтоНеВерсияТолькоWB") Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоТорговойПлощадке",
"НастройкиОпераций.ЛичныйКабинет.ТорговаяПлощадка = ЗНАЧЕНИЕ(Перечисление.топ_ТорговыеПлощадки.Wildberries)");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоТорговойПлощадке", "ИСТИНА");
КонецЕсли;
// -- Бойков BSLR-1852
Запрос.УстановитьПараметр("МассивИсключений", МассивИсключений);
Запрос.УстановитьПараметр("МоментВремени", ТекущаяДата());
ТаблицаЗаказов = Запрос.Выполнить().Выгрузить();
Если ТаблицаЗаказов.Количество() > 0 Тогда
НаборЗаписей = РегистрыСведений.топ_ОчередьОперацийДокументооборота.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(ТаблицаЗаказов);
НаборЗаписей.Записать(Ложь);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОткатитьДействияПоОперации(ЗаказТорговойПлощадки, Операция, ПромежуточныйРезультат)
ЗаказКлиента = ПромежуточныйРезультат.Документ;
// ++ БИТ Сергеев BSLR-997
//Если ЗаказКлиента = Неопределено Тогда
// ЗаказКлиента = топ_ОбщийМодульСервер.ВернутьПодчиненныйЗаказКлиента(ЗаказТорговойПлощадки);
//КонецЕсли;
Если ЗаказКлиента = Неопределено Тогда
ЗаказыКлиента = топ_ОбщийМодульСервер.ВернутьПодчиненныйЗаказКлиента(ЗаказТорговойПлощадки);
Иначе
ЗаказыКлиента = Новый Массив(1);
ЗаказыКлиента[0] = ЗаказКлиента;
КонецЕсли;
// -- БИТ Сергеев BSLR-997
Если Операция.СоздатьДокумент Тогда
// ++ БИТ Сергеев BSLR-997
НачатьТранзакцию();
Для Каждого ЗаказКлиента Из ЗаказыКлиента Цикл
// -- БИТ Сергеев BSLR-997
Если ЗаказКлиента.Проведен Тогда
ЗаказКлиента_Объект = ЗаказКлиента.ПолучитьОбъект();
ЗаказКлиента_Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;
// ++ БИТ Сергеев BSLR-997
ЗафиксироватьТранзакцию();
КонецЦикла;
// -- БИТ Сергеев BSLR-997
КонецЕсли;
Если Операция.УстановитьСтатусЗаказаКлиента Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СтатусыЗаказовКлиента.Статус КАК Статус,
| СтатусыЗаказовКлиента.Период КАК Период,
| СтатусыЗаказовКлиента.ЗаказКлиента КАК ЗаказКлиента
|ИЗ
| РегистрСведений.топ_СтатусыЗаказовКлиента.СрезПоследних(, ЗаказКлиента В (&ЗаказыКлиента)) КАК СтатусыЗаказовКлиента";
Запрос.УстановитьПараметр("ЗаказыКлиента", ЗаказыКлиента);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЗаписьРегистра = РегистрыСведений.топ_СтатусыЗаказовКлиента.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(ЗаписьРегистра,Выборка);
ЗаписьРегистра.Прочитать();
Если ЗаписьРегистра.Выбран() Тогда
ЗаписьРегистра.Удалить();
КонецЕсли;
КонецЕсли;
КонецЕсли;
//BSLR-2575, Чупраков А.Н., 16.11.23, оптимизация по статусам заказов торговых площадки, отказ от РС топ_УнифицированныеСтатусыЗаказов
//Если Операция.УстановитьУнифицированныйСтатус Тогда
//
// Запрос = Новый Запрос;
// Запрос.Текст = "ВЫБРАТЬ
// | топ_УнифицированныеСтатусы.Период КАК Период,
// | топ_УнифицированныеСтатусы.ЗаказТорговойПлощадки КАК ЗаказТорговойПлощадки,
// | топ_УнифицированныеСтатусы.УнифицированныйСтатус КАК УнифицированныйСтатус
// |ИЗ
// | РегистрСведений.топ_УнифицированныеСтатусыЗаказов.СрезПоследних(, ЗаказТорговойПлощадки = &ЗаказТорговойПлощадки) КАК топ_УнифицированныеСтатусы";
//
// Запрос.УстановитьПараметр("ЗаказТорговойПлощадки", ЗаказТорговойПлощадки);
//
// Выборка = Запрос.Выполнить().Выбрать();
// Если Выборка.Следующий() Тогда
//
// ЗаписьРегистра = РегистрыСведений.топ_УнифицированныеСтатусыЗаказов.СоздатьМенеджерЗаписи();
// ЗаполнитьЗначенияСвойств(ЗаписьРегистра,Выборка);
// ЗаписьРегистра.Прочитать();
//
// Если ЗаписьРегистра.Выбран() Тогда
// ЗаписьРегистра.Удалить();
// КонецЕсли;
//
// КонецЕсли;
//
//КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УдалитьОперациюИзРегистра(Выборка)
ЗаписьРегистра = РегистрыСведений.топ_ОчередьОперацийДокументооборота.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(ЗаписьРегистра,Выборка);
ЗаписьРегистра.Прочитать();
//LAShadrin 22/06/23 +
Если ЗаписьРегистра.Выбран() Тогда
ЗаписьРегистра.ОперацияВыполнена = Истина;
ЗаписьРегистра.Записать(Истина)
КонецЕсли;
//-
КонецПроцедуры
&НаСервере
Процедура ОбработкаПриНеудачномВыполненииОперации(Выборка)
ЗаписьРегистра = Неопределено;
Если НЕ Выборка.АльтернативнаяОперацияВыполнена Тогда
Если НЕ Выборка.АльтернативнаяОперация.Пустая() Тогда
ЗаписьРегистра = ПолучитьЗаписьРегистраОчередиВыполненияОпераций(Выборка);
Если ЗаписьРегистра.Выбран() Тогда
ВыполнитьОперациюПоЗаказуТорговойПлошадки(Выборка, Выборка.АльтернативнаяОперация);
ЗаписьРегистра.АльтернативнаяОперацияВыполнена = Истина;
ЗаписьРегистра.Записать(Истина);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КоличествоОсновныхПопыток = Выборка.Операция.КоличествоПопыток;
Если Выборка.Операция.РезервныйРежим = Истина Тогда
КоличествоРезервныхПопыток = Выборка.Операция.КоличествоПопытокВрезервномРежиме;
Иначе
КоличествоРезервныхПопыток = 0;
КонецЕсли;
Если Выборка.КоличествоПопыток <= (КоличествоОсновныхПопыток+КоличествоРезервныхПопыток) Тогда
Если ЗаписьРегистра = Неопределено Тогда
ЗаписьРегистра = ПолучитьЗаписьРегистраОчередиВыполненияОпераций(Выборка);
КонецЕсли;
Если ЗаписьРегистра.Выбран() Тогда
ЗаписьРегистра.ВремяПоследнейПопытки = ТекущаяДата();
ЗаписьРегистра.КоличествоПопыток = ЗаписьРегистра.КоличествоПопыток + 1;
ЗаписьРегистра.Записать(Истина);
КонецЕсли;
Иначе
УдалитьОперациюИзРегистра(Выборка);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВыполнитьОперацииПоЗаказамТорговыхПлощадок() Экспорт
//BSLR-2575, Чупраков А.Н., 16.11.23, оптимизация по статусам заказов торговых площадки, отказ от РС топ_УнифицированныеСтатусыЗаказов
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки КАК ЗаказТорговойПлощадки,
| топ_ОчередьОперацийДокументооборота.ЗаказКлиента КАК ЗаказКлиента,
| топ_ОчередьОперацийДокументооборота.Операция КАК Операция,
| топ_ОчередьОперацийДокументооборота.АльтернативнаяОперация КАК АльтернативнаяОперация,
| топ_ОчередьОперацийДокументооборота.КоличествоПопыток КАК КоличествоПопыток,
| топ_ОчередьОперацийДокументооборота.ВремяПоследнейПопытки КАК ВремяПоследнейПопытки,
| топ_ОчередьОперацийДокументооборота.Операция.Приоритет КАК ОперацияПриоритет,
| топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки.ЛичныйКабинет КАК ЛичныйКабинет,
| топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка КАК ТорговаяПлощадка,
| топ_ОчередьОперацийДокументооборота.Операция.РезервныйРежим КАК РезервныйРежим,
| топ_ОчередьОперацийДокументооборота.АльтернативнаяОперацияВыполнена КАК АльтернативнаяОперацияВыполнена,
| топ_СтатусыЗаказовТорговойПлощадкиСрезПоследних.УнифицированныйСтатус КАК УнифицированныйСтатус
|ИЗ
| РегистрСведений.топ_ОчередьОперацийДокументооборота КАК топ_ОчередьОперацийДокументооборота
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СтатусыЗаказовТорговойПлощадки.СрезПоследних(, ) КАК топ_СтатусыЗаказовТорговойПлощадкиСрезПоследних
| ПО топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки = топ_СтатусыЗаказовТорговойПлощадкиСрезПоследних.ЗаказТорговойПлощадки
// ++ Бойков BSLR-1852
|ГДЕ
//LAShadrin 22/06/23+
| НЕ топ_ОчередьОперацийДокументооборота.ОперацияВыполнена
//-
| И &ОтборПоТорговойПлощадке
// -- Бойков BSLR-1852
// ++ Бойков BSLR-2012
| И топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки.ЛичныйКабинет.Используется
// -- Бойков BSLR-2012
|
|УПОРЯДОЧИТЬ ПО
| ОперацияПриоритет УБЫВ";
// ++ Бойков BSLR-1852
Если Не ПолучитьФункциональнуюОпцию("топ_ЭтоНеВерсияТолькоWB") Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоТорговойПлощадке",
"топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка = ЗНАЧЕНИЕ(Перечисление.топ_ТорговыеПлощадки.Wildberries)");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоТорговойПлощадке", "ИСТИНА");
КонецЕсли;
// -- Бойков BSLR-1852
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
РазрешеноВыполнитьОперацию = Ложь;
Если Выборка.ВремяПоследнейПопытки = Дата(1,1,1) Тогда
РазрешеноВыполнитьОперацию = Истина;
Иначе
ВремяСледующейПопытки = Дата(1,1,1);
КоличествоОсновныхПопыток = Выборка.Операция.КоличествоПопыток;
КоличествоРезервныхПопыток = Выборка.Операция.КоличествоПопытокВрезервномРежиме;
Если Выборка.КоличествоПопыток <= КоличествоОсновныхПопыток Тогда
ВремяСледующейПопытки = Выборка.ВремяПоследнейПопытки + Выборка.Операция.ИнтервалПопыток;
Иначе
Если Выборка.РезервныйРежим = Истина Тогда
Если Выборка.КоличествоПопыток <= (КоличествоОсновныхПопыток + КоличествоРезервныхПопыток) Тогда
ВремяСледующейПопытки = Выборка.ВремяПоследнейПопытки + Выборка.Операция.ИнтервалПопытокВРезервномРежиме;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ВремяСледующейПопытки <= ТекущаяДата() Тогда
РазрешеноВыполнитьОперацию = Истина;
КонецЕсли;
КонецЕсли;
Если РазрешеноВыполнитьОперацию = Истина Тогда
РезультатВыполнения = ВыполнитьОперациюПоЗаказуТорговойПлошадки(Выборка, Выборка.Операция);
Если РезультатВыполнения.Успешно Тогда
УдалитьОперациюИзРегистра(Выборка);
Иначе
ОбработкаПриНеудачномВыполненииОперации(Выборка);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ВыполнитьОчисткаОчередиДокументооборота() Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки КАК ЗаказТорговойПлощадки,
| топ_ОчередьОперацийДокументооборота.Операция.Приоритет КАК ОперацияПриоритет,
| топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки КАК ЗаказТорговойПлощадки1,
| топ_ОчередьОперацийДокументооборота.ЗаказКлиента КАК ЗаказКлиента,
| топ_ОчередьОперацийДокументооборота.Операция КАК Операция,
| топ_ОчередьОперацийДокументооборота.АльтернативнаяОперация КАК АльтернативнаяОперация,
| топ_ОчередьОперацийДокументооборота.КоличествоПопыток КАК КоличествоПопыток,
| топ_ОчередьОперацийДокументооборота.ОперацияВыполнена КАК ОперацияВыполнена,
| топ_ОчередьОперацийДокументооборота.ВремяПоследнейПопытки КАК ВремяПоследнейПопытки,
| топ_ОчередьОперацийДокументооборота.АльтернативнаяОперацияВыполнена КАК АльтернативнаяОперацияВыполнена
|ИЗ
| РегистрСведений.топ_ОчередьОперацийДокументооборота КАК топ_ОчередьОперацийДокументооборота
|ГДЕ
| топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки.Дата < НАЧАЛОПЕРИОДА(&МоментВремени, НЕДЕЛЯ)
| И топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки.Дата > КОНЕЦПЕРИОДА(&МоментВремени, НЕДЕЛЯ)
// ++ Бойков BSLR-2012
| И топ_ОчередьОперацийДокументооборота.ЗаказТорговойПлощадки.ЛичныйКабинет.Используется
// -- Бойков BSLR-2012
| И топ_ОчередьОперацийДокументооборота.ОперацияВыполнена = ЛОЖЬ";
Запрос.УстановитьПараметр("МоментВремени", ТекущаяДата());
Выборка = Запрос.Выполнить().Выгрузить();
ЗаписьРегистра = РегистрыСведений.топ_ОчередьОперацийДокументооборота.СоздатьНаборЗаписей();
ЗаписьРегистра.Записать();
ЗаписьРегистра.Загрузить(Выборка);
ЗаписьРегистра.Записать();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьТестРеглЗаданияСозданиеЭлементаВСправочниктоп_ГруппыTelegram() Экспорт
ЭлементСпр = Справочники.топ_ГруппыTelegram.СоздатьЭлемент();
ЭлементСпр.ОбменДанными.Загрузка = Истина;
ЭлементСпр.Наименование = "ТестовыйЭлемент "+Строка(ТекущаяДата());
ЭлементСпр.ОбменДанными.Загрузка = Истина;
ЭлементСпр.Записать();
КонецПроцедуры
Функция АктивныеСклады(ЛичныйКабинет = Неопределено) Экспорт
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_ЛичныеКабинетыСписокСкладовFBS.СкладТП КАК СкладТП
|ИЗ
| Справочник.топ_ЛичныеКабинеты.СписокСкладовFBS КАК топ_ЛичныеКабинетыСписокСкладовFBS
|ГДЕ
| топ_ЛичныеКабинетыСписокСкладовFBS.Активно = ИСТИНА
| И топ_ЛичныеКабинетыСписокСкладовFBS.ЗагрузкаЗаказовМП = ИСТИНА
| И (топ_ЛичныеКабинетыСписокСкладовFBS.Ссылка = &ЛичныйКабинет
| ИЛИ &НеИспользоватьОтборПоЛК)");
Запрос.УстановитьПараметр("НеИспользоватьОтборПоЛК", ЛичныйКабинет = Неопределено);
Запрос.УстановитьПараметр("ЛичныйКабинет", ЛичныйКабинет);
ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
АктивныеСклады = ТаблицаЗапроса.ВыгрузитьКолонку("СкладТП");
Возврат АктивныеСклады;
КонецФункции
//++ БИТ_Тверитин
&НаСервере
Процедура ВывестиЭтикеткуОЗОН(Заказы) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_ЛогистическиеЭтикетки.Хранилище КАК Хранилище,
| топ_ЛогистическиеЭтикетки.Штрихкод КАК Штрихкод,
| топ_ЛогистическиеЭтикетки.ПутьКФайлу КАК ПутьКФайлу,
| топ_ЛогистическиеЭтикетки.СохраненоВБазе КАК СохраненоВБазе,
| топ_ЛогистическиеЭтикетки.ID КАК ID,
| топ_ЛогистическиеЭтикетки.ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка КАК ТорговаяПлощадка
|ИЗ
| РегистрСведений.топ_ЛогистическиеЭтикетки КАК топ_ЛогистическиеЭтикетки
|ГДЕ
| топ_ЛогистическиеЭтикетки.ЗаказТорговойПлощадки В(&ЗаказТорговойПлощадки)";
Запрос.УстановитьПараметр("ЗаказТорговойПлощадки", Заказы);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.OZON Тогда
//БИТ Смирнов А.П. 05.09.2022 BSLR-648 (
Если Выборка.СохраненоВБазе Тогда
ПутьКФайлу = ПолучитьИмяВременногоФайла("pdf");
ДвоичныеДанные = Base64Значение(Выборка.Хранилище.Получить());
ДвоичныеДанные.Записать(ПутьКФайлу);
Иначе
ПутьКФайлу = Выборка.ПутьКФайлу;
КонецЕсли;
//БИТ Смирнов А.П. 05.09.2022 )
Попытка
ЗапуститьПриложение(ПутьКФайлу);
Исключение
Сообщить("Ошибка открытия (PDF) файла");
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область Печать
Функция ПроверитьНаличиеДанныхОбЭтикетках(МассивЗаказов) Экспорт //++ БИТ Артемьев 20.06.2022
Результат = Новый Структура("РезультатПроверки, МассивЗаказовБезЭтикеток");
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_ЗаказТорговойПлощадки.Ссылка КАК ЗаказТорговойПлощадки
|ПОМЕСТИТЬ ВТ_Заказы
|ИЗ
| Документ.топ_ЗаказТорговойПлощадки КАК топ_ЗаказТорговойПлощадки
|ГДЕ
| топ_ЗаказТорговойПлощадки.Ссылка В(&Заказы)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Этикетки.ЗаказТорговойПлощадки КАК ЗаказТорговойПлощадки
|ПОМЕСТИТЬ ВТ_ЗаказыСЭтикетками
|ИЗ
| РегистрСведений.топ_ЛогистическиеЭтикетки КАК Этикетки
|ГДЕ
| Этикетки.ЗаказТорговойПлощадки В
| (ВЫБРАТЬ
| ВТ_Заказы.ЗаказТорговойПлощадки
| ИЗ
| ВТ_Заказы)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Заказы.ЗаказТорговойПлощадки КАК ЗаказТорговойПлощадки
|ИЗ
| ВТ_Заказы КАК ВТ_Заказы
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ЗаказыСЭтикетками КАК ВТ_ЗаказыСЭтикетками
| ПО ВТ_Заказы.ЗаказТорговойПлощадки = ВТ_ЗаказыСЭтикетками.ЗаказТорговойПлощадки
|ГДЕ
| ВТ_ЗаказыСЭтикетками.ЗаказТорговойПлощадки ЕСТЬ NULL");
Запрос.УстановитьПараметр("Заказы", МассивЗаказов);
ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
Возврат Новый Структура("РезультатПроверки, МассивЗаказовБезЭтикеток",
ТаблицаРезультата.Количество() = 0,
ТаблицаРезультата.ВыгрузитьКолонку("ЗаказТорговойПлощадки"));
КонецФункции //-- БИТ Артемьев
Функция ПолучитьДанныеЭтикеток(МассивЗаказов) Экспорт //++ БИТ Артемьев 20.06.2022
// Временно: 1 заказ = 1 запрос
// По-хорошему нужно разбивать заказы по торговым площадкам и делать 1 торговая площадка = 1 запрос,
// потому что тело запроса позволяет передать N заказов
// ++ БИТ Сергеев COSTS-66
пНеобработанныеЗаказы = Новый Массив;
// -- БИТ Сергеев COSTS-66
Для Каждого Заказ Из МассивЗаказов Цикл
// ++ БИТ Сергеев COSTS-66
//ПолучитьДанныеЭтикетки(Заказ);
Если НЕ ПолучитьДанныеЭтикетки(Заказ) Тогда
пНеобработанныеЗаказы.Добавить(Заказ)
КонецЕсли;
// -- БИТ Сергеев COSTS-66
КонецЦикла;
// ++ БИТ Сергеев COSTS-66
Возврат пНеобработанныеЗаказы;
// -- БИТ Сергеев COSTS-66
КонецФункции //-- БИТ Артемьев
Функция ПолучитьДанныеЭтикетки(ЗаказТорговойПлощадки) Экспорт //++ БИТ Артемьев 20.06.2022
РеквизитыЗаказа = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗаказТорговойПлощадки, "ЛичныйКабинет, ЛичныйКабинет.ТорговаяПлощадка");
ЛичныйКабинет = РеквизитыЗаказа.ЛичныйКабинет;
ТорговаяПлощадка = РеквизитыЗаказа.ЛичныйКабинетТорговаяПлощадка;
ЗапросКСерверу = НайтиЗапросЛогистическихЭтикеток(ТорговаяПлощадка);
//БИТ Симонова 19.09.2022 (
Если ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
Операция = "Запрос QR-этикеток";
Иначе
Операция = "Запрос логистических этикеток";
КонецЕсли;
//БИТ Симонова 19.09.2022 )
НакопленныеДанные = Новый Структура("Успешно,ОписаниеОшибки,Документ,Статус,УнифицированныйСтатус",Ложь,"");
Если ЗапросКСерверу = Неопределено Тогда Возврат Ложь; КонецЕсли;
Если ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
HTTP_Соединение = топ_ИнтеграцияСервер.ВернутьСоединение(ЛичныйКабинет, Справочники.Топ_СервераПлощадок.НайтиПоРеквизиту("НаименованиеДляПоиска","WildBerries"));
ИначеЕсли ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.OZON Тогда
HTTP_Соединение = топ_ИнтеграцияСервер.ВернутьСоединение(ЛичныйКабинет, Справочники.Топ_СервераПлощадок.НайтиПоРеквизиту("НаименованиеДляПоиска","OZON"));
ИначеЕсли ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.ЯндексМаркет Тогда
HTTP_Соединение = топ_ИнтеграцияСервер.ВернутьСоединение(ЛичныйКабинет, Справочники.Топ_СервераПлощадок.НайтиПоРеквизиту("НаименованиеДляПоиска","ЯндексМаркет"));
Иначе
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" запрос по "+ТорговаяПлощадка+" не предусмотрен";
Возврат Ложь;
КонецЕсли;
Если HTTP_Соединение.Ошибка Тогда
НакопленныеДанные.Успешно = Ложь;
НакопленныеДанные.ОписаниеОшибки = "В операции: "+Операция+" не удалось сформировать HTTP соединение из за ошибки "+HTTP_Соединение.ОписаниеОшибки;
Возврат Ложь;
КонецЕсли;
ПараметрыЗапроса = ВернутьПараметрыЗапроса(ТорговаяПлощадка, ЗаказТорговойПлощадки);
ПеременныеАдреса = Новый Структура("orderId", ЗаказТорговойПлощадки.НомерЗаказа);
ПараметрыЗапроса.Вставить("Шаблон", ПеременныеАдреса);
РезультатЗапроса = топ_ИнтеграцияСервер.ВыполнитьЗапросКСерверу(HTTP_Соединение, ЗапросКСерверу, Ложь, ПараметрыЗапроса);
Если Не РезультатЗапроса.Ошибка Тогда
Возврат топ_ОбщийМодульСервер.ЗагрузитьЛогистическуюЭтикетку(ЗаказТорговойПлощадки, РезультатЗапроса.Данные);
Иначе
Если ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.ЯндексМаркет И РезультатЗапроса.КодСостояния = 400 Тогда
//Чупраков А.Н. 19.12.22, вывод сообщения с понятной формулировкой. Требуется проверка.
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Для заказа " + ЗаказТорговойПлощадки.НомерЗаказа + " идентификатор грузовых мест не указан.");
ИначеЕсли ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.OZON И РезультатЗапроса.КодСостояния = 400 Тогда
//Чупраков А.Н. 20.12.22, вывод ошибки по этикетке
//только в статусе awaiting_delivery(для кроссбордера ещё в статусе awaiting_registration),
//после перехода в delivering и далее, этикетка становится не доступна для печати
ОшибкаОЗОН = топ_ВзаимодействиеСПлощадками.ВернутьСодержимоеРезультатовЗапроса(РезультатЗапроса.Данные, "message");
Если ОшибкаОЗОН = "INVALID_ARGUMENT" Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Для заказа " + ЗаказТорговойПлощадки.НомерЗаказа + " загрузка этикетки недоступна.");
Иначе
Сообщить(топ_ИнтеграцияСервер.ПояснитьКодСостоянияПриОшибке(РезультатЗапроса.КодСостояния));
КонецЕсли;
Иначе
//БИТ Тверитин
Сообщить(топ_ИнтеграцияСервер.ПояснитьКодСостоянияПриОшибке(РезультатЗапроса.КодСостояния));
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции //-- БИТ Артемьев
Функция НайтиЗапросЛогистическихЭтикеток(ТорговаяПлощадка) //++ БИТ Артемьев 10.06.2022
Запрос = Новый Запрос("Выбрать Первые 1 Ссылка Из Справочник.топ_ЗапросыКТорговымПлощадкам ГДЕ КатегорияЗапроса = &КатегорияЗапроса И ТорговаяПлощадка = &ТорговаяПлощадка");
//БИТ Симонова 19.09.2022 (
Если ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
Запрос.УстановитьПараметр("КатегорияЗапроса", Справочники.топ_КатегорииЗапросов.НайтиПоРеквизиту("НаименованиеДляПоиска","ЗапросКуарЭтикеток"));
Иначе
Запрос.УстановитьПараметр("КатегорияЗапроса", Справочники.топ_КатегорииЗапросов.НайтиПоРеквизиту("НаименованиеДляПоиска","ЗапросЛогЭтикеток"));
КонецЕсли;
//БИТ Симонова 19.09.2022 (
Запрос.УстановитьПараметр("ТорговаяПлощадка", ТорговаяПлощадка);
Выборка = Запрос.Выполнить().Выбрать();
Возврат ?(Выборка.Следующий(), Выборка.Ссылка, Неопределено);
КонецФункции //-- БИТ Артемьев
Функция ВернутьПараметрыЗапроса(ТорговаяПлощадка, ЗаказТорговойПлощадки) //++ БИТ Артемьев 10.06.2022
ПараметрыЗапроса = Новый Структура();
Если ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
Массив = Новый Массив();
Массив.Добавить(Число(ЗаказТорговойПлощадки.НомерЗаказа));
ПараметрыЗапроса.Вставить("Array", Массив);
КонецЕсли;
Если ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.OZON Тогда
//БИТ Смирнов А.П. 09.12.2022 BSLR-1069 (
//Массив = Новый Массив();
//Массив.Добавить(ЗаказТорговойПлощадки.НомерОтправления);
Массив = МассивНомеровОтправленийЗаказаОзон(ЗаказТорговойПлощадки);
//БИТ Смирнов А.П. 09.12.2022 )
ПараметрыЗапроса.Вставить("Array", Массив);
КонецЕсли;
Если ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.ЯндексМаркет Тогда
Массив = Новый Массив();
Массив.Добавить(ЗаказТорговойПлощадки.НомерЗаказа);
ПараметрыЗапроса.Вставить("Array", Массив);
КонецЕсли;
Возврат ПараметрыЗапроса;
КонецФункции //-- БИТ Артемьев
//БИТ Смирнов А.П. 30.11.2022 BSLR-777 (
Функция ПечатьЭтикетокТоваровЗаказаТорговойПлощадки(ЗаказТорговойПлощадки) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок.ПолеСверху = 1;
ТабДок.ПолеСнизу = 1;
ТабДок.ПолеСлева = 1;
ТабДок.ПолеСправа = 1;
ТабДок.РазмерСтраницы = "Custom";
ТабДок.ВысотаСтраницы = 40;
ТабДок.ШиринаСтраницы = 58;
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ТОП_ЭТИКЕТКАТОВАРА";
Если ТипЗнч(ЗаказТорговойПлощадки) = Тип("Массив") Тогда
Если ЗаказТорговойПлощадки.Количество() > 0 И ТипЗнч(ЗаказТорговойПлощадки[0]) = Тип("ДокументСсылка.топ_ЗаказТорговойПлощадки") Тогда
МассивЗаказов = ЗаказТорговойПлощадки;
Иначе
Возврат Неопределено;
КонецЕсли;
ИначеЕсли ТипЗнч(ЗаказТорговойПлощадки) = Тип("ДокументСсылка.топ_ЗаказТорговойПлощадки") Тогда
МассивЗаказов = Новый Массив;
МассивЗаказов.Добавить(ЗаказТорговойПлощадки);
Иначе
Возврат Неопределено;
КонецЕсли;
Запрос = Новый Запрос;
// ++ Бойков BSLR-3505
СоответствиеВариантовСортировки = Новый Соответствие;
СоответствиеВариантовСортировки.Вставить(Перечисления.топ_ВариантыСорировкиПечатныхФорм.НомерЗаказа, "ВТЗаказы.НомерЗаказа");
СоответствиеВариантовСортировки.Вставить(Перечисления.топ_ВариантыСорировкиПечатныхФорм.Артикул, "ДополнительныеПоляСортировки.Артикул");
СоответствиеВариантовСортировки.Вставить(Перечисления.топ_ВариантыСорировкиПечатныхФорм.Номенклатура, "ДополнительныеПоляСортировки.Номенклатура");
СоответствиеВариантовСортировки.Вставить(Перечисления.топ_ВариантыСорировкиПечатныхФорм.Склад1С, "ДополнительныеПоляСортировки.Склад");
СоответствиеВариантовСортировки.Вставить(Перечисления.топ_ВариантыСорировкиПечатныхФорм.Товар, "ДополнительныеПоляСортировки.Товар");
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
// В менеджер временных таблиц помещаем таблицу ВТ_ДополнительныеПоляСортировки
топ_ОбщийВызовСервера.ВременнаяТаблицаДополнительныеПоляСортировкиЭтикеток(Запрос);
// -- Бойков BSLR-3505
Запрос.Текст =
"ВЫБРАТЬ
| топ_ЗаказТорговойПлощадки.Ссылка КАК Ссылка,
| топ_ЗаказТорговойПлощадки.НомерЗаказа КАК НомерЗаказа
|ПОМЕСТИТЬ ВТЗаказы
|ИЗ
| Документ.топ_ЗаказТорговойПлощадки КАК топ_ЗаказТорговойПлощадки
|ГДЕ
| топ_ЗаказТорговойПлощадки.Ссылка В(&ЗаказТорговойПлощадки)
//| И топ_ЗаказТорговойПлощадки.ЛичныйКабинет.ВыводитьНаПечатьЭтикеткиТоваров //BT BSLR-2486 27.10.23
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| топ_ЗаказТорговойПлощадкиТовары.Ссылка КАК ЗаказТП,
| топ_ЗаказТорговойПлощадкиТовары.Товар КАК Товар,
| топ_ЗаказТорговойПлощадкиТовары.РазмерWB.баркод КАК Баркод,
| топ_ЗаказТорговойПлощадкиТовары.Товар.Наименование КАК Наименование,
| ЕСТЬNULL(топ_ЗначенияСвойствТоваров_СП.Значение, """") КАК СтранаПроизводитель,
| ЕСТЬNULL(топ_ЗначенияСвойствТоваров_Бренд.Значение, """") КАК Бренд,
//LAShadrin 05/05/23+
| топ_ЗаказТорговойПлощадкиТовары.Товар.КодПоставщика КАК Артикул
//LAShadrin 05/05/23-
|ИЗ
| ВТЗаказы КАК ВТЗаказы
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.топ_ЗаказТорговойПлощадки.Товары КАК топ_ЗаказТорговойПлощадкиТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_ЗначенияСвойствТоваров КАК топ_ЗначенияСвойствТоваров_СП
| ПО топ_ЗаказТорговойПлощадкиТовары.Товар = топ_ЗначенияСвойствТоваров_СП.Товар
| И топ_ЗаказТорговойПлощадкиТовары.РазмерWB = топ_ЗначенияСвойствТоваров_СП.РазмерWB
| И (топ_ЗначенияСвойствТоваров_СП.Свойство = &СвойствоСтранаПроизводитель)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_ЗначенияСвойствТоваров КАК топ_ЗначенияСвойствТоваров_Бренд
| ПО топ_ЗаказТорговойПлощадкиТовары.Товар = топ_ЗначенияСвойствТоваров_Бренд.Товар
| И топ_ЗаказТорговойПлощадкиТовары.РазмерWB = топ_ЗначенияСвойствТоваров_Бренд.РазмерWB
| И (топ_ЗначенияСвойствТоваров_Бренд.Свойство = &СвойствоБренд)
| ПО ВТЗаказы.Ссылка = топ_ЗаказТорговойПлощадкиТовары.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДополнительныеПоляСортировки КАК ДополнительныеПоляСортировки
| ПО ВТЗаказы.Ссылка = ДополнительныеПоляСортировки.ЗаказТорговойПлощадки
|
|УПОРЯДОЧИТЬ ПО
| &ВариантСортировки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| топ_ЗаказТорговойПлощадкиТовары.Товар КАК Товар,
| топ_Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| ВТЗаказы КАК ВТЗаказы
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.топ_ЗаказТорговойПлощадки.Товары КАК топ_ЗаказТорговойПлощадкиТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_Штрихкоды КАК топ_Штрихкоды
| ПО топ_ЗаказТорговойПлощадкиТовары.Товар = топ_Штрихкоды.Товар
| И топ_ЗаказТорговойПлощадкиТовары.РазмерWB = топ_Штрихкоды.РазмерWB
| ПО ВТЗаказы.Ссылка = топ_ЗаказТорговойПлощадкиТовары.Ссылка
|ГДЕ
| НЕ топ_Штрихкоды.Штрихкод ЕСТЬ NULL";
// ++ Бойков BSLR-3505
УстановитьПривилегированныйРежим(Истина);
ВариантСортировки = Константы.топ_ВариантСорировкиПечатныхФорм.Получить();
Если Не ЗначениеЗаполнено(ВариантСортировки) Тогда
ВариантСортировки = Перечисления.топ_ВариантыСорировкиПечатныхФорм.НомерЗаказа;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
// ++ Бойков BSLR-3937
//Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ВариантСортировки", СоответствиеВариантовСортировки.Получить(ВариантСортировки));
Если ВариантСортировки = Перечисления.топ_ВариантыСорировкиПечатныхФорм.НомерЗаказа Тогда
ДополнительноеПолеСортировки = "ДополнительныеПоляСортировки.Артикул";
Иначе
ДополнительноеПолеСортировки = "ДополнительныеПоляСортировки.НомерЗаказа";
КонецЕсли;
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ВариантСортировки", СоответствиеВариантовСортировки.Получить(ВариантСортировки) +
СтрШаблон(",
| %1", ДополнительноеПолеСортировки));
// -- Бойков BSLR-3937
// -- Бойков BSLR-3505
Запрос.УстановитьПараметр("СвойствоСтранаПроизводитель" , Справочники.топ_СвойстваТоваров.НайтиПоНаименованию("Страна производства"));
Запрос.УстановитьПараметр("СвойствоБренд" , Справочники.топ_СвойстваТоваров.НайтиПоНаименованию("Бренд"));
Запрос.УстановитьПараметр("ЗаказТорговойПлощадки" , МассивЗаказов);
РезультатЗапроса = Запрос.ВыполнитьПакет();
РезультатТовары = РезультатЗапроса[1];
ТаблицаШтрихкодов = РезультатЗапроса[2].Выгрузить();
ПараметрыОтбораШтрихкодов = Новый Структура("Товар");
Если НЕ РезультатТовары.Пустой() Тогда
//BSLR-4027, Чупраков А.Н., 31.10.24, макет через БСП
//Макет = Документы.топ_ЗаказТорговойПлощадки.ПолучитьМакет("ПФ_MXL_ЛогЭтикетка");
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.топ_ЗаказТорговойПлощадки.ПФ_MXL_ЛогЭтикетка");
ОбластьШКТовара = Макет.ПолучитьОбласть("ШКТовара|ОбластьВерт");
Эталон = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет("Эталон");
РисунокКвадрат = Эталон.Рисунки.Квадрат100Пикселей; // РисунокТабличногоДокумента
КоличествоМиллиметровВПикселе = РисунокКвадрат.Высота / 100;
ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода();
ПараметрыШтрихкода.Вставить("Ширина", Окр(ОбластьШКТовара.Рисунки.ШтрихкодТовара.Ширина / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Высота", Окр(ОбластьШКТовара.Рисунки.ШтрихкодТовара.Высота / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Штрихкод", "");
ПараметрыШтрихкода.Вставить("ТипВходныхДанных", 0); // Штрихкод - это строка
ПараметрыШтрихкода.Вставить("ТипКода", 4); // Code128
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);//LAShadrin 05/05/23
ПараметрыШтрихкода.Вставить("РазмерШрифта", 5);
Выборка = РезультатТовары.Выбрать();
Пока Выборка.Следующий() Цикл
ШтрихкодТовара = Выборка.Баркод;
Если НЕ ЗначениеЗаполнено(ШтрихкодТовара) Тогда
ПараметрыОтбораШтрихкодов.Вставить("Товар", Выборка.Товар);
СтрокиШтрихкодов = ТаблицаШтрихкодов.НайтиСтроки(ПараметрыОтбораШтрихкодов);
Если СтрокиШтрихкодов.Количество() > 0 Тогда
ШтрихкодТовара = СтрокиШтрихкодов[0].Штрихкод;
КонецЕсли;
КонецЕсли;
ПараметрыШтрихкода.Вставить("Штрихкод", ШтрихкодТовара);
ОбластьШКТовара.Параметры.Заполнить(Выборка);
ОбластьШКТовара.Параметры.НомерШК = ШтрихкодТовара; //LAShadrin 05/05/23
ОбластьШКТовара.Рисунки.ШтрихкодТовара.Картинка = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода).Картинка;
ТабДок.Вывести(ОбластьШКТовара);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;
АдресТабДок = ПоместитьВоВременноеХранилище(ТабДок);
Возврат АдресТабДок;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
//БИТ Смирнов А.П. 30.11.2022 )
//БИТ Смирнов А.П. 09.12.2022 BSLR-1069 (
Функция МассивНомеровОтправленийЗаказаОзон(ЗаказТорговойПлощадки)
МассивНомеровОтправлений = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| топ_ЗаказТорговойПлощадкиОтправления.НомерОтправления КАК НомерОтправления
|ПОМЕСТИТЬ ВТОтправления
|ИЗ
| Документ.топ_ЗаказТорговойПлощадки.Отправления КАК топ_ЗаказТорговойПлощадкиОтправления
|ГДЕ
| топ_ЗаказТорговойПлощадкиОтправления.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| топ_ЗаказТорговойПлощадки.НомерОтправления
|ИЗ
| Документ.топ_ЗаказТорговойПлощадки КАК топ_ЗаказТорговойПлощадки
|ГДЕ
| топ_ЗаказТорговойПлощадки.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТОтправления.НомерОтправления КАК НомерОтправления
|ИЗ
| ВТОтправления КАК ВТОтправления
|
|СГРУППИРОВАТЬ ПО
| ВТОтправления.НомерОтправления";
Запрос.УстановитьПараметр("Ссылка", ЗаказТорговойПлощадки);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
МассивНомеровОтправлений = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("НомерОтправления");
КонецЕсли;
Возврат МассивНомеровОтправлений;
КонецФункции
//БИТ Смирнов А.П. 09.12.2022 )
// ++ Бойков BSLR-1946
Функция ВывестиМассивЭтикетокPDFВЕдиныйТабличныйДокумент(МассивЭтикеток) Экспорт
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ПолеСверху = 1;
ТабличныйДокумент.ПолеСлева = 1;
ТабличныйДокумент.ПолеСнизу = 1;
ТабличныйДокумент.ПолеСправа = 1;
ТабличныйДокумент.РазмерКолонтитулаСверху = 0;
ТабличныйДокумент.РазмерКолонтитулаСнизу = 0;
ТабличныйДокумент.АвтоМасштаб = Истина;
Если МассивЭтикеток.Количество() = 0 Тогда
Возврат ТабличныйДокумент;
КонецЕсли;
ТорговаяПлощадка = МассивЭтикеток[0].ЗаказТП.ЛичныйКабинет.ТорговаяПлощадка;
//BSLR-4027, Чупраков А.Н., 31.10.24, макет через БСП
//МакетЭтикеток = Обработки.топ_АРМ_КладовщикаFBS.ПолучитьМакет("ПФ_MXL_ЭтикеткаПодробно");
МакетЭтикеток = УправлениеПечатью.МакетПечатнойФормы("Обработка.топ_АРМ_КладовщикаFBS.ПФ_MXL_ЭтикеткаПодробно");
Если ТорговаяПлощадка = Перечисления.топ_ТорговыеПлощадки.ЯндексМаркет Тогда
ЭтикеткаМаркета = МакетЭтикеток.ПолучитьОбласть("МаркетплейсРасш");
Рисунок = ЭтикеткаМаркета.Рисунки[0];
ТабличныйДокумент.ШиринаСтраницы = 76;
ТабличныйДокумент.ВысотаСтраницы = 120;
Иначе
ЭтикеткаМаркета = МакетЭтикеток.ПолучитьОбласть("Маркетплейс");
Рисунок = ЭтикеткаМаркета.Рисунки.Этикетка;
ТабличныйДокумент.ШиринаСтраницы = 58;
ТабличныйДокумент.ВысотаСтраницы = 40;
КонецЕсли;
СоответствиеЭтикеток = Новый Соответствие;
ЭтикеткиДляКонвертации = Новый Соответствие;
#Область КонвертацияPDFВКартинки
Для Каждого ДанныеЭтикетки Из МассивЭтикеток Цикл
Значение = ЭтикеткиДляКонвертации.Получить(ДанныеЭтикетки.ЗаказТП);
Если Значение = Неопределено Тогда
ЭтикеткиДляКонвертации.Вставить(ДанныеЭтикетки.ЗаказТП, ДанныеЭтикетки.ДвоичныеДанные);
ИначеЕсли ТипЗнч(Значение) = Тип("Массив") Тогда
Значение.Добавить(ДанныеЭтикетки.ДвоичныеДанные);
Иначе
Массив = Новый Массив;
Массив.Добавить(Значение);
Массив.Добавить(ДанныеЭтикетки.ДвоичныеДанные);
ЭтикеткиДляКонвертации.Вставить(ДанныеЭтикетки.ЗаказТП, Массив);
КонецЕсли;
КонецЦикла;
Если ЭтикеткиДляКонвертации.Количество() Тогда
РезультатКонвертации = Обработки.топ_КонвертацияPDF.Создать().КонвертироватьФайлыPDF(ЭтикеткиДляКонвертации,"GhostScript");
Для Каждого Запись Из РезультатКонвертации Цикл
Значение = СоответствиеЭтикеток.Получить(Запись.Ключ);
Если Значение = Неопределено Тогда
СоответствиеЭтикеток.Вставить(Запись.Ключ, Запись.Значение);
Иначе
Для Каждого пФайл Из Запись.Значение Цикл
Значение.Добавить(пФайл);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
#КонецОбласти
Для Каждого ДанныеЭтикетки Из МассивЭтикеток Цикл
ЭтикеткиМаркетПлейса = СоответствиеЭтикеток.Получить(ДанныеЭтикетки.ЗаказТП);
Если ЭтикеткиМаркетПлейса = Неопределено Тогда
ТекстСообщения = НСтр("ru='Для заказа №%1 не найдено этикетки маркетплейса.'");
ТекстСообщения = СтрШаблон(ТекстСообщения, ДанныеЭтикетки.ЗаказТП.НомерЗаказа);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Продолжить;
ИначеЕсли ТипЗнч(ЭтикеткиМаркетПлейса) = Тип("Строка") Тогда
ТекстСообщения = НСтр("ru='Не удалось выполнить конвертацию для заказа №%1
|по причине: %2.'");
ТекстСообщения = СтрШаблон(ТекстСообщения, ДанныеЭтикетки.ЗаказТП.НомерЗаказа, ЭтикеткиМаркетПлейса);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Продолжить;
КонецЕсли;
Для Каждого Этикетка Из ЭтикеткиМаркетПлейса Цикл
Рисунок.Картинка = Новый Картинка(Этикетка);
ТабличныйДокумент.Вывести(ЭтикеткаМаркета);
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;
АдресДанных = ПечатьЭтикетокТоваровЗаказаТорговойПлощадки(ДанныеЭтикетки.ЗаказТП);
Если АдресДанных <> Неопределено Тогда
ЭтикеткиТоваровЗаказаТП = ПолучитьИзВременногоХранилища(АдресДанных);
ИсходнаяВысотаТаблицы = ТабличныйДокумент.ВысотаТаблицы;
ТабличныйДокумент.Вывести(ЭтикеткиТоваровЗаказаТП);
// Выравнивание этикетки товара под этикетку МП
ОбластьЭтикеткиТовара = ТабличныйДокумент.Область(ИсходнаяВысотаТаблицы + 1, 1, ТабличныйДокумент.ВысотаТаблицы, 1);
ОбластьЭтикеткиТовара.ШиринаКолонки = 45;
ТабличныйДокумент.Рисунки.ШтрихкодТовара.Лево = 15;
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции // -- Бойков BSLR-1946
#КонецОбласти
#Область ОстаткиFBS
// ++ БИТ Сергеев BSLR-807
// Функция возвращает текст запроса остатков по FBS
// Бойков BSLR-1734. Добавлен параметр "ЭтоВыгрузкаОстатков"
//
// Параметры:
// ИмяВТ - Строка - Имя временой таблицы содержащей результат запроса. Если строка пустая, то добавляются поля для построителя и результат не помещается в ВТ
//
Функция ПолучитьТекстЗапросаОстатковПоFBS(Знач ИмяВТ = "ВТ_Результат", УчитыватьМинимальныеОстатки = Ложь, ЭтоВыгрузкаОстатков = Ложь) Экспорт
пТекстыЗапросов = Новый Массив;
// ++ Бойков BSLR-1734
//пТекстыЗапросов.Добавить(ОстаткиFBS_ПолучитьТекстЗапроса_ОсновныхТаблиц()); // ВТ_ЛичныеКабинеты, ВТ_Склады, ВТ_Товары - Описание таблицы в процедуре
пТекстыЗапросов.Добавить(ОстаткиFBS_ПолучитьТекстЗапроса_ОсновныхТаблиц(ЭтоВыгрузкаОстатков)); // ВТ_ЛичныеКабинеты, ВТ_Склады, ВТ_Товары - Описание таблицы в процедуре
// -- Бойков BSLR-1734
пТекстыЗапросов.Добавить(ОстаткиFBS_ПолучитьТекстЗапроса_ВТ_Номенклатура()); //ВТ_Номенклатура - К таблице товаров тянутся необходимые реквизиты номенклатуры, к примеру ед.изм.
пТекстыЗапросов.Добавить(ОстаткиFBS_ПолучитьТекстЗапроса_ВТ_Остатки(УчитыватьМинимальныеОстатки)); //ВТ_Остатки - Получаем остатки в разрезе товаров
пТекстыЗапросов.Добавить(ОстаткиFBS_ПолучитьТекстЗапроса_ВТ_Резерв(Истина)); //ВТ_Резерв - Таблица с резервом товара
// ++ Бойков BSLR-2506
// ++ Бойков BSLR-2906
УстановитьПривилегированныйРежим(Истина);
ИспользоватьВиртуальныйРезерв = Константы.топ_ИспользоватьВиртуальныйРезерв.Получить();
УстановитьПривилегированныйРежим(Ложь);
// -- Бойков BSLR-2906
Если ИспользоватьВиртуальныйРезерв Тогда
ТекстРезерва = "-ВТ_Резерв.Количество";
Иначе
ТекстРезерва = "0";
КонецЕсли;
// -- Бойков BSLR-2506
пТекстРезультата =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ВложенныйЗапрос.Товар КАК Справочник.топ_ТоварыТорговыхПлощадок).ЛичныйКабинет КАК ЛичныйКабинет,
| ВложенныйЗапрос.Товар КАК Товар,
| ВложенныйЗапрос.РазмерWB КАК РазмерWB,
| ВложенныйЗапрос.Склад КАК Склад,
| ВложенныйЗапрос.Количество КАК Количество,
| ВТ_Товары.ТоварID КАК ТоварID,
| ВТ_Товары.КодПоставщика КАК КодПоставщика,
| ВТ_Товары.Штрихкод КАК Штрихкод,
// ++ BSLR-1160
| ВТ_Товары.ОбнулятьОстатки КАК ОбнулятьОстатки,
// -- BSLR-1160
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ВТ_Результат
|ИЗ
| (ВЫБРАТЬ
| ВложенныйЗапрос.Товар КАК Товар,
| ВложенныйЗапрос.РазмерWB КАК РазмерWB,
| ВложенныйЗапрос.Склад КАК Склад,
| СУММА(ВложенныйЗапрос.Количество) КАК Количество,
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.Характеристика КАК Характеристика
| ИЗ
| (ВЫБРАТЬ
| ВТ_Остатки.Товар КАК Товар,
| ВТ_Остатки.РазмерWB КАК РазмерWB,
| ВТ_Остатки.Склад КАК Склад,
| ВТ_Остатки.Количество КАК Количество,
| ВТ_Остатки.Номенклатура КАК Номенклатура,
| ВТ_Остатки.Характеристика КАК Характеристика
| ИЗ
| ВТ_Остатки КАК ВТ_Остатки
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
// ++ Бойков BSLR-2735
//| ВТ_Резерв.Товар,
//| ВТ_Резерв.РазмерWB,
| ВТ_Номенклатура.Товар,
| ВТ_Номенклатура.РазмерWB,
// -- Бойков BSLR-2735
| ВТ_Резерв.Склад,
| %ТекстРезерва,
| ВТ_Резерв.Номенклатура,
| ВТ_Резерв.Характеристика
| ИЗ
// ++ Бойков BSLR-2735
//| ВТ_Резерв КАК ВТ_Резерв) КАК ВложенныйЗапрос
| ВТ_Резерв КАК ВТ_Резерв
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТ_Номенклатура.Товар КАК Товар,
| ВТ_Номенклатура.РазмерWB КАК РазмерWB,
| ВТ_Номенклатура.Номенклатура КАК Номенклатура,
| ВТ_Номенклатура.Характеристика КАК Характеристика
| ИЗ
| ВТ_Номенклатура КАК ВТ_Номенклатура) КАК ВТ_Номенклатура
| ПО ВТ_Резерв.Номенклатура = ВТ_Номенклатура.Номенклатура
| И ВТ_Резерв.Характеристика = ВТ_Номенклатура.Характеристика) КАК ВложенныйЗапрос
// -- Бойков BSLR-2735
|
| СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.Товар,
| ВложенныйЗапрос.РазмерWB,
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Характеристика) КАК ВложенныйЗапрос
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| Т.Товар КАК Товар,
| Т.ТоварID КАК ТоварID,
| Т.КодПоставщика КАК КодПоставщика,
| Т.РазмерWB КАК РазмерWB,
| Т.Штрихкод КАК Штрихкод,
// ++ BSLR-1160
| Т.ОбнулятьОстатки КАК ОбнулятьОстатки
// -- BSLR-1160
| ИЗ
| ВТ_Товары КАК Т
|
| СГРУППИРОВАТЬ ПО
| Т.Товар,
| Т.ТоварID,
| Т.КодПоставщика,
| Т.РазмерWB,
// ++ BSLR-1160
| Т.ОбнулятьОстатки,
// -- BSLR-1160
| Т.Штрихкод) КАК ВТ_Товары
| ПО ВложенныйЗапрос.Товар = ВТ_Товары.Товар
| И ВложенныйЗапрос.РазмерWB = ВТ_Товары.РазмерWB
|{ГДЕ
| (ВЫРАЗИТЬ(ВложенныйЗапрос.Товар КАК Справочник.топ_ТоварыТорговыхПлощадок).ЛичныйКабинет) КАК ЛичныйКабинет,
| ВложенныйЗапрос.Товар,
| ВложенныйЗапрос.РазмерWB,
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.Количество,
| ВТ_Товары.ТоварID,
| ВТ_Товары.КодПоставщика,
| ВТ_Товары.Штрихкод}";
Если НЕ ИмяВТ = "ВТ_Результат" Тогда
Если ЗначениеЗаполнено(ИмяВТ) Тогда
ИмяВТ = СтрШаблон("ПОМЕСТИТЬ %1", ИмяВТ);
Иначе
ИмяВТ =
"{ВЫБРАТЬ
| ЛичныйКабинет,
| Товар,
| РазмерWB,
| Склад,
| Количество,
| ТоварID,
| КодПоставщика,
| Штрихкод,
| Номенклатура,
| Характеристика}";
КонецЕсли;
пТекстРезультата = СтрЗаменить(пТекстРезультата, "ПОМЕСТИТЬ ВТ_Результат", ИмяВТ);
КонецЕсли;
пТекстРезультата = СтрЗаменить(пТекстРезультата, "%ТекстРезерва", ТекстРезерва);
пТекстыЗапросов.Добавить(пТекстРезультата);
пТекстыЗапросов = СтрСоединить(пТекстыЗапросов, ОбщегоНазначения.РазделительПакетаЗапросов());
Возврат пТекстыЗапросов;
КонецФункции
// Бойков BSLR-1734. Добавлен параметр "ЭтоВыгрузкаОстатков"
Функция ОстаткиFBS_ПолучитьТекстЗапроса_ОсновныхТаблиц(ЭтоВыгрузкаОстатков = Ложь) Экспорт
//ВТ_ЛичныеКабинеты - Выбираются все личные кабинеты
//ВТ_Склады - Выбирается таблица СписокСкладовFBS из личного кабинета
//ВТ_Товары - Выбираются ТОЛЬКО сопоставленные товары
Возврат
"ВЫБРАТЬ
| топ_ЛичныеКабинеты.Ссылка КАК Ссылка
|ПОМЕСТИТЬ ВТ_ЛичныеКабинеты
|ИЗ
| Справочник.топ_ЛичныеКабинеты КАК топ_ЛичныеКабинеты
|{ГДЕ
| топ_ЛичныеКабинеты.Ссылка.* КАК ЛичныйКабинет}
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ЛичныеКабинеты.Ссылка КАК ЛичныйКабинет,
| топ_ЛичныеКабинетыСписокСкладовFBS.Склад КАК Склад,
| топ_ЛичныеКабинетыСписокСкладовFBS.СкладТП КАК СкладТП
|ПОМЕСТИТЬ ВТ_Склады
|ИЗ
| Справочник.топ_ЛичныеКабинеты.СписокСкладовFBS КАК топ_ЛичныеКабинетыСписокСкладовFBS
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЛичныеКабинеты КАК ВТ_ЛичныеКабинеты
| ПО топ_ЛичныеКабинетыСписокСкладовFBS.Ссылка = ВТ_ЛичныеКабинеты.Ссылка
|{ГДЕ
| топ_ЛичныеКабинетыСписокСкладовFBS.Склад.*,
| топ_ЛичныеКабинетыСписокСкладовFBS.СкладТП.*}
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВложенныйЗапрос.Товар КАК Товар,
| ВложенныйЗапрос.ТоварID КАК ТоварID,
| ВложенныйЗапрос.КодПоставщика КАК КодПоставщика,
| ВложенныйЗапрос.РазмерWB КАК РазмерWB,
| ВложенныйЗапрос.Штрихкод КАК Штрихкод,
// ++ BSLR-1114
| ВложенныйЗапрос.ОбнулятьОстатки КАК ОбнулятьОстатки,
// -- BSLR-1114
| топ_СоответствиеТоваров.Номенклатура КАК Номенклатура,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика,
| топ_СоответствиеТоваров.Упаковка КАК Упаковка
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| (ВЫБРАТЬ
| Товары.Ссылка КАК Товар,
| Товары.ID КАК ТоварID,
| Товары.КодПоставщика КАК КодПоставщика,
| ЕСТЬNULL(РазмерыТоваровWB.Ссылка, ЗНАЧЕНИЕ(Справочник.топ_РазмерыТоваровWB.ПустаяСсылка)) КАК РазмерWB,
// ++ BSLR-1160
| Товары.ОбнулятьОстатки КАК ОбнулятьОстатки,
// ++ BSLR-1160
| МАКСИМУМ(ВЫБОР
| КОГДА ЕСТЬNULL(РазмерыТоваровWB.Ссылка, 0) = 0
| ИЛИ РазмерыТоваровWB.баркод = """"
| ТОГДА ЕСТЬNULL(Штрихкоды.Штрихкод, """")
| ИНАЧЕ РазмерыТоваровWB.баркод
| КОНЕЦ) КАК Штрихкод
| ИЗ
| Справочник.топ_ТоварыТорговыхПлощадок КАК Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЛичныеКабинеты КАК ВТ_ЛичныеКабинеты
| ПО Товары.ЛичныйКабинет = ВТ_ЛичныеКабинеты.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_Штрихкоды КАК Штрихкоды
| ПО Товары.Ссылка = Штрихкоды.Товар
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.топ_РазмерыТоваровWB КАК РазмерыТоваровWB
| ПО Товары.Ссылка = РазмерыТоваровWB.Владелец
| И (НЕ РазмерыТоваровWB.ПометкаУдаления)
| ГДЕ
| Товары.Показывается = Истина
| {ГДЕ
| Товары.Ссылка.* КАК Товар,
| (ЕСТЬNULL(РазмерыТоваровWB.Ссылка, ЗНАЧЕНИЕ(Справочник.топ_РазмерыТоваровWB.ПустаяСсылка))).* КАК Размер,
// ++ BSLR-1160
| НЕ Товары.ОбнулятьОстатки КАК РазмещенНаВитрине,
// -- BSLR-1160
| (МАКСИМУМ(ЕСТЬNULL(Штрихкоды.Штрихкод, """"))) КАК Штрихкод}
|
| СГРУППИРОВАТЬ ПО
| Товары.Ссылка,
| Товары.ID,
// ++ BSLR-1160
| Товары.ОбнулятьОстатки,
// -- BSLR-1160
| Товары.КодПоставщика,
| ЕСТЬNULL(РазмерыТоваровWB.Ссылка, ЗНАЧЕНИЕ(Справочник.топ_РазмерыТоваровWB.ПустаяСсылка))) КАК ВложенныйЗапрос
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК спрНоменклатура
| ПО топ_СоответствиеТоваров.Номенклатура = спрНоменклатура.Ссылка
| ПО ВложенныйЗапрос.Товар = топ_СоответствиеТоваров.Товар
| И (ВложенныйЗапрос.РазмерWB = топ_СоответствиеТоваров.РазмерWB
| ИЛИ ВложенныйЗапрос.РазмерWB = ЗНАЧЕНИЕ(Справочник.топ_РазмерыТоваровWB.ПустаяСсылка)
| И топ_СоответствиеТоваров.РазмерWB.размер = ""0"")
// ++ Бойков BSLR-1734
|" + ?(ЭтоВыгрузкаОстатков,
" ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_МинимальныйОстатокТовара.СрезПоследних КАК МинимальныеОстаткиТовара
| ПО ВложенныйЗапрос.Товар = МинимальныеОстаткиТовара.Товар
|ГДЕ
| НЕ ЕСТЬNULL(МинимальныеОстаткиТовара.ТоварТолькоДляFBO, ЛОЖЬ)", "") + "
// -- Бойков BSLR-1734
|{ГДЕ
| топ_СоответствиеТоваров.Номенклатура.*,
| топ_СоответствиеТоваров.Характеристика.*}";
КонецФункции
Функция ОстаткиFBS_ПолучитьТекстЗапроса_ВТ_Номенклатура() Экспорт
пТекстыЗапросов = Новый Массив;
Если НЕ Метаданные.Справочники.Найти("УпаковкиЕдиницыИзмерения") = Неопределено Тогда //УТ
пТекстыЗапросов.Добавить(
"ВЫБРАТЬ
| ВТ_Товары.Товар КАК Товар,
| ВТ_Товары.РазмерWB КАК РазмерWB,
| ВТ_Товары.Номенклатура КАК Номенклатура,
| ВТ_Товары.Характеристика КАК Характеристика,
| ЛОЖЬ КАК Набор,
| ВТ_Товары.Номенклатура КАК НоменклатураОстатков,
| ВТ_Товары.Характеристика КАК ХарактеристикаОстатков,
| ВЫБОР
| КОГДА ВТ_Товары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА 1
| ИНАЧЕ ВЫБОР
| КОГДА ВТ_Товары.Упаковка.Знаменатель = 0
| ТОГДА 1
| ИНАЧЕ ВТ_Товары.Упаковка.Знаменатель
| КОНЕЦ
| КОНЕЦ КАК КоэффициентЧислитель,
| ВЫБОР
| КОГДА ВТ_Товары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА 1
| ИНАЧЕ ВЫБОР
| КОГДА ВТ_Товары.Упаковка.Числитель = 0
| ТОГДА 1
| ИНАЧЕ ВТ_Товары.Упаковка.Числитель
| КОНЕЦ
| КОНЕЦ КАК КоэффициентЗнаменатель
|ПОМЕСТИТЬ ВТ_Номенклатура
|ИЗ
| ВТ_Товары КАК ВТ_Товары");
ИначеЕсли НЕ Метаданные.Справочники.Найти("ЕдиницыИзмерения") = Неопределено Тогда //УНФ
пТекстыЗапросов.Добавить(
"ВЫБРАТЬ
| ВТ_Товары.Товар КАК Товар,
| ВТ_Товары.РазмерWB КАК РазмерWB,
| ВТ_Товары.Номенклатура КАК Номенклатура,
| ВТ_Товары.Характеристика КАК Характеристика,
| ЛОЖЬ КАК Набор,
| ВТ_Товары.Номенклатура КАК НоменклатураОстатков,
| ВТ_Товары.Характеристика КАК ХарактеристикаОстатков,
| 1 КАК КоэффициентЧислитель,
| ВЫБОР
| КОГДА ВТ_Товары.Упаковка = ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА 1
| ИНАЧЕ ВЫБОР
| КОГДА ВТ_Товары.Упаковка.Коэффициент = 0
| ТОГДА 1
| ИНАЧЕ ВТ_Товары.Упаковка.Коэффициент
| КОНЕЦ
| КОНЕЦ КАК КоэффициентЗнаменатель
|ПОМЕСТИТЬ ВТ_Номенклатура
|ИЗ
| ВТ_Товары КАК ВТ_Товары");
Иначе
ВызватьИсключение "Ошибка при построении запроса остатков FBS (не найдена таблица упаковок и единиц измерения)";
КонецЕсли;
//БИТ Смирнов А.П. 16.12.2022 )
Если НЕ Метаданные.Справочники.Найти("ВариантыКомплектацииНоменклатуры") = Неопределено Тогда // УТ
пТекстыЗапросов.Добавить(
"ВЫБРАТЬ
| ВТ_Товары.Товар КАК Товар,
| ВТ_Товары.РазмерWB КАК РазмерWB,
| ВТ_Товары.Номенклатура КАК Номенклатура,
| ВТ_Товары.Характеристика КАК Характеристика,
| СоставНаборов.Ссылка КАК Набор,
| СоставНаборов.Номенклатура КАК НоменклатураОстатков,
| СоставНаборов.Характеристика КАК ХарактеристикаОстатков,
| ВЫБОР
| КОГДА СоставНаборов.Ссылка.Количество = 0
| ТОГДА 1
| ИНАЧЕ СоставНаборов.Ссылка.Количество
| КОНЕЦ КАК КоэффициентЧислитель,
| ВЫБОР
| КОГДА СоставНаборов.Количество = 0
| ТОГДА 1
| ИНАЧЕ СоставНаборов.Количество
| КОНЕЦ КАК КоэффициентЗнаменатель
|ИЗ
| ВТ_Товары КАК ВТ_Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК СоставНаборов
| ПО (ВТ_Товары.Номенклатура = СоставНаборов.Ссылка.Владелец
| И ВТ_Товары.Характеристика = СоставНаборов.Ссылка.Характеристика
| И НЕ СоставНаборов.Ссылка.ПометкаУдаления
| И ВТ_Товары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)),
| Константа.ИспользоватьНаборы КАК ИспользоватьНаборы
|ГДЕ
| ИспользоватьНаборы.Значение = ИСТИНА
// ++ Бойков BSLR-2230
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВТ_Товары.Товар КАК Товар,
| ВТ_Товары.РазмерWB КАК РазмерWB,
| ВТ_Товары.Номенклатура КАК Номенклатура,
| ВТ_Товары.Характеристика КАК Характеристика,
| СоставНаборов.Ссылка КАК Набор,
| СоставНаборов.Номенклатура КАК НоменклатураОстатков,
| СоставНаборов.Характеристика КАК ХарактеристикаОстатков,
| ВЫБОР
| КОГДА СоставНаборов.Ссылка.Количество = 0
| ТОГДА 1
| ИНАЧЕ СоставНаборов.Ссылка.Количество
| КОНЕЦ КАК КоэффициентЧислитель,
| ВЫБОР
| КОГДА СоставНаборов.Количество = 0
| ТОГДА 1
| ИНАЧЕ СоставНаборов.Количество
| КОНЕЦ КАК КоэффициентЗнаменатель
|ИЗ
| ВТ_Товары КАК ВТ_Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК СоставНаборов
| ПО (ВТ_Товары.Номенклатура = СоставНаборов.Ссылка.Владелец
| И ВТ_Товары.Характеристика = СоставНаборов.Ссылка.Характеристика
| И НЕ СоставНаборов.Ссылка.ПометкаУдаления
//BSLR-2489, Начало, Чупраков А.Н., 28.11.23
//| И &НеВыгружатьВиртуальныйОстатокПоКомплектам = ЛОЖЬ
| И ВТ_Товары.Товар.ЛичныйКабинет.НеВыгружатьВиртуальныйОстатокПоКомплектам = ЛОЖЬ
//BSLR-2489, Конец
| И ВЫБОР
| КОГДА ВТ_Товары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
| ТОГДА СоставНаборов.Ссылка.Основной
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ)");
// -- Бойков BSLR-2230
ИначеЕсли НЕ Метаданные.РегистрыСведений.Найти("СоставНаборов") = Неопределено Тогда // УНФ
пТекстыЗапросов.Добавить(
"ВЫБРАТЬ
| ВТ_Товары.Товар КАК Товар,
| ВТ_Товары.РазмерWB КАК РазмерWB,
| ВТ_Товары.Номенклатура КАК Номенклатура,
| ВТ_Товары.Характеристика КАК Характеристика,
| ИСТИНА КАК Набор,
| СоставНаборов.Номенклатура КАК НоменклатураОстатков,
| СоставНаборов.Характеристика КАК ХарактеристикаОстатков,
| 1 КАК КоэффициентЧислитель,
| ВЫБОР
| КОГДА СУММА(СоставНаборов.Количество * ВЫБОР
| КОГДА СоставНаборов.ЕдиницаИзмерения ССЫЛКА Справочник.ЕдиницыИзмерения
| ТОГДА СоставНаборов.ЕдиницаИзмерения.Коэффициент
| ИНАЧЕ 1
| КОНЕЦ) = 0
| ТОГДА 1
| ИНАЧЕ СУММА(СоставНаборов.Количество * ВЫБОР
| КОГДА СоставНаборов.ЕдиницаИзмерения ССЫЛКА Справочник.ЕдиницыИзмерения
| ТОГДА СоставНаборов.ЕдиницаИзмерения.Коэффициент
| ИНАЧЕ 1
| КОНЕЦ)
| КОНЕЦ КАК КоэффициентЗнаменатель
|ИЗ
| ВТ_Товары КАК ВТ_Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставНаборов КАК СоставНаборов
| ПО ВТ_Товары.Номенклатура = СоставНаборов.НоменклатураНабора
// письмерова BSLR-1795 - при отключении признака набор в номенклатуре запись в РС остается
| И СоставНаборов.НоменклатураНабора.ЭтоНабор
| И (ВТ_Товары.Характеристика = СоставНаборов.ХарактеристикаНабора
| И НЕ СоставНаборов.Общий
| ИЛИ ВТ_Товары.Характеристика <> ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
| И СоставНаборов.Общий)
|
|СГРУППИРОВАТЬ ПО
| ВТ_Товары.Товар,
| ВТ_Товары.РазмерWB,
| ВТ_Товары.Номенклатура,
| ВТ_Товары.Характеристика,
| СоставНаборов.Номенклатура,
| СоставНаборов.Характеристика
// ++ Бойков BSLR-2230
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВТ_Товары.Товар КАК Товар,
| ВТ_Товары.РазмерWB КАК РазмерWB,
| ВТ_Товары.Номенклатура КАК Номенклатура,
| ВТ_Товары.Характеристика КАК Характеристика,
| ИСТИНА КАК Набор,
| СоставКомплектации.Номенклатура КАК НоменклатураОстатков,
| СоставКомплектации.Характеристика КАК ХарактеристикаОстатков,
| СоставКомплектации.КоличествоПродукции КАК КоэффициентЧислитель,
| СоставКомплектации.Количество КАК КоэффициентЗнаменатель
|ИЗ
| ВТ_Товары КАК ВТ_Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КомплектацииПоУмолчанию КАК КомплектацииПоУмолчанию
| ПО ВТ_Товары.Номенклатура = КомплектацииПоУмолчанию.Номенклатура
| И ВТ_Товары.Характеристика = КомплектацииПоУмолчанию.Характеристика
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.КомплектацииНоменклатуры.Состав КАК СоставКомплектации
| ПО КомплектацииПоУмолчанию.Комплектация = СоставКомплектации.Ссылка
| И НЕ СоставКомплектации.Ссылка.ПометкаУдаления
//BSLR-2489, Начало, Чупраков А.Н., 28.11.23
//| И (&НеВыгружатьВиртуальныйОстатокПоКомплектам = ЛОЖЬ)");
| И (ВТ_Товары.Товар.ЛичныйКабинет.НеВыгружатьВиртуальныйОстатокПоКомплектам = ЛОЖЬ)");
//BSLR-2489, Конец
// -- Бойков BSLR-2230
Иначе
ВызватьИсключение "Ошибка при построении запроса остатков FBS (не найдена таблица наборов)";
КонецЕсли;
пТекстыЗапросов = СтрСоединить(пТекстыЗапросов, СтрШаблон("%1%1ОБЪЕДИНИТЬ ВСЕ%1%1", Символы.ПС));
Возврат пТекстыЗапросов;
КонецФункции
Функция ОстаткиFBS_ПолучитьТекстЗапроса_ВТ_Остатки(УчитыватьМинимальныеОстатки = Ложь)
ЭтоУНФ = Ложь;
пТекстЗапроса = Новый Массив;
Если топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей", "11.4.")
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("КомплекснаяАвтоматизация", "2.4.")
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеПредприятием", "2.4.") Тогда // УТ 11.4
пТекстЗапроса.Добавить(
"ВЫБРАТЬ
| СвободныеОстатки.Номенклатура КАК Номенклатура,
| СвободныеОстатки.Характеристика КАК Характеристика,
| СвободныеОстатки.Склад КАК Склад,
| СУММА(СвободныеОстатки.ВНаличииОстаток - СвободныеОстатки.ВРезервеСоСкладаОстаток - СвободныеОстатки.ВРезервеПодЗаказОстаток) КАК Остаток
|ПОМЕСТИТЬ ВТ_ОстаткиПредварительная
|ИЗ
| РегистрНакопления.СвободныеОстатки.Остатки(
| ,
| (Номенклатура, Характеристика) В
| (ВЫБРАТЬ
| Таблица.НоменклатураОстатков КАК Номенклатура,
| Таблица.ХарактеристикаОстатков КАК Характеристика
| ИЗ
| ВТ_Номенклатура КАК Таблица)
| И Склад В
| (ВЫБРАТЬ
| Таблица.Склад
| ИЗ
| ВТ_Склады КАК Таблица)) КАК СвободныеОстатки
|
|СГРУППИРОВАТЬ ПО
| СвободныеОстатки.Номенклатура,
| СвободныеОстатки.Характеристика,
| СвободныеОстатки.Склад");
//BSLR-5453
ИначеЕсли топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей", "11.5.26.96", Истина)
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("КомплекснаяАвтоматизация", "2.5.26.96", Истина)
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеПредприятием", "2.5.26.96", Истина) Тогда // УТ 11.5
пТекстЗапроса.Добавить(
"ВЫБРАТЬ
| СвободныеОстатки.Номенклатура КАК Номенклатура,
| СвободныеОстатки.Характеристика КАК Характеристика,
| СвободныеОстатки.Склад КАК Склад,
| СУММА(СвободныеОстатки.Количество) КАК Остаток
|ПОМЕСТИТЬ ВТ_ОстаткиПредварительная
|ИЗ
| (ВЫБРАТЬ
| Т.НоменклатураОстатков КАК Номенклатура,
| Т.ХарактеристикаОстатков КАК Характеристика
| ИЗ
| ВТ_Номенклатура КАК Т
|
| СГРУППИРОВАТЬ ПО
| Т.НоменклатураОстатков,
| Т.ХарактеристикаОстатков) КАК ВТ_Номенклатура
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК СвободныеОстатки
| ПО ВТ_Номенклатура.Номенклатура = СвободныеОстатки.Номенклатура
| И ВТ_Номенклатура.Характеристика = СвободныеОстатки.Характеристика
| И (СвободныеОстатки.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии))
// BSLR-5822
//| И (СвободныеОстатки.СостояниеЗапаса В (ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка), ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке)))
| И (СвободныеОстатки.ХарактеристикаПотребности В (ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек)))
| И (СвободныеОстатки.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка))
|ГДЕ
| СвободныеОстатки.Склад В
| (ВЫБРАТЬ
| Т.Склад
| ИЗ
| ВТ_Склады КАК Т)
|
|СГРУППИРОВАТЬ ПО
| СвободныеОстатки.Номенклатура,
| СвободныеОстатки.Характеристика,
| СвободныеОстатки.Склад");
//BSLR-5453
ИначеЕсли топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей", "11.5.")
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("КомплекснаяАвтоматизация", "2.5.")
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеПредприятием", "2.5.") Тогда //
пТекстЗапроса.Добавить(
"ВЫБРАТЬ
| СвободныеОстатки.Номенклатура КАК Номенклатура,
| СвободныеОстатки.Характеристика КАК Характеристика,
| СвободныеОстатки.Склад КАК Склад,
| СУММА(СвободныеОстатки.Свободно) КАК Остаток
|ПОМЕСТИТЬ ВТ_ОстаткиПредварительная
|ИЗ
| (ВЫБРАТЬ
| Т.НоменклатураОстатков КАК Номенклатура,
| Т.ХарактеристикаОстатков КАК Характеристика
| ИЗ
| ВТ_Номенклатура КАК Т
|
| СГРУППИРОВАТЬ ПО
| Т.НоменклатураОстатков,
| Т.ХарактеристикаОстатков) КАК ВТ_Номенклатура
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК СвободныеОстатки
| ПО ВТ_Номенклатура.Номенклатура = СвободныеОстатки.Номенклатура
| И ВТ_Номенклатура.Характеристика = СвободныеОстатки.Характеристика
| И (СвободныеОстатки.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОстатокНаСкладе))
| И (СвободныеОстатки.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка))
|ГДЕ
| СвободныеОстатки.Склад В
| (ВЫБРАТЬ
| Т.Склад
| ИЗ
| ВТ_Склады КАК Т)
|
|СГРУППИРОВАТЬ ПО
| СвободныеОстатки.Номенклатура,
| СвободныеОстатки.Характеристика,
| СвободныеОстатки.Склад");
ИначеЕсли топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеНебольшойФирмой") Тогда // УНФ
ЭтоУНФ = Истина;
пТекстЗапроса.Добавить(
"ВЫБРАТЬ
| ЗапасыОстатки.Номенклатура КАК Номенклатура,
| ЗапасыОстатки.Характеристика КАК Характеристика,
| ЗапасыОстатки.СтруктурнаяЕдиница КАК Склад,
| СУММА(ЗапасыОстатки.КоличествоОстаток) КАК Остаток
|ПОМЕСТИТЬ ВТ_ОстаткиПредварительная
|ИЗ
| РегистрНакопления.Запасы.Остатки(
| ,
| (Номенклатура, Характеристика) В
| (ВЫБРАТЬ
| Таблица.НоменклатураОстатков КАК Номенклатура,
| Таблица.ХарактеристикаОстатков КАК Характеристика
| ИЗ
| ВТ_Номенклатура КАК Таблица)
| И СтруктурнаяЕдиница В
| (ВЫБРАТЬ
| Таблица.Склад
| ИЗ
| ВТ_Склады КАК Таблица)
| И ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)) КАК ЗапасыОстатки
|
|СГРУППИРОВАТЬ ПО
| ЗапасыОстатки.Номенклатура,
| ЗапасыОстатки.Характеристика,
| ЗапасыОстатки.СтруктурнаяЕдиница");
Иначе
ВызватьИсключение "Ошибка при построении запроса остатков FBS (не найден регистр остатков)";
КонецЕсли;
// ++ BSLR-XXXX, Варнин, 23.09.2026
// Склады поставщиков (FBS со склада Берга): остаток берётся не из РаспределениеЗапасов, а из
// регистра расширения Кореана кор_ОстаткиПоставщиков. Текст подменяет кор_ОстаткиПоставщиков.ДополнитьЗапросОстатковFBS;
// без Кореаны или без настроенных складов поставщиков запрос остаётся прежним.
Если Не ЭтоУНФ И Метаданные.ОбщиеМодули.Найти("кор_ОстаткиПоставщиков") <> Неопределено Тогда
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(пТекстЗапроса);
ОбщегоНазначения.ВыполнитьМетодКонфигурации("кор_ОстаткиПоставщиков.ДополнитьЗапросОстатковFBS", ПараметрыМетода);
КонецЕсли;
// -- BSLR-XXXX, Варнин, 23.09.2026
// BSLR-5822 добавлена группировка для КоэффициентЗнаменатель, когда в наборе несколько строк с одним товаром
пТекстЗапроса.Добавить(
"ВЫБРАТЬ
| ВложенныйЗапрос.Товар КАК Товар,
| ВложенныйЗапрос.РазмерWB КАК РазмерWB,
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.Характеристика КАК Характеристика,
| СУММА(ВЫБОР
| КОГДА ВложенныйЗапрос.Количество = 0
| ТОГДА 0
| КОГДА ВложенныйЗапрос.Количество > 0
| ТОГДА ВЫРАЗИТЬ(ВложенныйЗапрос.Количество - 0.5 КАК ЧИСЛО(15, 0))
| ИНАЧЕ ВЫРАЗИТЬ(ВложенныйЗапрос.Количество + 0.5 КАК ЧИСЛО(15, 0))
| КОНЕЦ) КАК Количество,
| ВложенныйЗапрос.Склад КАК Склад
|ПОМЕСТИТЬ ВТ_Остатки
|ИЗ
| (ВЫБРАТЬ
| ВТ_Номенклатура.Товар КАК Товар,
| ВТ_Номенклатура.РазмерWB КАК РазмерWB,
| ВТ_Номенклатура.Номенклатура КАК Номенклатура,
| ВТ_Номенклатура.Характеристика КАК Характеристика,
| ВТ_Номенклатура.Набор КАК Набор,
| МИНИМУМ(ВТ_Номенклатура.КоэффициентЧислитель * ВЫБОР
| КОГДА ВТ_ОстаткиПредварительная.Остаток ЕСТЬ NULL
| ИЛИ ВТ_ОстаткиПредварительная.Остаток < 0
| И ВТ_Номенклатура.Набор <> ЛОЖЬ
| ТОГДА 0
| ИНАЧЕ ВТ_ОстаткиПредварительная.Остаток
| КОНЕЦ / ВТ_Номенклатура.КоэффициентЗнаменатель) КАК Количество,
| ВТ_Номенклатура.Склад КАК Склад
| ИЗ
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТ_Номенклатура.Товар КАК Товар,
| ВТ_Номенклатура.РазмерWB КАК РазмерWB,
| ВТ_Номенклатура.Номенклатура КАК Номенклатура,
| ВТ_Номенклатура.Характеристика КАК Характеристика,
| ВТ_Номенклатура.Набор КАК Набор,
| ВТ_Номенклатура.НоменклатураОстатков КАК НоменклатураОстатков,
| ВТ_Номенклатура.ХарактеристикаОстатков КАК ХарактеристикаОстатков,
| ВТ_Номенклатура.КоэффициентЧислитель КАК КоэффициентЧислитель,
| СУММА(ВТ_Номенклатура.КоэффициентЗнаменатель) КАК КоэффициентЗнаменатель,
| ВложенныйЗапрос.Склад КАК Склад
| ИЗ
| ВТ_Номенклатура КАК ВТ_Номенклатура,
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВТ_Склады.Склад КАК Склад
| ИЗ
| ВТ_Склады КАК ВТ_Склады) КАК ВложенныйЗапрос
|
| СГРУППИРОВАТЬ ПО
| ВТ_Номенклатура.Товар,
| ВТ_Номенклатура.РазмерWB,
| ВТ_Номенклатура.Номенклатура,
| ВТ_Номенклатура.Характеристика,
| ВТ_Номенклатура.Набор,
| ВТ_Номенклатура.НоменклатураОстатков,
| ВТ_Номенклатура.ХарактеристикаОстатков,
| ВТ_Номенклатура.КоэффициентЧислитель,
| ВложенныйЗапрос.Склад) КАК ВТ_Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиПредварительная КАК ВТ_ОстаткиПредварительная
| ПО ВТ_Номенклатура.НоменклатураОстатков = ВТ_ОстаткиПредварительная.Номенклатура
| И ВТ_Номенклатура.ХарактеристикаОстатков = ВТ_ОстаткиПредварительная.Характеристика
| И ВТ_Номенклатура.Склад = ВТ_ОстаткиПредварительная.Склад
|
| СГРУППИРОВАТЬ ПО
| ВТ_Номенклатура.Товар,
| ВТ_Номенклатура.РазмерWB,
| ВТ_Номенклатура.Номенклатура,
| ВТ_Номенклатура.Характеристика,
| ВТ_Номенклатура.Набор,
| ВТ_Номенклатура.Склад) КАК ВложенныйЗапрос
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Товар,
| ВложенныйЗапрос.РазмерWB,
| ВложенныйЗапрос.Номенклатура,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Склад");
// ++ Бойков BSLR-2192. Сделано через вложенные запросы, чтобы оптимизатор СКД не убрал некоторые поля
пТекстЗапроса.Удалить(пТекстЗапроса.ВГраница());
пТекстЗапроса.Добавить(
"ВЫБРАТЬ
| топ_ОграниченияВыгрузкиОстатковНаМП.СкладПоставщика КАК СкладПоставщика,
| топ_ОграниченияВыгрузкиОстатковНаМП.Товар КАК Товар,
| топ_ОграниченияВыгрузкиОстатковНаМП.РазмерWB КАК РазмерWB
|ПОМЕСТИТЬ ВТ_ограничения
|ИЗ
| РегистрСведений.топ_ОграниченияВыгрузкиОстатковНаМП КАК топ_ОграниченияВыгрузкиОстатковНаМП
|ГДЕ
| топ_ОграниченияВыгрузкиОстатковНаМП.СкладПоставщика = &Склад");
пТекстЗапроса.Добавить(
// BSLR-5822 добавлена группировка для КоэффициентЗнаменатель, когда в наборе несколько строк с одним товаром
"ВЫБРАТЬ
| ВложенныйЗапрос.Товар КАК Товар,
| ВложенныйЗапрос.РазмерWB КАК РазмерWB,
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.Характеристика КАК Характеристика,
| ВложенныйЗапрос.Набор КАК Набор,
| ВложенныйЗапрос.НоменклатураОстатков КАК НоменклатураОстатков,
| ВложенныйЗапрос.ХарактеристикаОстатков КАК ХарактеристикаОстатков,
| ВложенныйЗапрос.КоэффициентЧислитель КАК КоэффициентЧислитель,
| СУММА(ВложенныйЗапрос.КоэффициентЗнаменатель) КАК КоэффициентЗнаменатель,
| ВложенныйЗапрос.Склад КАК Склад,
| ВложенныйЗапрос.СкладТП КАК СкладТП
|ПОМЕСТИТЬ ВТ_НоменклатураСоСкладами
|ИЗ
| (ВЫБРАТЬ
| ВТ_Номенклатура.Товар КАК Товар,
| ВТ_Номенклатура.РазмерWB КАК РазмерWB,
| ВТ_Номенклатура.Номенклатура КАК Номенклатура,
| ВТ_Номенклатура.Характеристика КАК Характеристика,
| ВТ_Номенклатура.Набор КАК Набор,
| ВТ_Номенклатура.НоменклатураОстатков КАК НоменклатураОстатков,
| ВТ_Номенклатура.ХарактеристикаОстатков КАК ХарактеристикаОстатков,
| ВТ_Номенклатура.КоэффициентЧислитель КАК КоэффициентЧислитель,
| ВТ_Номенклатура.КоэффициентЗнаменатель КАК КоэффициентЗнаменатель,
| ВТ_Склады.Склад КАК Склад,
| ВТ_Склады.СкладТП КАК СкладТП
| ИЗ
| ВТ_Номенклатура КАК ВТ_Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Склады КАК ВТ_Склады
| ПО ВТ_Номенклатура.Товар.ЛичныйКабинет = ВТ_Склады.ЛичныйКабинет) КАК ВложенныйЗапрос
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ограничения КАК ВТ_ограничения
| ПО ВложенныйЗапрос.Товар = ВТ_ограничения.Товар
| И ВложенныйЗапрос.РазмерWB = ВТ_ограничения.РазмерWB
| И ВложенныйЗапрос.СкладТП = ВТ_ограничения.СкладПоставщика
|ГДЕ
| ЕСТЬNULL(ВТ_ограничения.СкладПоставщика, 0) = 0
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.РазмерWB,
| ВложенныйЗапрос.Товар,
| ВложенныйЗапрос.СкладТП,
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.КоэффициентЧислитель,
| ВложенныйЗапрос.ХарактеристикаОстатков,
| ВложенныйЗапрос.НоменклатураОстатков,
| ВложенныйЗапрос.Набор,
| ВложенныйЗапрос.Характеристика,
| ВложенныйЗапрос.Номенклатура");
пТекстЗапроса.Добавить(
"ВЫБРАТЬ
| ВложенныйЗапрос.Товар КАК Товар,
| ВложенныйЗапрос.РазмерWB КАК РазмерWB,
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.Характеристика КАК Характеристика,
| ВложенныйЗапрос.Набор КАК Набор,
| ВложенныйЗапрос.НоменклатураОстатков КАК НоменклатураОстатков,
| ВложенныйЗапрос.ХарактеристикаОстатков КАК ХарактеристикаОстатков,
| ВложенныйЗапрос.СкладТП КАК СкладТП,
| ВложенныйЗапрос.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_ИтогиПоНоменклатуреОстатков
|ИЗ
| (ВЫБРАТЬ
| ВТ_НоменклатураСоСкладами.Товар КАК Товар,
| ВТ_НоменклатураСоСкладами.РазмерWB КАК РазмерWB,
| ВТ_НоменклатураСоСкладами.Номенклатура КАК Номенклатура,
| ВТ_НоменклатураСоСкладами.Характеристика КАК Характеристика,
| ВТ_НоменклатураСоСкладами.Набор КАК Набор,
| ВТ_НоменклатураСоСкладами.НоменклатураОстатков КАК НоменклатураОстатков,
| ВТ_НоменклатураСоСкладами.ХарактеристикаОстатков КАК ХарактеристикаОстатков,
| ВТ_НоменклатураСоСкладами.СкладТП КАК СкладТП,
| СУММА(ВЫБОР
| КОГДА ВТ_ОстаткиПредварительная.Остаток ЕСТЬ NULL
| ИЛИ ВТ_ОстаткиПредварительная.Остаток < 0
| И ВТ_НоменклатураСоСкладами.Набор <> ЛОЖЬ
| ТОГДА 0
| ИНАЧЕ ВТ_ОстаткиПредварительная.Остаток
| КОНЕЦ) * ВТ_НоменклатураСоСкладами.КоэффициентЧислитель / ВТ_НоменклатураСоСкладами.КоэффициентЗнаменатель КАК Количество
| ИЗ
| ВТ_НоменклатураСоСкладами КАК ВТ_НоменклатураСоСкладами
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиПредварительная КАК ВТ_ОстаткиПредварительная
| ПО ВТ_НоменклатураСоСкладами.НоменклатураОстатков = ВТ_ОстаткиПредварительная.Номенклатура
| И ВТ_НоменклатураСоСкладами.ХарактеристикаОстатков = ВТ_ОстаткиПредварительная.Характеристика
| И ВТ_НоменклатураСоСкладами.Склад = ВТ_ОстаткиПредварительная.Склад
|
| СГРУППИРОВАТЬ ПО
| ВТ_НоменклатураСоСкладами.Товар,
| ВТ_НоменклатураСоСкладами.РазмерWB,
| ВТ_НоменклатураСоСкладами.Номенклатура,
| ВТ_НоменклатураСоСкладами.Характеристика,
| ВТ_НоменклатураСоСкладами.Набор,
| ВТ_НоменклатураСоСкладами.НоменклатураОстатков,
| ВТ_НоменклатураСоСкладами.ХарактеристикаОстатков,
| ВТ_НоменклатураСоСкладами.КоэффициентЧислитель,
| ВТ_НоменклатураСоСкладами.КоэффициентЗнаменатель,
| ВТ_НоменклатураСоСкладами.СкладТП) КАК ВложенныйЗапрос");
пТекстЗапроса.Добавить(
"ВЫБРАТЬ
| ВложенныйЗапрос.Товар КАК Товар,
| ВложенныйЗапрос.РазмерWB КАК РазмерWB,
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.Характеристика КАК Характеристика,
| ВложенныйЗапрос.Набор КАК Набор,
| ВложенныйЗапрос.СкладТП КАК СкладТП,
| ВложенныйЗапрос.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_ОстаткиПоСкладамТП
|ИЗ
| (ВЫБРАТЬ
| ВТ_ИтогиПоНоменклатуреОстатков.Товар КАК Товар,
| ВТ_ИтогиПоНоменклатуреОстатков.РазмерWB КАК РазмерWB,
| ВТ_ИтогиПоНоменклатуреОстатков.Номенклатура КАК Номенклатура,
| ВТ_ИтогиПоНоменклатуреОстатков.Характеристика КАК Характеристика,
| ВТ_ИтогиПоНоменклатуреОстатков.Набор КАК Набор,
| ВТ_ИтогиПоНоменклатуреОстатков.СкладТП КАК СкладТП,
| МИНИМУМ(ВТ_ИтогиПоНоменклатуреОстатков.Количество) КАК Количество
| ИЗ
| ВТ_ИтогиПоНоменклатуреОстатков КАК ВТ_ИтогиПоНоменклатуреОстатков
|
| СГРУППИРОВАТЬ ПО
| ВТ_ИтогиПоНоменклатуреОстатков.Товар,
| ВТ_ИтогиПоНоменклатуреОстатков.РазмерWB,
| ВТ_ИтогиПоНоменклатуреОстатков.Номенклатура,
| ВТ_ИтогиПоНоменклатуреОстатков.Характеристика,
| ВТ_ИтогиПоНоменклатуреОстатков.Набор,
| ВТ_ИтогиПоНоменклатуреОстатков.СкладТП) КАК ВложенныйЗапрос");
пТекстЗапроса.Добавить(
"ВЫБРАТЬ
| ВложенныйЗапрос.Товар КАК Товар,
| ВложенныйЗапрос.РазмерWB КАК РазмерWB,
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.Характеристика КАК Характеристика,
| ВложенныйЗапрос.СкладТП КАК СкладТП,
| ВложенныйЗапрос.Склад КАК Склад,
| ВложенныйЗапрос.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_Остатки
|ИЗ
| (ВЫБРАТЬ
| ВТ_ОстаткиПоСкладамТП.Товар КАК Товар,
| ВТ_ОстаткиПоСкладамТП.РазмерWB КАК РазмерWB,
| ВТ_ОстаткиПоСкладамТП.Номенклатура КАК Номенклатура,
| ВТ_ОстаткиПоСкладамТП.Характеристика КАК Характеристика,
| ВТ_ОстаткиПоСкладамТП.СкладТП КАК СкладТП,
| НЕОПРЕДЕЛЕНО КАК Склад,
| СУММА(ВЫБОР
| КОГДА ВТ_ОстаткиПоСкладамТП.Количество = 0
| ТОГДА 0
| КОГДА ВТ_ОстаткиПоСкладамТП.Количество > 0
| ТОГДА ВЫРАЗИТЬ(ВТ_ОстаткиПоСкладамТП.Количество - 0.5 КАК ЧИСЛО(15, 0))
| ИНАЧЕ ВЫРАЗИТЬ(ВТ_ОстаткиПоСкладамТП.Количество + 0.5 КАК ЧИСЛО(15, 0))
| КОНЕЦ) КАК Количество
| ИЗ
| ВТ_ОстаткиПоСкладамТП КАК ВТ_ОстаткиПоСкладамТП
|
| СГРУППИРОВАТЬ ПО
| ВТ_ОстаткиПоСкладамТП.Товар,
| ВТ_ОстаткиПоСкладамТП.РазмерWB,
| ВТ_ОстаткиПоСкладамТП.Номенклатура,
| ВТ_ОстаткиПоСкладамТП.Характеристика,
| ВТ_ОстаткиПоСкладамТП.СкладТП) КАК ВложенныйЗапрос");
// -- Бойков BSLR-2192
пТекстЗапроса.Добавить("УНИЧТОЖИТЬ ВТ_ОстаткиПредварительная");
// ++ БИТ Сергеев BSLR-1005
Если УчитыватьМинимальныеОстатки Тогда
пТекстЗапроса.Добавить("ВЫБРАТЬ * Поместить ВТ_ОстаткиПредварительная ИЗ ВТ_Остатки КАК Т");
пТекстЗапроса.Добавить("УНИЧТОЖИТЬ ВТ_Остатки");
ТекстСклада = ?(ЭтоУНФ, "Значение(Справочник.СтруктурныеЕдиницы.пустаяссылка)", "Значение(Справочник.Склады.пустаяссылка)");
ТекстМинОстатка = "ВЫБРАТЬ
| Т.Товар КАК Товар,
| Т.РазмерWB КАК РазмерWB,
| Т.Номенклатура КАК Номенклатура,
| Т.Характеристика КАК Характеристика,
| Т.Количество - ЕСТЬNULL(МинимальныйОстатокТовара.МинимальныйОстаток, 0) КАК Количество,
| %1 КАК Склад
|ПОМЕСТИТЬ ВТ_Остатки
|ИЗ
| ВТ_ОстаткиПредварительная КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_МинимальныйОстатокТовара.СрезПоследних(
| ,
| Товар В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.Товар
| ИЗ
| ВТ_Товары КАК Т)) КАК МинимальныйОстатокТовара
| ПО Т.Товар = МинимальныйОстатокТовара.Товар";
ТекстМинОстатка = СтрШаблон(ТекстМинОстатка, ТекстСклада);
пТекстЗапроса.Добавить(ТекстМинОстатка);
КонецЕсли;
// -- БИТ Сергеев BSLR-1005
пТекстЗапроса = СтрСоединить(пТекстЗапроса, ОбщегоНазначения.РазделительПакетаЗапросов());
Возврат пТекстЗапроса;
КонецФункции
Функция ОстаткиFBS_ПолучитьТекстЗапроса_ВТ_Резерв(НовыйТекстЗапроса = Ложь) Экспорт
// ++ Бойков BSLR-2507
Если НовыйТекстЗапроса Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Продажи.Товар КАК Товар,
| Продажи.РазмерWB КАК РазмерWB,
| Продажи.СкладПоставщика КАК СкладТП,
| СУММА(Продажи.КоличествоОборот) КАК Количество
|ПОМЕСТИТЬ ВТ_ПродажиВРезерве
|ИЗ
| РегистрНакопления.топ_Продажи.Обороты(
| ,
| ,
| Регистратор,
| (Товар, РазмерWB) В
| (ВЫБРАТЬ
| Т.Товар КАК Товар,
| Т.РазмерWB КАК РазмерWB
| ИЗ
| ВТ_Номенклатура КАК Т)
| И СкладПоставщика В
| (ВЫБРАТЬ
| Т.СкладТП КАК СкладТП
| ИЗ
| ВТ_Склады КАК Т)
| И СхемаРаботы = ЗНАЧЕНИЕ(Перечисление.топ_СхемыРаботы.FBS)) КАК Продажи
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.топ_СтатусыЗаказовТорговойПлощадки.СрезПоследних КАК СтатусыЗаказов
| ПО Продажи.Регистратор = СтатусыЗаказов.ЗаказТорговойПлощадки
| И (СтатусыЗаказов.Статус.НаименованиеДляПоиска = ""ЗаказВОбработке""
| И СтатусыЗаказов.ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка = ЗНАЧЕНИЕ(Перечисление.топ_ТорговыеПлощадки.ЯндексМаркет)
| ИЛИ СтатусыЗаказов.Статус.НаименованиеДляПоиска = ""Awaiting_packaging""
| И СтатусыЗаказов.ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка = ЗНАЧЕНИЕ(Перечисление.топ_ТорговыеПлощадки.OZON)
| ИЛИ СтатусыЗаказов.Статус.НаименованиеДляПоиска = ""НовыйЗаказ""
| И СтатусыЗаказов.ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка = ЗНАЧЕНИЕ(Перечисление.топ_ТорговыеПлощадки.Wildberries))
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеЗаказов КАК СоответствиеЗаказов
| ПО Продажи.Регистратор = СоответствиеЗаказов.ЗаказТорговойПлощадки
|
//| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Константа.топ_ИспользоватьВиртуальныйРезерв КАК ИспользоватьВиртуальныйРезерв
//| ПО ИСТИНА
|ГДЕ
| НЕ ЕСТЬNULL(СоответствиеЗаказов.ЗаказКлиента.Проведен, ЛОЖЬ)
| И &ИспользоватьВиртуальныйРезерв
|
|СГРУППИРОВАТЬ ПО
| Продажи.Товар,
| Продажи.РазмерWB,
| Продажи.СкладПоставщика
|;
|
|////////////////////////////////////////////////////////////////////////////////
// ++ Бойков BSLR-2603
|ВЫБРАТЬ
| СоответствиеТоваровИНоменклатурыКомплектующих.Товар КАК Товар,
| СоответствиеТоваровИНоменклатурыКомплектующих.РазмерWB КАК РазмерWB,
| СоответствиеТоваровИНоменклатурыКомплектующих.Номенклатура КАК Номенклатура,
| СоответствиеТоваровИНоменклатурыКомплектующих.Характеристика КАК Характеристика,
| ПродажиВРезерве.СкладТП КАК СкладТП,
| СУММА(ПродажиВРезерве.Количество * НоменклатураКомплектующих.КоэффициентЗнаменатель * СоответствиеТоваровИНоменклатурыКомплектующих.КоэффициентЧислитель / (НоменклатураКомплектующих.КоэффициентЧислитель * СоответствиеТоваровИНоменклатурыКомплектующих.КоэффициентЗнаменатель)) КАК Количество
|ПОМЕСТИТЬ ВТ_КомплектующиеВРезерве
|ИЗ
| ВТ_ПродажиВРезерве КАК ПродажиВРезерве
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Номенклатура КАК НоменклатураКомплектующих
| ПО ПродажиВРезерве.Товар = НоменклатураКомплектующих.Товар
| И ПродажиВРезерве.РазмерWB = НоменклатураКомплектующих.РазмерWB
| И НЕ НоменклатураКомплектующих.Набор = ЛОЖЬ
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Номенклатура КАК СоответствиеТоваровИНоменклатурыКомплектующих
| ПО НоменклатураКомплектующих.НоменклатураОстатков = СоответствиеТоваровИНоменклатурыКомплектующих.Номенклатура
| И НоменклатураКомплектующих.ХарактеристикаОстатков = СоответствиеТоваровИНоменклатурыКомплектующих.Характеристика
| И СоответствиеТоваровИНоменклатурыКомплектующих.Набор = ЛОЖЬ
|
|СГРУППИРОВАТЬ ПО
| СоответствиеТоваровИНоменклатурыКомплектующих.Товар,
| СоответствиеТоваровИНоменклатурыКомплектующих.РазмерWB,
| СоответствиеТоваровИНоменклатурыКомплектующих.Номенклатура,
| СоответствиеТоваровИНоменклатурыКомплектующих.Характеристика,
| ПродажиВРезерве.СкладТП
|;
|
|////////////////////////////////////////////////////////////////////////////////
// -- Бойков BSLR-2603
|ВЫБРАТЬ
| ПродажиВРезерве.Товар КАК Товар,
| ПродажиВРезерве.РазмерWB КАК РазмерWB,
| ВТ_Номенклатура.Номенклатура КАК Номенклатура,
| ВТ_Номенклатура.Характеристика КАК Характеристика,
| ПродажиВРезерве.СкладТП КАК СкладТП,
| НЕОПРЕДЕЛЕНО КАК Склад,
| ВЫБОР
| КОГДА ПродажиВРезерве.Количество > 0
| ТОГДА ВЫРАЗИТЬ(ПродажиВРезерве.Количество - 0.5 КАК ЧИСЛО(15, 0))
| ИНАЧЕ 0
| КОНЕЦ КАК Количество
|ПОМЕСТИТЬ ВТ_Резерв
|ИЗ
| ВТ_ПродажиВРезерве КАК ПродажиВРезерве
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Номенклатура КАК ВТ_Номенклатура
| ПО ПродажиВРезерве.Товар = ВТ_Номенклатура.Товар
| И ПродажиВРезерве.РазмерWB = ВТ_Номенклатура.РазмерWB
| И ВТ_Номенклатура.Набор = ЛОЖЬ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| КомплектующиеВРезерве.Товар,
| КомплектующиеВРезерве.РазмерWB,
| КомплектующиеВРезерве.Номенклатура,
| КомплектующиеВРезерве.Характеристика,
| КомплектующиеВРезерве.СкладТП,
| НЕОПРЕДЕЛЕНО,
| ВЫБОР
| КОГДА КомплектующиеВРезерве.Количество > 0
| ТОГДА ВЫРАЗИТЬ(КомплектующиеВРезерве.Количество - 0.5 КАК ЧИСЛО(15, 0))
| ИНАЧЕ 0
| КОНЕЦ
|ИЗ
| ВТ_КомплектующиеВРезерве КАК КомплектующиеВРезерве";
// ++ Бойков BSLR-2906
УстановитьПривилегированныйРежим(Истина);
ИспользоватьВиртуальныйРезерв = Константы.топ_ИспользоватьВиртуальныйРезерв.Получить();
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИспользоватьВиртуальныйРезерв", ?(ИспользоватьВиртуальныйРезерв, "ИСТИНА", "ЛОЖЬ"));
УстановитьПривилегированныйРежим(Ложь);
// -- Бойков BSLR-2906
Возврат ТекстЗапроса;
КонецЕсли;
// -- Бойков BSLR-2507
пТекст = Новый Массив;
пТекст.Добавить(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| топ_СоответствиеТоваров.Товар КАК Товар,
| ВЫБОР
| КОГДА топ_СоответствиеТоваров.РазмерWB.размер = ""0""
| ТОГДА ЗНАЧЕНИЕ(Справочник.топ_РазмерыТоваровWB.ПустаяСсылка)
| ИНАЧЕ топ_СоответствиеТоваров.РазмерWB
| КОНЕЦ КАК РазмерWB,
| топ_СоответствиеТоваров.Номенклатура КАК Номенклатура,
| топ_СоответствиеТоваров.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ВТ_ТоварыРаширенныйСписок
|ИЗ
| ВТ_Номенклатура КАК ВТ_Номенклатура
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.топ_ТоварыТорговыхПлощадок КАК спрТовары
| ПО топ_СоответствиеТоваров.Товар = спрТовары.Ссылка
| ПО ВТ_Номенклатура.Номенклатура = топ_СоответствиеТоваров.Номенклатура
| И ВТ_Номенклатура.Характеристика = топ_СоответствиеТоваров.Характеристика
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| МАКСИМУМ(ВТ_Склады.Склад) КАК Склад,
| СписокСкладовFBS.СкладТП КАК СкладТП
|ПОМЕСТИТЬ ВТ_СкладыРаширенныйСписок
|ИЗ
| ВТ_Склады КАК ВТ_Склады
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.топ_ЛичныеКабинеты.СписокСкладовFBS КАК СписокСкладовFBS
| ПО ВТ_Склады.Склад = СписокСкладовFBS.Склад
|
|СГРУППИРОВАТЬ ПО
| СписокСкладовFBS.СкладТП
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
// ++ БИТ Сергеев BSLR-1128
//| Продажи.Товар КАК Товар,
//| Продажи.КоличествоОборот КАК Количество,
//| ВТ_ТоварыРаширенныйСписок.Номенклатура КАК Номенклатура,
//| ВТ_ТоварыРаширенныйСписок.Характеристика КАК Характеристика,
// ++ БИТ Сергеев BSLR-1128
| Продажи.Регистратор КАК ЗаказТП,
| ВТ_СкладыРаширенныйСписок.Склад КАК Склад
|ПОМЕСТИТЬ ВТ_ЗаказыВРезерве
|ИЗ
| РегистрНакопления.топ_Продажи.Обороты(
| ,
| ,
| Регистратор,
| Товар В
| (ВЫБРАТЬ
| Т.Товар КАК Товар
| ИЗ
| ВТ_ТоварыРаширенныйСписок КАК Т)
| И СкладПоставщика В
| (ВЫБРАТЬ
| Т.СкладТП КАК СкладТП
| ИЗ
| ВТ_СкладыРаширенныйСписок КАК Т)) КАК Продажи
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.топ_СтатусыЗаказовТорговойПлощадки.СрезПоследних КАК СтатусыЗаказов
| ПО Продажи.Регистратор = СтатусыЗаказов.ЗаказТорговойПлощадки
| И (СтатусыЗаказов.Статус.НаименованиеДляПоиска = ""PROCESSING""
| И СтатусыЗаказов.ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка = ЗНАЧЕНИЕ(Перечисление.топ_ТорговыеПлощадки.ЯндексМаркет)
| ИЛИ СтатусыЗаказов.Статус.НаименованиеДляПоиска = ""Awaiting_packaging""
| И СтатусыЗаказов.ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка = ЗНАЧЕНИЕ(Перечисление.топ_ТорговыеПлощадки.OZON)
| ИЛИ СтатусыЗаказов.Статус.НаименованиеДляПоиска = ""НовыйЗаказ""
| И СтатусыЗаказов.ЗаказТорговойПлощадки.ЛичныйКабинет.ТорговаяПлощадка = ЗНАЧЕНИЕ(Перечисление.топ_ТорговыеПлощадки.Wildberries))
// ++ БИТ Сергеев BSLR-1128
//| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТоварыРаширенныйСписок КАК ВТ_ТоварыРаширенныйСписок
//| ПО Продажи.Товар = ВТ_ТоварыРаширенныйСписок.Товар
// -- БИТ Сергеев BSLR-1128
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.топ_ЗаказТорговойПлощадки КАК топ_ЗаказТорговойПлощадки
| ПО Продажи.Регистратор = топ_ЗаказТорговойПлощадки.Ссылка
| И (топ_ЗаказТорговойПлощадки.СхемаРаботы = ЗНАЧЕНИЕ(Перечисление.топ_СхемыРаботы.FBS))
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СкладыРаширенныйСписок КАК ВТ_СкладыРаширенныйСписок
| ПО Продажи.СкладПоставщика = ВТ_СкладыРаширенныйСписок.СкладТП");
//Если топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей")
// ИЛИ топ_ОбщийМодульСервер.ЭтаКонфигурация("КомплекснаяАвтоматизация")
// ИЛИ топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеПредприятием") Тогда
// пТекст.Добавить(
// "");
//Иначе // УНФ
пТекст.Добавить(
"ВЫБРАТЬ
// ++ БИТ Сергеев BSLR-1128
//| ВТ_ЗаказыВРезерве.Номенклатура КАК Номенклатура,
//| ВТ_ЗаказыВРезерве.Характеристика КАК Характеристика,
//| ВТ_ЗаказыВРезерве.Склад КАК Склад,
// -- БИТ Сергеев BSLR-1128
| ВТ_ЗаказыВРезерве.ЗаказТП КАК ЗаказТП
|ПОМЕСТИТЬ ВТ_УченыеРезервы
|ИЗ
| ВТ_ЗаказыВРезерве КАК ВТ_ЗаказыВРезерве
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеЗаказов КАК СоответствиеЗаказов
| ПО ВТ_ЗаказыВРезерве.ЗаказТП = СоответствиеЗаказов.ЗаказТорговойПлощадки
|ГДЕ
| ЕСТЬNULL(СоответствиеЗаказов.ЗаказКлиента.Проведен, ЛОЖЬ)");
//КонецЕсли;
пТекст.Добавить(
"ВЫБРАТЬ
// ++ БИТ Сергеев BSLR-1128
//| ВТ_ЗаказыВРезерве.Номенклатура КАК Номенклатура,
//| ВТ_ЗаказыВРезерве.Характеристика КАК Характеристика,
//| ВТ_ЗаказыВРезерве.Количество КАК Количество,
| ВТ_ТоварыРаширенныйСписок.Номенклатура КАК Номенклатура,
| ВТ_ТоварыРаширенныйСписок.Характеристика КАК Характеристика,
| ТчТовары.Количество КАК Количество,
// -- БИТ Сергеев BSLR-1128
//▼ BSLR-2489, Чупраков А.Н., 29.01.24, для наборов Неопределено
| ВЫБОР
| КОГДА ВТ_ТоварыРаширенныйСписок.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)
| ТОГДА НЕОПРЕДЕЛЕНО
| ИНАЧЕ ВТ_ЗаказыВРезерве.Склад
|КОНЕЦ КАК Склад
//▲ BSLR-2489, Чупраков А.Н.
|ПОМЕСТИТЬ ВТ_Резерв
|ИЗ
| ВТ_ЗаказыВРезерве КАК ВТ_ЗаказыВРезерве
// ++ БИТ Сергеев BSLR-1128
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.топ_ЗаказТорговойПлощадки.Товары КАК ТчТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТоварыРаширенныйСписок КАК ВТ_ТоварыРаширенныйСписок
| ПО ТчТовары.Товар = ВТ_ТоварыРаширенныйСписок.Товар
| И ТчТовары.РазмерWB = ВТ_ТоварыРаширенныйСписок.РазмерWB
| ПО ВТ_ЗаказыВРезерве.ЗаказТП = ТчТовары.Ссылка
// -- БИТ Сергеев BSLR-1128
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_УченыеРезервы КАК ВТ_УченыеРезервы
| ПО ВТ_ЗаказыВРезерве.ЗаказТП = ВТ_УченыеРезервы.ЗаказТП
// ++ БИТ Сергеев BSLR-1128
//| И ВТ_ЗаказыВРезерве.Номенклатура = ВТ_УченыеРезервы.Номенклатура
//| И ВТ_ЗаказыВРезерве.Характеристика = ВТ_УченыеРезервы.Характеристика
//| И ВТ_ЗаказыВРезерве.Склад = ВТ_УченыеРезервы.Склад
// -- БИТ Сергеев BSLR-1128
|ГДЕ
| ВТ_УченыеРезервы.ЗаказТП ЕСТЬ NULL");
пТекст.Добавить("УНИЧТОЖИТЬ ВТ_УченыеРезервы");
пТекст.Добавить("УНИЧТОЖИТЬ ВТ_ЗаказыВРезерве");
пТекст.Добавить("УНИЧТОЖИТЬ ВТ_ТоварыРаширенныйСписок");
пТекст = СтрСоединить(пТекст, ОбщегоНазначения.РазделительПакетаЗапросов());
Возврат пТекст;
КонецФункции
// -- БИТ Сергеев BSLR-807
// ++ Куряев 11.01.2024 BSLR-2485
Процедура ОбработатьОбнулениеОстаткаFBSПоFBO(ТекстЗапросаМассив) Экспорт
МассивКоличество = ТекстЗапросаМассив.Количество();
Если МассивКоличество > 0 Тогда
ТекстЗапросаМассив[МассивКоличество - 1] = СтрЗаменить(ТекстЗапросаМассив[МассивКоличество - 1], "ПОМЕСТИТЬ ВТ_Результат", "ПОМЕСТИТЬ ВТ_РезультатПредварительный");
ТекстЗапросаМассив.Добавить("
|ВЫБРАТЬ
| ОстаткиНаСкладахТП.ЛичныйКабинет КАК ЛичныйКабинет,
| ОстаткиНаСкладахТП.Товар КАК Товар,
| топ_Штрихкоды.Штрихкод КАК Штрихкод,
| СУММА(ОстаткиНаСкладахТП.Количество) КАК Количество,
| ОстаткиНаСкладахТП.ID_Товара КАК ID_Товара
|ПОМЕСТИТЬ ВТ_ОстаткиФБО
|ИЗ
|РегистрСведений.топ_ОстаткиНаСкладахТорговойПлощадки.СрезПоследних(, ЛичныйКабинет = &П) КАК ОстаткиНаСкладахТП
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_Штрихкоды КАК топ_Штрихкоды
| ПО ОстаткиНаСкладахТП.Товар = топ_Штрихкоды.Товар
| И ОстаткиНаСкладахТП.РазмерWB = топ_Штрихкоды.РазмерWB
|
|СГРУППИРОВАТЬ ПО
| ОстаткиНаСкладахТП.ЛичныйКабинет,
| ОстаткиНаСкладахТП.Товар,
| топ_Штрихкоды.Штрихкод,
| ОстаткиНаСкладахТП.ID_Товара
|
|ИНДЕКСИРОВАТЬ ПО
| Товар
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_РезультатПредварительный.ЛичныйКабинет КАК ЛичныйКабинет,
| ВТ_РезультатПредварительный.Товар КАК Товар,
| ВТ_РезультатПредварительный.РазмерWB КАК РазмерWB,
| ВТ_РезультатПредварительный.Склад КАК Склад,
| ВЫБОР
| КОГДА ЕСТЬNULL(ВТ_ОстаткиФБО.Количество, 0) > 0
| И ЕСТЬNULL(МинимальныеОстаткиFBO.МинимальныйОстаток, 0) < ЕСТЬNULL(ВТ_ОстаткиФБО.Количество, 0)
| ТОГДА 0
| ИНАЧЕ ВТ_РезультатПредварительный.Количество
| КОНЕЦ КАК Количество,
| ВТ_РезультатПредварительный.ТоварID КАК ТоварID,
| ВТ_РезультатПредварительный.КодПоставщика КАК КодПоставщика,
| ВТ_РезультатПредварительный.Штрихкод КАК Штрихкод,
| ВТ_РезультатПредварительный.ОбнулятьОстатки КАК ОбнулятьОстатки,
| ВТ_РезультатПредварительный.Номенклатура КАК Номенклатура,
| ВТ_РезультатПредварительный.Характеристика КАК Характеристика
|ПОМЕСТИТЬ ВТ_Результат
|ИЗ
| ВТ_РезультатПредварительный КАК ВТ_РезультатПредварительный
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ОстаткиФБО КАК ВТ_ОстаткиФБО
| ПО ВТ_РезультатПредварительный.Товар = ВТ_ОстаткиФБО.Товар
// письмерова 31.03.2025 BSLR-4191
| И ВТ_РезультатПредварительный.Штрихкод = ВТ_ОстаткиФБО.Штрихкод
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_МинимальныеОстаткиFBO КАК МинимальныеОстаткиFBO
| ПО ВТ_РезультатПредварительный.Товар = МинимальныеОстаткиFBO.Товар
// письмерова 31.03.2025 BSLR-4191
| И ВТ_РезультатПредварительный.РазмерWB = МинимальныеОстаткиFBO.РазмерWB
|{ГДЕ
| ВТ_РезультатПредварительный.ЛичныйКабинет КАК ЛичныйКабинет,
| ВТ_РезультатПредварительный.Товар,
| ВТ_РезультатПредварительный.РазмерWB,
| ВТ_РезультатПредварительный.Склад,
| ВЫБОР
| КОГДА ЕСТЬNULL(ВТ_ОстаткиФБО.Количество, 0) > 0
| И ЕСТЬNULL(МинимальныеОстаткиFBO.МинимальныйОстаток, 0) < ЕСТЬNULL(ВТ_ОстаткиФБО.Количество, 0)
| ТОГДА 0
| ИНАЧЕ ВТ_РезультатПредварительный.Количество
| КОНЕЦ,
| ВТ_РезультатПредварительный.ТоварID,
| ВТ_РезультатПредварительный.КодПоставщика,
| ВТ_РезультатПредварительный.Штрихкод}");
КонецЕсли;
КонецПроцедуры
// Куряев 11.01.2024 BSLR-2485
#КонецОбласти
#Область КИЗы
Функция ПолучитьТаблицуКИЗов(ЛичныйКабинет, НаДату) Экспорт
НастройкиПодключения = ПолучитьНастройкиЛичногоКабинета(ЛичныйКабинет);
Если НастройкиПодключения.Маркетплейс <> Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
ОбщегоНазначения.СообщитьПользователю("Для данного маркетплейса не предусмотрена загрузка КИЗов по API");
Возврат Неопределено;
КонецЕсли;
Возврат ПолучитьТаблицуКИЗовМП(НастройкиПодключения, НаДату);
КонецФункции
Функция ПолучитьТаблицуКИЗовМП(НастройкиПодключения, НаДату)
Если НастройкиПодключения.Маркетплейс = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
Возврат ПолучитьТаблицуКИЗов_WB(НастройкиПодключения, НаДату);
КонецЕсли;
КонецФункции
Функция ПолучитьТаблицуКИЗов_WB(НастройкиСоединения, Дата) Экспорт
МетодыAPI = ПолучитьМетодыAPI(НастройкиСоединения.Маркетплейс);
ПараметрыЗапроса = ПодготовитьПараметрыЗапросаДляКИЗов(НастройкиСоединения.ЛичныйКабинет, Дата);
Если ПараметрыЗапроса = Неопределено Тогда
Возврат ПараметрыЗапроса;
КонецЕсли;
Ответ = топ_HTTPКоннектор.GetJson(МетодыAPI.ЗагрузитьКИЗы, ПараметрыЗапроса);
Возврат Ответ
КонецФункции
Функция ПодготовитьПараметрыЗапросаДляКИЗов(ЛичныйКабинет, Дата)
ПараметрыЗапроса = Новый Структура("key, datefrom", "", Формат(Дата, "ДФ=yyyy-MM-dd"));
Если ЗначениеЗаполнено(ЛичныйКабинет.API_Key_СтатистикаNEW) Тогда
ПараметрыЗапроса.key = ЛичныйКабинет.API_Key_СтатистикаNEW;
Возврат ПараметрыЗапроса;
Иначе
ОбщегоНазначения.СообщитьПользователю("Не найден ключ статистики APIx64 для Wildberries в личном кабинете");
Возврат Неопределено;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область Методы
Функция ПолучитьПустуюСтруктуруМетодов()
Методы = Новый Структура();
Методы.Вставить("ЗагрузитьОбновитьТовары");
Методы.Вставить("ОбновитьЦеныТоваровНаСайте");
Методы.Вставить("ЗагрузитьЗаказыDBS"); // BSLR-4446, Чупраков А.Н., 24.11.25
Методы.Вставить("ПолучитьКатегорииТоваров");
Методы.Вставить("ПолучитьРеквизитыКатегории");
Методы.Вставить("ПолучитьСписокТоваров");
Методы.Вставить("ПолучитьСписокТоваров_v2");
Методы.Вставить("ОбновитьОстатокТовара");
Методы.Вставить("ПолучитьРеквизитыАтрибутов");
Методы.Вставить("ДобавитьТовары");
Методы.Вставить("ПолучитьСписокЗаказов");
Методы.Вставить("ПолучитьЦеныТоваров");
Методы.Вставить("ПолучитьИнформациюОТоварах");
Методы.Вставить("ПолучитьИнформациюОТоварах_v2");
Методы.Вставить("ПолучитьДопИнформациюОТоварах");
Методы.Вставить("ПолучитьДопИнформациюОТоварах_v2");
Методы.Вставить("ПолучитьСписокСкладов");
Методы.Вставить("ЗагрузитьОбновитьЗаказы");
Методы.Вставить("ПолучитьДочерниеКатегории");
Методы.Вставить("ПолучитьОстатки");
Методы.Вставить("СобратьЗаказ");
Методы.Вставить("ПолучитьМаркировку");
Методы.Вставить("СменитьСтатус");
Методы.Вставить("ОтменитьТоварыОтправления");
Методы.Вставить("ОтменитьОтправление");
Методы.Вставить("ПолучитьАктНакладную");
Методы.Вставить("ПолучитьМетодыДоставки");
Методы.Вставить("ПолучитьЭтикеткиГрузМеста");
Методы.Вставить("СоздатьПоставку");
Методы.Вставить("ДобавитьКПоставкеЗаказы");
Методы.Вставить("ЗакрытьПоставку");
Методы.Вставить("ПолучитьЭтикеткуПоставки");
Методы.Вставить("ПередатьГрузовоеМесто");
Методы.Вставить("ПолучитьМаркировкуГМ");
Методы.Вставить("ПолучитьПФАктПриемаПередачи");
Методы.Вставить("ПолучитьIDГрузовогоМеста");
Методы.Вставить("ПолучитьСписокЗаказовФБО");
Методы.Вставить("ЗагрузитьКИЗы");
Методы.Вставить("ПередатьКиЗ");
Методы.Вставить("ПолучитьКатегорииТоваров_NEW");
Методы.Вставить("ПолучитьИнфоПоЦенам");
Методы.Вставить("ПередатьСкидкиНаТовары");
Методы.Вставить("СброситьСкидкиНаТовары");
Возврат Методы;
КонецФункции
Функция ПолучитьМетодыAPI(Маркетплейс) Экспорт
Методы = ПолучитьПустуюСтруктуруМетодов();
Если Маркетплейс = Перечисления.топ_ТорговыеПлощадки.OZON Тогда
Если Константы.БИТ_ИспользуетсяТестоваяСреда.Получить() Тогда
АдресAPI = "https://cb-api.ozonru.me";
Иначе
АдресAPI = "https://api-seller.ozon.ru";
КонецЕсли;
Методы.ЗагрузитьОбновитьТовары = СтрШаблон("%1/v2/product/import", АдресAPI);
Методы.ОбновитьЦеныТоваровНаСайте = СтрШаблон("%1/v1/product/import/prices", АдресAPI);
Методы.ПолучитьКатегорииТоваров = СтрШаблон("%1/v2/category/tree", АдресAPI);
Методы.ПолучитьРеквизитыКатегории = СтрШаблон("%1/v3/category/attribute", АдресAPI);
Методы.ПолучитьСписокТоваров = СтрШаблон("%1/v2/product/list", АдресAPI);
Методы.ОбновитьОстатокТовара = СтрШаблон("%1/v2/products/stocks", АдресAPI);
Методы.ПолучитьРеквизитыАтрибутов = СтрШаблон("%1/v2/category/attribute/values", АдресAPI);
Методы.ДобавитьТовары = СтрШаблон("%1/v2/product/import", АдресAPI);
Методы.ПолучитьЦеныТоваров = СтрШаблон("%1/v4/product/info/prices", АдресAPI);
Методы.ПолучитьИнформациюОТоварах = СтрШаблон("%1/v2/product/info", АдресAPI);
Методы.ПолучитьИнформациюОТоварах_v2 = СтрШаблон("%1/v2/product/info/list", АдресAPI);
Методы.ПолучитьДопИнформациюОТоварах = СтрШаблон("%1/v3/products/info/attributes", АдресAPI);
Методы.ПолучитьДопИнформациюОТоварах_v2 = СтрШаблон("%1/v3/products/info/attributes", АдресAPI);
Методы.ПолучитьСписокСкладов = СтрШаблон("%1/v2/warehouse/list", АдресAPI);
Методы.ЗагрузитьОбновитьЗаказы = СтрШаблон("%1/v3/posting/fbs/list", АдресAPI);
// ++ Бойков BSLR-2453. Метод устарел, при необходимости использовать "/v2/analytics/stock_on_warehouses"
//Методы.ПолучитьОстатки = СтрШаблон("%1/v1/analytics/stock_on_warehouses", АдресAPI);
// -- Бойков BSLR-2453
//Методы.СобратьЗаказ = СтрШаблон("%1/v3/posting/fbs/ship", АдресAPI);
Методы.СобратьЗаказ = СтрШаблон("%1/v4/posting/fbs/ship", АдресAPI);
Методы.ПолучитьМаркировку = СтрШаблон("%1/v2/posting/fbs/package-label", АдресAPI);
Методы.ОтменитьТоварыОтправления = СтрШаблон("%1/v2/posting/fbs/product/cancel", АдресAPI);
Методы.ОтменитьОтправление = СтрШаблон("%1/v2/posting/fbs/cancel", АдресAPI);
Методы.ПолучитьАктНакладную = СтрШаблон("%1/v2/posting/fbs/act/get-pdf", АдресAPI);
Методы.ПолучитьМетодыДоставки = СтрШаблон("%1/v1/delivery-method/list", АдресAPI);
Методы.ПолучитьЭтикеткиГрузМеста = СтрШаблон("%1/v2/posting/fbs/act/get-container-labels", АдресAPI);
Методы.ПолучитьСписокЗаказовФБО = СтрШаблон("%1/v2/posting/fbo/list", АдресAPI);
ИначеЕсли Маркетплейс = Перечисления.топ_ТорговыеПлощадки.Wildberries Тогда
Методы.ПолучитьСписокТоваров = "https://suppliers-api.wildberries.ru/card/list";
Методы.ПолучитьКатегорииТоваров_NEW = "https://suppliers-api.wildberries.ru/content/v1/object/all?top=100000";
Методы.ПолучитьСписокТоваров_v2 = "https://suppliers-api.wildberries.ru/content/v1/cards/list";
Методы.ЗагрузитьОбновитьЗаказы = "https://suppliers-api.wildberries.ru/api/v2/orders";
Методы.ПолучитьКатегорииТоваров = "https://suppliers-api.wildberries.ru/api/v1/config/get/object/parent/list";
Методы.ПолучитьДочерниеКатегории = "https://suppliers-api.wildberries.ru/api/v1/config/object/byparent";
Методы.ПолучитьСписокСкладов = "https://suppliers-api.wildberries.ru/api/v2/warehouses";
Методы.ОбновитьОстатокТовара = "https://suppliers-api.wildberries.ru/api/v2/stocks";
Методы.ОбновитьЦеныТоваровНаСайте = "https://suppliers-api.wildberries.ru/public/api/v1/prices";
Методы.ПолучитьОстатки = "https://suppliers-stats.wildberries.ru/api/v1/supplier/stocks";
Методы.ПолучитьМаркировку = "https://suppliers-api.wildberries.ru/api/v2/orders/stickers/pdf";
Методы.СменитьСтатус = "https://suppliers-api.wildberries.ru/api/v2/orders"; // PUT
Методы.СоздатьПоставку = "https://suppliers-api.wildberries.ru/api/v2/supplies"; //PoST
Методы.ДобавитьКПоставкеЗаказы = "https://suppliers-api.wildberries.ru/api/v2/supplies/{id}"; // PUT
Методы.ЗакрытьПоставку = "https://suppliers-api.wildberries.ru/api/v2/supplies/{id}/close";//PoST
Методы.ПолучитьЭтикеткуПоставки = "https://suppliers-api.wildberries.ru/api/v2/supplies/{id}/barcode";//Get
Методы.ПолучитьIDГрузовогоМеста = "https://suppliers-api.wildberries.ru/api/v2/orders/stickers";
Методы.ПолучитьСписокЗаказовФБО = "https://suppliers-stats.wildberries.ru/api/v1/supplier/orders";
Методы.ЗагрузитьКИЗы = "https://suppliers-stats.wildberries.ru/api/v1/supplier/excise-goods"; //get
Методы.ЗагрузитьЗаказыDBS = "https://marketplace-api.wildberries.ru/api/v3/dbs/orders"; // BSLR-4446, Чупраков А.Н., get
Методы.ПолучитьИнфоПоЦенам = "https://suppliers-api.wildberries.ru/public/api/v1/info"; //Get
Методы.ПередатьСкидкиНаТовары = "https://suppliers-api.wildberries.ru/public/api/v1/updateDiscounts"; //PoST
Методы.СброситьСкидкиНаТовары = "https://suppliers-api.wildberries.ru/public/api/v1/revokeDiscounts"; //PoST
ИначеЕсли Маркетплейс = Перечисления.топ_ТорговыеПлощадки.ЯндексМаркет Тогда
Методы.ПолучитьСписокТоваров = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/offer-mapping-entries.json";
Методы.ЗагрузитьОбновитьЗаказы = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/orders.json"; //Get - нет ID склада
Методы.ПолучитьМаркировку = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/orders/{orderId}/delivery/labels.json";
Методы.ПолучитьМаркировкуГМ = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/orders/{orderId}/delivery/shipments/{shipmentId}/boxes/{boxId}/label.json";
Методы.СменитьСтатус = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/orders/status-update.json"; // PoST
Методы.ПередатьГрузовоеМесто = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/orders/{orderId}/delivery/shipments/{shipmentId}/boxes.json"; //PUT
Методы.ПолучитьПФАктПриемаПередачи = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/shipments/reception-transfer-act.json"; //GET
Методы.ПолучитьСписокСкладов = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/business-info.json"; //GET
Методы.ОбновитьОстатокТовара = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/offers/stocks";
Методы.ОбновитьЦеныТоваровНаСайте = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/offer-prices/updates";
Методы.ПередатьКиЗ = "https://api.partner.market.yandex.ru/v2/campaigns/{campaignId}/orders/{orderId}/cis.json"; //PUT
КонецЕсли;
Возврат Методы;
КонецФункции
Функция ПолучитьНастройкиЛичногоКабинета(ЛичныйКабинет, ЗаголовкиВСоответствие = Ложь) Экспорт
ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЛичныйКабинет, "ТорговаяПлощадка");
Результат = Новый Структура("ЛичныйКабинет, Заголовки, Маркетплейс"
, ЛичныйКабинет
,
, ЗначенияРеквизитов.ТорговаяПлощадка);
//Заголовки = ПолучитьЗаголовки(ЛичныйКабинет, ЗначенияРеквизитов.ТорговаяПлощадка);
//
//ДополнитьЗаголовкиМП(Результат.Заголовки, ЛичныйКабинет, ЗначенияРеквизитов.Маркетплейс);
//
//Если ЗаголовкиВСоответствие Тогда
//
// Результат.Заголовки = ТаблицуЗаголовковВСоответствие(Результат.Заголовки);
//
//КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область Статистика
Процедура ОбновитьДанныеСтатистики(ИмяФормы) Экспорт
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_ИспользованиеОбъектов.КоличествоОткрытий КАК КоличествоОткрытий,
| топ_ИспользованиеОбъектов.КлючОбъекта КАК КлючОбъекта,
| топ_ИспользованиеОбъектов.Период КАК Период
|ИЗ
| РегистрСведений.топ_ИспользованиеОбъектов КАК топ_ИспользованиеОбъектов
|ГДЕ
| топ_ИспользованиеОбъектов.Период = &Период
| И топ_ИспользованиеОбъектов.КлючОбъекта = &КлючОбъекта");
ПериодРегистра = НачалоДня(ТекущаяДата());
Запрос.УстановитьПараметр("Период", ПериодРегистра);
Запрос.УстановитьПараметр("КлючОбъекта", ИмяФормы);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Данные = Новый Структура("КлючОбъекта, КоличествоОткрытий, Период", ИмяФормы, 1, ТекущаяДата());
РегистрыСведений.топ_ИспользованиеОбъектов.ЗаписатьДанныеВРегистр(Данные);
Иначе
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Данные = Новый Структура("КлючОбъекта, КоличествоОткрытий, Период", ИмяФормы, Выборка.КоличествоОткрытий + 1, ТекущаяДата());
РегистрыСведений.топ_ИспользованиеОбъектов.ЗаписатьДанныеВРегистр(Данные);
КонецЕсли;
КонецПроцедуры
Функция ПолучитьДанныеСтатистики() Экспорт
Результат = ПолучитьРезультатВозвратаСтатистики();
ТекстЗапроса = ПолучитьТекстЗапросаПоДаннымСтатистики();
Запрос = Новый Запрос(ТекстЗапроса);
ВременныеТаблицы = Запрос.ВыполнитьПакетСПромежуточнымиДанными();
КонецФункции
Функция ПолучитьТекстЗапросаПоДаннымСтатистики()
Возврат "ВЫБРАТЬ
| СУММА(1) КАК Количество
|ПОМЕСТИТЬ ВТ_ЗагрузкаОК
|ИЗ
| Документ.топ_ЗарузкаОтчетовКомиссионера КАК топ_ЗарузкаОтчетовКомиссионера
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СУММА(1) КАК Количество
|ПОМЕСТИТЬ ВТ_ЗаданиеНаПоставку
|ИЗ
| Документ.топ_ЗаданиеНаПоставкуFBO КАК топ_ЗаданиеНаПоставкуFBO
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СУММА(1) КАК Количество
|ПОМЕСТИТЬ ВТ_ЗаказыТП
|ИЗ
| Документ.топ_ЗаказТорговойПлощадки КАК топ_ЗаказТорговойПлощадки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СУММА(1) КАК Количество
|ПОМЕСТИТЬ ВТ_ЛичныеКабинеты
|ИЗ
| Справочник.топ_ЛичныеКабинеты КАК топ_ЛичныеКабинеты
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СУММА(1) КАК Количество
|ПОМЕСТИТЬ ВТ_СнятиеТоваров
|ИЗ
| Документ.топ_СнятиеТоваровСПродажи КАК топ_СнятиеТоваровСПродажи
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СУММА(1) КАК Количество
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| Справочник.топ_ТоварыТорговыхПлощадок КАК топ_ТоварыТорговыхПлощадок
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СУММА(1) КАК Количество
|ПОМЕСТИТЬ ВТ_УстановкаМинимальногоОстатка
|ИЗ
| Документ.топ_УстановкаМинимальногоОстаткаТоваров КАК топ_УстановкаМинимальногоОстаткаТоваров
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СУММА(1) КАК Количество
|ПОМЕСТИТЬ ВТ_УстановкаЦен
|ИЗ
| Документ.топ_УстановкаЦенНаТовары КАК топ_УстановкаЦенНаТовары";
КонецФункции
Функция ПолучитьРезультатВозвратаСтатистики()
Возврат Новый Структура("ЗагрузкаОтчетаКомиссионера, ЗаданиеНаПоставкуFBO, ЗаказМаркетплейса, ЛичныеКабинеты, СнятиеТоваров, Товары, УстановкаМинимальногоОстатка, УстановкаЦен");
КонецФункции
Функция ПолучитьИмяСервераСтатистики() Экспорт
Возврат "tor.1bit.support";
КонецФункции
Функция ПолучитьИмяБазыСтатистики()
Возврат "Statistic";
КонецФункции
Процедура ВыгрузитьДанныеСтатистики() Экспорт
// ++ Бойков BSLR-2906
УстановитьПривилегированныйРежим(Истина);
ИдентификаторБазы = Константы.топ_ИдентификаторСтатистики.Получить();
УстановитьПривилегированныйРежим(Ложь);
// -- Бойков BSLR-2906
Если ПустаяСтрока(ИдентификаторБазы) Тогда
Возврат;
КонецЕсли;
ДанныеКабинетов = топ_ОбщийВызовСервера.ДанныеКабинетовJSON();
МассивКонстант = топ_ОбщийВызовСервера.ПолучитьЗначенияВсехКонстант();
ДанныеКОтправке = Новый Структура("id, client, const, data, cabinets", ИдентификаторБазы,
ПолучитьИнформациюОКлиенте(), МассивКонстант, , ДанныеКабинетов);
МассивДанных = Новый Массив;
СерверИсточник = ПолучитьИмяСервераСтатистики();
ИмяБазыСтатистики = ПолучитьИмяБазыСтатистики();
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_ИспользованиеОбъектовСрезПоследних.Период КАК Период,
| топ_ИспользованиеОбъектовСрезПоследних.КлючОбъекта КАК КлючОбъекта,
| топ_ИспользованиеОбъектовСрезПоследних.Количество КАК Количество,
| топ_ИспользованиеОбъектовСрезПоследних.КоличествоОткрытий КАК КоличествоОткрытий
|ИЗ
| РегистрСведений.топ_ИспользованиеОбъектов.СрезПоследних(, ) КАК топ_ИспользованиеОбъектовСрезПоследних
|
|УПОРЯДОЧИТЬ ПО
| КлючОбъекта");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураДанных = Новый Структура();
СтруктураДанных.Вставить("key", Выборка.КлючОбъекта);
СтруктураДанных.Вставить("count", Выборка.Количество);
СтруктураДанных.Вставить("countOpen", Выборка.КоличествоОткрытий);
СтруктураДанных.Вставить("period", Формат(Выборка.Период, "ДФ=yyyyMMdd"));
МассивДанных.Добавить(СтруктураДанных);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_ИспользованиеОбъектов.Период КАК Период,
| топ_ИспользованиеОбъектов.КлючОбъекта КАК КлючОбъекта,
| топ_ИспользованиеОбъектов.Количество КАК Количество,
| топ_ИспользованиеОбъектов.КоличествоОткрытий КАК КоличествоОткрытий
|ИЗ
| РегистрСведений.топ_ИспользованиеОбъектов КАК топ_ИспользованиеОбъектов
|ГДЕ
| топ_ИспользованиеОбъектов.КоличествоОткрытий <> 0";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураДанных = Новый Структура();
СтруктураДанных.Вставить("key", Выборка.КлючОбъекта);
СтруктураДанных.Вставить("count", Выборка.Количество);
СтруктураДанных.Вставить("countOpen", Выборка.КоличествоОткрытий);
СтруктураДанных.Вставить("period", Формат(Выборка.Период, "ДФ=yyyyMMdd"));
МассивДанных.Добавить(СтруктураДанных);
КонецЦикла;
ДанныеКОтправке.data = МассивДанных;
ОтправкаДанныхНаСерверСтатистики(ДанныеКОтправке, СерверИсточник, ИмяБазыСтатистики);
КонецПроцедуры
Процедура ОтправкаДанныхНаСерверСтатистики(ДанныеКОтправке, СерверИсточник, ИмяБазыСтатистики)
JSONСтрока = топ_HTTPКоннектор.Данные1СВJSON(ДанныеКОтправке);
ПараметрыЖурналаОбмена = топ_ВзаимодействиеСПлощадками.ВернутьПараметрыЖурналаОбмена();
ДанныеОтправлены = ДанныеБылиОтправлены(JSONСтрока);
Если ДанныеОтправлены Тогда
топ_ВзаимодействиеСПлощадками.ЗаполнитьПараметрыЖурналаОбмена(ПараметрыЖурналаОбмена, Справочники.топ_ЛичныеКабинеты.ПустаяСсылка(),Перечисления.топ_ВидыОбменов.ВыгрузкаСтатистики,
"Выгрузка статистики не будет произведена",
"Выгрузка статистики не будет произведена т.к. эти данные уже выгружались", Ложь);
топ_ВзаимодействиеСПлощадками.ДобавитьЗаписьВЖурналОбменов(ПараметрыЖурналаОбмена);
Возврат;
КонецЕсли;
Попытка
HTTPСоединение = Новый HTTPСоединение(СерверИсточник);
Исключение
Возврат;
КонецПопытки;
АдресРесурса = СтрШаблон("%1/hs/statistics", ИмяБазыСтатистики);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.УстановитьТелоИзСтроки(JSONСтрока);
ИмяМетода = "POST";
Попытка
Результат = HTTPСоединение.ВызватьHTTPМетод(ИмяМетода, HTTPЗапрос);
Если Результат.КодСостояния = 200 Тогда
ОбщегоНазначения.СообщитьПользователю("Данные успешно отправлены и обработаны");
РегистрыСведений.топ_ИспользованиеОбъектов.ОчиститьЗаписиРегистраСведений();
ДанныеСтатистики = Новый Структура("Период, JSONСтрока", ТекущаяДата(), JSONСтрока);
РегистрыСведений.топ_ДанныеСтатистикиОтправка.ЗаписатьДанныеВРегистр(ДанныеСтатистики);
Возврат;
Иначе
Возврат;
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецПроцедуры
Функция ПользовательскоеСоглашениеПринято() Экспорт
УстановитьПривилегированныйРежим(Истина);
Возврат Константы.топ_ПользовательскоеСоглашениеПодписано.Получить();
КонецФункции
Функция ДанныеБылиОтправлены(JSONСтрока)
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_ДанныеСтатистикиОтправкаСрезПоследних.JSONСтрока КАК JSONСтрока
|ИЗ
| РегистрСведений.топ_ДанныеСтатистикиОтправка.СрезПоследних КАК топ_ДанныеСтатистикиОтправкаСрезПоследних");
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Ложь;
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
Если Выборка.JSONСтрока = JSONСтрока Тогда
Набор = РегистрыСведений.топ_ДанныеСтатистикиОтправка.СоздатьНаборЗаписей();
Набор.Записать(Истина);
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецЕсли;
КонецФункции
Процедура ОтправитьДанныеОКлиенте() Экспорт
// ++ Бойков BSLR-2906
УстановитьПривилегированныйРежим(Истина);
ИдентификаторБазы = Константы.топ_ИдентификаторСтатистики.Получить();
// -- Бойков BSLR-2906
Если НЕ ПустаяСтрока(ИдентификаторБазы) Тогда
УстановитьПривилегированныйРежим(Ложь);
Возврат;
КонецЕсли;
СерверИсточник = ПолучитьИмяСервераСтатистики();
ИмяБазыСтатистики = ПолучитьИмяБазыСтатистики();
ДанныеКОтправке = ПолучитьИнформациюОКлиенте();
Идентификатор = ПолучитьИдентификатор(ДанныеКОтправке, СерверИсточник, ИмяБазыСтатистики);
Если Идентификатор <> Неопределено Тогда
ЗаписатьДанныеОбИдентификаторе(Идентификатор, СерверИсточник, ИмяБазыСтатистики);
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Процедура ЗаписатьДанныеОбИдентификаторе(Идентификатор, СерверИсточник, ИмяБазыСтатистики)
Попытка
HTTPСоединение = Новый HTTPСоединение(СерверИсточник);
Исключение
Возврат;
КонецПопытки;
АдресРесурса = СтрШаблон("%1/hs/statistics/confirm/%2", ИмяБазыСтатистики, Идентификатор);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
ИмяМетода = "GET";
Попытка
Результат = HTTPСоединение.ВызватьHTTPМетод(ИмяМетода, HTTPЗапрос);
Если Результат.КодСостояния = 200 Тогда
// ++ Бойков BSLR-2906
УстановитьПривилегированныйРежим(Истина);
Константы.топ_ИдентификаторСтатистики.Установить(Идентификатор);
УстановитьПривилегированныйРежим(Ложь);
// -- Бойков BSLR-2906
КонецЕсли;
Исключение
Возврат;
КонецПопытки;
КонецПроцедуры
Функция ПолучитьИдентификатор(ДанныеКОтправке, СерверИсточник, ИмяБазыСтатистики)
JSONСтрока = топ_HTTPКоннектор.Данные1СВJSON(ДанныеКОтправке);
Попытка
HTTPСоединение = Новый HTTPСоединение(СерверИсточник);
Исключение
Возврат Неопределено;
КонецПопытки;
АдресРесурса = СтрШаблон("%1/hs/statistics", ИмяБазыСтатистики);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.УстановитьТелоИзСтроки(JSONСтрока);
ИмяМетода = "GET";
Попытка
Результат = HTTPСоединение.ВызватьHTTPМетод(ИмяМетода, HTTPЗапрос);
Если Результат.КодСостояния = 200 Тогда
Идентификатор = Результат.ПолучитьТелоКакСтроку();
Возврат Идентификатор;
Иначе
Возврат Неопределено;
КонецЕсли;
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
&НаСервере
Функция ПолучитьВерсиюРасширенияБИТУМ() Экспорт
УстановитьПривилегированныйРежим(Истина);
ИмяКонфигурации = "БИТ_УправлениеМаркетплейсами";
МассивРасширений = РасширенияКонфигурации.Получить();
Для Каждого ТекущееРасширение Из МассивРасширений Цикл
Если ТекущееРасширение.Имя = ИмяКонфигурации Тогда
УстановитьПривилегированныйРежим(Ложь);
Возврат ТекущееРасширение.Версия;
КонецЕсли;
КонецЦикла;
УстановитьПривилегированныйРежим(Ложь);
КонецФункции
Функция ПолучитьИнформациюОКлиенте()
Запрос = Новый Запрос("ВЫБРАТЬ
| топ_ЛичныеКабинеты.Организация.Наименование КАК Организация,
| топ_ЛичныеКабинеты.Организация.ИНН КАК ИНН
|ИЗ
| Справочник.топ_ЛичныеКабинеты КАК топ_ЛичныеКабинеты
|ГДЕ
| топ_ЛичныеКабинеты.ПометкаУдаления = ЛОЖЬ");
Результат = Запрос.Выполнить();
МассивОрганизаций = Новый Массив;
Выборка = Результат.Выбрать();
МассивИНН = Новый Массив;
Пока Выборка.Следующий() Цикл
Если МассивИНН.Найти(Выборка.ИНН) = Неопределено Тогда
ДанныеОрганизации = Новый Структура();
ДанныеОрганизации.Вставить("name", Выборка.Организация);
ДанныеОрганизации.Вставить("INN", Выборка.ИНН);
МассивОрганизаций.Добавить(ДанныеОрганизации);
МассивИНН.Добавить(Выборка.ИНН);
КонецЕсли;
КонецЦикла;
СистемнаяИнформация = Новый СистемнаяИнформация;
ВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения;
ВерсияКонфигурации = Метаданные.Версия;
Конфигурация = Метаданные.Имя;
ИнформацияОКлиенте = Новый Структура();
ИнформацияОКлиенте.Вставить("conf", Конфигурация);
ИнформацияОКлиенте.Вставить("platform", ВерсияПлатформы);
ИнформацияОКлиенте.Вставить("versionConf", ВерсияКонфигурации);
ИнформацияОКлиенте.Вставить("organizations", МассивОрганизаций);
ИнформацияОКлиенте.Вставить("versionBIT", ПолучитьВерсиюРасширенияБИТУМ());
Возврат ИнформацияОКлиенте;
КонецФункции
Процедура ЗапуститьПроцедуруВыгрузкиСтатистики() Экспорт
// ++ Бойков BSLR-2906
УстановитьПривилегированныйРежим(Истина);
ПользовательскоеСоглашениеПодписано = Константы.топ_ПользовательскоеСоглашениеПодписано.Получить();
УстановитьПривилегированныйРежим(Ложь);
// -- Бойков BSLR-2906
Если ПользовательскоеСоглашениеПодписано Тогда
ОтправитьДанныеОКлиенте();
ВыгрузитьДанныеСтатистики();
КонецЕсли;
КонецПроцедуры
Функция ПолучитьСлучайноеЧисло(Мин=0,Макс=100) Экспорт
//вместо Randomize
Для н = 1 По Макс Цикл
Уник = Новый УникальныйИдентификатор;
КонецЦикла;
//генерируем GUID
Уник = СокрЛП(Новый УникальныйИдентификатор);
//оставляем только цифры
Уник = СтрЗаменить(Уник,"-","");
Уник = СтрЗаменить(Уник,Символы.НПП,"");
Случ = 0;
//знаменатель должен иметь такую же разрядность
Знаменатель = 1;
Для н = 1 По (СтрДлина(Уник)) Цикл
ТекС = Сред(Уник,н,1);
Если ТекС="a" Тогда
Случ = Случ + Знаменатель*10;
ИначеЕсли ТекС="b" Тогда
Случ = Случ + Знаменатель*11;
ИначеЕсли ТекС="c" Тогда
Случ = Случ + Знаменатель*12;
ИначеЕсли ТекС="d" Тогда
Случ = Случ + Знаменатель*13;
ИначеЕсли ТекС="e" Тогда
Случ = Случ + Знаменатель*14;
ИначеЕсли ТекС="f" Тогда
Случ = Случ + Знаменатель*15;
ИначеЕсли ТекС="1" Тогда
Случ = Случ + Знаменатель;
ИначеЕсли ТекС="2" Тогда
Случ = Случ + Знаменатель*2;
ИначеЕсли ТекС="3" Тогда
Случ = Случ + Знаменатель*3;
ИначеЕсли ТекС="4" Тогда
Случ = Случ + Знаменатель*4;
ИначеЕсли ТекС="5" Тогда
Случ = Случ + Знаменатель*5;
ИначеЕсли ТекС="6" Тогда
Случ = Случ + Знаменатель*6;
ИначеЕсли ТекС="7" Тогда
Случ = Случ + Знаменатель*7;
ИначеЕсли ТекС="8" Тогда
Случ = Случ + Знаменатель*8;
ИначеЕсли ТекС="9" Тогда
Случ = Случ + Знаменатель*9;
КонецЕсли;
Знаменатель = Знаменатель * 16;
КонецЦикла;
Случ = Случ / Знаменатель; //здесь получается дробное случайное число от 0 до 1
//преобразуем его в случайное число из заданного интервала, округляем до целого
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Возврат ЧислоИзИнтервала;
КонецФункции //ПолучитьСлучайноеЧисло()
// ++ Чупраков BSLR-3724, отправка информации ошибки загрузки товаров, если была попытка изменения ключевых реквизитов объекта Товар
//
Процедура ОтправитьДанныеОбОшибкеЗаписиТоваров(ЛичныйКабинет, ПараметрыЖурналаОбмена = Неопределено, ПревышениеТоваровПослеЗапроса = Ложь) Экспорт
УстановитьПривилегированныйРежим(Истина);
ИдентификаторБазы = Константы.топ_ИдентификаторСтатистики.Получить();
УстановитьПривилегированныйРежим(Ложь);
Если ПустаяСтрока(ИдентификаторБазы) Тогда
Возврат;
КонецЕсли;
РеквизитыЛичногоКабинета = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЛичныйКабинет, "Наименование, Код");
ДанныеКабинета = Новый Структура;
ДанныеКабинета.Вставить("Наименование", РеквизитыЛичногоКабинета.Наименование);
ДанныеКабинета.Вставить("Код", РеквизитыЛичногоКабинета.Код);
ДанныеКабинета.Вставить("ОшибкаЗагрузкиТоваровДубли", Истина);
ДанныеКабинета.Вставить("ПревышениеТоваровПослеЗапроса", ПревышениеТоваровПослеЗапроса); // BSLR-3724/1
ДанныеКОтправке = Новый Структура;
ДанныеКОтправке.Вставить("id", ИдентификаторБазы);
ДанныеКОтправке.Вставить("cabinets", ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ДанныеКабинета));
Если ПараметрыЖурналаОбмена = Неопределено Тогда
ПараметрыЖурналаОбмена = топ_ВзаимодействиеСПлощадками.ВернутьПараметрыЖурналаОбмена();
КонецЕсли;
ИмяСервераСтатистики = ПолучитьИмяСервераСтатистики();
ИмяБазыСтатистики = ПолучитьИмяБазыСтатистики();
Попытка
HTTPСоединение = Новый HTTPСоединение(ИмяСервераСтатистики);
Исключение
Возврат;
КонецПопытки;
ДанныеКОтправкеСтрокой = топ_HTTPКоннектор.Данные1СВJSON(ДанныеКОтправке);
АдресРесурса = СтрШаблон("%1/hs/statistics", ИмяБазыСтатистики);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.УстановитьТелоИзСтроки(ДанныеКОтправкеСтрокой);
Попытка
РезультатЗапроса = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
топ_ВзаимодействиеСПлощадками.ЗаполнитьПараметрыЖурналаОбмена(ПараметрыЖурналаОбмена,
ЛичныйКабинет,
Перечисления.топ_ВидыОбменов.ВыгрузкаСтатистики,
"Отправка отчета об ошибке загрузки товаров",
"Выполнена отправка отчета об ошибке загрузки товаров");
топ_ВзаимодействиеСПлощадками.ДобавитьЗаписьВЖурналОбменов(ПараметрыЖурналаОбмена);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
топ_ВзаимодействиеСПлощадками.ЗаполнитьПараметрыЖурналаОбмена(ПараметрыЖурналаОбмена,
ЛичныйКабинет,
Перечисления.топ_ВидыОбменов.ВыгрузкаСтатистики,
"Отправка отчета об ошибке загрузки товаров",
"При отправке отчета возникла ошибка:" + Символы.ПС + ТекстОшибки,
Истина);
топ_ВзаимодействиеСПлощадками.ДобавитьЗаписьВЖурналОбменов(ПараметрыЖурналаОбмена);
КонецПопытки;
КонецПроцедуры // -- Бойков BSLR-3724
//BSLR-3724, Чупраков А.Н., 21.11.24, отправляет на сервер FTP исходные тексты запросов API
Процедура ОтправитьРезультатЗапросАПИ(МассивАдресХранилища) Экспорт
УстановитьПривилегированныйРежим(Истина);
ИдентификаторБазы = Константы.топ_ИдентификаторСтатистики.Получить();
УстановитьПривилегированныйРежим(Ложь);
Если ПустаяСтрока(ИдентификаторБазы) Тогда
Возврат;
КонецЕсли;
НомерСтроки = 1;
Для Каждого АдресХранилища Из МассивАдресХранилища Цикл
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяФайла = ПолучитьИмяВременногоФайла("txt");
ДвоичныеДанные.Записать(ИмяФайла);
ИмяФайлаСервер = Строка(ИдентификаторБазы + Формат(НомерСтроки, "ЧЦ=; ЧГ=; ЧФ=_Ч") + Формат(ТекущаяДата(), "ДФ=_yyyyMMdd_HHmmss") + ".txt");
ФТП = топ_ВзаимодействиеСПлощадками.ПодключитьсяКFTPСерверу();
Попытка
ФТП.Записать(ИмяФайла, ИмяФайлаСервер);
Исключение
ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки());
КонецПопытки;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
КонецПроцедуры
// письмерова 12.05.2025 BSLR-3724/1 - дубли товаров, Эгрегор
Процедура ОтправитьДанныеТоваров(ТаблицаТоваров, ИзмененныеТовары, ТаблицаЗапроса) Экспорт
УстановитьПривилегированныйРежим(Истина);
ИдентификаторБазы = Константы.топ_ИдентификаторСтатистики.Получить();
УстановитьПривилегированныйРежим(Ложь);
Если ПустаяСтрока(ИдентификаторБазы) Тогда
Возврат;
КонецЕсли;
// ТаблицаТоваров
ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
ТаблДок = ПреобразоватьТЗвТД(ТаблицаТоваров);
ТаблДок.Записать(ИмяФайла);
ИмяФайлаСервер = Строка(ИдентификаторБазы + Формат("ТаблТоваров") + Формат(ТекущаяДата(), "ДФ=_yyyyMMdd_HHmmss") + ".mxl");
ФТП = топ_ВзаимодействиеСПлощадками.ПодключитьсяКFTPСерверу();
Попытка
ФТП.Записать(ИмяФайла, ИмяФайлаСервер);
Исключение
ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки());
КонецПопытки;
// ИзмененныеТовары
ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
ТаблДок = ПреобразоватьТЗвТД(ИзмененныеТовары);
ТаблДок.Записать(ИмяФайла);
ИмяФайлаСервер = Строка(ИдентификаторБазы + Формат("ИзмТовары") + Формат(ТекущаяДата(), "ДФ=_yyyyMMdd_HHmmss") + ".mxl");
ФТП = топ_ВзаимодействиеСПлощадками.ПодключитьсяКFTPСерверу();
Попытка
ФТП.Записать(ИмяФайла, ИмяФайлаСервер);
Исключение
ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки());
КонецПопытки;
// ТаблицаЗапроса
ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
ТаблДок = ПреобразоватьТЗвТД(ТаблицаЗапроса);
ТаблДок.Записать(ИмяФайла);
ИмяФайлаСервер = Строка(ИдентификаторБазы + Формат("ТоварыИтог") + Формат(ТекущаяДата(), "ДФ=_yyyyMMdd_HHmmss") + ".mxl");
ФТП = топ_ВзаимодействиеСПлощадками.ПодключитьсяКFTPСерверу();
Попытка
ФТП.Записать(ИмяФайла, ИмяФайлаСервер);
Исключение
ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
// Преобразовать таблицу значений в табличный документ. BSLR-3724/1
//
// Параметры:
// ТабЗначений - <ТаблицаЗначений> - Исходная таблица значений;
// ТабДок - <ТабличныйДокумент> - Полученный табличный документ. Если параметр не задан,
// то документ создаётся заново и возвращается функцией;
// НачалоСтрока - <Число> - Строка начала области;
// НачалоСтолбец - <Число> - Столбец начала области;
// ВыводитьЗаголовки - <Булево> - Определяет выводить ли имена колонок или нет.
//
// Возвращаемое значение:
// <ТабличныйДокумент> - Полученный табличный документ (возвращает параметр "ТабДок").
//
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Истина) Экспорт
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли;
// Определение габаритов таблицы
НачалоСтрока = ?(НачалоСтрока = Неопределено, 1, НачалоСтрока);
НачалоСтолбец = ?(НачалоСтолбец = Неопределено, 1, НачалоСтолбец);
// Преобразование
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений.Колонки Цикл
ТабДок.Область(ИндексСтроки, ИндексКолонки).Текст = ?(ПустаяСтрока(Колонка.Заголовок), Колонка.Имя, Колонка.Заголовок);
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
ИндексСтроки = ИндексСтроки + 1;
КонецЕсли;
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений.Колонки Цикл
ТабДок.Область(ИндексСтроки, ИндексКолонки).СодержитЗначение = Истина;
ТабДок.Область(ИндексСтроки, ИндексКолонки).ТипЗначения = Новый ОписаниеТипов(Колонка.ТипЗначения);
ТабДок.Область(ИндексСтроки, ИндексКолонки).Значение = Элемент[Колонка.Имя];
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;
Возврат ТабДок;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Функция - Вернуть используемые схемы работы
//
// Возвращаемое значение:
// - Структура, которая хранит в себе признаки использования хотя бы одним кабинетом схем работы FBS или FBO
//
Функция ВернутьИспользуемыеСхемыРаботы() Экспорт
ИспользуемыеСхемы = Новый Структура("ИспользуетсяСхемаFBS,ИспользуетсяСхемаFBO",Ложь,Ложь);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ЕСТЬNULL(топ_ЛичныеКабинеты.ИспользуетсяСхемаFBS, ЛОЖЬ)) КАК ИспользуетсяСхемаFBS,
| МАКСИМУМ(ЕСТЬNULL(топ_ЛичныеКабинеты.ИспользуетсяСхемаFBO, ЛОЖЬ)) КАК ИспользуетсяСхемаFBO
|ИЗ
| Справочник.топ_ЛичныеКабинеты КАК топ_ЛичныеКабинеты
|ГДЕ
| топ_ЛичныеКабинеты.Используется";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество()> 0 Тогда
Выборка.Следующий();
ЗаполнитьЗначенияСвойств(ИспользуемыеСхемы, Выборка);
КонецЕсли;
Возврат ИспользуемыеСхемы;
КонецФункции
&НаСервере
Функция ВернутьТорговуюПлощадку(ЛичныйКабинет) Экспорт
Возврат ЛичныйКабинет.ТорговаяПлощадка;
КонецФункции
&НаСервере
Функция ВернутьОсновнуюНастройкуОбмена() Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Топ_ЛичныеКабинеты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Топ_ЛичныеКабинеты КАК Топ_ЛичныеКабинеты
|ГДЕ
| Топ_ЛичныеКабинеты.Основная
| И Топ_ЛичныеКабинеты.Используется";
// ++ Бойков BSLR-1852
Если Не ПолучитьФункциональнуюОпцию("топ_ЭтоНеВерсияТолькоWB") Тогда
Запрос.Текст = Запрос.Текст +
"
| И топ_ЛичныеКабинеты.ТорговаяПлощадка = ЗНАЧЕНИЕ(Перечисление.топ_ТорговыеПлощадки.Wildberries)";
КонецЕсли;;
// -- Бойков BSLR-1852
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецФункции
&НаСервере
Функция ВернутьГруппуПоНаименованию(ЭтотОбъект, ИмяГруппы)
ЭлементГруппы = ЭтотОбъект.Элементы.Найти(ИмяГруппы);
Если ЭлементГруппы = Неопределено Тогда
ЭлементГруппы = ЭтотОбъект.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"));
КонецЕсли;
Возврат ЭлементГруппы;
КонецФункции
&НаСервере
Процедура ДобавитьДополнительныеНастройки(ФормаОбъекта,ЭтотОбъект) Экспорт
ДопНастройки = Новый Структура("Адрес,Массивреквизитов");
МассивРеквизитов = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| топ_ЗначенияНастроекПодключения.Характеристика КАК Характеристика,
| топ_ЗначенияНастроекПодключения.Значение КАК Значение
|ИЗ
| РегистрСведений.топ_ЗначенияНастроекПодключения КАК топ_ЗначенияНастроекПодключения
|ГДЕ
| топ_ЗначенияНастроекПодключения.Объект = &Объект";
Запрос.УстановитьПараметр("Объект",ФормаОбъекта.Ссылка);
ТаблицаДополнительныхНастроек = Запрос.Выполнить().Выгрузить();
Для Каждого СтрокаТаблицы из ТаблицаДополнительныхНастроек цикл
ДопНастройка = СтрокаТаблицы.Характеристика;
МассивРеквизитов.Добавить(Новый РеквизитФормы(ДопНастройка.Наименование,ДопНастройка.ТипЗначения,,ДопНастройка.Заголовок));
КонецЦикла;
ЭтотОбъект.ИзменитьРеквизиты(МассивРеквизитов);
Для Каждого СтрокаТаблицы из ТаблицаДополнительныхНастроек цикл
ДопНастройка = СтрокаТаблицы.Характеристика;
ЭлементСвойство = ФормаОбъекта.Элементы.Добавить(ДопНастройка.Наименование, Тип("ПолеФормы"),ВернутьГруппуПоНаименованию(ФормаОбъекта,ДопНастройка.ИнтерфейсГруппаИмя));
ЭлементСвойство.ПутьКДанным = ДопНастройка.Наименование;
ЭлементСвойство.Заголовок = ДопНастройка.Описание;
Если Тип(ДопНастройка.ТипЗначения) = Тип("Строка") или Тип(ДопНастройка.ТипЗначения) = Тип("Число") Тогда
ЭлементСвойство.Вид = ВидПоляФормы.ПолеВвода;
ИначеЕсли Тип(ДопНастройка.ТипЗначения) = Тип("Булево") Тогда
ЭлементСвойство.Вид = ВидПоляФормы.ПолеФлажка;
КонецЕсли;
ФормаОбъекта.Объект[ДопНастройка.Наименование] = СтрокаТаблицы.Значение;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура УдалитьПовторяющиесяЭлементыМассива(Массив) Экспорт
МассивУникальныхЗначений = Новый Массив();
Для Каждого ЭлементМассива из Массив цикл
Если МассивУникальныхЗначений.Найти(ЭлементМассива) = Неопределено Тогда
МассивУникальныхЗначений.Добавить(ЭлементМассива);
КонецЕсли;
КонецЦикла;
Массив.Очистить();
Для Каждого ЭлементМассива из МассивУникальныхЗначений цикл
Массив.Добавить(ЭлементМассива);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция УбратьНеЦифровыеСимволы(Данные) Экспорт
ОбрабатываемаяСтрока = СокрЛП(Данные);
Результат = ОбрабатываемаяСтрока;
Для Симв =1 по СтрДлина(ОбрабатываемаяСтрока) Цикл
ТекСимвол = Сред(ОбрабатываемаяСтрока,Симв,1);
Если Найти("0123456789",ТекСимвол) = 0 Тогда
Результат = СтрЗаменить(Результат, ТекСимвол, "");
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ПреобразоватьСтрокуВЧисло(Данные) Экспорт
ОбрабатываемаяСтрока = СокрЛП(Данные);
Результат = ОбрабатываемаяСтрока;
Для Симв =1 по СтрДлина(ОбрабатываемаяСтрока) Цикл
ТекСимвол = Сред(ОбрабатываемаяСтрока,Симв,1);
Если Найти("0123456789,",ТекСимвол) = 0 Тогда
Результат = СтрЗаменить(Результат, ТекСимвол, "");
КонецЕсли;
КонецЦикла;
Попытка
Результат = Число(Результат);
Исключение
Результат = 0;
КонецПопытки;
Возврат Результат;
КонецФункции
//Функция возвращает результат проверки названия и версии текущей конфигурации
// Параметры:
// Наименование - Строка - Название конфигурации.
// Версия - Строка - версия конфигурации
// ИлиВерсияСтарше - Булево - применяется при сравнении на минимальную версию конфигурации
// При использовании этого параметра необходимо передавать номер версии в формате "x.x.x.x",
// т.к. применятеся функция общего модуля. Прежняя реализация при сравненнии на больше ">" была некорректна.
// Например, "3.0.4" > "3.0.12" = Истина, что неверно
//
// Пример:
//
// 1. Для проверки является ли текущая конфигурация, конфигурацией "Управление торговлей" версии 11.4:
// топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей", "11.4");
&НаСервере
Функция ЭтаКонфигурация(Наименование, Версия = Неопределено, ИлиВерсияСтарше = Ложь) Экспорт
РезультатПроверки = Ложь;
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВерсииПодсистем.Версия КАК Версия
|ИЗ
| РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем
|ГДЕ
| ВерсииПодсистем.ИмяПодсистемы = &ИмяПодсистемы";
Запрос.УстановитьПараметр("ИмяПодсистемы", Наименование);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Если ЗначениеЗаполнено(Версия) Тогда
Если ИлиВерсияСтарше Тогда
// см. описание параметра ИлиВерсияСтарше в комментарии к функции
РезультатПроверки = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Выборка.Версия, Версия) >= 0;
Иначе
РезультатПроверки = (Лев(Выборка.Версия, СтрДлина(Версия)) = Версия);
КонецЕсли;
Иначе
РезультатПроверки = Истина;
КонецЕсли;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
Возврат РезультатПроверки;
КонецФункции
//++ БИТ Козырев 15.07.2022
// Функция возвращает признак необходимости получения лицензии при старте сеанса
&НаСервере
Функция ПолучатьЛицензию() ЭКСПОРТ
УстановитьПривилегированныйРежим(Истина);
Попытка
НастройкиСтруктура = ce8525a7_МодульРасширенияСервер.ПолучитьНастройки(, Пользователи.ТекущийПользователь());
Если НастройкиСтруктура.ПолучатьЛицензиюПриЗапуске <> неопределено Тогда
ПолучатьЛицензиюПриЗапуске = НастройкиСтруктура.ПолучатьЛицензиюПриЗапуске;
Иначе
ПолучатьЛицензиюПриЗапуске = Ложь;
КонецЕсли;
Исключение
ПолучатьЛицензиюПриЗапуске = Ложь;
КонецПопытки;
//БИТ Смирнов А.П. 01.12.2022 BSLR-924 (
Если ПолучатьЛицензиюПриЗапуске Тогда
ПолучатьЛицензиюПриЗапуске = ИспользоватьФункционалБИТ_УМ();
КонецЕсли;
//БИТ Смирнов А.П. 01.12.2022 )
УстановитьПривилегированныйРежим(Ложь);
Если (РольДоступна("топ_ОсновнаяРоль") и ПолучатьЛицензиюПриЗапуске) или (РольДоступна("ПолныеПрава") и ПолучатьЛицензиюПриЗапуске) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
//-- БИТ Козырев 15.07.2022
//++ БИТ Шадрин 28.10.2022
&НаСервере
Функция ПолучитьТекущуюВерсиюРасширения() Экспорт
УстановитьПривилегированныйРежим(Истина);
ТекущаяВерсия = Константы.топ_ТекущаяВерсияРасширения.Получить();
УстановитьПривилегированныйРежим(Ложь);
Возврат ТекущаяВерсия;
КонецФункции
//LAShadrin 08/06/23 +
&НаСервере
Функция РасширениеДоступноПользователю() Экспорт
Если Не РольДоступна("ПолныеПрава") Тогда
Если Не РольДоступна("топ_ОсновнаяРоль") Тогда
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| топ_ИспользованиеБИТ_УМ.Использование КАК Доступно
|ИЗ
| РегистрСведений.топ_ИспользованиеБИТ_УМ КАК топ_ИспользованиеБИТ_УМ
|ГДЕ
| топ_ИспользованиеБИТ_УМ.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Доступно = ВыборкаДетальныеЗаписи.Доступно;
Иначе
// ++ Бойков BSLR-1267
Доступно = Ложь;
// -- Бойков BSLR-1267
КонецЕсли;
Возврат Доступно;
КонецФункции
//-- БИТ Шадрин 28.10.2022
//Функция возвратащет текст запроса после выполнения компановщика
//
// Параметры:
// ТекстЗапроса - Строка - Текст запроса
// Поля - Строка - Выбранные поля вывода через запятую
// Отборы - Массив - Массив структур см. функцию ДобавитьСтруктуруОтбораСКДВМассив
//
// Возвращаемое значение:
// - Структура
// Текст - Строка - Текст запроса
// Параметры - Структура - Структура, где ключ это имя параметра, значение - значение параметра
//
Функция ПолучитьТекстЗапросаИзСКД(ТекстЗапроса, Поля, Отборы = Неопределено) Экспорт
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных";
ИсточникДанных.ТипИсточникаДанных = "Local";
НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных";
НаборДанных.Запрос = ТекстЗапроса;
НаборДанных.АвтоЗаполнениеДоступныхПолей = Ложь;
НаборДанных.ИсточникДанных = "ИсточникДанных";
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
Настройки = Компоновщик.Настройки;
Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группировка.Использование = Истина;
АвтоПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоПоле.Использование = Истина;
пПоля = СтрРазделить(Поля, ",", Ложь);
Если пПоля.Количество() Тогда
Для Каждого пПоле ИЗ пПоля Цикл
ПолеНабора = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабора.Заголовок = пПоле;
ПолеНабора.Поле = пПоле;
ПолеНабора.ПутьКДанным = пПоле;
ЭлементПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ЭлементПоле.Использование = Истина;
ЭлементПоле.Поле = Новый ПолеКомпоновкиДанных(пПоле);
КонецЦикла;
КонецЕсли;
Если ТипЗнч(Отборы) = Тип("Массив") Тогда
Для Каждого пОтбор Из Отборы Цикл
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(ЭлементОтбора, пОтбор);
КонецЦикла;
КонецЕсли;
//Если ТипЗнч(Параметры) = Тип("Структура") Тогда
// Для Каждого пПараметр Из Параметры Цикл
// Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(пПараметр.Ключ, пПараметр.Значение)
// КонецЦикла;
//КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Если НЕ МакетКомпоновки.НаборыДанных.Количество() = 1 Тогда
ВызватьИсключение "Ошибка при получении набора данных";
КонецЕсли;
пПараметры = Новый Структура;
Для Каждого ЗначениеПараметра Из МакетКомпоновки.ЗначенияПараметров Цикл
пПараметры.Вставить(ЗначениеПараметра.Имя, ЗначениеПараметра.Значение);
КонецЦикла;
пРезультат = Новый Структура;
пРезультат.Вставить("Текст", МакетКомпоновки.НаборыДанных[0].Запрос);
пРезультат.Вставить("Параметры", пПараметры);
Возврат пРезультат;
КонецФункции
//Процедура добавляет в массив структура отбора
//
// Параметры:
// МассивОтборов - Массив - Текст запроса
// ЛевоеЗначение - Левое значение отбора
// ПравоеЗначение - Правое значение отбора
// ВидСравнения - ВидСравненияКомпоновкиДанных - Вид сравнения
// Использование - Булево - Использования отбора
//
Процедура ДобавитьСтруктуруОтбораСКДВМассив(МассивОтборов, ЛевоеЗначение, ПравоеЗначение, ВидСравнения = Неопределено, Использование = Истина) Экспорт
пСтруктура = Новый Структура;
пСтруктура.Вставить("Использование", Использование);
пСтруктура.Вставить("ЛевоеЗначение", ЛевоеЗначение);
пСтруктура.Вставить("ПравоеЗначение", ПравоеЗначение);
пСтруктура.Вставить("ВидСравнения", ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения));
МассивОтборов.Добавить(пСтруктура);
КонецПроцедуры
//Чупраков А.Н. 15.07.22
//▼
Функция ПолучитьЗначениеРеквизитаСправочника(Справочник, Реквизит) Экспорт
Возврат Справочник[Реквизит];
КонецФункции
// -- БИТ Сергеев BSLR-807
// ++ БИТ Сергеев BSLR-847
Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт
Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, Реквизиты, ВыбратьРазрешенные, КодЯзыка);
КонецФункции
// Добавляет в запрос одноименный параметр и текст позволяющий использовать ТаблицуЗначений
Процедура ДобавитьТаблицуВЗапрос(Запрос, Таблица, ИмяВременойТаблицы, ДобавитьПолеАвтономер = Ложь) Экспорт
Запрос.УстановитьПараметр(ИмяВременойТаблицы, Таблица);
пПоля = Новый Массив;
Если ДобавитьПолеАвтономер Тогда
пПоля.Добавить("АВТОНОМЕРЗАПИСИ() КАК Автономер");
КонецЕсли;
пШаблонПолей = "Таблица.%1 КАК %1";
Для Каждого пКолонка Из Таблица.Колонки Цикл
пПоля.Добавить(СтрШаблон(пШаблонПолей, пКолонка.Имя));
КонецЦикла;
пПоля = СтрСоединить(пПоля, СтрШаблон(",%1%2", Символы.ПС, Символы.Таб));
Запрос.Текст = Запрос.Текст
+ ?(ЗначениеЗаполнено(Запрос.Текст), ОбщегоНазначения.РазделительПакетаЗапросов(), "")
+ СтрШаблон(
"ВЫБРАТЬ
| %1
|ПОМЕСТИТЬ %2
|ИЗ
| &%2 КАК Таблица", пПоля, ИмяВременойТаблицы);
КонецПроцедуры
// БИТ Малышев 27.07.2022
Функция ПолучитьСреднийОстатокТовараЗаПериод(ДатаНачалаПериода, ДатаОкончанияПериода, Товар, Склад, ЛичныйКабинет) Экспорт
Остаток = 0;
КонОстаток = 0;
СуммаОстатков = 0;
СекундВДне = 60 * 60 * 24;
НачДата = ДатаНачалаПериода;
КонДата = ДатаОкончанияПериода;
ДнейВПериоде = (КонДата - НачДата) / СекундВДне;
ТекДата = НачДата;
Пока ТекДата < КонДата Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| топ_ОстаткиНаСкладахТорговойПлощадкиСрезПервых.Количество КАК КолНачДня,
| топ_ОстаткиНаСкладахТорговойПлощадкиСрезПоследних.Количество КАК КолКонДня
|ИЗ
| РегистрСведений.топ_ОстаткиНаСкладахТорговойПлощадки.СрезПервых(
| НАЧАЛОПЕРИОДА(&ТекДата, День),
| Товар = &Товар
| И Склад = &Склад
| И ЛичныйКабинет = &ЛичныйКабинет) КАК топ_ОстаткиНаСкладахТорговойПлощадкиСрезПервых,
| РегистрСведений.топ_ОстаткиНаСкладахТорговойПлощадки.СрезПоследних(
| КОНЕЦПЕРИОДА(&ТекДата, День),
| Товар = &Товар
| И Склад = &Склад
| И ЛичныйКабинет = &ЛичныйКабинет) КАК топ_ОстаткиНаСкладахТорговойПлощадкиСрезПоследних";
Запрос.УстановитьПараметр("ЛичныйКабинет", ЛичныйКабинет);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ТекДата", ТекДата);
Запрос.УстановитьПараметр("Товар", Товар);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
КонОстаток = ВыборкаДетальныеЗаписи.КолКонДня;
Остаток = (ВыборкаДетальныеЗаписи.КолНачДня + КонОстаток) / 2;
Иначе
Остаток = КонОстаток;
КонецЕсли;
СуммаОстатков = СуммаОстатков + Остаток;
ТекДата = ТекДата + СекундВДне;
КонецЦикла;
Возврат ?(СуммаОстатков > 0 И ДнейВПериоде > 0, СуммаОстатков / ДнейВПериоде, 0);
КонецФункции
//БИТ ++ Тверитин
Функция ВернутьКонстанту(ИмяКонстанты) Экспорт
// ++ Бойков BSLR-2906
УстановитьПривилегированныйРежим(Истина);
// -- Бойков BSLR-2906
Возврат Константы[ИмяКонстанты].Получить();
КонецФункции
//БИТ Смирнов А.П. 01.09.2022 )
//Чупраков А.Н. 12.09.22
Функция МассивЭтикетокPDF(МассивЗаказов) Экспорт
Возврат Документы.топ_ЗаказТорговойПлощадки.НаличиеФайлаPDF(МассивЗаказов);
КонецФункции // МассивЭтикетокPDF()
//> БИТ - 11_4 - КондращенкоМ
// ++ БИТ Малышев
Функция ПолучитьСкидкуПоТовару(Товар) Экспорт
Результат = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| топ_ТоварыТорговыхПлощадок.ПроцентСкидки КАК ПроцентСкидки
|ИЗ
| Справочник.топ_ТоварыТорговыхПлощадок КАК топ_ТоварыТорговыхПлощадок
|ГДЕ
| топ_ТоварыТорговыхПлощадок.Ссылка = &Товар";
Запрос.УстановитьПараметр("Товар", Товар);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Результат = Выборка.ПроцентСкидки;
КонецЕсли;
Возврат Результат;
КонецФункции
// -- БИТ Сергеев BSLR-847
//Бит Юрлов
Функция Бит_ПолучитьФункциональнуюОпцию(Имя) Экспорт
Возврат ПолучитьФункциональнуюОпцию(Имя);
КонецФункции
//Бит Юрлов
Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные,КодЯзыка);
КонецФункции
//БИТ Смирнов А.П. 01.12.2022 BSLR-924 (
Функция ИспользоватьФункционалБИТ_УМ(Пользователь = Неопределено) Экспорт
// ++ Бойков BSLR-1267
Результат = Ложь;
// -- Бойков BSLR-1267
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| топ_ИспользованиеБИТ_УМ.Использование КАК Использование
|ИЗ
| РегистрСведений.топ_ИспользованиеБИТ_УМ КАК топ_ИспользованиеБИТ_УМ
|ГДЕ
| топ_ИспользованиеБИТ_УМ.Пользователь = &Пользователь";
Если Пользователь = Неопределено Тогда
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Иначе
Запрос.УстановитьПараметр("Пользователь", Пользователь);
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
Результат = ВыборкаДетальныеЗаписи.Использование;
КонецЕсли;
Возврат Результат;
КонецФункции // ИспользоватьФункционалБИТ_УМ()
Процедура ПриОткрытииФормыОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
Если ИспользоватьФункционалБИТ_УМ() Тогда
ce8525a7_МодульРасширенияСервер.ПриОткрытииФормыОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка);
Иначе
СтандартнаяОбработка = Ложь;
ВыбраннаяФорма = "Обработка.топ_НастройкаИспользованияБИТ_УМ.Форма.ФормаПредупреждения";
КонецЕсли;
КонецПроцедуры
Функция ПреобразованиеМассивВТаблицуЗначений(Массив) Экспорт
ТЗ = Новый ТаблицаЗначений;
Для Каждого СтрокаМассива Из Массив Цикл
Если ТЗ.Колонки.Количество() = 0 Тогда
Для Каждого ЭлементМассива Из СтрокаМассива Цикл
ТЗ.Колонки.Добавить(ЭлементМассива.Ключ);
КонецЦикла;
КонецЕсли;
НоваяСтрока = ТЗ.Добавить();
Для Каждого ЭлементМассива Из СтрокаМассива Цикл
НоваяСтрока[ЭлементМассива.Ключ] = ЭлементМассива.Значение;
КонецЦикла;
КонецЦикла;
Возврат ТЗ;
КонецФункции
// ++ Бойков BSLR-2129
//
Функция ПодсистемаУправлениеМаркетплейсамиДоступнаВсегда() Экспорт
Возврат Пользователи.ЭтоПолноправныйПользователь();
КонецФункции // -- Бойков BSLR-2129
// ++ Бойков BSLR-2129
//
Функция ВывестиФормуНастроекИспользованияУправлениеМаркетПлейсами() Экспорт
// Если в регистре нет записей, выводим для администратора форму для настройки использования расширения
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИспользованиеБИТ_УМ.Пользователь КАК Пользователь
|ИЗ
| РегистрСведений.топ_ИспользованиеБИТ_УМ КАК ИспользованиеБИТ_УМ";
РезультатЗапроса = Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);
Возврат РезультатЗапроса.Пустой();
КонецФункции // -- Бойков BSLR-2129
Функция КопироватьСтруктуру(Источник) Экспорт
Приемник = Новый Структура;
Для Каждого ЭлементСтруктуры Из Источник Цикл
Приемник.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
Возврат Приемник;
КонецФункции
Функция ВернутьТаблицуСОтбором(ТаблицаДанных, ЗначениеОтбора, КолонкаОтбора) Экспорт
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаДанных);
тОтбор = Построитель.Отбор.Добавить(КолонкаОтбора);
тОтбор.ВидСравнения = ВидСравнения.ВСписке;
Значение = Новый СписокЗначений;
Значение.ЗагрузитьЗначения(ЗначениеОтбора);
тОтбор.Значение = Значение;
тОтбор.Использование = Истина;
Построитель.Выполнить();
ТабРезультат = Построитель.Результат.Выгрузить();
Возврат ТабРезультат;
КонецФункции
//БИТ Смирнов А.П. 01.12.2022 )
Функция ПолучитьАдресПочтыТехподдержки() Экспорт //LAShadrin 11/03/24 BSLR-3060
Возврат "support-mp@1cbit.ru";
КонецФункции
Функция ПолучитьСписокКолонокЛистаПодбора(Маркетплейс) Экспорт //LAShadrin BSLR-2842
МассивКолонок = Новый Массив;
Если Маркетплейс = ПредопределенноеЗначение("Перечисление.топ_ТорговыеПлощадки.Wildberries") Тогда
МассивКолонок.Добавить("№ задания");
МассивКолонок.Добавить("Склад 1С");
МассивКолонок.Добавить("Фото");
МассивКолонок.Добавить("Наименование товара");
МассивКолонок.Добавить("Наименование номенклатуры");
МассивКолонок.Добавить("Размер");
МассивКолонок.Добавить("Цвет");
МассивКолонок.Добавить("Артикул поставщика");
МассивКолонок.Добавить("Количество");
МассивКолонок.Добавить("Этикетка");
ИначеЕсли Маркетплейс = ПредопределенноеЗначение("Перечисление.топ_ТорговыеПлощадки.OZON") Тогда
МассивКолонок.Добавить("№ задания");
МассивКолонок.Добавить("Склад 1С");
МассивКолонок.Добавить("Фото");
МассивКолонок.Добавить("Наименование товара");
МассивКолонок.Добавить("Наименование номенклатуры");
МассивКолонок.Добавить("Характеристика");
МассивКолонок.Добавить("Артикул поставщика");
МассивКолонок.Добавить("Кол-во");
МассивКолонок.Добавить("Этикетка");
МассивКолонок.Добавить("Куда доставить");
МассивКолонок.Добавить("Дата зак. / отгр.");
ИНачеЕсли Маркетплейс = ПредопределенноеЗначение("Перечисление.топ_ТорговыеПлощадки.ЯндексМаркет") Тогда
МассивКолонок.Добавить("№ задания");
МассивКолонок.Добавить("Склад 1С");
МассивКолонок.Добавить("Фото");
МассивКолонок.Добавить("Наименование товара");
МассивКолонок.Добавить("Наименование номенклатуры");
МассивКолонок.Добавить("Характеристика");
МассивКолонок.Добавить("Артикул поставщика");
МассивКолонок.Добавить("Кол-во");
МассивКолонок.Добавить("Этикетка");
ИначеЕсли Маркетплейс = ПредопределенноеЗначение("Перечисление.топ_ТорговыеПлощадки.СберМегаМаркет") Тогда
КонецЕсли;
Возврат МассивКолонок;
КонецФункции
// ++ БИТ Сергеев COSTS-66
Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные, КодЯзыка);
КонецФункции
Функция ЗначенияРеквизитовОбъектов(Ссылки, Знач Реквизиты, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт
Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъектов(Ссылки, Реквизиты, ВыбратьРазрешенные, КодЯзыка);
КонецФункции
#КонецОбласти
Функция ИмяИнтеграции() Экспорт
Возврат "BIT_UM/" + ВерсияРасширения();
КонецФункции
Функция ВерсияРасширения() Экспорт
ПривилегированныйРежим = ПривилегированныйРежим();
УстановитьПривилегированныйРежим(Истина);
Отбор = Новый Структура("Имя", "БИТ_УправлениеМаркетплейсами");
Расширения = РасширенияКонфигурации.Получить(Отбор);
Если Расширения.Количество() = 0 Тогда
Возврат "";
КонецЕсли;
Версия = Расширения[0].Версия;
УстановитьПривилегированныйРежим(ПривилегированныйРежим);
Возврат Версия;
КонецФункции
//письмерова BSLR-4451 - ошибка авторизованного пользователя при начале сеанса
//Только для внутреннего использования.
//
// Возвращаемое значение:
// СправочникСсылка.Пользователи
// СправочникСсылка.ВнешниеПользователи
//
Функция ВернутьПользователяТекущегоСеанса() Экспорт
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
//Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
// ТекстОшибки = ТекстСообщенияТекущийПользовательНедоступенВСеансеБезРазделителей();
// ВызватьИсключение ТекстОшибки;
//КонецЕсли;
Возврат ?(ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь),
ПараметрыСеанса.ТекущийПользователь,
ПараметрыСеанса.ТекущийВнешнийПользователь);
КонецФункции
// письмерова 20.10.2025 BSLR-4959
#Область УслугиКонсалтинга
Функция ОтправкаЗаявкиНаКонсалтинг(ДанныеКОтправке, ВидЗапроса) Экспорт
Результат = Новый Структура("Ошибка, Сообщение", ЛОжь, "");
СерверИсточник = ПолучитьИмяСервераСтатистики();
ИмяБазыСтатистики = ПолучитьИмяБазыСтатистики();
ДанныеКОтправке = ДополнитьДанныеКОтправке(ДанныеКОтправке);
JSONСтрока = топ_HTTPКоннектор.Данные1СВJSON(ДанныеКОтправке);
ПараметрыЖурналаОбмена = топ_ВзаимодействиеСПлощадками.ВернутьПараметрыЖурналаОбмена();
Попытка
HTTPСоединение = Новый HTTPСоединение(СерверИсточник);
Исключение
Результат.Ошибка = Истина;
Результат.Сообщение = ОписаниеОшибки();
КонецПопытки;
АдресРесурса = СтрШаблон("%1/hs/statistics/consulting", ИмяБазыСтатистики);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.УстановитьТелоИзСтроки(JSONСтрока);
ИмяМетода = "POST";
Попытка
ОТвет = HTTPСоединение.ВызватьHTTPМетод(ИмяМетода, HTTPЗапрос);
Если ОТвет.КодСостояния = 200 Тогда
Результат.Сообщение = "Спасибо за Вашу заявку! Мы свяжемся с Вами в течение 1 рабочего дня с 9:00 до 18:00 по московскому времени. Хорошего дня!";
ЗаписатьДанныеОбОтправкеЗаявкиВРегистр(ДанныеКОтправке, JSONСтрока, ВидЗапроса);
Иначе
Результат.Ошибка = Истина;
Результат.Сообщение = "Не удалось отправить заявку";
КонецЕсли;
Исключение
Результат.Ошибка = Истина;
Результат.Сообщение = ОписаниеОшибки();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ДополнитьДанныеКОтправке(ДанныеКОтправке)
ДанныеоКлиенте = ПолучитьИнформациюОКлиенте();
ДанныеКОтправке.Вставить("organizations",ДанныеоКлиенте.organizations);
ДанныеКОтправке.Вставить("date_request",ЗаписатьДатуJSON(ТекущаяДатаСеанса(), ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.ЛокальнаяДата));
Возврат ДанныеКОтправке;
КонецФункции
ПРоцедура ЗаписатьДанныеОбОтправкеЗаявкиВРегистр(ДанныеКОтправке, JSONСтрока, ВидЗапроса)
НоваяЗапись = РегистрыСведений.топ_ЗаявкиНаКонсалтинг.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = ПрочитатьДатуJSON(ДанныеКОтправке.date_request, ФорматДатыJSON.ISO);
НоваяЗапись.Имя = ДанныеКОтправке.name;
НоваяЗапись.Почта = ДанныеКОтправке.mail;
НоваяЗапись.Телефон = ДанныеКОтправке.tel;
НоваяЗапись.ВидЗапроса = ВидЗапроса;
НоваяЗапись.Вопрос = ДанныеКОтправке.question;
НоваяЗапись.JSONСтрока = JSONСтрока;
НоваяЗапись.Пользователь = Пользователи.АвторизованныйПользователь();
НоваяЗапись.Записать();
КонецПроцедуры
#КонецОбласти
Функция БКОрганизации(Организация) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Владелец", Организация);
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
| БанковскиеСчетаОрганизаций.Ссылка КАК Ссылка
|ИЗ
| Справочник.БанковскиеСчетаОрганизаций КАК БанковскиеСчетаОрганизаций
|ГДЕ
| БанковскиеСчетаОрганизаций.Владелец = &Владелец";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецЕсли;
КонецФункции
Функция БККонтрагента(Контрагент) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Владелец", Контрагент);
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
| БанковскиеСчетаКонтрагентов.Ссылка КАК Ссылка
|ИЗ
| Справочник.БанковскиеСчетаКонтрагентов КАК БанковскиеСчетаКонтрагентов
|ГДЕ
| БанковскиеСчетаКонтрагентов.Владелец = &Владелец";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецЕсли;
КонецФункции
//БИТ Смирнов А.П. 17.10.2022 BSLR-791 (
// Функция получает связанную номенклатуру товаров из заказов торговой площадки и распределяет ее по складам в зависимости от наличия остатка.
// Результат функции можно передать в параметры заполнения процедуры создания заказа клиента
//
// Параметры:
// ЛичныйКабинет - Личный кабинет поставщика на торговой площадки
// ЗаказТорговойПлощадки - Документ заказа с торговой площадки или массив заказов, на основании которых создается заказ клиента
//
// Возвращаемое значение:
// Структура
// ОписаниеОшибки - Строка
// ДанныеРаспределения - Массив структур
// СкладЗаполнения - Справочник.Склады - склад, с которого номенклатура будет зарезервирована
// ЗаказыТорговойПлощадки - Массив элементов типа Документ.топ_ЗаказТорговойПлощадки - заказы ТП, из товаров которых получена номенклатура
// МассивНоменклатурыЗаполнения - массив структур - состав номенклатуры для резерва со склада
// Номенклатура - Справочник.Номенклатура
// Характеристика - Справочник.Характеристики
// Количество - Число
// Цена - Число
// Сумма - Число
//
Функция РаспределитьТоварыЗаказовПоОстаткамНаСкладах_УправлениеТорговлей(ЛичныйКабинет, ЗаказТорговойПлощадки) Экспорт
РезультатРаспределения = Новый Структура("СообщениеОбОшибке, ДанныеРаспределения", "", Новый Массив);
ЭтоОдинЗаказТП = Истина;
Если ТипЗнч(ЗаказТорговойПлощадки) <> Тип("Массив") Тогда
МассивЗаказовТП = Новый Массив;
МассивЗаказовТП.Добавить(ЗаказТорговойПлощадки);
Иначе
МассивЗаказовТП = ЗаказТорговойПлощадки;
Если МассивЗаказовТП.Количество() > 1 Тогда
ЭтоОдинЗаказТП = Ложь;
КонецЕсли;
КонецЕсли;
Если МассивЗаказовТП.Количество() = 0 Тогда
РезультатРаспределения.СообщениеОбОшибке = "Не переданы заказы торговой площадки";
Возврат РезультатРаспределения;
КонецЕсли;
ДанныеДляОбработки = ТоварныйСостав_ОстаткиНоменклатурыПоЗаказамТорговойПлощадки(ЛичныйКабинет, МассивЗаказовТП);
ВыборкаЗаказы = ДанныеДляОбработки.ВыборкаЗаказы;
ТаблицаОстатков = ДанныеДляОбработки.ТаблицаОстатков;
ТаблицаСкладов = ДанныеДляОбработки.ТаблицаСкладов;
//отл
//ТаблицаТоваров = ДанныеДляОбработки.ТаблицаТоваров;
ПараметрыОтбора = Новый Структура("Номенклатура,Характеристика,Склад");
ПараметрыОтбораСкладов = Новый Структура("СкладПоставщика", Справочники.топ_СкладыПоставщика.ПустаяСсылка());
СтрокиПустыхСкладовПоставщика = ТаблицаСкладов.НайтиСтроки(ПараметрыОтбораСкладов);
СоздаватьОдинЗаказКлиента = ЛичныйКабинет.СоздаватьОдинЗаказКлиентаFBS;
Если СоздаватьОдинЗаказКлиента Тогда
СоответствиеСкладов = Новый Соответствие;
КонецЕсли;
Пока ВыборкаЗаказы.Следующий() Цикл
МассивСкладов = Новый Массив;
Если ЗначениеЗаполнено(ВыборкаЗаказы.СкладПоставщика) Тогда
ПараметрыОтбораСкладов.Вставить("СкладПоставщика", ВыборкаЗаказы.СкладПоставщика);
СтрокиСкладов = ТаблицаСкладов.НайтиСтроки(ПараметрыОтбораСкладов);
Для каждого СтрокаСклада из СтрокиСкладов Цикл
МассивСкладов.Добавить(СтрокаСклада.Склад);
КонецЦикла;
КонецЕсли;
Для каждого СтрокаСклада из СтрокиПустыхСкладовПоставщика Цикл
МассивСкладов.Добавить(СтрокаСклада.Склад);
КонецЦикла;
Если МассивСкладов.Количество() = 0 Тогда
РезультатРаспределения.СообщениеОбОшибке = "Для заказа торговой площадки №" + ВыборкаЗаказы.НомерЗаказа + " не найдено соответствие со складами 1С";
Возврат РезультатРаспределения;
КонецЕсли;
ТекущиеПараметрыЗаполнения = Неопределено;
ВыборкаТовары = ВыборкаЗаказы.Выбрать();
КоличествоПозицийВНаборе = 1;
ЭтоПервый = Истина;
н = 0;
Пока ВыборкаТовары.Следующий() Цикл
// письмерова 30.01.2023 BSLR-1339
ПересчитаннаяЦена = ВыборкаТовары.Цена;
КоличествоНаборов = ВыборкаТовары.КоличествоПоЗаказу;
Если ВыборкаТовары.НоменклатураПоЗаказу <> ВыборкаТовары.Номенклатура Тогда // начался набор
н = н + 1;
Если ЭтоПервый ТОгда
пСуммаКРаспределению = ВыборкаТовары.Сумма;
ЭтоПервый = Ложь;
Конецесли;
//если набор состоит из одной комплектующей - цену и сумму можно заполнить
// если элементов набора больше одного - пересчитываем исходя из варианта расчета цены набора
ПараметрыВариантаКомплектацииНоменклатуры = НаборыВызовСервера.ПараметрыВариантаКомплектацииНоменклатуры(
ВыборкаТовары.НоменклатураПоЗаказу,
ВыборкаТовары.ХарактеристикаПоЗаказу);
ВариантКомплектацииНоменклатуры = ПараметрыВариантаКомплектацииНоменклатуры.ВариантКомплектацииНоменклатуры;
ПодобранныеТоварыСтруктура = ПодобранныеТовары(Неопределено, ВыборкаТовары);
ВариантРасчетаЦеныНабора = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВариантКомплектацииНоменклатуры, "ВариантРасчетаЦеныНабора");
КоличествоПозицийВНаборе = ПодобранныеТоварыСтруктура.Количество();
Если КоличествоПозицийВНаборе = 1 ТОгда // нужно пересчитать цену исходя из количества элемента набора
ПересчитаннаяЦена = ВыборкаТовары.Цена * ВыборкаТовары.КоличествоПоЗаказу /ВыборкаТовары.КоличествоУпаковок;
Иначе // письмерова 20.02.2023 BSLR-1428 - нужно пересчитать цены если это возможно или заполнить цену по первому товару, по остальным выставить 0,01 руб
СтандартныйПересчетНабора = истина;
Если ВариантРасчетаЦеныНабора = Перечисления.ВариантыРасчетаЦенНаборов.ЦенаЗадаетсяЗаНаборРаспределяетсяПоДолям Тогда
СтандартныйПересчетНабора = Ложь;
Для Каждого Стр из ПодобранныеТоварыСтруктура Цикл
Если СТр.Номенклатура = ВыборкаТовары.Номенклатура Тогда
ПересчитаннаяЦена = Стр.Цена;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если СтандартныйПересчетНабора Тогда // если не можем расчитать цену по долям
Если н = КоличествоПозицийВНаборе Тогда // это последняя строка
ПересчитаннаяСумма = пСуммаКРаспределению;
ПересчитаннаяЦена = ПересчитаннаяСумма/ ВыборкаТовары.КоличествоУпаковок;
Иначе
ПересчитаннаяЦена = 0.01;
ПересчитаннаяСумма = 0.01 * ВыборкаТовары.КоличествоУпаковок;
КонецЕсли;
пСуммаКРаспределению = пСуммаКРаспределению - ПересчитаннаяСумма;
Конецесли;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ВыборкаТовары.Упаковка) Тогда
ДанныеУпаковки = Справочники.УпаковкиЕдиницыИзмерения.КоэффициентВесОбъемПрочиеРеквизитыУпаковки(ВыборкаТовары.Упаковка, ВыборкаТовары.Номенклатура);
КоэффициентУпаковки = ДанныеУпаковки.Коэффициент;
Иначе
КоэффициентУпаковки = 1;
КонецЕсли;
ОсталосьРаспределить = ВыборкаТовары.КоличествоУпаковок * КоэффициентУпаковки;
ЗаполнитьЗначенияСвойств(ПараметрыОтбора, ВыборкаТовары);
Для каждого Склад из МассивСкладов Цикл
Если ОсталосьРаспределить = 0 Тогда
Прервать;
КонецЕсли;
ПараметрыОтбора.Вставить("Склад", Склад);
СтрокиОстатков = ТаблицаОстатков.НайтиСтроки(ПараметрыОтбора);
Если СтрокиОстатков.Количество() > 0 Тогда
СтрокаОстатка = СтрокиОстатков[0];
Если СтрокаОстатка.КоличествоОстаток = 0 Тогда
Продолжить;
КонецЕсли;
Если СтрокаОстатка.КоличествоОстаток >= ОсталосьРаспределить Тогда
КоличествоКРезерву = ОсталосьРаспределить;
ОсталосьРаспределить = 0;
Иначе
КоличествоКРезерву = СтрокаОстатка.КоличествоОстаток;
ОсталосьРаспределить = ОсталосьРаспределить - СтрокаОстатка.КоличествоОстаток;
КонецЕсли;
СтрокаОстатка.КоличествоОстаток = СтрокаОстатка.КоличествоОстаток - КоличествоКРезерву;
Если СоздаватьОдинЗаказКлиента Тогда
ТекущиеПараметрыЗаполнения = СоответствиеСкладов.Получить(Склад);
КонецЕсли;
Если ТекущиеПараметрыЗаполнения = Неопределено Тогда
ТекущиеПараметрыЗаполнения = ПараметрыЗаполненияЗаказаКлиента();
ТекущиеПараметрыЗаполнения.Вставить("СкладЗаполнения", Склад);
Если СоздаватьОдинЗаказКлиента Тогда
СоответствиеСкладов.Вставить(Склад, ТекущиеПараметрыЗаполнения);
КонецЕсли;
КонецЕсли;
Если ТекущиеПараметрыЗаполнения.ЗаказыТорговойПлощадки.Найти(ВыборкаЗаказы.ЗаказТП) = Неопределено Тогда
ТекущиеПараметрыЗаполнения.ЗаказыТорговойПлощадки.Добавить(ВыборкаЗаказы.ЗаказТП);
КонецЕсли;
// ++ Бойков BSLR-1968
//нСтр = ТекущиеПараметрыЗаполнения.ТаблицаНоменклатурыЗаполнения.Добавить();
//ЗаполнитьЗначенияСвойств(нСтр, ВыборкаТовары, "Номенклатура,Характеристика,Товар,РазмерWB,Упаковка");
//нСтр.КоличествоУпаковок = КоличествоКРезерву / ?(КоэффициентУпаковки = 0, 1, КоэффициентУпаковки);
//нСтр.Ссылка = ВыборкаТовары.ЗаказТП;
//Если НЕ ВыборкаТовары.ЭтоКомплектующая Тогда
// нСтр.Цена = ВыборкаТовары.Цена;
// нСтр.Сумма = нСтр.КоличествоУпаковок * нСтр.Цена; //БИТ Смирнов А.П. 16.12.2022 BSLR-958
//Иначе // письмерова 30.01.2023 BSLR-1339
// нСтр.Цена = ПересчитаннаяЦена;
// нСтр.Сумма = нСтр.КоличествоУпаковок * нСтр.Цена;
//КонецЕсли;
Если НЕ ВыборкаТовары.ЭтоКомплектующая Тогда
нСтр = ТекущиеПараметрыЗаполнения.ТаблицаНоменклатурыЗаполнения.Добавить();
ЗаполнитьЗначенияСвойств(нСтр, ВыборкаТовары, "Номенклатура,Характеристика,Товар,РазмерWB,Упаковка");
нСтр.КоличествоУпаковок = КоличествоКРезерву / ?(КоэффициентУпаковки = 0, 1, КоэффициентУпаковки);
нСтр.Ссылка = ВыборкаТовары.ЗаказТП;
нСтр.Цена = ВыборкаТовары.Цена;
нСтр.Сумма = нСтр.КоличествоУпаковок * нСтр.Цена; //БИТ Смирнов А.П. 16.12.2022 BSLR-958
Иначе // письмерова 30.01.2023 BSLR-1339
Для Каждого Стр из ПодобранныеТоварыСтруктура Цикл
Если СТр.Номенклатура = ВыборкаТовары.Номенклатура И Стр.КоличествоУпаковок > 0 И КоличествоКРезерву > 0 Тогда
нСтр = ТекущиеПараметрыЗаполнения.ТаблицаНоменклатурыЗаполнения.Добавить();
ЗаполнитьЗначенияСвойств(нСтр, ВыборкаТовары, "Номенклатура,Характеристика,Товар,РазмерWB,Упаковка");
нСтр.Ссылка = ВыборкаТовары.ЗаказТП;
КоличествоУпаковок = КоличествоКРезерву / ?(КоэффициентУпаковки = 0, 1, КоэффициентУпаковки);
КоличествоУпаковок = Мин(Стр.КоличествоУпаковок, КоличествоУпаковок);
КоличествоКРезерву = КоличествоКРезерву - КоличествоУпаковок * КоэффициентУпаковки;
Стр.КоличествоУпаковок = Стр.КоличествоУпаковок - КоличествоУпаковок;
нСтр.КоличествоУпаковок = КоличествоУпаковок;
нСтр.Цена = СТр.Цена;
нСтр.Сумма = нСтр.КоличествоУпаковок * нСтр.Цена;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// -- Бойков BSLR-1968
КонецЕсли;
КонецЦикла;
Если ОсталосьРаспределить > 0 Тогда
СкладКОбеспечению = МассивСкладов[0];
Если СоздаватьОдинЗаказКлиента Тогда
ТекущиеПараметрыЗаполнения = СоответствиеСкладов.Получить(СкладКОбеспечению);
КонецЕсли;
Если ТекущиеПараметрыЗаполнения = Неопределено Тогда
ТекущиеПараметрыЗаполнения = ПараметрыЗаполненияЗаказаКлиента();
ТекущиеПараметрыЗаполнения.Вставить("СкладЗаполнения", СкладКОбеспечению);
Если СоздаватьОдинЗаказКлиента Тогда
СоответствиеСкладов.Вставить(СкладКОбеспечению, ТекущиеПараметрыЗаполнения);
КонецЕсли;
КонецЕсли;
Если ТекущиеПараметрыЗаполнения.ЗаказыТорговойПлощадки.Найти(ВыборкаЗаказы.ЗаказТП) = Неопределено Тогда
ТекущиеПараметрыЗаполнения.ЗаказыТорговойПлощадки.Добавить(ВыборкаЗаказы.ЗаказТП);
КонецЕсли;
нСтр = ТекущиеПараметрыЗаполнения.ТаблицаНоменклатурыЗаполнения.Добавить();
ЗаполнитьЗначенияСвойств(нСтр, ВыборкаТовары, "Номенклатура,Характеристика,Товар,РазмерWB,Упаковка");
нСтр.КоличествоУпаковок = ОсталосьРаспределить / ?(КоэффициентУпаковки = 0, 1, КоэффициентУпаковки);
нСтр.Ссылка = ВыборкаТовары.ЗаказТП;
Если НЕ ВыборкаТовары.ЭтоКомплектующая Тогда
нСтр.Цена = ВыборкаТовары.Цена;
нСтр.Сумма = нСтр.КоличествоУпаковок * нСтр.Цена; //БИТ Смирнов А.П. 16.12.2022 BSLR-958
Иначе // письмерова 30.01.2023 BSLR-1339
нСтр.Цена = ПересчитаннаяЦена;
нСтр.Сумма = нСтр.КоличествоУпаковок * нСтр.Цена;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НЕ СоздаватьОдинЗаказКлиента И ТекущиеПараметрыЗаполнения <> Неопределено Тогда
ТекТаблицаНоменклатуры = ТекущиеПараметрыЗаполнения.ТаблицаНоменклатурыЗаполнения;
ТекТаблицаНоменклатуры.Свернуть("Ссылка,Номенклатура,Характеристика,Товар,РазмерWB,Упаковка,Цена", "КоличествоУпаковок,Сумма");
МассивНоменклатуры = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТекТаблицаНоменклатуры);
ТекущиеПараметрыЗаполнения.Вставить("МассивНоменклатурыЗаполнения", МассивНоменклатуры);
ТекущиеПараметрыЗаполнения.Удалить("ТаблицаНоменклатурыЗаполнения");
РезультатРаспределения.ДанныеРаспределения.Добавить(ТекущиеПараметрыЗаполнения);
КонецЕсли;
КонецЦикла;
Если СоздаватьОдинЗаказКлиента Тогда
Для каждого ПараметрыЗаполненияПоСкладу из СоответствиеСкладов Цикл
ТекТаблицаНоменклатуры = ПараметрыЗаполненияПоСкладу.Значение.ТаблицаНоменклатурыЗаполнения;
ТекТаблицаНоменклатуры.Свернуть("Ссылка,Номенклатура,Характеристика,Товар,РазмерWB,Упаковка,Цена", "КоличествоУпаковок,Сумма");
МассивНоменклатуры = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТекТаблицаНоменклатуры);
ПараметрыЗаполненияПоСкладу.Значение.Вставить("МассивНоменклатурыЗаполнения", МассивНоменклатуры);
ПараметрыЗаполненияПоСкладу.Значение.Удалить("ТаблицаНоменклатурыЗаполнения");
РезультатРаспределения.ДанныеРаспределения.Добавить(ПараметрыЗаполненияПоСкладу.Значение);
КонецЦикла;
КонецЕсли;
Возврат РезультатРаспределения;
КонецФункции // СоздатьЗаказКлиентаСРазделениемПоОстаткамНаСкладах_УправлениеТорговлей()
Функция ТоварныйСостав_ОстаткиНоменклатурыПоЗаказамТорговойПлощадки(ЛичныйКабинет, МассивЗаказовТП)
Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ
| топ_ЗаказТорговойПлощадкиТовары.Ссылка КАК ЗаказТП,
| топ_ЗаказТорговойПлощадкиТовары.Ссылка.СкладПоставщика КАК СкладПоставщика,
| топ_ЗаказТорговойПлощадкиТовары.Товар КАК Товар,
| топ_ЗаказТорговойПлощадкиТовары.РазмерWB КАК РазмерWB,
| МИНИМУМ(топ_ЗаказТорговойПлощадкиТовары.Цена) КАК Цена,
| СУММА(топ_ЗаказТорговойПлощадкиТовары.Сумма) КАК Сумма,
| СУММА(топ_ЗаказТорговойПлощадкиТовары.Количество) КАК Количество
|ПОМЕСТИТЬ ВТ_ТоварыПоЗаказам
|ИЗ
| Документ.топ_ЗаказТорговойПлощадки.Товары КАК топ_ЗаказТорговойПлощадкиТовары
|ГДЕ
| топ_ЗаказТорговойПлощадкиТовары.Ссылка В(&МассивЗаказовТП)
|
|СГРУППИРОВАТЬ ПО
| топ_ЗаказТорговойПлощадкиТовары.Ссылка,
| топ_ЗаказТорговойПлощадкиТовары.Ссылка.СкладПоставщика,
| топ_ЗаказТорговойПлощадкиТовары.Товар,
| топ_ЗаказТорговойПлощадкиТовары.РазмерWB
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТоварыПоЗаказам.Товар КАК Товар,
| ВТ_ТоварыПоЗаказам.РазмерWB КАК РазмерWB,
//БИТ Смирнов А.П. 25.11.2022 доработка для учета нулевых размеров (
| ВЫБОР
| КОГДА ВТ_ТоварыПоЗаказам.РазмерWB.размер = ""0""
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ЭтоНулевойРазмер
//БИТ Смирнов А.П. 25.11.2022 доработка для учета нулевых размеров )
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| ВТ_ТоварыПоЗаказам КАК ВТ_ТоварыПоЗаказам
|
|СГРУППИРОВАТЬ ПО
| ВТ_ТоварыПоЗаказам.Товар,
| ВТ_ТоварыПоЗаказам.РазмерWB,
//БИТ Смирнов А.П. 25.11.2022 доработка для учета нулевых размеров (
| ВЫБОР
| КОГДА ВТ_ТоварыПоЗаказам.РазмерWB.размер = ""0""
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ
//БИТ Смирнов А.П. 25.11.2022 доработка для учета нулевых размеров )
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТТовары.Товар КАК Товар,
| ВТТовары.РазмерWB КАК РазмерWB,
| ВТТовары.ЭтоНулевойРазмер КАК ЭтоНулевойРазмер,
| ВЫБОР
| КОГДА топ_СоответствиеТоваров.Номенклатура ЕСТЬ NULL
| ТОГДА ВЫБОР
| КОГДА ВТТовары.ЭтоНулевойРазмер
| ТОГДА топ_СоответствиеТоваров1.Номенклатура
| ИНАЧЕ топ_СоответствиеТоваров2.Номенклатура
| КОНЕЦ
| ИНАЧЕ топ_СоответствиеТоваров.Номенклатура
| КОНЕЦ КАК Номенклатура,
| ВЫБОР
| КОГДА топ_СоответствиеТоваров.Характеристика ЕСТЬ NULL
| ТОГДА ВЫБОР
| КОГДА ВТТовары.ЭтоНулевойРазмер
| ТОГДА топ_СоответствиеТоваров1.Характеристика
| ИНАЧЕ топ_СоответствиеТоваров2.Характеристика
| КОНЕЦ
| ИНАЧЕ топ_СоответствиеТоваров.Характеристика
| КОНЕЦ КАК Характеристика,
//БИТ Смирнов А.П. 16.12.2022 BSLR-958 (
| ВЫБОР
| КОГДА топ_СоответствиеТоваров.Упаковка ЕСТЬ NULL
| ТОГДА ВЫБОР
| КОГДА ВТТовары.ЭтоНулевойРазмер
| ТОГДА топ_СоответствиеТоваров1.Упаковка
| ИНАЧЕ топ_СоответствиеТоваров2.Упаковка
| КОНЕЦ
| ИНАЧЕ топ_СоответствиеТоваров.Упаковка
| КОНЕЦ КАК Упаковка
//БИТ Смирнов А.П. 16.12.2022 )
|ПОМЕСТИТЬ ВТ_НоменклатураТовары
|ИЗ
| ВТ_Товары КАК ВТТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров
| ПО ВТТовары.Товар = топ_СоответствиеТоваров.Товар
| И ВТТовары.РазмерWB = топ_СоответствиеТоваров.РазмерWB
| И топ_СоответствиеТоваров.Товар <> ЗНАЧЕНИЕ(Справочник.топ_ТоварыТорговыхПлощадок.ПустаяСсылка)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров1
| ПО ВТТовары.Товар = топ_СоответствиеТоваров1.Товар
| И (ВТТовары.ЭтоНулевойРазмер)
| И (топ_СоответствиеТоваров1.РазмерWB = ЗНАЧЕНИЕ(Справочник.топ_РазмерыТоваровWB.ПустаяСсылка))
| И топ_СоответствиеТоваров1.Товар <> ЗНАЧЕНИЕ(Справочник.топ_ТоварыТорговыхПлощадок.ПустаяСсылка)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.топ_СоответствиеТоваров КАК топ_СоответствиеТоваров2
| ПО ВТТовары.Товар = топ_СоответствиеТоваров2.Товар
| И (ВТТовары.РазмерWB = ЗНАЧЕНИЕ(Справочник.топ_РазмерыТоваровWB.ПустаяСсылка))
| И (топ_СоответствиеТоваров2.РазмерWB.размер = ""0"")
| И топ_СоответствиеТоваров2.Товар <> ЗНАЧЕНИЕ(Справочник.топ_ТоварыТорговыхПлощадок.ПустаяСсылка)
|ГДЕ
| НЕ ВЫБОР
| КОГДА топ_СоответствиеТоваров.Номенклатура ЕСТЬ NULL
| ТОГДА ВЫБОР
| КОГДА ВТТовары.ЭтоНулевойРазмер
| ТОГДА топ_СоответствиеТоваров1.Номенклатура
| ИНАЧЕ топ_СоответствиеТоваров2.Номенклатура
| КОНЕЦ
| ИНАЧЕ топ_СоответствиеТоваров.Номенклатура
| КОНЕЦ ЕСТЬ NULL
|;
|
|////////////////////////////////////////////////////////////////////////////////
//БИТ Смирнов А.П. 25.11.2022 доработка для учета нулевых размеров )
|ВЫБРАТЬ
| ВТ_НоменклатураТовары.Товар КАК Товар,
| ВТ_НоменклатураТовары.РазмерWB КАК РазмерWB,
| ВТ_НоменклатураТовары.Номенклатура КАК НоменклатураНабора,
| ВТ_НоменклатураТовары.Характеристика КАК ХарактеристикаНабора,
| СоставНаборов.Номенклатура КАК Номенклатура,
| СоставНаборов.Характеристика КАК Характеристика,
//БИТ Смирнов А.П. 17.11.2022 BSLR-958 (
//| СУММА(СоставНаборов.КоличествоУпаковок) КАК Количество,
| СУММА(СоставНаборов.Количество) КАК Количество,
| СУММА(СоставНаборов.КоличествоУпаковок) КАК КоличествоУпаковок,
| СоставНаборов.Упаковка КАК Упаковка
//БИТ Смирнов А.П. 17.11.2022 )
|ПОМЕСТИТЬ ВТ_СоставНабора
|ИЗ
| ВТ_НоменклатураТовары КАК ВТ_НоменклатураТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыКомплектацииНоменклатуры.Товары КАК СоставНаборов
| ПО (ВТ_НоменклатураТовары.Номенклатура = СоставНаборов.Ссылка.Владелец
| И ВТ_НоменклатураТовары.Характеристика = СоставНаборов.Ссылка.Характеристика)
|ГДЕ
| ВТ_НоменклатураТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)
|
|СГРУППИРОВАТЬ ПО
| ВТ_НоменклатураТовары.Товар,
| ВТ_НоменклатураТовары.РазмерWB,
| ВТ_НоменклатураТовары.Номенклатура,
| ВТ_НоменклатураТовары.Характеристика,
| СоставНаборов.Номенклатура,
| СоставНаборов.Характеристика,
//БИТ Смирнов А.П. 17.11.2022 BSLR-958 (
| СоставНаборов.Упаковка";
//БИТ Смирнов А.П. 17.11.2022 )
Если топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей", "11.4")
ИЛИ топ_ОбщийМодульСервер.ЭтаКонфигурация("КомплекснаяАвтоматизация", "2.4.")
ИЛИ топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеПредприятием", "2.4.") Тогда
ТекстЗапроса = ТекстЗапроса +
";
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СвободныеОстатки.Номенклатура КАК Номенклатура,
| СвободныеОстатки.Характеристика КАК Характеристика,
| СвободныеОстатки.Склад КАК Склад,
| СвободныеОстатки.ВНаличииОстаток - СвободныеОстатки.ВРезервеСоСкладаОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.СвободныеОстатки.Остатки(
| ,
| (Номенклатура, Характеристика) В
| (ВЫБРАТЬ
| ВТ_НоменклатураТовары.Номенклатура,
| ВТ_НоменклатураТовары.Характеристика
| ИЗ
| ВТ_НоменклатураТовары
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| ВТ_СоставНабора.Номенклатура,
| ВТ_СоставНабора.Характеристика
| ИЗ
| ВТ_СоставНабора)) КАК СвободныеОстатки";
ИначеЕсли топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей", "11.5.26.96", Истина)
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("КомплекснаяАвтоматизация", "2.5.26.96", Истина)
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеПредприятием", "2.5.26.96", Истина) Тогда // УТ 11.5
ТекстЗапроса = ТекстЗапроса +
";
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_НоменклатураТовары.Номенклатура КАК Номенклатура,
| ВТ_НоменклатураТовары.Характеристика КАК Характеристика,
| ОстатокНаСкладе.Склад КАК Склад,
| СУММА(ЕСТЬNULL(ОстатокНаСкладе.Свободно, 0)) КАК КоличествоОстаток
|ИЗ
| ВТ_НоменклатураТовары КАК ВТ_НоменклатураТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК ОстатокНаСкладе
| ПО ВТ_НоменклатураТовары.Номенклатура = ОстатокНаСкладе.Номенклатура
| И ВТ_НоменклатураТовары.Характеристика = ОстатокНаСкладе.Характеристика
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СоставНабора КАК ВТ_СоставНабора
| ПО ВТ_НоменклатураТовары.Номенклатура = ВТ_СоставНабора.Номенклатура
| И ВТ_НоменклатураТовары.Характеристика = ВТ_СоставНабора.Характеристика
|
|ГДЕ
// BSLR-5822 {
| ОстатокНаСкладе.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
| И ОстатокНаСкладе.ХарактеристикаПотребности В (ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек))
//| ОстатокНаСкладе.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОстатокНаСкладе)
// BSLR-5822 }
| И ОстатокНаСкладе.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
//| И ОстатокНаСкладе.Склад В (ВЫБРАТЬ ВТСкладыПоЗаказам.Склад ИЗ ВТСкладыПоЗаказам КАК ВТСкладыПоЗаказам)
| И ВТ_НоменклатураТовары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)
| И ВТ_СоставНабора.Номенклатура ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
| ВТ_НоменклатураТовары.Номенклатура,
| ВТ_НоменклатураТовары.Характеристика,
| ОстатокНаСкладе.Склад
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВТ_СоставНабора.Номенклатура КАК Номенклатура,
| ВТ_СоставНабора.Характеристика КАК Характеристика,
| ДоступностьТоваров.Склад КАК Склад,
| СУММА(ЕСТЬNULL(ДоступностьТоваров.Свободно, 0)) КАК КоличествоОстаток
|ИЗ
| ВТ_СоставНабора КАК ВТ_СоставНабора,
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК ДоступностьТоваров
| ПО ДоступностьТоваров.Номенклатура = ВТ_СоставНабора.Номенклатура
| И ДоступностьТоваров.Характеристика = ВТ_СоставНабора.Характеристика
// BSLR-5822 {
| И ДоступностьТоваров.ХарактеристикаПотребности В (ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.ОтложитьРезервирование), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.КОбеспечению), ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек))
| И ДоступностьТоваров.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
//| И ДоступностьТоваров.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОстатокНаСкладе)
// BSLR-5822 }
| И ДоступностьТоваров.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
//| И ДоступностьТоваров.Склад В (ВЫБРАТЬ ВТСкладыПоЗаказам.Склад ИЗ ВТСкладыПоЗаказам КАК ВТСкладыПоЗаказам)
|
|СГРУППИРОВАТЬ ПО
| ВТ_СоставНабора.Номенклатура,
| ВТ_СоставНабора.Характеристика,
| ДоступностьТоваров.Склад";
//BSLR-5453
ИначеЕсли топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеТорговлей", "11.5.")
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("КомплекснаяАвтоматизация", "2.5.")
Или топ_ОбщийМодульСервер.ЭтаКонфигурация("УправлениеПредприятием", "2.5.") Тогда // УТ 11.5
ТекстЗапроса = ТекстЗапроса +
";
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_НоменклатураТовары.Номенклатура КАК Номенклатура,
| ВТ_НоменклатураТовары.Характеристика КАК Характеристика,
| ОстатокНаСкладе.Склад КАК Склад,
| СУММА(ЕСТЬNULL(ОстатокНаСкладе.Количество, 0)) КАК КоличествоОстаток
|ИЗ
| ВТ_НоменклатураТовары КАК ВТ_НоменклатураТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК ОстатокНаСкладе
| ПО ВТ_НоменклатураТовары.Номенклатура = ОстатокНаСкладе.Номенклатура
| И ВТ_НоменклатураТовары.Характеристика = ОстатокНаСкладе.Характеристика
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СоставНабора КАК ВТ_СоставНабора
| ПО ВТ_НоменклатураТовары.Номенклатура = ВТ_СоставНабора.Номенклатура
| И ВТ_НоменклатураТовары.Характеристика = ВТ_СоставНабора.Характеристика
|
|ГДЕ
// BSLR-5822 {
| ОстатокНаСкладе.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОстатокНаСкладе)
//| ОстатокНаСкладе.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
//| ОстатокНаСкладе.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек)
// BSLR-5822 }
| И ОстатокНаСкладе.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
//| И ОстатокНаСкладе.Склад В (ВЫБРАТЬ ВТСкладыПоЗаказам.Склад ИЗ ВТСкладыПоЗаказам КАК ВТСкладыПоЗаказам)
| И ВТ_НоменклатураТовары.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)
| И ВТ_СоставНабора.Номенклатура ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
| ВТ_НоменклатураТовары.Номенклатура,
| ВТ_НоменклатураТовары.Характеристика,
| ОстатокНаСкладе.Склад
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВТ_СоставНабора.Номенклатура КАК Номенклатура,
| ВТ_СоставНабора.Характеристика КАК Характеристика,
| ДоступностьТоваров.Склад КАК Склад,
| СУММА(ЕСТЬNULL(ДоступностьТоваров.Свободно, 0)) КАК КоличествоОстаток
|ИЗ
| ВТ_СоставНабора КАК ВТ_СоставНабора,
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК ДоступностьТоваров
| ПО ДоступностьТоваров.Номенклатура = ВТ_СоставНабора.Номенклатура
| И ДоступностьТоваров.Характеристика = ВТ_СоставНабора.Характеристика
// BSLR-5822 {
| И ДоступностьТоваров.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОстатокНаСкладе)
//| И ДоступностьТоваров.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.Излишек)
//| И ДоступностьТоваров.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
// BSLR-5822 }
| И ДоступностьТоваров.Назначение = ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
//| И ДоступностьТоваров.Склад В (ВЫБРАТЬ ВТСкладыПоЗаказам.Склад ИЗ ВТСкладыПоЗаказам КАК ВТСкладыПоЗаказам)
|
|СГРУППИРОВАТЬ ПО
| ВТ_СоставНабора.Номенклатура,
| ВТ_СоставНабора.Характеристика,
| ДоступностьТоваров.Склад";
//BSLR-5453
КонецЕсли;
ТекстЗапроса = ТекстЗапроса +
";
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТоварыПоЗаказам.ЗаказТП КАК ЗаказТП,
| ВТ_ТоварыПоЗаказам.ЗаказТП.НомерЗаказа КАК НомерЗаказа,
| ВТ_ТоварыПоЗаказам.СкладПоставщика КАК СкладПоставщика,
| ВТ_ТоварыПоЗаказам.Товар КАК Товар,
| ВТ_ТоварыПоЗаказам.РазмерWB КАК РазмерWB,
| ВТ_ТоварыПоЗаказам.Цена КАК Цена,
| ВТ_ТоварыПоЗаказам.Сумма КАК Сумма,
//БИТ Смирнов А.П. 16.12.2022 BSLR-958 (
//| ВЫБОР
//| КОГДА ВТ_СоставНабора.Номенклатура ЕСТЬ NULL
//| ТОГДА ВТ_ТоварыПоЗаказам.Количество
//| ИНАЧЕ ВТ_ТоварыПоЗаказам.Количество * ВТ_СоставНабора.Количество
//| КОНЕЦ КАК Количество,
// письмерова 30.01.2023 BSLR-1339
| ВТ_ТоварыПоЗаказам.Количество КАК КоличествоПоЗаказу,
| ВЫБОР
| КОГДА ВТ_СоставНабора.Номенклатура ЕСТЬ NULL
| ТОГДА ВТ_ТоварыПоЗаказам.Количество
| ИНАЧЕ ВТ_ТоварыПоЗаказам.Количество * ВТ_СоставНабора.КоличествоУпаковок
| КОНЕЦ КАК КоличествоУпаковок,
| ВЫБОР
| КОГДА ВТ_СоставНабора.Номенклатура ЕСТЬ NULL
| ТОГДА ВТ_НоменклатураТовары.Упаковка
| ИНАЧЕ ВТ_СоставНабора.Упаковка
| КОНЕЦ КАК Упаковка,
//БИТ Смирнов А.П. 16.12.2022 )
| ВЫБОР
| КОГДА ВТ_СоставНабора.Номенклатура ЕСТЬ NULL
| ТОГДА ЕСТЬNULL(ВТ_НоменклатураТовары.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))
| ИНАЧЕ ВТ_СоставНабора.Номенклатура
| КОНЕЦ КАК Номенклатура,
// письмерова 30.01.2023 BSLR-1339
| ЕСТЬNULL(ВТ_НоменклатураТовары.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК НоменклатураПоЗаказу,
| ВЫБОР
| КОГДА ВТ_СоставНабора.Номенклатура ЕСТЬ NULL
| ТОГДА ЕСТЬNULL(ВТ_НоменклатураТовары.Характеристика, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))
| ИНАЧЕ ВТ_СоставНабора.Характеристика
| КОНЕЦ КАК Характеристика,
// письмерова 30.01.2023 BSLR-1339
| ЕСТЬNULL(ВТ_НоменклатураТовары.Характеристика, ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК ХарактеристикаПоЗаказу,
| ВЫБОР
| КОГДА ВТ_СоставНабора.Номенклатура ЕСТЬ NULL
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ КАК ЭтоКомплектующая
|ИЗ
| ВТ_ТоварыПоЗаказам КАК ВТ_ТоварыПоЗаказам
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НоменклатураТовары КАК ВТ_НоменклатураТовары
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СоставНабора КАК ВТ_СоставНабора
| ПО ВТ_НоменклатураТовары.Номенклатура = ВТ_СоставНабора.НоменклатураНабора
| И ВТ_НоменклатураТовары.Характеристика = ВТ_СоставНабора.ХарактеристикаНабора
| ПО ВТ_ТоварыПоЗаказам.Товар = ВТ_НоменклатураТовары.Товар
| И ВТ_ТоварыПоЗаказам.РазмерWB = ВТ_НоменклатураТовары.РазмерWB
|ИТОГИ
| МИНИМУМ(СкладПоставщика),
| МИНИМУМ(НомерЗаказа)
|ПО
| ЗаказТП
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| топ_ЛичныеКабинетыСписокСкладовFBS.НомерСтроки КАК НомерСтроки,
| топ_ЛичныеКабинетыСписокСкладовFBS.Склад КАК Склад,
| топ_ЛичныеКабинетыСписокСкладовFBS.СкладТП КАК СкладПоставщика,
| топ_ЛичныеКабинетыСписокСкладовFBS.Ссылка КАК ЛичныйКабинет
|ИЗ
| Справочник.топ_ЛичныеКабинеты.СписокСкладовFBS КАК топ_ЛичныеКабинетыСписокСкладовFBS
|ГДЕ
| топ_ЛичныеКабинетыСписокСкладовFBS.Ссылка = &ЛичныйКабинет
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
Запрос.Текст = ТекстЗапроса;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("МассивЗаказовТП", МассивЗаказовТП);
Запрос.УстановитьПараметр("ЛичныйКабинет" , ЛичныйКабинет);
РезультатЗапроса = Запрос.ВыполнитьПакет();
ДанныеДляОбработки = Новый Структура;
ДанныеДляОбработки.Вставить("ТаблицаСкладов" , РезультатЗапроса[РезультатЗапроса.Количество()-1].Выгрузить());
ДанныеДляОбработки.Вставить("ВыборкаЗаказы" , РезультатЗапроса[РезультатЗапроса.Количество()-2].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам));
ДанныеДляОбработки.Вставить("ТаблицаОстатков", РезультатЗапроса[РезультатЗапроса.Количество()-3].Выгрузить());
//ДанныеДляОбработки.Вставить("ТаблицаТоваров" , РезультатЗапроса[РезультатЗапроса.Количество()-2].Выгрузить());
Возврат ДанныеДляОбработки;
КонецФункции
Функция ПустаяТаблицаНоменклатурыДляЗаполненияЗаказаКлиента()
ТаблицаНоменклатуры = Новый ТаблицаЗначений;
ТаблицаНоменклатуры.Колонки.Добавить("Номенклатура");
ТаблицаНоменклатуры.Колонки.Добавить("Характеристика");
ТаблицаНоменклатуры.Колонки.Добавить("Товар");
ТаблицаНоменклатуры.Колонки.Добавить("РазмерWB");
//БИТ Смирнов А.П. 16.12.2022 BSLR-958 (
//ТаблицаНоменклатуры.Колонки.Добавить("Количество");
ТаблицаНоменклатуры.Колонки.Добавить("КоличествоУпаковок");
ТаблицаНоменклатуры.Колонки.Добавить("Упаковка");
//БИТ Смирнов А.П. 16.12.2022 )
ТаблицаНоменклатуры.Колонки.Добавить("Цена");
ТаблицаНоменклатуры.Колонки.Добавить("Сумма");
//БИТ Смирнов А.П. 30.11.2022 BSLR-1014 (
ТаблицаНоменклатуры.Колонки.Добавить("Ссылка");
//БИТ Смирнов А.П. 30.11.2022 )
Возврат ТаблицаНоменклатуры;
КонецФункции
Функция ПараметрыЗаполненияЗаказаКлиента()
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("СкладЗаполнения");
ПараметрыЗаполнения.Вставить("ЗаказыТорговойПлощадки" , Новый Массив);
ПараметрыЗаполнения.Вставить("ТаблицаНоменклатурыЗаполнения", ПустаяТаблицаНоменклатурыДляЗаполненияЗаказаКлиента());
Возврат ПараметрыЗаполнения;
КонецФункции