Установка цен номенклатуры / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

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

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Замер = ОценкаПроизводительности.НачатьЗамерДлительнойОперации(
	"Документ.УстановкаЦенНоменклатуры.МодульОбъекта.ОбработкаПроведения");
	
	УстановитьБлокировкуЦенНоменклатуры(Отказ);
	Если Отказ Тогда
		Возврат;
	КонецЕсли; 
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
	КоличествоОбработанныхДанных = (Товары.Количество() + Товары2_5.Количество()) / 10;
	ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(Замер, КоличествоОбработанныхДанных);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьБлокировкуЦенНоменклатуры(Отказ);
	Если Отказ Тогда
		Возврат;
	КонецЕсли; 
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ПриКопировании(ОбъектКопирования)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Если ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25(ТекущаяДатаСеанса()) Тогда
		Если Товары.Количество() > 0  Тогда
			Товары.Очистить();
		КонецЕсли;
	Иначе
		Если Товары2_5.Количество() > 0  Тогда
			Товары2_5.Очистить();
		КонецЕсли;
	КонецЕсли;
	
	ИнициализироватьДокумент();
	Согласован = Ложь;
	
КонецПроцедуры

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

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

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

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

#Область ИнициализацияИЗаполнение

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

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

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

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

// Процедура заполнения документа на основании заявки на возврат товаров от клиента.
//
// Параметры:
//	ДокументОснование - ДокументСсылка.ЗаявкаНаВозвратТоваровОтКлиента - Ссылка на заявку
//	ДанныеЗаполнения - Структура - Данные заполнения документа.
//	
Процедура ЗаполнитьПоЗаказуПоставщику(
	Знач ДокументОснование,
	ДанныеЗаполнения)
	
	// Заполним данные шапки документа.
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ЗаказПоставщикуТовары.Номенклатура   КАК Номенклатура,
	|	ЗаказПоставщикуТовары.Характеристика КАК Характеристика,
	|	ЗаказПоставщикуТовары.Упаковка       КАК Упаковка
	|ИЗ
	|	Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
	|ГДЕ
	|	ЗаказПоставщикуТовары.Ссылка = &Ссылка");
	Запрос.УстановитьПараметр("Ссылка", ДокументОснование);
	
	РезультатЗапроса = Запрос.Выполнить();
	Если РезультатЗапроса.Пустой() Тогда
		Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не требуется вводить установку цен номенклатуры на основании документа %1'"),
			ДокументОснование);
		ВызватьИсключение Текст;
	Иначе
		
		ЭтотОбъект.ДокументОснование = ДокументОснование;
		ЗагрузитьТовары(РезультатЗапроса.Выгрузить());
		
	КонецЕсли;
	
КонецПроцедуры

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

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

// Процедура заполнения документа на основании прочего оприходования товаров.
//
// Параметры:
//	ДокументОснование - ДокументСсылка.ЗаявкаНаВозвратТоваровОтКлиента - Ссылка на заявку
//	ДанныеЗаполнения - Структура - Данные заполнения документа.
//	
Процедура ЗаполнитьПоПрочемуОприходованиюТоваров(
	Знач ДокументОснование,
	ДанныеЗаполнения)
	
	// Заполним данные шапки документа.
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.Серия,
	|	Товары.Упаковка КАК Упаковка
	|ИЗ
	|	Документ.ПрочееОприходованиеТоваров.Товары КАК Товары
	|ГДЕ
	|	Товары.Ссылка = &Ссылка");
	Запрос.УстановитьПараметр("Ссылка", ДокументОснование);
	
	РезультатЗапроса = Запрос.Выполнить();
	Если РезультатЗапроса.Пустой() Тогда
		Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не требуется вводить установку цен номенклатуры на основании документа %1'"),
			ДокументОснование);
		ВызватьИсключение Текст;
	Иначе
		
		ЭтотОбъект.ДокументОснование = ДокументОснование;
		ЗагрузитьТовары(РезультатЗапроса.Выгрузить());
		
	КонецЕсли;
	
КонецПроцедуры

// Процедура заполнения документа на основании изменения ассортимента.
//
// Параметры:
//	ДокументОснование - ДокументСсылка.ИзменениеАссортимента - ссылка на документ
//	ДанныеЗаполнения - Структура - Данные заполнения документа.
//	
Процедура ЗаполнитьПоИзменениюАссортимента(
	Знач ДокументОснование,
	ДанныеЗаполнения)
	
	АссортиментСервер.ПроверитьНеобходимостьУстановкиЦенНаОсновании(ДанныеЗаполнения.Ссылка);
	
	РезультатПакетаВидыЦенИТовары = АссортиментСервер.РезультатПакетаВидыЦенИТоварыДляУстановкиПоАссортименту(ДанныеЗаполнения.Ссылка);
	ТаблицаВидовЦен   = РезультатПакетаВидыЦенИТовары[1].Выгрузить();
	ТаблицаТоваров    = РезультатПакетаВидыЦенИТовары[0].Выгрузить();
	
	Если ТаблицаВидовЦен.Количество() = 0 Тогда
		
		ТекстОшибки = НСтр("ru='Нет доступных видов цен для установки цен номенклатуры.
		|Оформление документа не требуется. 
		|Заполнение документа не выполнено.'");
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ДанныеЗаполнения.Ссылка);
		
		ВызватьИсключение ТекстОшибки;
		
	Иначе	
		
		ЭтотОбъект.ДокументОснование = ДокументОснование;
		ВидыЦен.Загрузить(ТаблицаВидовЦен);
		ЗагрузитьТовары(ТаблицаТоваров);
		
	КонецЕсли;
	
КонецПроцедуры


// Инициализирует установку цен номенклатуры.
//
Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)

	Ответственный = Пользователи.ТекущийПользователь();

	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСогласованиеЦенНоменклатуры")
	 Или ПраваПользователяПовтИсп.УстановкаЦенНоменклатурыБезСогласования() Тогда
		Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
	Иначе
	    Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.НеСогласован;
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьПоТаблицеНоменклатуры(ДанныеЗаполнения)
	
	ТаблицаНоменклатуры = ПолучитьИзВременногоХранилища(ДанныеЗаполнения.ТаблицаНоменклатуры); // ТаблицаЗначений
	ЗагрузитьТовары(ТаблицаНоменклатуры);
	
	ТаблицаНоменклатуры.Свернуть("ВидЦены");
	
	ВидыЦен.Загрузить(ТаблицаНоменклатуры);
	
	Дата = ДанныеЗаполнения.Дата;
		
КонецПроцедуры

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

		СтруктураНастроек.ОбязательныеПоля.Добавить("Номенклатура");
		СтруктураНастроек.ОбязательныеПоля.Добавить("Характеристика");
		СтруктураНастроек.ОбязательныеПоля.Добавить("ХарактеристикаЦО");
		СтруктураНастроек.ОбязательныеПоля.Добавить("Серия");
		СтруктураНастроек.ОбязательныеПоля.Добавить("СерияЦО");
		СтруктураНастроек.ОбязательныеПоля.Добавить("Упаковка");
		СтруктураНастроек.ОбязательныеПоля.Добавить("УпаковкаЦО");
		СтруктураНастроек.ОбязательныеПоля.Добавить("ВидЦены");
		
		СтруктураРезультата = Обработки.ПодборТоваровПоОтбору.ПодготовитьСтруктуруДанных(СтруктураНастроек);
		
		Товары2_5.Загрузить(СтруктураРезультата.ТаблицаТоваров);
	Иначе
		Товары.Загрузить(ТаблицаТовары);
	КонецЕсли;
		
КонецПроцедуры


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

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

#Область ПрограммныйИнтерфейс

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

#КонецЕсли

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