Изменение ассортимента / Форма документа / Модуль формы

файл

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

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

	УстановитьУсловноеОформление();
	
	// Пропускаем инициализацию, чтобы гарантировать получение формы при передаче параметра "АвтоТест".
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;

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

	// ИнтеграцияС1СДокументооборотом
	ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПриСозданииНаСервере(ЭтотОбъект);
	// Конец ИнтеграцияС1СДокументооборотом
	
	СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

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

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

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

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "КопированиеСтрокВБуферОбмена" Тогда
		
		УстановитьДоступностьКомандБуфераОбменаНаКлиенте();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура  ПослеЗаписи(ПараметрыЗаписи)

	МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтаФорма, ПараметрыЗаписи);

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

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

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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

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

	МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(ЭтаФорма, ТекущийОбъект, ПараметрыЗаписи);

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

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

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

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

&НаКлиенте
Процедура ЭтапПриИзменении(Элемент)
	ЭтапПриИзмененииНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ДатаНачалаЗакупокПриИзменении(Элемент)
	
	Если Объект.ДатаНачалаЗакупок > Объект.ДатаНачалаПродаж Тогда
		Объект.ДатаНачалаПродаж = Объект.ДатаНачалаЗакупок;
	КонецЕсли; 
	
	Если Объект.ДатаНачалаЗакупок > Объект.ДатаЗапретаЗакупки Тогда
		Объект.ДатаЗапретаЗакупки = КонецДня(Объект.ДатаНачалаЗакупок)+1;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Объект.ДатаНачалаЗакупок) И ЗначениеЗаполнено(Объект.ДатаНачалаПродаж) Тогда
		Объект.ДатаНачалаДействия = Мин(Объект.ДатаНачалаЗакупок, Объект.ДатаНачалаПродаж);
	Иначе
		Объект.ДатаНачалаДействия = Объект.Дата;
	КонецЕсли; 
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаЗапретаЗакупкиПриИзменении(Элемент)
	
	Если Объект.ДатаНачалаЗакупок > Объект.ДатаЗапретаЗакупки Тогда
		Объект.ДатаЗапретаЗакупки = КонецДня(Объект.ДатаНачалаЗакупок)+1;
	КонецЕсли;  
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаНачалаПродажПриИзменении(Элемент)
	
	Если Объект.ДатаНачалаЗакупок > Объект.ДатаНачалаПродаж Тогда
		Объект.ДатаНачалаПродаж = Объект.ДатаНачалаЗакупок;
	КонецЕсли; 
	
	Если Объект.ДатаНачалаПродаж > Объект.ДатаЗапретаПродажи Тогда
		Объект.ДатаЗапретаПродажи = КонецДня(Объект.ДатаНачалаПродаж)+1;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Объект.ДатаНачалаЗакупок) И ЗначениеЗаполнено(Объект.ДатаНачалаПродаж) Тогда
		Объект.ДатаНачалаДействия = Мин(Объект.ДатаНачалаЗакупок, Объект.ДатаНачалаПродаж);
	Иначе
		Объект.ДатаНачалаДействия = Объект.Дата;
	КонецЕсли; 
	
КонецПроцедуры

&НаКлиенте
Процедура ДатаЗапретаПродажиПриИзменении(Элемент)
	
	Если Объект.ДатаНачалаПродаж > Объект.ДатаЗапретаПродажи Тогда
		Объект.ДатаЗапретаПродажи = КонецДня(Объект.ДатаНачалаПродаж)+1;
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыТовары

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

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

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

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

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьРольДляВсехТоваров(Команда)
	Если Объект.Товары.Количество() = 0 Тогда
		
		ТекстПредупреждения = НСтр("ru='В документе не заполнена таблица %ПредставлениеТабличнойЧасти%. Роль не может быть заполнена'");
		ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%ПредставлениеТабличнойЧасти%", "Товары");
		ПоказатьПредупреждение(Неопределено, ТекстПредупреждения);
		Возврат;
		
	КонецЕсли;
	ВыбраннаяРоль = Неопределено;

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

&НаКлиенте
Процедура УстановитьРольДляВсехТоваровЗавершение(Результат, ДополнительныеПараметры) Экспорт
    
    ВыбраннаяРоль = Результат;
    Если ВыбраннаяРоль = Неопределено Тогда
        Возврат;
    КонецЕсли;
    УстановитьЗначениеРеквизитаВсемСтрокам("РольАссортимента", ВыбраннаяРоль);

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

&НаКлиенте
Процедура УстановитьВидЦенДляВсехТоваров(Команда)
	
	Если Объект.Товары.Количество() = 0 Тогда
		
		ТекстПредупреждения = НСтр("ru='В документе не заполнена таблица %ПредставлениеТабличнойЧасти%. Вид цен не может быть заполнен'");
		ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%ПредставлениеТабличнойЧасти%", "Товары");
		ПоказатьПредупреждение(,ТекстПредупреждения);
		Возврат;
		
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура();
	СтруктураОтбора = Новый Структура();
	СтруктураОтбора.Вставить("ИспользоватьПриПродаже", Истина);
	СтруктураОтбора.Вставить("Статус", ПредопределенноеЗначение("Перечисление.СтатусыДействияВидовЦен.Действует"));
	
	ПараметрыФормы.Вставить("Отбор", СтруктураОтбора);
	
	ОткрытьФорму("Справочник.ВидыЦен.ФормаВыбора", 
		ПараметрыФормы, 
		ЭтаФорма,
		,
		,
		, 
		Новый ОписаниеОповещения("УстановитьВидЦенДляВсехТоваровЗавершение", ЭтотОбъект), 
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ВставитьСтроки(Команда)
	
	КоличествоТоваровДоВставки = Объект.Товары.Количество();
	
	ПолучитьСтрокиИзБуфераОбмена();
	
	КоличествоВставленных = Объект.Товары.Количество()-КоличествоТоваровДоВставки;
	РаботаСТабличнымиЧастямиКлиент.ОповеститьПользователяОВставкеСтрок(КоличествоВставленных);
КонецПроцедуры

&НаКлиенте
Процедура ПровестиДокумент(Команда)
	
	ОбщегоНазначенияУТКлиент.Провести(ЭтаФорма);
	
КонецПроцедуры

&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
	
	ОбщегоНазначенияУТКлиент.ПровестиИЗакрыть(ЭтаФорма);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

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

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

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

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатураКод.Имя);

	ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДополнительныеКолонкиНоменклатуры");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Код;

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыНоменклатураАртикул.Имя);

	ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДополнительныеКолонкиНоменклатуры");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул;

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

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

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

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

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

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

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

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

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


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

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

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

&НаКлиенте
Процедура ЗаполнитьТоварыПоЗапросуНаКлиентеФрагмент(Знач ПараметрыЗаполнения, РежимЗаполнения)
    
    ПараметрыЗаполнения.Вставить("РежимЗаполнения",РежимЗаполнения);
    
    ЗаполнитьТоварыПоЗапросуНаСервере(ПараметрыЗаполнения);

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

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

// Процедура формирует текст запроса, используемого для заполнения товаров
&НаСервере
Функция СформироватьТекстДляКоманды(ИмяКомандыЗаполнения,РежимЗаполнения)
	
	ТекстЗапроса="";
	
	Если ИмяКомандыЗаполнения="ЗаполнитьПоСкладскимОстаткамИОборотам" Тогда
		ТекстЗапроса=
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
		|	ВложенныйЗапрос.Склад КАК Склад
		|ПОМЕСТИТЬ Склады
		|ИЗ
		|	(ВЫБРАТЬ
		|		ИсторияИзмененияФорматовМагазиновСрезПоследних.Склад КАК Склад
		|	ИЗ
		|		РегистрСведений.ИсторияИзмененияФорматовМагазинов.СрезПоследних(&ДатаНачала, ) КАК ИсторияИзмененияФорматовМагазиновСрезПоследних
		|	ГДЕ
		|		ИсторияИзмененияФорматовМагазиновСрезПоследних.ФорматМагазина = &ОбъектПланирования
		|	
		|	ОБЪЕДИНИТЬ ВСЕ
		|	
		|	ВЫБРАТЬ
		|		ИсторияИзмененияФорматовМагазинов.Склад
		|	ИЗ
		|		РегистрСведений.ИсторияИзмененияФорматовМагазинов КАК ИсторияИзмененияФорматовМагазинов
		|	ГДЕ
		|		ИсторияИзмененияФорматовМагазинов.Период > &ДатаНачала
		|		И ИсторияИзмененияФорматовМагазинов.Период <= &ДатаКонца
		|		И ИсторияИзмененияФорматовМагазинов.ФорматМагазина = &ОбъектПланирования
		|	
		|	ОБЪЕДИНИТЬ ВСЕ
		|	
		|	ВЫБРАТЬ
		|		Склады.Ссылка
		|	ИЗ
		|		Справочник.Склады КАК Склады
		|	ГДЕ
		|		Склады.Ссылка = &ОбъектПланирования) КАК ВложенныйЗапрос
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Склад
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
		|	ЗНАЧЕНИЕ(Перечисление.РолиАссортимента.ДополнительныйАссортимент) КАК РольАссортимента,
		|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.РейтингПродаж КАК РейтингПродаж,
		|	&ВидЦенФормата КАК ВидЦены
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
		|			&ДатаНачала,
		|			&ДатаКонца,
		|			,
		|			,
		|			Склад В
		|				(ВЫБРАТЬ
		|					Склады.Склад
		|				ИЗ
		|					Склады КАК Склады)
		|			И &ТекстЗапросаУсловиеОтбораНоменклатуры) КАК ТоварыНаСкладахОстаткиИОбороты
		|ГДЕ
		|	ВЫБОР
		|			КОГДА НЕ &ИспользоватьУправлениеКоллекциями
		|				ТОГДА ИСТИНА
		|			КОГДА &ИспользоватьУправлениеКоллекциями
		|					И ТоварыНаСкладахОстаткиИОбороты.Номенклатура.КоллекцияНоменклатуры = &КоллекцияНоменклатуры
		|				ТОГДА ИСТИНА
		|			ИНАЧЕ ЛОЖЬ
		|		КОНЕЦ
		|
		|СГРУППИРОВАТЬ ПО
		|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура
		|
		|УПОРЯДОЧИТЬ ПО
		|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Наименование";
		
		ТекстЗапроса = СтрЗаменить(
			ТекстЗапроса, 
			"И &ТекстЗапросаУсловиеОтбораНоменклатуры", 
			?(РежимЗаполнения=2,"И НЕ Номенклатура В (&МассивТоваров)",""));
		
	ИначеЕсли ИмяКомандыЗаполнения="ЗаполнитьПоАссортиментуФормата" Тогда
		
		ТекстЗапроса=
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	Ассортимент.Номенклатура КАК Номенклатура,
		|	Ассортимент.РольАссортимента КАК РольАссортимента,
		|	Ассортимент.РейтингПродаж КАК РейтингПродаж,
		|	Ассортимент.ВидЦены КАК ВидЦены
		|ИЗ
		|	РегистрСведений.Ассортимент.СрезПоследних(
		|			КОНЕЦПЕРИОДА(&Период, ДЕНЬ),
		|			ОбъектПланирования = &ОбъектПланирования
		|И &ТекстЗапросаУсловиеОтбораНоменклатуры
		|				) КАК Ассортимент
		|ГДЕ
		|	Ассортимент.РазрешеныЗакупки
		|	И ВЫБОР
		|			КОГДА НЕ &ИспользоватьУправлениеКоллекциями
		|				ТОГДА ИСТИНА
		|			КОГДА &ИспользоватьУправлениеКоллекциями
		|					И Ассортимент.Номенклатура.КоллекцияНоменклатуры = &КоллекцияНоменклатуры
		|				ТОГДА ИСТИНА
		|			ИНАЧЕ ЛОЖЬ
		|		КОНЕЦ
		|
		|УПОРЯДОЧИТЬ ПО
		|	Ассортимент.Номенклатура.Наименование";
		
		ТекстЗапроса = СтрЗаменить(
			ТекстЗапроса, 
			"И &ТекстЗапросаУсловиеОтбораНоменклатуры", 
			?(РежимЗаполнения=2,"			И НЕ Номенклатура В (&МассивТоваров)",""));
		
	Иначе //такой команды не предусмотрено - надо вызвать исключение
		ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
									НСтр("ru = 'Неизвестный вариант заполнения: %1'"),
									ИмяКомандыЗаполнения);
		ВызватьИсключение(ТекстСообщенияОбОшибке);
	КонецЕсли;
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

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

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

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

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

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

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

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

#Область РаботаСБуферомОбмена

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция РассчитатьДатуДокумента(ДатаДокумента, НомерВПределахДня)
	
	Возврат НачалоДня(ДатаДокумента) + НомерВПределахДня - 1;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ДатаДокумента(Дата, ТекущаяДатаСеанса)
	
	Возврат ?(ЗначениеЗаполнено(Дата), Дата, НачалоДня(ТекущаяДатаСеанса));
	
КонецФункции

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

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

&НаСервере
Функция ПоместитьТоварыВоВременноеХранилище()

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

	РезультатЗапроса = Запрос.Выполнить();

	ТаблицаТоваров = РезультатЗапроса.Выгрузить();
	
	Возврат ПоместитьВоВременноеХранилище(ТаблицаТоваров, УникальныйИдентификатор);

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

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

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

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

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

&НаКлиенте
Процедура ДобавитьТоварыПоОтборуЗавершение(Результат, ДополнительныеПараметры) Экспорт 

	Если НЕ ЭтоАдресВременногоХранилища(Результат) Тогда
		Возврат;
	КонецЕсли; 
	
	Если ЗначениеЗаполнено(Результат) Тогда
		ДобавитьТоварыИзВременногоХранилищаНаСервере(Результат, Истина);
	КонецЕсли;

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

&НаКлиенте
Процедура УстановитьРейтингПродаж(Команда)
	
	Если Элементы.Товары.ВыделенныеСтроки.Количество() = 0 Тогда
	
		ПоказатьПредупреждение(, НСтр("ru = 'Необходимо выделить строки в списке'"));
		Возврат;
	
	КонецЕсли;
	
	ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ВыделенныеСтроки[0]).РейтингПродаж;
	
	Оповещение = Новый ОписаниеОповещения("УстановитьРейтингПродажЗавершение", ЭтотОбъект);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущаяСтрока);
	ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);
	ПараметрыФормы.Вставить("РежимВыбора", Истина);
	ПараметрыФормы.Вставить("ЗакрыватьПриЗакрытииВладельца", Истина);
	ПараметрыФормы.Вставить("РазрешитьВыборКорня", Ложь);
	
	ОткрытьФорму("Справочник.РейтингиПродажНоменклатуры.ФормаВыбора", 
		ПараметрыФормы, 
		ЭтотОбъект, 
		УникальныйИдентификатор,
		,
		,
		Оповещение, 
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьРейтингПродажЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт

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

&НаКлиенте
Процедура ЗагрузитьТоварыИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
	
	Если АдресЗагруженныхДанных = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	ЗагрузитьТоварыИзФайлаНаСервере(АдресЗагруженныхДанных);
	
КонецПроцедуры

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

	КонецЦикла;
	
	Если ТоварыДобавлены Тогда
		Модифицированность = Истина;
	КонецЕсли;
	
КонецПроцедуры

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

Связанные материалы