Регистрация цен номенклатуры поставщика / Модуль менеджера

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

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

#Область Проведение

// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
//  МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
//              регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
	
	МеханизмыДокумента.Добавить("ЦеныИСкидки");
	
КонецПроцедуры

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

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет список команд создания на основании.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.КомандыСозданияНаОсновании
//  Параметры - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.Параметры
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
	
	БизнесПроцессы.Задание.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
	
КонецПроцедуры

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

		Возврат КомандаСоздатьНаОсновании;
	КонецЕсли;

	Возврат Неопределено;
КонецФункции

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

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

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
//   Параметры - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.Параметры
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
КонецПроцедуры

// Заполняет регистрацию цен номенклатуры поставщика на основании приобретения товаров.
//
// Параметры:
//  Основание - ДокументСсылка.ПриобретениеТоваровУслуг - Ссылка на документ приобретения товаров.
//  ДокументОбъект - ДокументОбъект.РегистрацияЦенНоменклатурыПоставщика - Заполняемый документ.
//
Процедура ЗаполнитьПоПоступлениюТоваров(Основание, ДокументОбъект) Экспорт
	
	ИмяТаблицы = Основание.Метаданные().Имя;
	
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	ДокументПоступления.Дата КАК Дата,
	|	ДокументПоступления.Валюта КАК Валюта,
	|	ДокументПоступления.Партнер КАК Партнер,
	|	ДокументПоступления.ЦенаВключаетНДС КАК ЦенаВключаетНДС,
	|	ДокументПоступления.Ссылка КАК ДокументОснование,
	|	НЕ ДокументПоступления.Проведен КАК ЕстьОшибкиПроведен,
	|	ДокументПоступления.РегистрироватьЦеныПоставщика КАК РегистрироватьЦеныПоставщика
	|ИЗ
	|	Документ.ПоступлениеТоваровНаСклад КАК ДокументПоступления
	|ГДЕ
	|	ДокументПоступления.Ссылка = &Ссылка";
	
	Запрос = Новый Запрос(ТекстЗапроса);	
	Запрос.УстановитьПараметр("Ссылка", Основание);
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаШапка = РезультатЗапроса.Выбрать();
	ВыборкаШапка.Следующий();
	ОбщегоНазначенияУТ.ПроверитьВозможностьВводаНаОсновании(
		ВыборкаШапка.ДокументОснование,
		,
		ВыборкаШапка.ЕстьОшибкиПроведен,);
	СообщитьОбОшибкахРегистрацииЦенОснованием(ВыборкаШапка.РегистрироватьЦеныПоставщика, ВыборкаШапка.ДокументОснование);
	ЗаполнитьЗначенияСвойств(ДокументОбъект, ВыборкаШапка);
	
	ТекстЗапроса = 
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ПоступлениеТоваровНаСклад.ВидЦеныПоставщика.Валюта КАК Валюта
	|ПОМЕСТИТЬ Валюты
	|ИЗ
	|	Документ.ПоступлениеТоваровНаСклад КАК ПоступлениеТоваровНаСклад
	|ГДЕ
	|	ПоступлениеТоваровНаСклад.Ссылка = &Ссылка
	|	И НЕ ПоступлениеТоваровНаСклад.ВидЦеныПоставщика = ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	&Валюта
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Валюта
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	КурсыВалютСрезПоследних.Валюта КАК Валюта,
	|	КурсыВалютСрезПоследних.КурсЧислитель КАК КурсЧислитель,
	|	КурсыВалютСрезПоследних.КурсЗнаменатель КАК КурсЗнаменатель
	|ПОМЕСТИТЬ ВременнаяТаблицаКурсыВалют
	|ИЗ
	|	РегистрСведений.ОтносительныеКурсыВалют.СрезПоследних(&Дата, Валюта В
	|		(ВЫБРАТЬ РАЗЛИЧНЫЕ
	|			Валюты.Валюта
	|		ИЗ
	|			Валюты)
	|	И БазоваяВалюта = &БазоваяВалюта) КАК КурсыВалютСрезПоследних
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Валюта
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТаблицаТовары.НоменклатураПартнера КАК НоменклатураПартнера,
	|	ТаблицаТовары.Номенклатура КАК Номенклатура,
	|	ТаблицаТовары.Характеристика КАК Характеристика,
	|	ДокументПоступления.ВидЦеныПоставщика КАК ВидЦеныПоставщика,
	|	ТаблицаТовары.Упаковка КАК Упаковка,
	|	ВЫРАЗИТЬ(ТаблицаТовары.Цена * ВЫБОР
	|		КОГДА &ЦенаВключаетНДС
	|		И НЕ ДокументПоступления.ВидЦеныПоставщика.ЦенаВключаетНДС
	|			ТОГДА ВЫБОР
	|				КОГДА ТаблицаТовары.СтавкаНДС = ЗНАЧЕНИЕ(Справочник.СтавкиНДС.ПустаяСсылка)
	|					ТОГДА 1
	|				ИНАЧЕ 100 / (100 + ТаблицаТовары.СтавкаНДС.Ставка)
	|			КОНЕЦ
	|		КОГДА НЕ &ЦенаВключаетНДС
	|		И ДокументПоступления.ВидЦеныПоставщика.ЦенаВключаетНДС
	|			ТОГДА (ТаблицаТовары.СтавкаНДС.Ставка + 100) / 100
	|		ИНАЧЕ 1
	|	КОНЕЦ * ВЫБОР
	|		КОГДА &Валюта <> ДокументПоступления.ВидЦеныПоставщика.Валюта
	|			ТОГДА ВЫБОР
	|				КОГДА ЕСТЬNULL(КурсыВалютыСоглашения.КурсЗнаменатель, 0) > 0
	|				И ЕСТЬNULL(КурсыВалютыСоглашения.КурсЧислитель, 0) > 0
	|				И ЕСТЬNULL(КурсыВалюты.КурсЗнаменатель, 0) > 0
	|				И ЕСТЬNULL(КурсыВалюты.КурсЧислитель, 0) > 0
	|					ТОГДА КурсыВалюты.КурсЧислитель * КурсыВалютыСоглашения.КурсЗнаменатель / (КурсыВалютыСоглашения.КурсЧислитель *
	|						КурсыВалюты.КурсЗнаменатель)
	|				ИНАЧЕ 0
	|			КОНЕЦ
	|		ИНАЧЕ 1
	|	КОНЕЦ КАК ЧИСЛО(31, 2)) КАК Цена
	|ПОМЕСТИТЬ Товары
	|ИЗ
	|	Документ.ПоступлениеТоваровНаСклад.Товары КАК ТаблицаТовары
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровНаСклад КАК ДокументПоступления
	|		ПО (ДокументПоступления.Ссылка = ТаблицаТовары.Ссылка)
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблицаКурсыВалют КАК КурсыВалюты
	|		ПО (КурсыВалюты.Валюта = &Валюта)
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблицаКурсыВалют КАК КурсыВалютыСоглашения
	|		ПО (КурсыВалютыСоглашения.Валюта = ДокументПоступления.ВидЦеныПоставщика.Валюта)
	|ГДЕ
	|	ТаблицаТовары.Ссылка = &Ссылка
	|	И ДокументПоступления.ВидЦеныПоставщика <> ЗНАЧЕНИЕ(Справочник.ВидыЦенПоставщиков.ПустаяСсылка)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТаблицаТовары.Номенклатура КАК Номенклатура,
	|	ТаблицаТовары.Характеристика КАК Характеристика,
	|	ТаблицаТовары.ВидЦеныПоставщика КАК ВидЦеныПоставщика,
	|	СРЕДНЕЕ(ТаблицаТовары.Цена / ВЫБОР
	|		КОГДА ТаблицаТовары.Упаковка <> ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
	|			ТОГДА &ТекстЗапросаКоэффициентУпаковки
	|		ИНАЧЕ 1
	|	КОНЕЦ) КАК ЦенаЗаБазовуюЕдиницу,
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТаблицаТовары.Упаковка) КАК КоличествоРазличныхУпаковок
	|ПОМЕСТИТЬ ТоварыСРазличнымиУпаковкамиЦенами
	|ИЗ
	|	Товары КАК ТаблицаТовары
	|СГРУППИРОВАТЬ ПО
	|	ТаблицаТовары.Номенклатура,
	|	ТаблицаТовары.Характеристика,
	|	ТаблицаТовары.ВидЦеныПоставщика
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	МАКСИМУМ(ТаблицаТовары.НоменклатураПартнера) КАК НоменклатураПартнера,
	|	ТаблицаТовары.Номенклатура КАК Номенклатура,
	|	ТаблицаТовары.Характеристика КАК Характеристика,
	|	ТаблицаТовары.ВидЦеныПоставщика КАК ВидЦеныПоставщика,
	|	МИНИМУМ(ВЫБОР
	|		КОГДА ТоварыСРазличнымиУпаковкамиЦенами.КоличествоРазличныхУпаковок > 1
	|			ТОГДА ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
	|		ИНАЧЕ ТаблицаТовары.Упаковка
	|	КОНЕЦ) КАК Упаковка,
	|	СРЕДНЕЕ(ВЫБОР
	|		КОГДА ТоварыСРазличнымиУпаковкамиЦенами.КоличествоРазличныхУпаковок > 1
	|			ТОГДА ТоварыСРазличнымиУпаковкамиЦенами.ЦенаЗаБазовуюЕдиницу
	|		ИНАЧЕ ТаблицаТовары.Цена
	|	КОНЕЦ) КАК Цена
	|ИЗ
	|	Товары КАК ТаблицаТовары
	|		ЛЕВОЕ СОЕДИНЕНИЕ ТоварыСРазличнымиУпаковкамиЦенами КАК ТоварыСРазличнымиУпаковкамиЦенами
	|		ПО ТаблицаТовары.Номенклатура = ТоварыСРазличнымиУпаковкамиЦенами.Номенклатура
	|		И ТаблицаТовары.Характеристика = ТоварыСРазличнымиУпаковкамиЦенами.Характеристика
	|		И ТаблицаТовары.ВидЦеныПоставщика = ТоварыСРазличнымиУпаковкамиЦенами.ВидЦеныПоставщика
	|СГРУППИРОВАТЬ ПО
	|	ТаблицаТовары.Номенклатура,
	|	ТаблицаТовары.Характеристика,
	|	ТаблицаТовары.ВидЦеныПоставщика";
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Документ.ПриобретениеТоваровУслуг", "Документ." + ИмяТаблицы);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ТекстЗапросаКоэффициентУпаковки",
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
		"ТаблицаТовары.Упаковка",
		"ТаблицаТовары.Номенклатура"));
		
	Запрос = Новый Запрос(ТекстЗапроса);
		
	Запрос.УстановитьПараметр("Ссылка",                    Основание);
	Запрос.УстановитьПараметр("Дата",                      ВыборкаШапка.Дата);
	Запрос.УстановитьПараметр("Валюта",                    ВыборкаШапка.Валюта);
	Запрос.УстановитьПараметр("ЦенаВключаетНДС",           ВыборкаШапка.ЦенаВключаетНДС);
	Запрос.УстановитьПараметр("БазоваяВалюта", ЗначениеНастроекПовтИсп.БазоваяВалютаПоУмолчанию());
	
	РезультатЗапроса = Запрос.ВыполнитьПакет();
	ДокументОбъект.Товары.Загрузить(РезультатЗапроса[3].Выгрузить());
	
КонецПроцедуры

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Партнер)";

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

#КонецОбласти
// Заполняет список команд печати.
//
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

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

#Область Проведение

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных; 

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

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

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

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

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

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

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

#КонецЕсли

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