berest.andriy@gmail.com @ Сегодня, 10:23
необходимо зарегистрироваться для просмотра ссылки
,
// Функция возвращает цену контрагента для требуемой номенклатуры в указанном типе цен ,
// на заданную дату, за заданную единицу измерения, пересчитанную в требуемую валюту по заданному курсу.
//
// Параметры:
// Номенклатура - ссылка на элемент справочника "Номенклатура", для которого надо получить цену,
// ХарактеристикаНоменклатуры - ссылка на элемент справочника "Характеристики номенклатуры",
// Контрагент - ссылка на элемент справочника "Контрагенты", для которого надо получить цену,
// ТипЦен - ссылка на элемент справочника "Типы цен", опредедяет цену какого типа надо получить,
// Дата - дата, на которую надо получить цену, если не заполнено, то берется рабочая дата
// ЕдиницаИзмерения - ссылка на элемент справочника "Единицы измерения", определяет для какой единицы надо получить
// цену, если не заполнен, то заполняется единицей цены
// Валюта - ссылка на элемент справочника "Валюты", определяет валюту. в которой надо вернуть цену,
// если не заполнен, то заполняется валютой цены
// Курс - число, курс требуемой валюты, если не заполнен, берется курс из регистра
// сведений "Курсы валют".
// Кратность - число, кратность требуемой валюты, если не заполнена, берется курс из регистра
// сведений "Курсы валют".
//
// Возвращаемое значение:
// Число, рассчитанное значение цены.
//
Функция ПолучитьЦенуКонтрагента(Номенклатура, ХарактеристикаНоменклатуры = Неопределено, Контрагент,
ТипЦен, Дата = Неопределено, ЕдиницаИзмерения = Неопределено,
Валюта = Неопределено, Курс = 0, Кратность = 1,
ДоговорКонтрагента = Неопределено, УсловиеПродаж = Неопределено) Экспорт
ХарактеристикиНоменклатуры = ПолучитьМассивХарактеристик(ХарактеристикаНоменклатуры);
Дата = ПолучитьАктуальнуюДатуРасчетаЦен(Дата);
ПолученнаяЦена = 0;
Если ДоговорКонтрагента <> Неопределено Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Договор", ДоговорКонтрагента);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("ХарактеристикиНоменклатуры", ХарактеристикиНоменклатуры);
ТекстЗапроса = "
|ВЫБРАТЬ ПЕРВЫЕ 1
| УсловияПоставок.Цена КАК Цена,
| ВЫБОР КОГДА сНоменклатура.Услуга И УсловияПоставок.ЕдиницаИзмерения = ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА сНоменклатура.ЕдиницаХраненияОстатков
| ИНАЧЕ УсловияПоставок.ЕдиницаИзмерения
| КОНЕЦ КАК ЕдиницаИзмерения,
| УсловияПоставок.ВалютаЦены КАК ВалютаЦены
|ИЗ
| РегистрСведений.УсловияПоставокПоДоговорамКонтрагентовПоНоменклатуре.СрезПоследних(&Дата,
| ДоговорКонтрагента = &Договор И Номенклатура = &Номенклатура
| И ХарактеристикаНоменклатуры В (&ХарактеристикиНоменклатуры)) КАК УсловияПоставок
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Справочник.Номенклатура КАК сНоменклатура
|ПО
| сНоменклатура.Ссылка = УсловияПоставок.Номенклатура
|ГДЕ
| УсловияПоставок.Цена <> 0 И сНоменклатура.Ссылка = &Номенклатура
|УПОРЯДОЧИТЬ ПО
| УсловияПоставок.ХарактеристикаНоменклатуры УБЫВ
|";
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ПолученнаяЦена = ПересчитатьЦенуПриИзмененииЕдиницы(Выборка.Цена, Выборка.ЕдиницаИзмерения, ЕдиницаИзмерения);
ПолученнаяЦена = ПересчитатьЦенуПриИзмененииВалюты(ПолученнаяЦена, Выборка.ВалютаЦены, Валюта, Курс, Кратность, Дата);
КонецЕсли;
КонецЕсли;
Если ПолученнаяЦена = 0 Тогда // особых условий нет
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("ХарактеристикиНоменклатуры", ХарактеристикиНоменклатуры);
Запрос.УстановитьПараметр("ТипЦен", ТипЦен);
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
| ЦеныНоменклатурыКонтрагентов.Цена КАК Цена,
| ВЫБОР КОГДА сНоменклатура.Услуга И ЦеныНоменклатурыКонтрагентов.ЕдиницаИзмерения = ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)
| ТОГДА сНоменклатура.ЕдиницаХраненияОстатков
| ИНАЧЕ ЦеныНоменклатурыКонтрагентов.ЕдиницаИзмерения
| КОНЕЦ КАК ЕдиницаИзмерения,
| ЦеныНоменклатурыКонтрагентов.Валюта КАК Валюта
|ИЗ
| РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&Дата, Номенклатура = &Номенклатура И ТипЦен = &ТипЦен
| И ХарактеристикаНоменклатуры В(&ХарактеристикиНоменклатуры)) КАК ЦеныНоменклатурыКонтрагентов
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| Справочник.Номенклатура КАК сНоменклатура
|ПО
| сНоменклатура.Ссылка = ЦеныНоменклатурыКонтрагентов.Номенклатура
|ГДЕ
| сНоменклатура.Ссылка = &Номенклатура
|УПОРЯДОЧИТЬ ПО
| ХарактеристикаНоменклатуры УБЫВ
|";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ПолученнаяЦена = ПересчитатьЦенуПриИзмененииЕдиницы(Выборка.Цена, Выборка.ЕдиницаИзмерения, ЕдиницаИзмерения);
ПолученнаяЦена = ПересчитатьЦенуПриИзмененииВалюты(ПолученнаяЦена, Выборка.Валюта, Валюта, Курс, Кратность, КонецДня(Дата));
КонецЕсли;
КонецЕсли;
ИзменитьЦенуПоУсловиюПродаж(Дата, Номенклатура, УсловиеПродаж, ПолученнаяЦена);
Возврат ПолученнаяЦена;
КонецФункции // ПолучитьЦенуКонтрагента()
Цена = Ценообразование.ПолучитьЦенуКонтрагента(Номенклатура, Характеристика, Контрагент, ТипЦен, Дата, ЕдиницаХранения, Валюта);