Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
25 авг 2025, 23:22

1С МЕРЧ (планограмма) добавление поворота изображение

Автор Yanawerg, 21 авг 2025, 12:55

0 Пользователей и 1 гость просматривают эту тему.

Yanawerg

В базе 1С МЕРЧ есть планограмма где на каждый товар можно выставить "ПоложениеТовара" которое должно менять Положение картинки на макете (Крутить его). Но при выборе параметра он разве что сужает картинку но не поворачивает её. С таким столкнулся первый раз поэтому не знаю как правильно будет прописать функцию/процедуру.
Кто сможет мне сказать где именно мне нужно прописывать параметры поворота что бы они работали как необходимо ?

КОД СПРАВОЧНИКА ПЛАНОГРАММЫ:

#Область Обработчики_событий_формы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;

Если Объект.Ссылка.Пустая() Тогда
еСЛИ Параметры.Свойство("ПараметрыВыбора") Тогда
Если Параметры.ПараметрыВыбора.Свойство("Владелец") тОГДА
Объект.Владелец = Параметры.ПараметрыВыбора.Владелец;
КонецЕсли;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Объект.Автор) ТОгда
Объект.Автор = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;

КонецЕсли;

Если Не ЗначениеЗаполнено(Объект.ВариантКонтроляВыкладки) ТОгда
Объект.ВариантКонтроляВыкладки = Перечисления.ВариантКонтроляВыкладки.ПоФактическимРазмерам;
КонецЕсли;
ИзменениеДобавленногоТовараНаПолку = Ложь;

ЗагрузитьПоставщиков();
ЗагрузитьКатегории();

ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(СписокПроверокВыкладки,"Планограмма",Объект.Ссылка,ВидСравненияКомпоновкиДанных.Равно,,Истина);

ЦеныНаДату = ТекущаяДата(); 
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьПоставщиков()

ТаблПоставщики.Загрузить(Объект.Владелец.ПоставщикиНаПолке.Выгрузить());
   
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьПоставщиковПоТоварамНаПолке(НппПолки)

Запрос = Новый Запрос("ВЫБРАТЬ
                      | ПланограммаВыкладкиТоваровТовары.Номенклатура.ОсновнойПоставщик КАК Поставщик
                      |ИЗ
                      | Справочник.ПланограммаВыкладкиТоваров.Товары КАК ПланограммаВыкладкиТоваровТовары
                      |ГДЕ
                      | ПланограммаВыкладкиТоваровТовары.КлючСвязиПолки = &КлючСвязиПолки
                      | И ПланограммаВыкладкиТоваровТовары.Ссылка = &Планограмма
                      | И ПланограммаВыкладкиТоваровТовары.Номенклатура.ОсновнойПоставщик <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)");

Запрос.УстановитьПараметр("Планограмма",Объект.Ссылка);
Запрос.УстановитьПараметр("КлючСвязиПолки",НппПолки);

ТаблПоставщики.Загрузить(Запрос.Выполнить().Выгрузить());
   
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьКатегории()
ТаблКатегорииТоваров.Загрузить(объект.Владелец.ГруппыТоваровНаПолку.Выгрузить());
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПриОткрытииНаСервере();
КонтролироватьПоРазмерам = объект.ВариантКонтроляВыкладки=ПредопределенноеЗначение("Перечисление.ВариантКонтроляВыкладки.ПоФактическимРазмерам");
ВыполнитьКонтрольРазмещенияТоваровНаПолках(КонтролироватьПоРазмерам,КонтролироватьПоРазмерам,КонтролироватьПоРазмерам);

Элементы.ТоварыНаПолке.ТолькоПросмотр = ТолькоПросмотр;
Элементы.ТоварыНаПолке.ИзменятьПорядокСтрок = НЕ ТолькоПросмотр;
Элементы.ТоварыНаПолке.ИзменятьСоставСтрок  = НЕ ТолькоПросмотр;
Элементы.ТоварыНаПолке.КоманднаяПанель.Видимость = НЕ ТолькоПросмотр;

Элементы.ТоварыНаПолкеКомандаСдвинутьВверхТЗ.Доступность = НЕ ТолькоПросмотр;
Элементы.ТоварыНаПолкеКомандаСдвинутьВнизТЗ.Доступность  = НЕ ТолькоПросмотр;
Элементы.ФормаКомандаЗаписатьИЗакрыть.Доступность        = НЕ ТолькоПросмотр;
Элементы.Пересчитать.Доступность   = НЕ ТолькоПросмотр;

КонецПроцедуры

&НаСервере
Процедура ПриОткрытииНаСервере()
ЗагрузитьПолкиОбъекта(Элементы.СписокСтруктураОборудования);
ЗагрузитьПолкиОбъекта(Элементы.СписокСтруктураОборудования1);
СПолкиОбъектаВТаблицуНаФорме(1); // Заполняем Таблицу ТоварыНаПолке товарами первой полки
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ПроверитьОшибкиКонтроляРазмещенияТовараНаПолке(Отказ);
ПередЗаписьюНаСервере(Отказ);
Если Отказ Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Запись не возможна!");
КонецЕсли;
ПересчитатьКоординатыТоваровНаПолках();
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ)
СТаблицыНаФормеВПолкуОбъекта();
ПересчитатьКоординатыТоваровНаПолках();
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьПолкиОбъекта(ЭлементСоСпискомСтруктурыОборудования)
ПолкиТорговогоОборудования.Загрузить(Объект.Владелец.Полки.Выгрузить());
ЭлементСоСпискомСтруктурыОборудования.СписокВыбора.Очистить();
Для Каждого СтрокаПолка из ПолкиТорговогоОборудования Цикл
СтрокаПолка.ИндексКартинки = Истина;
СтрокаПолка.ЭлементТОсНомером = Прав(" "+СокрЛП(ПолкиТорговогоОборудования.Индекс(СтрокаПолка)+1),2)+"."+Строка(СтрокаПолка.ЭлементТО);
//СтрокаПолка.ИмяПолки = "Ряд " + СтрокаПолка.Нпп;   
СтрокаПолка.ИмяПолки =
Прав(" "+СокрЛП(ПолкиТорговогоОборудования.Индекс(СтрокаПолка)+1),2)+"."+Строка(СтрокаПолка.ЭлементТО);
//И Добавляем в список выбора
ДанныеОПолке = Новый Структура("Нпп,СсылкаПолка",СтрокаПолка.Нпп,СтрокаПолка.ЭлементТО);
ЭлементСоСпискомСтруктурыОборудования.СписокВыбора.Добавить(СтрокаПолка.Нпп, СтрокаПолка.ИмяПолки);
//Прав(" "+СокрЛП(ПолкиТорговогоОборудования.Индекс(СтрокаПолка)+1),2)+"."+Строка(СтрокаПолка.ЭлементТО));
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ИсточникВыбора.ИмяФормы = "Обработка.ОБР_ПодборТоваровДляВыкладки.Форма.Форма"
ИЛИ ИсточникВыбора.ИмяФормы = "Обработка.ОБР_ПодборТоваровДляВыкладки.Форма"  Тогда
ОбработатьПодборНоменкалтурыДляРазмещенияНаПолкеНаКлиенте(ВыбранноеЗначение);
ИначеЕсли ИсточникВыбора.ИмяФормы = "Обработка.ОБР_ПодборТоваровДляВыкладки.Форма.ЗапросКоличества" Тогда
ОбработатьИзменениеРазмера(ВыбранноеЗначение);
КонецЕсли;
ТПолка = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные.Нпп;
//ПересчитатьХВТоварыНаПолке();

//СТаблицыНаФормеВПолкуОбъекта();
//ПересчитатьКоординатыТоваровНаПолках();
//СПолкиОбъектаВТаблицуНаФорме(тПолка);
КонецПроцедуры

#КонецОбласти

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Обработчики команд формы

// -------------------- Закладка   "  Выкладка  " -------------------- //
&НаКлиенте
Процедура КомандаПодборТоваров(Команда)

тПолка = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;
Если тПолка = Неопределено Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Выделите полку для подбора товаров!",,"ПолкиТорговогоОборудования");
Иначе
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ПолкаРазмещения", ПолучитьДанныеТекущейПолкиРазмещения(тПолка));
ПараметрыФормы.Вставить("ТорговыйОбъект",  ПолучитьТорговыйОбъектСсылка());
ПараметрыФормы.Вставить("НаДату",    ?(ЗначениеЗаполнено(Объект.ДатаУтверждения),Объект.ДатаУтверждения, ТекущаяДата()));
ПараметрыФормы.Вставить("ВариантКонтроляВыкладки",Объект.ВариантКонтроляВыкладки);
ПараметрыФормы.Вставить("ПодборСУчетомМатрицы", Объект.ПодборСУчетомМатрицы);

ПараметрыФормы.Вставить("ТекущийСписокТоваровНаПолке", УпаковатьТоварыПолкиВМассив(тПолка.Нпп)); //Передаем текущий список товаров на полке для контроля во время подбора


ОткрытьФорму("Обработка.ОБР_ПодборТоваровДляВыкладки.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);
КонецЕсли;

КонецПроцедуры

&НаСервере
Функция УпаковатьТоварыПолкиВМассив(тПолкаНпп)  //Выбирается из Объекта, возможно нужно из ТоварыНаПолке
МассивТоваровНаПолке = Новый Массив;

мТоварыНаПолке = Объект.Товары.НайтиСтроки(Новый Структура("КлючСвязиПолки",тПолкаНпп));
Для Каждого ЭлемТовараНаПолке из мТоварыНаПолке Цикл
ЗначМассива = Новый Структура("Нпп, КлючСвязиПолки, Номенклатура, ГлубинаВыкладки, ВысотаВыкладки, МаксВес, ПоложениеТовара");
ЗначМассива.Нпп =ЭлемТовараНаПолке.Нпп;
ЗначМассива.КлючСвязиПолки =тПолкаНпп;
ЗначМассива.Номенклатура = ЭлемТовараНаПолке.Номенклатура;
ЗначМассива.ГлубинаВыкладки = ЭлемТовараНаПолке.ГлубинаВыкладки;
ЗначМассива.ВысотаВыкладки  = ЭлемТовараНаПолке.ВысотаВыкладки;
ЗначМассива.МаксВес         = 0;
ЗначМассива.ПоложениеТовара = ЭлемТовараНаПолке.ПоложениеТовара;
МассивТоваровНаПолке.Добавить(ЗначМассива);
КонецЦикла;

Возврат МассивТоваровНаПолке;

КонецФункции

Функция ПолучитьТорговыйОбъектСсылка()

Возврат Объект.Владелец.Владелец

КонецФункции

#Область Закладка_Планограмма
// -------------------- Закладка   " Планограмма " -------------------- //
&НаКлиенте
Процедура КомандаСформироватьПланограмму(Команда)
ТабДок = КомандаСформироватьПланограммуНаСервере();

КонецПроцедуры

&НаСервере
Функция КомандаСформироватьПланограммуНаСервере()
//Если Объект.ЭтоНовый() Тогда
// Сообщить("Требуется записать элемент перед выводом на печать.");
//КонецЕсли;
РеквизитПланограмма.Очистить();
ОтборВыбранных = Новый Структура("Выбран",Истина);
МассивКатегорий = ТаблКатегорииТоваров.Выгрузить(ОтборВыбранных,"Категория").ВыгрузитьКолонку("Категория");
МассивПоставщиков = ТаблПоставщики.Выгрузить(ОтборВыбранных,"Поставщик").ВыгрузитьКолонку("Поставщик");
МассивТоваров = ТаблТоварыДляПланограммы.Выгрузить(ОтборВыбранных,"Номенклатура").ВыгрузитьКолонку("Номенклатура");
СтруктураПараметров = Новый Структура("Категории, Поставщики, Товары",МассивКатегорий,МассивПоставщиков,МассивТоваров);

РеквизитПланограмма.Очистить();
ОбрПл = Обработки.ОБР_СформироватьПланограмму.Создать();
ОбрПл.ВыводитьАртикул = ВыводитьАртикул;
ОбрПл.ВыводитьНаименованиеТовара = ВыводитьИмя;
ОбрПл.ВыводитьГлубину = ВыводитьГлубину;
ОбрПл.ВыводитьЦену   = ВыводитьЦену;
ОбрПл.ВыводитьДоходностьЦветом = ВыводитьДоходностьЦветом;
ОбрПл.ВыводитьЗаголовкиСекций = ВыводитьЗаголовкиСекций;
ОбрПл.НаДату = ЦеныНаДату;
ТаблПланограмма = ОбрПл.СформироватьПланограмму(Объект.Ссылка,
    СписокСтруктураОборудования,
?(ЗначениеЗаполнено(МасштабПланограммы),МасштабПланограммы,1),
СтруктураПараметров
  );
РеквизитПланограмма.Вывести(ТаблПланограмма);
РеквизитПланограмма.АвтоМасштаб=Истина;
РеквизитПланограмма.ИмяПараметровПечати="ПФ_ПЛАНОГРАММА_ПЕЧАТЬ_ФОРМА";
Возврат ТаблПланограмма;

// Вставить содержимое обработчика.

КонецФункции

&НаКлиенте
Процедура КомандаОткрытьПланограммуВОтдельномОкне(Команда)
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ТабДок",РеквизитПланограмма);
ОткрытьФорму("Справочник.ПланограммаВыкладкиТоваров.Форма.ФормаПечати",ПараметрыПечати,Объект.Ссылка);

КонецПроцедуры

&Насервере
Функция ПолучитьТаблДокумент()

КонецФункции

#Конецобласти

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Обработчики событий таблиц

// ----- Таблица ПолкиТорговогоОборудования ----- //
&НаКлиенте
Процедура ПолкиТорговогоОборудованияПриАктивизацииСтроки(Элемент)

СТаблицыНаФормеВПолкуОбъекта();

ТекДанные = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;
Если ТекДанные=Неопределено Тогда
Возврат;
КонецЕсли;



Если ТекДанныеПолки <> ТекДанные.ПолучитьИдентификатор() Тогда
ТекДанныеПолки = ТекДанные.ПолучитьИдентификатор();
УстановитьДоступностьПоПравамКатегорий(ТекДанные);

//ПодключитьОбработчикОжидания("УстановитьДоступностьПоПравамКатегорий",0.1,Истина);

ЗагрузитьМестаНаПолке(Объект.Владелец,  ТекДанные.Нпп);
Элементы.МестаНаПолках.Видимость = МестаНаПолках.Количество()>0;
Элементы.МестаНаПолках.ОтборСтрок = Новый ФиксированнаяСтруктура(Новый Структура("КлючНпп",ТекДанные.Нпп));
Если МестаНаПолках.Количество()>0 Тогда
МестаНаПолкахПриАктивизацииСтроки(Элементы.МестаНаПолках);
Иначе
ЗагрузитьТоварыНаПолке(ТекДанные.Нпп);
Элементы.ТоварыНаПолке.ОтборСтрок = Неопределено;

КонецЕсли;
СПолкиОбъектаВТаблицуНаФорме(ТекДанные.Нпп);

КонецЕсли;



КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьПоПравамКатегорий(ТекДанные)
//ТекДанные = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;
Если ТекДанные=Неопределено Тогда
Возврат;
КонецЕсли;
НппРяда = ТекДанные.Нпп;
ЕстьПравоРедактирования = ВМ_ПраваДоступаПоКатегориямСервер.ПолучитьПравоРедактированияВыкладкиРяда(НппРяда, Объект.Владелец);

Элементы.Товары.ИзменятьСоставСтрок = ЕстьПравоРедактирования;
Элементы.ТоварыКомандаПодборТоваров.Доступность = ЕстьПравоРедактирования;
ЕстьПравоРедактированияТовара =  ЕстьПравоРедактирования;

//ОтключитьОбработчикОжидания("УстановитьДоступностьПоПравамКатегорий");
КонецПроцедуры



&НаКлиенте
Процедура ЗагрузитьТоварыНаПолке(НомерПолки)
// ТоварыВыкладки.Очистить();
// ОтборСтрок = Новый Структура("КлючСвязиПолки",ТекПолка.Нпп);
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("КлючСвязиПолки", НомерПолки);
//НайденыСтроки = Объект.Товары.НайтиСтроки(ОтборСтрок);
//Для Каждого СтрокаТовара из НайденыСтроки Цикл
//     НовСтрокаВыкладки = ТоварыВыкладки.Добавить();
// ЗаполнитьЗначенияСвойств(НовСтрокаВыкладки,СтрокаТовара);
//
//КонецЦикла;

КонецПроцедуры

// ----- Таблица Товары ----- //
&НаКлиенте
Процедура ТоварыВыкладкиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

тПолка = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;

Если тПолка = Неопределено Тогда

Отказ = Истина;
Сообщ = Новый СообщениеПользователю;
Сообщ.Текст = "Для добавления товаров выберите полку/ряд !";
Сообщ.Сообщить();
Возврат;

ИначеЕсли Копирование Тогда

// алгоритм проверки с учетом копирование 1-ой строки
тТовар = Элементы.Товары.ТекущиеДанные;
Если НЕ ВыполнитьКонтрольРазмещенияТовараНаПолкеПоВысоте(тПолка, тТовар, тТовар.Номенклатура) Тогда
Отказ = Истина;
КонецЕсли;

КонецЕсли;   

КонецПроцедуры

&НаКлиенте
Процедура ТоварыВыкладкиПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
Если НоваяСтрока Тогда
ТекПолка   = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;
Нпп   = Объект.Товары.Количество();
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ТекущиеДанные.НПП = ПолучитьНовыйНппТовараВыкладкиНаПолке(ТекПолка.Нпп);
ТекущиеДанные.КлючСвязиПолки = ТекПолка.Нпп;
Если Элементы.МестаНаПолках.ТекущиеДанные<>Неопределено И Элементы.МестаНаПолках.Видимость ТОгда
ТекущиеДанные.ИдентификаторМеста = Элементы.МестаНаПолках.ТекущиеДанные.ИдентификаторМеста;
КонецЕсли;

КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТоварыВыкладкиНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
тСтрокаТовары = Элементы.Товары.ТекущиеДанные;
Если тСтрокаТовары<>Неопределено Тогда
тСтрокаТовары.ВысотаВыкладки  = 1;
тСтрокаТовары.ГлубинаВыкладки = 1;
КонецЕсли;

//тПолка = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;
//Если ВыполнитьКонтрольРазмещенияТовараНаПолкеПоВысоте(тПолка, тСтрокаТовары, ВыбранноеЗначение) Тогда
// СтандартнаяОбработка = Ложь;
//
//КонецЕсли;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
КонтролироватьПоРазмерам = объект.ВариантКонтроляВыкладки=ПредопределенноеЗначение("Перечисление.ВариантКонтроляВыкладки.ПоФактическимРазмерам");
ВыполнитьКонтрольРазмещенияТоваровНаПолках(КонтролироватьПоРазмерам, КонтролироватьПоРазмерам, КонтролироватьПоРазмерам);
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПослеУдаления(Элемент)
КонтролироватьПоРазмерам = объект.ВариантКонтроляВыкладки=ПредопределенноеЗначение("Перечисление.ВариантКонтроляВыкладки.ПоФактическимРазмерам");
ВыполнитьКонтрольРазмещенияТоваровНаПолках(КонтролироватьПоРазмерам, КонтролироватьПоРазмерам, КонтролироватьПоРазмерам);
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

&НаКлиенте
Процедура ПроверитьОшибкиКонтроляРазмещенияТовараНаПолке(Отказ);
Если Не Отказ Тогда
Отказ = ?(ЗначениеЗаполнено(Элементы.Декорация_ЛимитТовараНаПолкеПоВысоте.Заголовок),  Истина, Ложь);
КонецЕсли;
Если Не Отказ Тогда
Отказ = ?(ЗначениеЗаполнено(Элементы.Декорация_ЛимитТовараНаПолкеПоГлубине.Заголовок), Истина, Ложь);
КонецЕсли;
Если Не Отказ Тогда
Отказ = ?(ЗначениеЗаполнено(Элементы.Декорация_ЛимитТовараНаПолкеПоДлине.Заголовок),   Истина, Ложь);
КонецЕсли;
Если Отказ Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Есть превышение лимитов размеров полки товарами!");
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьПодборНоменкалтурыДляРазмещенияНаПолкеНаКлиенте(ДанныеПодбора)

Если ДанныеПодбора = Неопределено
ИЛИ НЕ ЗначениеЗаполнено(ДанныеПодбора)
ИЛИ НЕ ДанныеПодбора.Свойство("ПолкаВыкладки")
ИЛИ НЕ ДанныеПодбора.Свойство("АдресТоваровВХранилище") Тогда

Возврат;

КонецЕсли;

ОбработатьПодборНоменкалтурыДляРазмещенияНаПолкеНаСервере(ДанныеПодбора);

КонтролироватьПоРазмерам = объект.ВариантКонтроляВыкладки=ПредопределенноеЗначение("Перечисление.ВариантКонтроляВыкладки.ПоФактическимРазмерам");

ВыполнитьКонтрольРазмещенияТоваровНаПолках(КонтролироватьПоРазмерам, КонтролироватьПоРазмерам, КонтролироватьПоРазмерам);

КонецПроцедуры

&НаКлиенте
Процедура ОбработатьИзменениеРазмера(ДанныеПодбора)
Сообщить("Изменение размера товара на полке");
КонецПроцедуры

&НаСервере
Процедура ОбработатьПодборНоменкалтурыДляРазмещенияНаПолкеНаСервере(ДанныеПодбора)

тПолка    = ДанныеПодбора.ПолкаВыкладки;
ТаблицаТоваров = ПолучитьИзВременногоХранилища(ДанныеПодбора.АдресТоваровВХранилище);

Для Каждого тСтрока ИЗ ТаблицаТоваров Цикл

//Если тСтрока.Высота > тПолка.Высота Тогда // тСтрока.Номенклатура.ВысотаУпаковки > тПолка.Высота Тогда
// Текст1 = тСтрока.Номенклатура.Наименование;
// Текст2 = тПолка.ИмяПолки;
// Текст3 = тСтрока.Высота - тПолка.Высота;
// ТекстИзвещения = НСтр("ru = 'Товар "" %1 "" на полку "" %2 "" не добавлен, так как не помещается по высоте ( не хватает %3 см. )'");
// ТекстИзвещения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИзвещения, Текст1, Текст2, Текст3);
// ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстИзвещения,,"Товары");
// Продолжить;
//КонецЕсли;

ДанныеВыкладкиТовара = Новый Структура;
ДанныеВыкладкиТовара.Вставить("Номенклатура",    тСтрока.Номенклатура);
ДанныеВыкладкиТовара.Вставить("Характеристика",  тСтрока.Характеристика);

ДанныеВыкладкиТовара.Вставить("ГлубинаВыкладки", тСтрока.ВыкладкаГлубина);
ДанныеВыкладкиТовара.Вставить("ВыкладкаВысота", тСтрока.ВыкладкаВысота);

ДанныеВыкладкиТовара.Вставить("ПоложениеТовара", тСтрока.ПоложениеТовара);
ДанныеВыкладкиТовара.Вставить("Длина",   тСтрока.Длина);
ДанныеВыкладкиТовара.Вставить("Высота",  тСтрока.Высота);
ДанныеВыкладкиТовара.Вставить("Глубина", тСтрока.Глубина);

Для Счетчик = 1 По тСтрока.ВыкладкаФейсинг Цикл
ДобавитьТоварНаПолку(тПолка, ДанныеВыкладкиТовара);
КонецЦикла;

КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ПолучитьАдресКартинкиДляОтображенияВСпискеТоваров(Номенклатура,ИдентификаторФормы)
Если ЗначениеЗаполнено(Номенклатура.ФайлКартинки) Тогда
АдресКартинки = ВМ_ПрисоединенныеФайлы.НавигационнаяСсылкаКартинки(
Номенклатура.ФайлКартинки,
ИдентификаторФормы);
ИначеЕсли ЗначениеЗаполнено(Номенклатура.ВидНоменклатуры.ФайлКартинки) Тогда
АдресКартинки = ВМ_ПрисоединенныеФайлы.НавигационнаяСсылкаКартинки(
Номенклатура.ВидНоменклатуры.ФайлКартинки,
ИдентификаторФормы);
Иначе
АдресКартинки ="";
КонецЕсли;
Возврат АдресКартинки;
КонецФункции

&НаСервере
Процедура ДобавитьТоварНаПолку(ПолкаРазмещения, ДанныеВыкладкиТовара)
//новСтрока = Объект.Товары.Добавить();
новСтрока = ТоварыНаПолке.Добавить();

новСтрока.Нпп   = ПолучитьНовыйНппТовараВыкладкиВТоварыНаПолке(ПолкаРазмещения.Нпп);
новСтрока.Номенклатура   = ДанныеВыкладкиТовара.Номенклатура;

новСтрока.АдресКартинки   = ПолучитьАдресКартинкиДляОтображенияВСпискеТоваров(
ДанныеВыкладкиТовара.Номенклатура,
УникальныйИдентификатор);
//ВМ_ПрисоединенныеФайлы.НавигационнаяСсылкаКартинки(ДанныеВыкладкиТовара.Номенклатура.ФайлКартинки,
//УникальныйИдентификатор);

Если ЗначениеЗаполнено(ДанныеВыкладкиТовара.Характеристика) Тогда
новСтрока.Характеристика = ДанныеВыкладкиТовара.Характеристика;
КонецЕсли;
новСтрока.ГлубинаВыкладки = ДанныеВыкладкиТовара.ГлубинаВыкладки;
новСтрока.ВысотаВыкладки = ДанныеВыкладкиТовара.ВыкладкаВысота;
новСтрока.ПоложениеТовара = ДанныеВыкладкиТовара.ПоложениеТовара;

новСтрока.ФактДлина   = ДанныеВыкладкиТовара.Длина;
новСтрока.ФактВысота  = ДанныеВыкладкиТовара.Высота;
новСтрока.ФактГлубина = ДанныеВыкладкиТовара.Глубина;

новСтрока.КлючСвязиПолки  = ПолкаРазмещения.Нпп;
Если Элементы.ТоварыНаПолке.ОтборСтрок <> Неопределено Тогда
новСтрока.ИдентификаторМеста = Элементы.ТоварыНаПолке.ОтборСтрок.ИдентификаторМеста;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьКонтрольРазмещенияТоваровНаПолках(ПроверкаНаВысоту = Ложь, ПроверкаНаГлубину = Ложь, ПроверкаНаДлину = Ложь)

Если ПолкиТорговогоОборудования.Количество() = 0 Тогда
Возврат;
КонецЕсли;
РезультатПроверки = ВМ_ПланограммаКлиент.ВыполнитьКонтрольРазмещенияТоваровНаПолках(ПолкиТорговогоОборудования, Объект.Товары, ПроверкаНаВысоту, ПроверкаНаГлубину, ПроверкаНаДлину, Объект.ВариантКонтроляВыкладки);

Если РезультатПроверки.Количество() > 0 Тогда
ВМ_ПланограммаКонтрольВыкладкиКлиент.ОбработатьРезультатПроверкиРазмещенияТоваровНаПолках(РезультатПроверки, ПроверкаНаВысоту, ПроверкаНаГлубину, ПроверкаНаДлину);
//ИначеЕсли ПроверкаНаВысоту ИЛИ ПроверкаНаГлубину ИЛИ ПроверкаНаДлину Тогда
// УбратьВидимостьИнформацииПоПроверкеРазмещенияТоваров(ПроверкаНаВысоту, ПроверкаНаГлубину, ПроверкаНаДлину);
КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОбработатьРезультатПроверкиРазмещенияТоваровНаПолках(РезультатПроверки, ПроверкаНаВысоту = Ложь, ПроверкаНаГлубину = Ложь, ПроверкаНаДлину = Ложь)

Если ТипЗнч(РезультатПроверки) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;

Если ПроверкаНаВысоту Тогда
Если РезультатПроверки.Свойство("НаВысоту") Тогда
ИнфоПоВысоте = "";
Для Каждого тТовар ИЗ РезультатПроверки.НаВысоту Цикл
ТекстДобавления = "";
//Текст1 = тТовар.Полка.ЭлементТО; // ИмяПолки;
Текст1 = тТовар.Полка.ИмяПолки;
Текст2 = Строка(тТовар.Товар);
Текст3 = тТовар.НаСколькоПревышено;
ТекстДобавления = НСтр("ru = 'На полке "" %1 "" товар "" %2 "" не помещается по высоте ( не хватает %3 см. )'");
ТекстДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстДобавления, Текст1, Текст2, Текст3);
ИнфоПоВысоте = ?(ЗначениеЗаполнено(ИнфоПоВысоте), ИнфоПоВысоте + Символы.ПС, ИнфоПоВысоте);
ИнфоПоВысоте = ИнфоПоВысоте + ТекстДобавления;
КонецЦикла;
Элементы.Декорация_ЛимитТовараНаПолкеПоВысоте.Заголовок = ИнфоПоВысоте;
Элементы.Декорация_ЛимитТовараНаПолкеПоВысоте.Видимость = Истина;
Иначе
Элементы.Декорация_ЛимитТовараНаПолкеПоВысоте.Заголовок = "";
Элементы.Декорация_ЛимитТовараНаПолкеПоВысоте.Видимость = Ложь;
КонецЕсли;
КонецЕсли;

Если  ПроверкаНаГлубину Тогда
Если РезультатПроверки.Свойство("НаГлубину") Тогда
ИнфоПоВысоте = "";
Для Каждого тТовар ИЗ РезультатПроверки.НаГлубину Цикл
ТекстДобавления = "";
//Текст1 = тТовар.Полка.ЭлементТО;//ИмяПолки;
Текст1 = тТовар.Полка.ИмяПолки;
Текст2 = Строка(тТовар.Товар);
Текст3 = тТовар.НаСколькоПревышено;
ТекстДобавления = НСтр("ru = 'На полке "" %1 "" товар "" %2 "" не помещается по глубине ( не хватает %3 см. )'");
ТекстДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстДобавления, Текст1, Текст2, Текст3);
ИнфоПоВысоте = ?(ЗначениеЗаполнено(ИнфоПоВысоте), ИнфоПоВысоте + Символы.ПС, ИнфоПоВысоте);
ИнфоПоВысоте = ИнфоПоВысоте + ТекстДобавления;
КонецЦикла;
Элементы.Декорация_ЛимитТовараНаПолкеПоГлубине.Заголовок = ИнфоПоВысоте;
Элементы.Декорация_ЛимитТовараНаПолкеПоГлубине.Видимость = Истина;
Иначе
Элементы.Декорация_ЛимитТовараНаПолкеПоГлубине.Заголовок = "";
Элементы.Декорация_ЛимитТовараНаПолкеПоГлубине.Видимость = Ложь;
КонецЕсли;
КонецЕсли;

Если ПроверкаНаДлину Тогда
Если РезультатПроверки.Свойство("НаДлину") Тогда
ИнфоПоВысоте = "";
Для Каждого тПолка ИЗ РезультатПроверки.НаДлину Цикл
ТекстДобавления = "";
//Текст1 = тПолка.Полка.ЭлементТО;// ИмяПолки;
Текст1 = тПолка.Полка.ИмяПолки;
Текст2 = тПолка.СуммаДлинТоваров;
Текст3 = тПолка.НаСколькоПревышено;
ТекстДобавления = НСтр("ru = 'На полке "" %1 "" выбранные товары не помещаются по длине. Общая сумма длины товаров - %2, превышено на %3 !'");
ТекстДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстДобавления, Текст1, Текст2, Текст3);
ИнфоПоВысоте = ?(ЗначениеЗаполнено(ИнфоПоВысоте), ИнфоПоВысоте + Символы.ПС, ИнфоПоВысоте);
ИнфоПоВысоте = ИнфоПоВысоте + ТекстДобавления;
КонецЦикла;
Элементы.Декорация_ЛимитТовараНаПолкеПоДлине.Заголовок = ИнфоПоВысоте;
Элементы.Декорация_ЛимитТовараНаПолкеПоДлине.Видимость = Истина;
Иначе
Элементы.Декорация_ЛимитТовараНаПолкеПоДлине.Заголовок = "";
Элементы.Декорация_ЛимитТовараНаПолкеПоДлине.Видимость = Ложь;
КонецЕсли;
КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УбратьВидимостьИнформацииПоПроверкеРазмещенияТоваров(ПроверкаНаВысоту, ПроверкаНаГлубину, ПроверкаНаДлину)

Если ПроверкаНаВысоту Тогда
Элементы.Декорация_ЛимитТовараНаПолкеПоВысоте.Заголовок = "";
Элементы.Декорация_ЛимитТовараНаПолкеПоВысоте.Видимость = Ложь;
КонецЕсли;

Если ПроверкаНаГлубину Тогда
Элементы.Декорация_ЛимитТовараНаПолкеПоГлубине.Заголовок = "";
Элементы.Декорация_ЛимитТовараНаПолкеПоГлубине.Видимость = Ложь;
КонецЕсли;

Если ПроверкаНаДлину Тогда
Элементы.Декорация_ЛимитТовараНаПолкеПоДлине.Заголовок = "";
Элементы.Декорация_ЛимитТовараНаПолкеПоДлине.Видимость = Ложь;
КонецЕсли;

КонецПроцедуры

&НаКлиенте
Функция ПолучитьДанныеТекущейПолкиРазмещения(ПолкаРазмещения)
СтруктураПолки = Новый Структура;
СтруктураПолки.Вставить("Нпп", ПолкаРазмещения.Нпп);
СтруктураПолки.Вставить("ИмяПолки", ПолкаРазмещения.ИмяПолки);
СтруктураПолки.Вставить("Высота", ПолкаРазмещения.Высота);
СтруктураПолки.Вставить("Глубина", ПолкаРазмещения.Глубина);
СтруктураПолки.Вставить("Длина", ПолкаРазмещения.Длина);
СтруктураПолки.Вставить("МаксВес", ПолкаРазмещения.МаксВес);
СтруктураПолки.Вставить("ЭлементТО", ПолкаРазмещения.ЭлементТО);
СтруктураПолки.Вставить("ТорговоеОборудование", Объект.Владелец);


Возврат СтруктураПолки;
КонецФункции

&НаКлиенте
Функция ВыполнитьКонтрольРазмещенияТовараНаПолкеПоВысоте(тПолка, тСтрокаВыкладки, тТовар)

//Элементы.Товары.РежимВводаСтрок = РежимВводаСтрокТаблицы.ПослеТекущейСтроки; //Этот метод не работает
//ТекПолка  = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;
//ТекТовар = Элементы.Товары.ТекущиеДанные;
//ИдСтроки  = Элементы.Товары.ТекущаяСтрока;

//Сделаем контроль поместится ли после копирования
Если Не КонтрольДоКопированияТовара(тПолка,тСтрокаВыкладки) Тогда
Возврат Ложь;
КонецЕсли;

Возврат Истина;

//ЛимитПревышен = Ложь;
//
//Если тТовар = Неопределено Тогда
// Возврат ЛимитПревышен;
//КонецЕсли;
//
//ВысотаТовара = ПолучитьЗначениеРеквизитаОбъекта(тТовар, "ВысотаУпаковки");
//
//Если тПолка.Высота < ВысотаТовара Тогда
//
// МожноСжиматьПоРазмерам = ПолучитьЗначениеРеквизитаОбъекта(тТовар, "МожноСжиматьПоРазмерам");
// Если МожноСжиматьПоРазмерам Тогда
//
// ВысотаТовара = ПолучитьЗначениеРеквизитаОбъекта(тТовар, "Высота");
// Если тПолка.Высота >= ВысотаТовара Тогда
// //Ставим факт.размер товара на полке
// тСтрокаВыкладки.ФактВысота = ВысотаТовара;
// Возврат ЛимитПревышен;
// КонецЕсли;
//
// КонецЕсли;
//
// Текст1 = тПолка.ЭлементТО; // ИмяПолки;
// Текст2 = Строка(тТовар);
// Текст3 = ВысотаТовара - тПолка.Высота;
//
// ТекстПредупреждения = НСтр("ru = 'На полке "" %1 "" товар "" %2 "" не помещается по высоте ( не хватает %3 см. ). Выберите другой товар!'");
// ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПредупреждения, Текст1, Текст2, Текст3);
//
// Предупреждение(ТекстПредупреждения);
//
// //тТовар   = ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка");
// ЛимитПревышен = Истина;
//
//КонецЕсли;
//
//Возврат ЛимитПревышен;

КонецФункции

//&НаКлиенте
&НаСервере
Функция ПолучитьНовыйНппТовараВыкладкиНаПолке(НппПолки)
ОтборСтрок   = Новый Структура("КлючСвязиПолки", НппПолки);
мТоварыНаПолке = Объект.Товары.НайтиСтроки(ОтборСтрок);
НовыйНпп   = 0;
Для Каждого СтрокаВыкладки Из мТоварыНаПолке Цикл
Если СтрокаВыкладки.Нпп > НовыйНпп Тогда
НовыйНпп = СтрокаВыкладки.Нпп;
КонецЕсли;
КонецЦикла;
Возврат НовыйНпп + 1;
КонецФункции

&НаСервере
Функция ПолучитьНовыйНппТовараВыкладкиВТоварыНаПолке(НппПолки)
ОтборСтрок   = Новый Структура("КлючСвязиПолки", НппПолки);
мТоварыНаПолке = ТоварыНаПолке.НайтиСтроки(ОтборСтрок);
НовыйНпп   = 0;
Для Каждого СтрокаВыкладки Из мТоварыНаПолке Цикл
Если СтрокаВыкладки.Нпп > НовыйНпп Тогда
НовыйНпп = СтрокаВыкладки.Нпп;
КонецЕсли;
КонецЦикла;
Возврат НовыйНпп + 1;
КонецФункции

&НаСервере
Функция ПолучитьЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита)
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита);
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

&НаСервере
Процедура ЗагрузитьВыкладкуНаПолке(СсылкаПолка)
ОтборТоваров = Новый Структура("КлючСвязиПолки",СсылкаПолка.Нпп);
СтрокиВыкладки = Объект.Товары.НайтиСтроки(ОтборТоваров);
КонецПроцедуры

&НаКлиенте
Процедура Печать(Команда)
ПечатьНаСервере(СписокСтруктураОборудования1);
КонецПроцедуры

&НаСервере
Процедура ПечатьНаСервере(СписокСтруктурЫОборудования)
//РеквизитПланограмма.Очистить();
ТаблДокумент.Очистить();
ФрмОб  = РеквизитФормыВЗначение("Объект");
ТабДок = ФрмОб.ПечатьСтруктурыНаСервере(СписокСтруктурЫОборудования, ЦеныНаДату);
//РеквизитПланограмма.Вывести(ТабДок);
ТаблДокумент.Вывести(ТабДок);
КонецПроцедуры
   

&НаКлиенте
Процедура КомандаОткрытьHTML(Команда)
П = Новый  Структура("ПланограммаВыкладки",Объект.Ссылка);
ОткрытьФорму("Обработка.ОБР_СформироватьПланограмму.Форма.Форма_html",П);

КонецПроцедуры

&НаСервере
Процедура УпорядичитьТоварыНаполкеНаСервере()

КонецПроцедуры

&НаКлиенте
Процедура УпорядичитьТоварыНаполке(Команда)
УпорядичитьТоварыНаполкеНаСервере();
КонецПроцедуры

&НаСервере
Процедура СписокСтруктураОборудованияПриИзмененииНаСервере(КлючПолки)
ОТборСтрок = Новый Структура("КлючСвязиПолки",КлючПолки);
МассивСтрок =  Объект.товары.НайтиСтроки(ОТборСтрок);
ТаблТоварыДляПланограммы.Загрузить(Объект.Товары.Выгрузить(МассивСтрок));

КонецПроцедуры

&НаКлиенте
Процедура СписокСтруктураОборудованияПриИзменении(Элемент)
Элементы.ГруппаТоварыРяда.Видимость = ЗначениеЗаполнено(СписокСтруктураОборудования);
ЗагрузитьМестаНаПолке(Объект.Владелец,  СписокСтруктураОборудования);
Элементы.МестаНаПолкахПланограмма.Видимость = МестаНаПолках.Количество()>0;
ЗагрузитьПоставщиковПоТоварамНаПолке(СписокСтруктураОборудования);
СписокСтруктураОборудованияПриИзмененииНаСервере(СписокСтруктураОборудования);
КонецПроцедуры

&НаКлиенте
Процедура ГруппаОсновноеПриСменеСтраницы(Элемент, ТекущаяСтраница)
МасштабПланограммы = 0;
КонецПроцедуры

&НаКлиенте
Процедура МестаНаПолкахПриАктивизацииСтроки(Элемент)
ТекДанные = Элементы.МестаНаПолках.ТекущиеДанные;
Если ТекДанные=Неопределено Тогда
Возврат;
КонецЕсли;

//Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(Новый Структура("КлючСвязиПолки,ИдентификаторМеста",ТекДанные.КлючНпп,ТекДанные.ИдентификаторМеста));

//Пока так, надо будет разобраться с привязкой к месту
Если ТекДанныеМестаНаПолке  <> ТекДанные.ПолучитьИдентификатор() Тогда
ТекДанныеМестаНаПолке = ТекДанные.ПолучитьИдентификатор();
УстановитьДоступностьРаботыССекциейНаПолкеИТоварами(ТекДанные);

Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(Новый Структура("КлючСвязиПолки,ИдентификаторМеста",ТекДанные.КлючНпп,ТекДанные.ИдентификаторМеста));

//++
Элементы.ТоварыНаПолке.ОтборСтрок =  Новый ФиксированнаяСтруктура(Новый Структура("КлючСвязиПолки,ИдентификаторМеста",ТекДанные.КлючНпп,ТекДанные.ИдентификаторМеста));
//--
КонецЕсли;


//ПодключитьОбработчикОжидания("УстановитьДоступностьРаботыССекциейНаПолкеИТоварами",0.1,Истина);

КонецПроцедуры

&НаСервере
Процедура ЗагрузитьМестаНаПолке(ТоргОборудование,  КлючПолки)
Запрос = Новый Запрос("ВЫБРАТЬ
                      | ТорговоеОборудованиеПредпритияСекцииНаПолках.ИдентификаторМеста КАК ИдентификаторМеста,
                      | ТорговоеОборудованиеПредпритияСекцииНаПолках.КлючНпп КАК КлючНпп,
                      | ТорговоеОборудованиеПредпритияСекцииНаПолках.Начало КАК Начало,
                      | ТорговоеОборудованиеПредпритияСекцииНаПолках.Окончание КАК Окончание,
                      | ТорговоеОборудованиеПредпритияСекцииНаПолках.Окончание - ТорговоеОборудованиеПредпритияСекцииНаПолках.Начало КАК Длина,
                      | ТорговоеОборудованиеПредпритияСекцииНаПолках.Поставщик КАК Поставщик,
                      | ТорговоеОборудованиеПредпритияСекцииНаПолках.КатегорияТовара КАК Категория
                      |ИЗ
                      | Справочник.ТорговоеОборудованиеПредприятия.СекцииНаПолках КАК ТорговоеОборудованиеПредпритияСекцииНаПолках
                      |ГДЕ
                      | ТорговоеОборудованиеПредпритияСекцииНаПолках.КлючНпп = &КлючНпп
                      | И ТорговоеОборудованиеПредпритияСекцииНаПолках.Ссылка = &ТорговоеОборудование");
Запрос.УстановитьПараметр("КлючНпп",КлючПолки);
Запрос.УстановитьПараметр("ТорговоеОборудование",ТоргОборудование);
МестаНаПолках.Загрузить(Запрос.Выполнить().Выгрузить());


КонецПроцедуры

&НаКлиенте
Процедура СкопироватьСтрокуПослеТекущей(Команда)
Элементы.Товары.РежимВводаСтрок = РежимВводаСтрокТаблицы.ПослеТекущейСтроки; //Этот метод не работает
ТекПолка  = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;
//ТекТовар = Элементы.Товары.ТекущиеДанные;
ТекТовар = Элементы.ТоварыНаПолке.ТекущиеДанные;
ИдСтроки  = Элементы.ТоварыНаПолке.ТекущаяСтрока;

//Сделаем контроль поместится ли после копирования
Если Не КонтрольДоКопированияТовара(ТекПолка,ТекТовар) Тогда
Возврат;
КонецЕсли;
//

СкопироватьСтрокуПослеТекущейНаСервере(ИдСтроки,ТекПолка.Нпп);
// СПолкиОбъектаВТаблицуНаФорме(ТекПолка.Нпп);
ЭтаФорма.Элементы.ТоварыНаПолке.Обновить();
//ЭтаФорма.Элементы.Товары.Обновить();
КонецПроцедуры

&Наклиенте
Функция КонтрольДоКопированияТовара(ТекПолка,ТекТовар)
МассивПолок = Новый Массив;
ДанныеПолки = Новый Структура("Нпп, Высота, Длина, Глубина, ЭлементТО, ИмяПолки");
ЗаполнитьЗначенияСвойств(ДанныеПолки, ТекПолка);
МассивПолок.Добавить(ДанныеПолки);

МассивТоваровВыкладки = новый Массив;

МассивТоваровНаПолке = Объект.Товары.НайтиСтроки(Новый Структура("КлючСвязиПолки",ДанныеПолки.Нпп));
Для Каждого ЭлемПолки из МассивТоваровНаПолке Цикл
ЗначМассива = Новый Структура("Нпп, КлючСвязиПолки, Номенклатура, ГлубинаВыкладки, ВысотаВыкладки, ПоложениеТовара");
ЗаполнитьЗначенияСвойств(ЗначМассива,ЭлемПолки);
МассивТоваровВыкладки.Добавить(ЗначМассива);
КонецЦикла;


ЗначМассива = Новый Структура("Нпп, КлючСвязиПолки, Номенклатура, ГлубинаВыкладки, ВысотаВыкладки, ПоложениеТовара");

ЗаполнитьЗначенияСвойств(ЗначМассива,ТекТовар);

ЗначМассива.Нпп =МассивТоваровВыкладки.Количество()+1;

МассивТоваровВыкладки.Добавить(ЗначМассива);


ВариантКонтроля   = Объект.ВариантКонтроляВыкладки;

ПроверкаНаВысоту  = ВариантКонтроля = ПредопределенноеЗначение("Перечисление.ВариантКонтроляВыкладки.ПоФактическимРазмерам");
ПроверкаНаГлубину = ПроверкаНаВысоту;
ПроверкаНаДлину   = ПроверкаНаВысоту;



РезультатПроверки = ВМ_ПланограммаВызовСервера.НачатьПроверкуКонтроляРазмещенияТоваровНаПолках(МассивПолок, МассивТоваровВыкладки, ПроверкаНаВысоту, ПроверкаНаГлубину, ПроверкаНаДлину, ВариантКонтроля);


Если РезультатПроверки.Количество() > 0 Тогда
Если РезультатПроверки.Свойство("НаДлину") Тогда
Для Каждого ПоДлине Из РезультатПроверки.НаДлину Цикл
Если ПоДлине.НаСколькоПревышено > 0 Тогда
ВМ_ПланограммаКонтрольВыкладкиКлиент.ОбработатьРезультатПроверкиРазмещенияТоваровНаПолках(РезультатПроверки, ПроверкаНаВысоту, ПроверкаНаГлубину, ПроверкаНаДлину);
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Иначе
ВМ_ПланограммаКонтрольВыкладкиКлиент.ОбработатьРезультатПроверкиРазмещенияТоваровНаПолках(РезультатПроверки, ПроверкаНаВысоту, ПроверкаНаГлубину, ПроверкаНаДлину);
Возврат Ложь;
КонецЕсли;
КонецЕсли;

Возврат Истина;

КонецФункции

&НаСервере
Процедура СкопироватьСтрокуПослеТекущейНаСервере(мИдСтроки,НомерПолки)

//НовыйНпп = ПолучитьНовыйНппТовараВыкладкиВТоварыНаПолке(НомерПолки);
ПредСтрока  = ТоварыНаПолке.НайтиПоИдентификатору(мИдСтроки);

НоваяСтрока = ТоварыНаПолке.Вставить(ТоварыНаПолке.Индекс(ПредСтрока)+1);
СдвинутьНППРядаОт(ПредСтрока.Нпп);
НоваяСтрока.Нпп = ПредСтрока.Нпп + 1;
//НоваяСтрока.НомерСтроки = мНомерСтроки;
НоваяСтрока.КлючСвязиПолки = ПредСтрока.КлючСвязиПолки;
НоваяСтрока.Номенклатура = ПредСтрока.Номенклатура;
НоваяСтрока.ГлубинаВыкладки = ПредСтрока.ГлубинаВыкладки;
НоваяСтрока.ВысотаВыкладки = ПредСтрока.ВысотаВыкладки;
НоваяСтрока.Характеристика = ПредСтрока.Характеристика;
НоваяСтрока.ПоложениеТовара = ПредСтрока.ПоложениеТовара;

НоваяСтрока.АдресКартинки = ПолучитьАдресКартинкиДляОтображенияВСпискеТоваров(
НоваяСтрока.Номенклатура,УникальныйИдентификатор);

Сдвиг = ВМ_ПланограммаВызовСервера.ДлинаТовараПоПоложению(НоваяСтрока.Номенклатура,НоваяСтрока.ПоложениеТовара);
НоваяСтрока.КоординатаX = ПредСтрока.КоординатаX + Сдвиг;
//Для мИндекс = ТоварыНаПолке.Индекс(ПредСтрока)+2 По ТоварыНаПолке.Количество() - 1 Цикл
// Если ТоварыНаПолке[мИндекс].КоординатаX <> 0 Тогда
// ТоварыНаПолке[мИндекс].КоординатаX = ТоварыНаПолке[мИндекс].КоординатаX + Сдвиг;
// КонецЕсли;
//КонецЦикла;
СдвинутьНачинаяСЭлемента(ТоварыНаПолке.Индекс(ПредСтрока)+2,Сдвиг);

КонецПроцедуры

&НаСервере
Процедура СдвинутьНППРядаОт(Нпп1)
Для Каждого мТовар Из ТоварыНаПолке Цикл
Если мТовар.Нпп > Нпп1 Тогда
мТовар.Нпп = мТовар.Нпп + 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры


&НаСервере
Процедура ВывестиТоварыНаСервере(НомерПолки)
ТаблДокумент.Очистить();
ФрмОб  = РеквизитФормыВЗначение("Объект");
ТабДок = ФрмОб.ЗаполнитьМакетТоваровНаОборудовании(НомерПолки);
ТаблДокумент.Вывести(ТабДок);
КонецПроцедуры

&НаКлиенте
Процедура ВывестиТовары(Команда)
ВывестиТоварыНаСервере(СписокСтруктураОборудования1);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьРазмерТовараНаПолке(Команда)
Парам = Новый Структура;
Парам.Вставить("НоменклатураПодбора",Элементы.ТоварыНаПолке.ТекущиеДанные.Номенклатура);
Парам.Вставить("НаПолку",Элементы.ТоварыНаПолке.ТекущиеДанные.КлючСвязиПолки);
//ОткрытьФорму("Обработка.ОБР_ПодборТоваровДляВыкладки.Форма.ЗапросКоличества",Парам, Элементы.Товары);
ОткрытьФорму("Обработка.ОБР_ПодборТоваровДляВыкладки.Форма.ЗапросКоличества",Парам,  ЭтаФорма,
УникальныйИдентификатор, , , ,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
 

//ТекущаяПолка = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;
//Если НЕ НоменклатураИмеетДействующиеХарактеристики(Парам.НоменклатураПодбора) ИЛИ
// ДляЭлементаТООпределяетсяФейсинг(ТекущаяПолка.ЭлементТО) Тогда
// //Номенклатура без характеристик или Полка
// ОткрытьФорму("Обработка.ОБР_ПодборТоваровДляВыкладки.Форма.ЗапросКоличества", Парам, ЭтаФорма,
// УникальныйИдентификатор, , , ,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
//Иначе
// ОткрытьФорму("Обработка.ОБР_ПодборТоваровДляВыкладки.Форма.ЗапросКоличестваСХарактеристиками", Парам, ЭтаФорма,
// УникальныйИдентификатор, , , ,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
//КонецЕсли;


КонецПроцедуры

&НаСервере
Процедура СдвинутьВнизНаСервере()
// Вставить содержимое обработчика.
КонецПроцедуры

&НаКлиенте
Процедура СдвинутьВниз(Команда)
Если НЕ ЕстьПравоРедактированияТовара ТОгда
ПоказатьПредупреждение(,"У Вас нет права перемещения товаров этой категории");
Возврат;
КонецЕсли;

ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
//Если Не ТекущаяСтрока = Элементы.Товары Тогда

Объект.Товары.Сдвинуть(ТекущаяСтрока,1);
//Элементы.Товары.ТекущаяСтрока = ТекущаяСтрока-1;
//КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СдвинутьВверх(Команда)
Если НЕ ЕстьПравоРедактированияТовара ТОгда
ПоказатьПредупреждение(,"У Вас нет права перемещения товаров этой категории");
Возврат;
КонецЕсли;

ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
//Если Не ТекущаяСтрока = 1 Тогда
Объект.Товары.Сдвинуть(ТекущаяСтрока,-1);
//Элементы.Товары.ТекущаяСтрока = ТекущаяСтрока+1; 
//КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Элементы.ТоварыНаПолке.Обновить();
ТекущаяПолка = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные.Нпп;
СПолкиОбъектаВТаблицуНаФорме(ТекущаяПолка);
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)

ТекДанныеПолка = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;

ТекДанные = Элементы.Товары.ТекущиеДанные;
Если ТекДанные=Неопределено Тогда
Возврат;
КонецЕсли;

//Проверить права доступа на работу с этим товаром
Если ТекДанныеТовары <> ТекДанные.ПолучитьИдентификатор() Тогда
ТекДанныеТовары = ТекДанные.ПолучитьИдентификатор();
УстановитьДоступностьРаботыСТоваромПоПравамКатегорий(ТекДанныеПолка, ТекДанные);
//ПодключитьОбработчикОжидания("УстановитьДоступностьРаботыСТоваромПоПравамКатегорий",0.1,Истина);
//У пользователя может быть доступ на работу с этой полкой, но на определенные категории товаров доступа может не быть
КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьРаботыССекциейНаПолкеИТоварами(ТекДанныеСекция)
//ТекДанныеСекция = Элементы.МестаНаПолках.ТекущиеДанные;
Если ТекДанныеСекция=Неопределено Тогда
Возврат;
КонецЕсли;

Если ЗначениеЗаполнено(ТекДанныеСекция.Категория) Тогда
МассивКатегорий = Новый Массив;
МассивКатегорий.Добавить(ТекДанныеСекция.Категория);

ЕстьПравоРедактированияСекции = ВМ_ПраваДоступаПоКатегориямСервер.ПолучитьПравоРедактированияПоКатегориям(МассивКатегорий);
Иначе
ЕстьПравоРедактированияСекции = Истина;
КонецЕсли;

Элементы.Товары.ИзменятьСоставСтрок = ЕстьПравоРедактированияСекции;
Элементы.ТоварыКомандаПодборТоваров.Доступность = ЕстьПравоРедактированияСекции;
ЕстьПравоРедактированияТовара = ЕстьПравоРедактированияСекции;
 
//ОтключитьОбработчикОжидания("УстановитьДоступностьРаботыССекциейНаПолкеИТоварами");

КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьРаботыСТоваромПоПравамКатегорий(ТекДанныеПолка, ТекДанные)
ТекДанныеПолка = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные;

ТекДанные = Элементы.Товары.ТекущиеДанные;

Если ТекДанныеПолка=Неопределено ИЛИ ТекДанные=Неопределено Тогда
Элементы.Товары.ИзменятьПорядокСтрок = ИСТИНА;

ЕстьПравоРедактированияТовара = ИСТИНА;

Возврат;
КонецЕсли;

//Если ТекДанныеТовары <> ТекДанные.ПолучитьИдентификатор() Тогда
ТекДанныеТовары = ТекДанные.ПолучитьИдентификатор();
ЕстьПравоРедактирования = ВМ_ПраваДоступаПоКатегориямСервер.ПолучитьПравоРедактированияПозийииВРяде(ТекДанныеПолка.Нпп, ТекДанные.Номенклатура);

Элементы.Товары.ИзменятьПорядокСтрок = ЕстьПравоРедактирования;

ЕстьПравоРедактированияТовара = ЕстьПравоРедактирования;
//КонецЕсли;

//ОтключитьОбработчикОжидания("УстановитьДоступностьРаботыСТоваромПоПравамКатегорий");
КонецПроцедуры


&НаКлиенте
Процедура ТоварыПередУдалением(Элемент, Отказ)
Если НЕ ЕстьПравоРедактированияТовара ТОгда
Отказ=Истина;
ПоказатьПредупреждение(,"У Вас нет права удаления товаров этой категории");
Возврат;
КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
// Вставить содержимое обработчика.
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПередНачаломИзменения(Элемент, Отказ)
Если НЕ ЕстьПравоРедактированияТовара ТОгда
Отказ=Истина;
ПоказатьПредупреждение(,"У Вас нет права изменения товаров этой категории");
Возврат;
КонецЕсли;
КонецПроцедуры


&НаСервере
Процедура _оп()

Если мПланограмма.ВысотаТаблицы = 0 Тогда
мПланограмма.Очистить();
мПланограмма.Вывести(РеквизитПланограмма);
мШиринаКолонки = (РеквизитПланограмма.Область(1,1).ШиринаКолонки);
иначе
РеквизитПланограмма.Очистить();
РеквизитПланограмма.Вывести(мПланограмма);
КонецЕсли;
Конецпроцедуры

&НаКлиенте
Процедура Масштаб1ПриИзменении(Элемент)
//_оп();
//Если мПланограмма.Области.Количество() = 0 Тогда
// мПланограмма.Вывести(РеквизитПланограмма);
// мШиринаКолонки = (РеквизитПланограмма.Область(1,1).ШиринаКолонки);
//КонецЕсли;
//Для Каждого мРисунок Из РеквизитПланограмма.Рисунки Цикл
// мРисунок.Высота = мРисунок.Высота * 1.1;
// мРисунок.Ширина = мРисунок.Ширина * 1.1;
//КонецЦикла;

//РеквизитПланограмма.Область(1,1).АвтоВысотаСтроки = Ложь;
//
//мВысотаСтроки = (РеквизитПланограмма.Область(1,1).ВысотаСтроки);
//Если мВысотаСтроки = 0 Тогда
// мВысотаСтроки = 1;
//КонецЕсли;

//ЭтаФорма.Масштаб  = (100+МасштабПланограммы); //Масштабируется вместе с формой

//ЭтаФорма.РеквизитПланограмма.АвтоМасштаб=Ложь;
//ЭтаФорма.РеквизитПланограмма.
//
////ТабличныйДокумент
//Если Элементы.РеквизитПланограмма.РежимМасштабированияПросмотра = ПредопределенноеЗначение("РежимМасштабированияПросмотра.Обычный") Тогда
// Элементы.РеквизитПланограмма.РежимМасштабированияПросмотра = ПредопределенноеЗначение("РежимМасштабированияПросмотра.Крупный");
//Иначе
// Элементы.РеквизитПланограмма.РежимМасштабированияПросмотра = ПредопределенноеЗначение("РежимМасштабированияПросмотра.Обычный");
//КонецЕсли;


//Элементы.РеквизитПланограмма.Ширина = Элементы.РеквизитПланограмма.Ширина * (100+МасштабПланограммы)/100;
//Элементы.РеквизитПланограмма.Высота = Элементы.РеквизитПланограмма.Высота * (100+МасштабПланограммы)/100;
//Элементы.РеквизитПланограмма.РежимМасштабированияПросмотра = ПредопределенноеЗначение("РежимМасштабированияПросмотра.Авто")


//Элементы.РеквизитПланограмма.Редактирование = Истина;
//ТекущийШрифт = ЭтаФорма.РеквизитПланограмма.Область(1,1).Шрифт;
//мШрифт = Новый Шрифт( ТекущийШрифт,,,,,,(100+МасштабПланограммы));
////ЭтаФорма.РеквизитПланограмма.ТекущаяОбласть.Шрифт = мШрифт;
//ЭтаФорма.РеквизитПланограмма.Область(1,1,РеквизитПланограмма.ШиринаТаблицы+10,РеквизитПланограмма.ВысотаТаблицы+10).Шрифт = мШрифт;
//
//Сообщить(ЭтаФорма.РеквизитПланограмма.ТекущаяОбласть.Шрифт.Размер);

// Последний вариант на котором собирались остановиться
//Если НЕ ЗначениеЗаполнено(мШиринаКолонки) Тогда
// мШиринаКолонки = РеквизитПланограмма.Область(1,1).ШиринаКолонки;
//КонецЕсли;
//РеквизитПланограмма.Область(1,1,РеквизитПланограмма.ШиринаТаблицы+10,РеквизитПланограмма.ВысотаТаблицы+10).ШиринаКолонки = мШиринаКолонки*(100+МасштабПланограммы)/100;
//РеквизитПланограмма.Область(1,1,РеквизитПланограмма.ШиринаТаблицы+10,РеквизитПланограмма.ВысотаТаблицы+10).ВысотаСтроки = мШиринаКолонки*(100+МасштабПланограммы)/100;

////Для Каждого мРисунок Из РеквизитПланограмма.Рисунки Цикл
//// мРисунок.Высота = мРисунок.Высота * (100+МасштабПланограммы)/100;
//// мРисунок.Ширина = мРисунок.Ширина * (100+МасштабПланограммы)/100;
////КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура КомандаЗаписатьИЗакрыть(Команда)
РезультатПроверки = ВМ_ПланограммаКлиент.ВыполнитьКонтрольРазмещенияТоваровНаПолках(ПолкиТорговогоОборудования, Объект.Товары, Ложь, Ложь, Истина, Объект.ВариантКонтроляВыкладки);
Для Каждого Полка Из РезультатПроверки Цикл
ИнфоПоВысоте = "";
Для Каждого тПолка ИЗ РезультатПроверки.НаДлину Цикл
ТекстДобавления = "";
//Текст1 = тПолка.Полка.ЭлементТО;// ИмяПолки;
Текст1 = тПолка.Полка.ИмяПолки;
Текст2 = тПолка.СуммаДлинТоваров;
Текст3 = - тПолка.НаСколькоПревышено;
Если тПолка.НаСколькоПревышено < 0 Тогда //Если Превышение меньше 0 (Осталось свободное место, это будет обработано в другом месте)
ТекстДобавления = НСтр("ru = 'На полке "" %1 "" остается свободное место. Общая сумма длины товаров - %2, не занято  %3 !'");
ТекстДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстДобавления, Текст1, Текст2, Текст3);
ИнфоПоВысоте = ?(ЗначениеЗаполнено(ИнфоПоВысоте), ИнфоПоВысоте + Символы.ПС, ИнфоПоВысоте);
ИнфоПоВысоте = ИнфоПоВысоте + ТекстДобавления;
КонецЕсли;
КонецЦикла;
Сообщить(ИнфоПоВысоте);
КонецЦикла;
Если ИнфоПоВысоте <> "" Тогда
Режим = РежимДиалогаВопрос.ДаНетОтмена;
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, Параметры);
ПоказатьВопрос(Оповещение,"Сохранить выкладку?", Режим, 0);
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Нет Тогда
ЭтаФорма.Закрыть();
ИначеЕсли Результат = КодВозвратаДиалога.Да Тогда   
Записать();
ЭтаФорма.Закрыть();
КонецЕсли;           
КонецПроцедуры


#Область ТоварыНаПолке
&НаСервере
Процедура СПолкиОбъектаВТаблицуНаФорме(ПолкаОбъекта)
ТоварыНаПолке.Очистить(); 
СтруктураОтбора = Новый Структура("КлючСвязиПолки",ПолкаОбъекта);
ТоварыПолки = Объект.Товары.НайтиСтроки(СтруктураОтбора);
Для Каждого ТоварНаПолке Из ТоварыПолки Цикл
ДобавляемыйТовар = ТоварыНаПолке.Добавить();
ЗаполнитьЗначенияСвойств(ДобавляемыйТовар,ТоварНаПолке);
ДобавляемыйТовар.АдресКартинки = ПолучитьАдресКартинкиДляОтображенияВСпискеТоваров(
ТоварНаПолке.Номенклатура,УникальныйИдентификатор);
//ВМ_ПрисоединенныеФайлы.НавигационнаяСсылкаКартинки(
//ТоварНаПолке.Номенклатура.ФайлКартинки,УникальныйИдентификатор);
КонецЦикла;

//ТоварыНаПолке.Сортировать("КоординатаX");
//Нпп = 1;
//Для Каждого ТоварНаПолке Из ТоварыНаПолке Цикл
// ДобавляемыйТовар.Нпп = Нпп;
// ДобавляемыйТовар.КоординатаX = 0;
// Нпп = Нпп + 1;
//КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура СТаблицыНаФормеВПолкуОбъекта(ПолкаОбъекта = 0)
Если ТоварыНаПолке.Количество()> 0 Тогда
ПолкаОбъекта = ТоварыНаПолке[0].КлючСвязиПолки;
КонецЕсли;
СтруктураОтбора = Новый Структура("КлючСвязиПолки",ПолкаОбъекта);
СтарыеТоварыПолки = Объект.Товары.НайтиСтроки(СтруктураОтбора);
Для Каждого ТоварНаПолке Из СтарыеТоварыПолки Цикл
Объект.Товары.Удалить(ТоварНаПолке);
КонецЦикла;
Для Каждого ТоварНаПолке Из ТоварыНаПолке Цикл
ДобавляемыйТовар = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ДобавляемыйТовар,ТоварНаПолке);
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ТоварыНаПолкеПередУдалением(Элемент, Отказ)
Если ТоварыНаПолке.Количество()<> 0 Тогда
КлючПолкиУдаленногоТовара = ТоварыНаПолке[0].КлючСвязиПолки;
КонецЕсли;
СдвинутьПравыеВлевоОт(Элементы.ТоварыНаПолке.ТекущаяСтрока);
КонецПроцедуры

&НаКлиенте
Процедура  СдвинутьПравыеВлевоОт(НомерУдаляемйСтроки)
СтрокаТаблицыФормы  = ТоварыНаПолке.НайтиПоИдентификатору(НомерУдаляемйСтроки);
ИндексТекущейСтроки = ТоварыНаПолке.Индекс(СтрокаТаблицыФормы);
ДлинаУдаляемогоТовара = ВМ_ПланограммаВызовСервера.ДлинаТовараПоПоложению(СтрокаТаблицыФормы.Номенклатура,СтрокаТаблицыФормы.ПоложениеТовара);
//Для мИндекс = ИндексТекущейСтроки + 1 По  ТоварыНаПолке.Количество()-1 Цикл
// Если ТоварыНаПолке[мИндекс].КоординатаX <> 0 Тогда
// ТоварыНаПолке[мИндекс].КоординатаX = ТоварыНаПолке[мИндекс].КоординатаX - ДлинаУдаляемогоТовара;
// КонецЕсли;
//КонецЦикла;

СдвинутьНачинаяСЭлемента(ИндексТекущейСтроки + 1,-ДлинаУдаляемогоТовара);

КонецПроцедуры

&НаКлиенте
Процедура ТоварыНаПолкеПослеУдаления(Элемент)
СТаблицыНаФормеВПолкуОбъекта(КлючПолкиУдаленногоТовара);
КлючПолкиУдаленногоТовара = 0;
КонецПроцедуры


#Область КнопкиВверхВниз
&НаКлиенте
Процедура КомандаСдвинутьВверхТЗ(Команда)
Если НЕ ЕстьПравоРедактированияТовара ТОгда
ПоказатьПредупреждение(,"У Вас нет права перемещения товаров этой категории");
Возврат;
КонецЕсли;

ТекущаяСтрока = Элементы.ТоварыНаПолке.ТекущаяСтрока;
Буфер = ОписаниеСтруктурыСтрокиТоварыНаПолке();
ТоварСлева = ОписаниеСтруктурыСтрокиТоварыНаПолке();

СтрокаТаблицыФормы  = ТоварыНаПолке.НайтиПоИдентификатору(ТекущаяСтрока);
ИндексТекущейСтроки = ТоварыНаПолке.Индекс(СтрокаТаблицыФормы);
Если ИндексТекущейСтроки = 0 Тогда
Возврат;
КонецЕсли;
ЗаполнитьЗначенияСвойств(Буфер,СтрокаТаблицыФормы);
ЗаполнитьЗначенияСвойств(ТоварСлева,ТоварыНаПолке[ИндексТекущейСтроки-1]);
ЗаполнитьЗначенияСвойств(ТоварыНаПолке[ИндексТекущейСтроки],ТоварСлева,,"Нпп");
ЗаполнитьЗначенияСвойств(ТоварыНаПолке[ИндексТекущейСтроки-1],Буфер,,"Нпп"); 
ТоварСлева.Вставить("ИндексСтроки",ИндексТекущейСтроки-1);
Буфер.Вставить("ИндексСтроки",ИндексТекущейСтроки);
ДанныеПересчета = ПересчитатьКоординатыХ(ТоварСлева,Буфер);
ЗаполнитьЗначенияСвойств(ТоварыНаПолке[ИндексТекущейСтроки-1],ДанныеПересчета.ТоварСправа,"КоординатаX");
ЗаполнитьЗначенияСвойств(ТоварыНаПолке[ИндексТекущейСтроки],ДанныеПересчета.ТоварСлева,"КоординатаX");
Элементы.ТоварыНаПолке.ТекущаяСтрока = ТоварыНаПолке[ИндексТекущейСтроки-1].ПолучитьИдентификатор();

КонецПроцедуры

&НаСервере
Функция ПересчитатьКоординатыХ(ТоварСлева,ТоварСправа)

Если ТоварСправа.КоординатаX <> 0 И ТоварСлева.КоординатаX <> 0 ИЛИ ТоварСправа.ИндексСтроки = 1 Тогда
//Координаты обоих товаров заполнены или слева первая строка
    Хнач = ТоварСлева.КоординатаX;
Сдвиг = ВМ_ПланограммаВызовСервера.ДлинаТовараПоПоложению(ТоварСправа.Номенклатура,ТоварСправа.ПоложениеТовара);
ТоварСправа.КоординатаX = Хнач;
ТоварСлева.КоординатаX = Хнач + Сдвиг;
ИначеЕсли ТоварСправа.КоординатаX <> 0 И ТоварСлева.КоординатаX = 0 Тогда


Иначе

мИндекс = ТоварСлева.ИндексСтроки;
Пока ТоварыНаПолке[мИндекс].КоординатаX = 0 И мИндекс > 0 Цикл
мИндекс = мИндекс - 1;
КонецЦикла;
мИндекс = мИндекс + 1;
//Добрались до элемента с непустой координатой или первого
Пока мИндекс <= ТоварСправа.ИндексСтроки Цикл
Сдвиг =?(мИндекс=0,0,ВМ_ПланограммаВызовСервера.ДлинаТовараПоПоложению(ТоварыНаПолке[мИндекс-1].Номенклатура,ТоварыНаПолке[мИндекс-1].ПоложениеТовара));
ТоварыНаПолке[мИндекс].КоординатаX =?(мИндекс=0,0, ТоварыНаПолке[мИндекс-1].КоординатаX + Сдвиг);
мИндекс = мИндекс + 1;
КонецЦикла;
мИндекс = мИндекс-1;
ТоварСлева.КоординатаX = ТоварыНаПолке[мИндекс].КоординатаX;
ТоварСправа.КоординатаX = ТоварыНаПолке[мИндекс-1].КоординатаX;   
КонецЕсли;                               

Возврат Новый Структура("ТоварСлева, ТоварСправа", ТоварСлева,ТоварСправа);
КонецФункции

&НаКлиенте
Процедура КомандаСдвинутьВнизТЗ(Команда)
Если НЕ ЕстьПравоРедактированияТовара ТОгда
ПоказатьПредупреждение(,"У Вас нет права перемещения товаров этой категории");
Возврат;
КонецЕсли;

ТекущаяСтрока = Элементы.ТоварыНаПолке.ТекущаяСтрока;
Буфер = ОписаниеСтруктурыСтрокиТоварыНаПолке();
ТоварСправа = ОписаниеСтруктурыСтрокиТоварыНаПолке();
СтрокаТаблицыФормы  = ТоварыНаПолке.НайтиПоИдентификатору(ТекущаяСтрока);
ИндексТекущейСтроки = ТоварыНаПолке.Индекс(СтрокаТаблицыФормы);
Если ИндексТекущейСтроки = ТоварыНаПолке.Количество()-1 Тогда
Возврат;
КонецЕсли;
ЗаполнитьЗначенияСвойств(Буфер,СтрокаТаблицыФормы);
ЗаполнитьЗначенияСвойств(ТоварСправа,ТоварыНаПолке[ИндексТекущейСтроки+1]);
ЗаполнитьЗначенияСвойств(ТоварыНаПолке[ИндексТекущейСтроки],ТоварыНаПолке[ИндексТекущейСтроки+1],,"Нпп");
ЗаполнитьЗначенияСвойств(ТоварыНаПолке[ИндексТекущейСтроки+1],Буфер,,"Нпп");
Буфер.Вставить("ИндексСтроки",ИндексТекущейСтроки);
ТоварСправа.Вставить("ИндексСтроки",ИндексТекущейСтроки+1);
ДанныеПересчета = ПересчитатьКоординатыХ(Буфер,ТоварСправа);
ЗаполнитьЗначенияСвойств(ТоварыНаПолке[ИндексТекущейСтроки+1],ДанныеПересчета.ТоварСлева,"КоординатаX");
ЗаполнитьЗначенияСвойств(ТоварыНаПолке[ИндексТекущейСтроки],ДанныеПересчета.ТоварСправа,"КоординатаX");

Элементы.ТоварыНаПолке.ТекущаяСтрока = ТоварыНаПолке[ИндексТекущейСтроки+1].ПолучитьИдентификатор();

КонецПроцедуры
#КонецОбласти


#КонецОбласти

&НаКлиенте
Функция ОписаниеСтруктурыСтрокиТоварыНаПолке()
Возврат Новый Структура("Нпп,КлючСвязиПолки,АдресКартинки,Номенклатура,Характеристика,ИдентификаторМеста,ГлубинаВыкладки,ВысотаВыкладки,ПоложениеТовара,ФактДлина,ФактВысота,ФактГлубина,idНаСхеме,КоординатаX,КоординатаY");
КонецФункции

&НаСервере
Процедура ПересчитатьКоординатыТоваровНаПолках()

Если Объект.Товары.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Объект.Товары.Сортировать("КлючСвязиПолки,Нпп");
мКлючСвязиПолки = Объект.Товары[0].КлючСвязиПолки;
ИндексТовараНаСтеллаже = 0;
ВсегоТоваровНаПолках = Объект.Товары.Количество() - 1;
Пока ИндексТовараНаСтеллаже < ВсегоТоваровНаПолках Цикл
ПервыйНаПолке = Истина;
ТекСтрока = Объект.Товары[ИндексТовараНаСтеллаже];
Пока мКлючСвязиПолки = ТекСтрока.КлючСвязиПолки Цикл
Если ТекСтрока.КоординатаX = 0 Тогда
ДлинаПредыдущегоТовара = ?(ПервыйНаПолке,0,ВМ_ПланограммаВызовСервера.ДлинаТовараПоПоложению(Объект.Товары[ИндексТовараНаСтеллаже-1].Номенклатура,Объект.Товары[ИндексТовараНаСтеллаже-1].ПоложениеТовара));
ТекСтрока.КоординатаX = ?(ПервыйНаПолке,0,Объект.Товары[ИндексТовараНаСтеллаже-1].КоординатаX + ДлинаПредыдущегоТовара);
КонецЕсли;
ПервыйНаПолке = Ложь;
Если ИндексТовараНаСтеллаже < ВсегоТоваровНаПолках Тогда
ИндексТовараНаСтеллаже = ИндексТовараНаСтеллаже + 1;
Иначе
Прервать;
КонецЕсли;
ТекСтрока = Объект.Товары[ИндексТовараНаСтеллаже];
КонецЦикла;
мКлючСвязиПолки = Объект.Товары[ИндексТовараНаСтеллаже].КлючСвязиПолки;
КонецЦикла; 
Объект.Товары.Сортировать("КлючСвязиПолки,КоординатаX");

КонецПроцедуры

&НаКлиенте
Процедура КомандаПересчитатьКоординатыТоваровНаПолках(Команда)

ТекДанные = Элементы.ТоварыНаПолке.ТекущиеДанные;
Если ТекДанные = Неопределено ТОгда
Возврат;
КонецЕсли;

КлючСвязиПолки    = ТекДанные.КлючСвязиПолки;
ИдентификаторМеста = ТекДанные.ИдентификаторМеста;

МассивСтрокТоваров = ТоварыНаПолке.НайтиСтроки(Новый Структура("КлючСвязиПолки, ИдентификаторМеста",КлючСвязиПолки, ИдентификаторМеста));


Для Каждого СтрокаТоварполка из МассивСтрокТоваров Цикл
СтрокаТоварполка.КоординатаX = 0;
//СтрокаТоварполка.КоординатаY = 0;
КонецЦикла;

ЭтаФорма.Модифицированность = Истина;

Если Объект.Товары.Количество() = 0 Тогда
Возврат;
КонецЕсли;

Объект.Товары.Сортировать("КлючСвязиПолки,Нпп");
мКлючСвязиПолки = Объект.Товары[0].КлючСвязиПолки;
ИндексТовараНаСтеллаже = 0;
ВсегоТоваровНаПолках = Объект.Товары.Количество() - 1;
Пока ИндексТовараНаСтеллаже < ВсегоТоваровНаПолках Цикл
ПервыйНаПолке = Истина;
ТекСтрока = Объект.Товары[ИндексТовараНаСтеллаже];
Пока мКлючСвязиПолки = ТекСтрока.КлючСвязиПолки Цикл
Если ТекСтрока.КоординатаX = 0 Тогда
ДлинаПредыдущегоТовара = ?(ПервыйНаПолке,0,ВМ_ПланограммаВызовСервера.ДлинаТовараПоПоложению(Объект.Товары[ИндексТовараНаСтеллаже-1].Номенклатура,Объект.Товары[ИндексТовараНаСтеллаже-1].ПоложениеТовара));
ТекСтрока.КоординатаX = ?(ПервыйНаПолке,0,Объект.Товары[ИндексТовараНаСтеллаже-1].КоординатаX + ДлинаПредыдущегоТовара);
КонецЕсли;
ПервыйНаПолке = Ложь;
Если ИндексТовараНаСтеллаже < ВсегоТоваровНаПолках Тогда
ИндексТовараНаСтеллаже = ИндексТовараНаСтеллаже + 1;
Иначе
Прервать;
КонецЕсли;
ТекСтрока = Объект.Товары[ИндексТовараНаСтеллаже];
КонецЦикла;
мКлючСвязиПолки = Объект.Товары[ИндексТовараНаСтеллаже].КлючСвязиПолки;
КонецЦикла; 
Объект.Товары.Сортировать("КлючСвязиПолки,КоординатаX");
    ПересчитатьКоординатыТоваровНаПолках();
КонецПроцедуры


&НаКлиенте
Процедура ТоварыНаПолкеПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
НппХ = 1;
Для Каждого мСтрока Из ТоварыНаПолке Цикл
НппХ = Макс(НппХ,мСтрока.Нпп);
ПересчитатьКоординатыТоваровНаПолках();
КонецЦикла;
Если Копирование ИЛИ НоваяСтрока Тогда
Элемент.ТекущиеДанные.ГлубинаВыкладки = 1;
Элемент.ТекущиеДанные.ВысотаВыкладки = 1;
Элемент.ТекущиеДанные.КоординатаX = 0;
Элемент.ТекущиеДанные.КлючСвязиПолки = Элементы.ПолкиТорговогоОборудования.ТекущиеДанные.Нпп;
Элемент.ТекущиеДанные.Нпп = НппХ+1;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТоварыНаПолкеНоменклатураПриИзменении(Элемент)
ИндексСтрокиТовара = ТоварыНаПолке.Индекс(ТоварыНаПолке.НайтиПоИдентификатору(Элементы.ТоварыНаПолке.ТекущаяСтрока));

Если (ИндексСтрокиТовара = 0 И  Элементы.ТоварыНаПолке.ТекущиеДанные.КоординатаX = 0)
ИЛИ (Элементы.ТоварыНаПолке.ТекущиеДанные.КоординатаX <> 0) Тогда
//Первый товар на полке или Позиция товара не с начала полки слева
НовыйТовар = Элементы.ТоварыНаПолке.ТекущиеДанные;
ДлинаНовогоТовара = ВМ_ПланограммаВызовСервера.ДлинаТовараПоПоложению(НовыйТовар.Номенклатура,НовыйТовар.ПоложениеТовара);
ИдСтроки  = Элементы.ТоварыНаПолке.ТекущаяСтрока;   
ЭтаСтрока  = ТоварыНаПолке.НайтиПоИдентификатору(ИдСтроки);
НачальныйИндекс = ТоварыНаПолке.Индекс(ЭтаСтрока)+1;

НовыйТовар.АдресКартинки = ПолучитьАдресКартинкиДляОтображенияВСпискеТоваров(
НовыйТовар.Номенклатура,УникальныйИдентификатор);


Если ТоварыНаПолке.Количество() = 1 Тогда
Сдвиг = 0; //++20210701 Если Товар на полке один, тогда не существует индекса следующего товара
ИначеЕсли НачальныйИндекс = ТоварыНаПолке.Количество() Тогда
//++20210708 Последняя строка
Сдвиг = 0;
Иначе
Сдвиг = ТоварыНаПолке[НачальныйИндекс-1].КоординатаX + ДлинаНовогоТовара - ТоварыНаПолке[НачальныйИндекс].КоординатаX;
КонецЕсли;
СдвинутьНачинаяСЭлемента(НачальныйИндекс,Сдвиг);
КонецЕсли;                             

ПересчитатьКоординатыТоваровНаПолках();

КонецПроцедуры


&НаСервере
Процедура СдвинутьНачинаяСЭлемента(ИндексЭлемента,Сдвиг)
Для мИндекс = ИндексЭлемента По ТоварыНаПолке.Количество() - 1 Цикл
Если ТоварыНаПолке[мИндекс].КоординатаX <> 0 Тогда
ТоварыНаПолке[мИндекс].КоординатаX = ТоварыНаПолке[мИндекс].КоординатаX + Сдвиг;
КонецЕсли;
КонецЦикла;                                        
КонецПроцедуры

&НаКлиенте
Процедура ОбнулитьПривязкиКоординат(Команда)

ТекДанные = Элементы.ТоварыНаПолке.ТекущиеДанные;
Если ТекДанные = Неопределено ТОгда
Возврат;
КонецЕсли;

КлючСвязиПолки    = ТекДанные.КлючСвязиПолки;
ИдентификаторМеста = ТекДанные.ИдентификаторМеста;

МассивСтрокТоваров = ТоварыНаПолке.НайтиСтроки(Новый Структура("КлючСвязиПолки, ИдентификаторМеста",КлючСвязиПолки, ИдентификаторМеста));


Для Каждого СтрокаТоварполка из МассивСтрокТоваров Цикл
СтрокаТоварполка.КоординатаX = 0;
//СтрокаТоварполка.КоординатаY = 0;
КонецЦикла;

ЭтаФорма.Модифицированность = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ТоварыНаПолкеКоординатаXПриИзменении(Элемент)
ПересчитатьКоординатыТоваровНаПолках();
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

&НаКлиенте
Процедура АдресФотоНажатие(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ОписаниеОповещения = новый ОписаниеОповещения("КонецВыбораФайла", ЭтотОбъект);
    НачатьПомещениеФайлаНаСервер(ОписаниеОповещения,,,,,УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура КонецВыбораФайла(Фото, ДопПарам) экспорт
    Если Фото <> Неопределено тогда
        АдресФото = Фото.Адрес;
    КонецЕсли;
КонецПроцедуры

//&НаСервере
//Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
//    Если ЭтоАдресВременногоХранилища(АдресФото) тогда
//        ТекущийОбъект.Фотография = новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресФото));
//    КонецЕсли;
//КонецПроцедуры

//&НаСервере
//Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//    АдресФото = ПоместитьВоВременноеХранилище(Объект.Ссылка.Фотография.Получить(), УникальныйИдентификатор);
//КонецПроцедуры

&НаКлиенте
Процедура ПовернутьФото(Команда)
    ПовернутьФотоНаСервере();
КонецПроцедуры 

&НаСервере
Процедура ПовернутьФотоНаСервере()
    Ссылка = ПолучитьИзВременногоХранилища(АдресФото);
    Картинка = новый Картинка(Ссылка);
    ОбрабатываемаяКартинка = новый ОбрабатываемаяКартинка(Картинка);
    ОбрабатываемаяКартинка.Повернуть(90);
    АдресФото = ПоместитьВоВременноеХранилище(ОбрабатываемаяКартинка.ПолучитьКартинку().ПолучитьДвоичныеДанные(), УникальныйИдентификатор);

КонецПроцедуры


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск