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