Файл: Разработка и реализация конфигурации «Терминал аэропорта» в среде 1С.pdf
Добавлен: 18.05.2023
Просмотров: 403
Скачиваний: 4
| И (&ТекущееВремя МЕЖДУ ВремяДействия.ВремяНачала И ВремяДействия.ВремяОкончания)
| И (СкидкиНатуральные.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1)
| ИЛИ СкидкиНатуральные.ДатаОкончания >= &Дата))
|");
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", ХарактеристикаНоменклатуры);
Запрос.УстановитьПараметр("МассивПолучателей", МассивПолучателей);
Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
Запрос.УстановитьПараметр("ДеньНедели", Перечисления.ДниНедели[ДеньНедели(Дата) - 1]);
Запрос.УстановитьПараметр("ТекущееВремя", Дата(1, 1, 1, Час(Дата), Минута(Дата), Секунда(Дата)));
Возврат Не Запрос.Выполнить().Пустой();
КонецФункции // ЭтоСпецПредложение()
// Изменяет переданную цену по условию продаж.
//
// Параметры:
// Дата - дата, на которую нужно брать условие продаж.
// Номенклатура - переданная номенклатура.
// УсловиеПродаж - переданное условие продаж.
// ПолученнаяЦена - цена, которую надо изменить. В эту переменную возвращается новая цена.
//
Процедура ИзменитьЦенуПоУсловиюПродаж(Дата, Номенклатура, УсловиеПродаж, ПолученнаяЦена) Экспорт
Если ПолученнаяЦена <> 0 И ЗначениеЗаполнено(УсловиеПродаж) Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("УсловиеПродаж", УсловиеПродаж);
Запрос.УстановитьПараметр("Группы", ПолучитьМассивГруппНоменклатуры(Номенклатура));
Запрос.Текст = "
|ВЫБРАТЬ
| НаценкиПоУсловиямПродаж.ПроцентНаценки КАК ПроцентНаценки
|ИЗ
| РегистрСведений.НаценкиПоУсловиямПродаж.СрезПоследних(&Дата, УсловиеПродаж = &УсловиеПродаж
| И НоменклатурнаяЦеноваяГруппа В (&Группы)) КАК НаценкиПоУсловиямПродаж
|";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ПолученнаяЦена = ПолученнаяЦена * (1 + Выборка.ПроцентНаценки / 100);
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ИзменитьЦенуПоУсловиюПродаж()
// Возвращает массив из двух элементов: номенклатурной и ценовой группы, к которым принадлежит
// переданная номенклатура.
//
// Параметры:
// Номенклатура - переданная номенклатура.
//
// Возвращаемое значение:
// Массив - номенклатурная и ценовая группа к которым принадлежит переданная номенклатура.
//
Функция ПолучитьМассивГруппНоменклатуры(Номенклатура) Экспорт
Группы = Новый Массив;
Группы.Добавить(Номенклатура.ЦеноваяГруппа);
Группы.Добавить(Номенклатура.НоменклатурнаяГруппа);
Возврат Группы;
КонецФункции // ПолучитьМассивГруппНоменклатуры()
// Возвращает массив характеристик: ПустаяХарактеристика + ХарактеристикаНоменклатуры,
// если ХарактеристикаНоменклатуры <> Неопределено
//
// Параметры:
// ХарактеристикаНоменклатуры - переданная характеристика номенклатуры.
//
// Возвращаемое значение:
// Массив - если ХарактеристикаНоменклатуры = Неопределено, то в массиве только ПустаяХарактеристика.
//
Функция ПолучитьМассивХарактеристик(ХарактеристикаНоменклатуры) Экспорт
Характеристики = Новый Массив;
Характеристики.Добавить(Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
Если ХарактеристикаНоменклатуры <> Неопределено Тогда
Характеристики.Добавить(ХарактеристикаНоменклатуры);
КонецЕсли;
Возврат Характеристики;
КонецФункции // ПолучитьМассивХарактеристик()
// Округляет число по заданному порядку. Если задано (=Истина) "ОкруглятьВБольшуюСторону",
// то число 123.37 при порядке округление 0.5 превратиться в 123.50, а число 0.1
// при порядке округления 5 станет равным 5.
//
// Параметры:
// Число - исходное число
// ПорядокОкругления - элемент перечисления Порядки окгугления:
// "шаг" округления (0.01 (арифметическое), 0.01, 0.05, 0.1, 0.5, 1, 5, 10, 50, 100)
// ОкруглятьВБольшуюСторону - булево, определяет способ округления: если Истина,
// то при порядке округления "5" 0.01 будет округлена до 5,
// Ложь - округление по арифметическим правилам
//
// Возвращаемое значение:
// Округленное по заданному порядку значение
//
Функция ОкруглитьЦену(Число, ПараметрПорядокОкругления, ОкруглятьВБольшуюСторону) Экспорт
Перем Результат;
// Преобразуем порядок округления числа.
// Если передали пустое значение порядка, то округлим до копеек.
Если НЕ ЗначениеЗаполнено(ПараметрПорядокОкругления) Тогда
ПорядокОкругления = Перечисления.ПорядкиОкругления.Окр0_01;
Иначе
ПорядокОкругления = ПараметрПорядокОкругления;
КонецЕсли;
Порядок = Число(Строка(ПорядокОкругления));
// вычислим количество интервалов, входящих в число
КоличествоИнтервал = Число / Порядок;
// вычислим целое количество интервалов.
КоличествоЦелыхИнтервалов = Цел(КоличествоИнтервал);
Если КоличествоИнтервал = КоличествоЦелыхИнтервалов Тогда
// Числа поделились нацело. Округлять не нужно.
Результат = Число;
Иначе
Если ОкруглятьВБольшуюСторону Тогда
// При порядке округления "0.05" 0.371 должно округлитья до 0.4
Результат = Порядок * (КоличествоЦелыхИнтервалов + 1);
Иначе
// При порядке округления "0.05" 0.371 должно округлитья до 0.35,
// а 0.376 до 0.4
Результат = Порядок * Окр(КоличествоИнтервал,0,РежимОкругления.Окр15как20);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции // ОкруглитьЦену()
// Производит пересчет цен при изменении флагов учета налогов.
// Пересчет зависит от способа заполнения цен, при заполнении По ценам номенклатуры (при продаже)
// хочется избегать ситуаций, когда компания «теряет деньги» при пересчете налогов.
// Поэтому если в документе флаг "Учитывать налог" выключен, то цены должны браться напрямую из справочника,
// потому что хочется продавать по той же цене, независимо от режима налогообложения.
// Например, если отпускная цена задана с НП для избежания ошибок округления, то это не значит,
// что при отпуске без НП мы должны продать дешевле. Если же флаг учета налога в документе включен,
// то цены должны пересчитываться при подстановке в документ:
// налог должен включаться или не включаться в зависимости от флага включения налога в типе цен.
// При заполнении по ценам контрагентов (при покупке) хочется хранить цены поставщиков.
// Поэтому нужно пересчитывать всегда по установленным флагам в документе и в типе цен.
// Это гарантирует, что при записи цен в регистр и последующем их чтении,
// например, при заполнении следующего документа, мы с точностью до ошибок округления при пересчете
// получим те же самые цены.
//
// Параметры:
// Цена - число, пересчитваемое значение цены,
// СпособЗаполненияЦен - ссылка на перечисление СпособыЗаполненияЦен, определяет способ расчета,
// "при продаже" или "при покупке", см описание функции,
// ЦенаВключаетНДС - булево, определяет содержит ли переданное значение цены НДС,
// УчитыватьНДС - булево, определяет должно ли новое значение цены учитвать НДС,
// СуммаВключаетНДС - булево, определяет должно ли новое значение цены включать НДС,
// СтавкаНДС - число, ставка НДС,
//
// Возвращаемое значение:
// Числое, новое значение цены.
//
Функция ПересчитатьЦенуПриИзмененииФлаговНалогов(Цена, СпособЗаполненияЦен, ЦенаВключаетНДС,
УчитыватьНДС, СуммаВключаетНДС, СтавкаНДС) Экспорт
// Инициализация переменных
НадоВключитьНДС = Ложь;
НадоИсключитьНДС = Ложь;
НоваяЦена = Цена;
Если СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры Тогда
Если УчитыватьНДС Тогда
Если СуммаВключаетНДС
И (НЕ ЦенаВключаетНДС) Тогда
// Надо добавлять НДС
НадоВключитьНДС = Истина;
ИначеЕсли (НЕ СуммаВключаетНДС)
И ЦенаВключаетНДС Тогда
// Надо исключать НДС
НадоИсключитьНДС = Истина;
КонецЕсли;
КонецЕсли;
Иначе // Надо пересчитывать строго по флагам включения
Если УчитыватьНДС Тогда
Если СуммаВключаетНДС
И (НЕ ЦенаВключаетНДС) Тогда
// Надо добавлять НДС
НадоВключитьНДС = Истина;
ИначеЕсли (НЕ СуммаВключаетНДС)
И ЦенаВключаетНДС Тогда
// Надо исключать НДС
НадоИсключитьНДС = Истина;
КонецЕсли;
Иначе
Если ЦенаВключаетНДС Тогда
// Надо исключать НДС
НадоИсключитьНДС = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если НадоИсключитьНДС Тогда
НоваяЦена = (НоваяЦена * 100) / (100 + СтавкаНДС);
КонецЕсли;
Если НадоВключитьНДС Тогда
НоваяЦена = (НоваяЦена * (100 + СтавкаНДС)) / 100;
КонецЕсли;
Возврат НоваяЦена;
КонецФункции // ПересчитатьЦенуПриИзмененииФлаговНалогов()
// Пересчитывает цену для другой единицы измерения
//
// Параметры:
// Цена - число, значение цены, которое надо пересчитать,
// ЕдиницаЦены - ссылка на справочник "ЕдиницыИзмерения", определяет единицу, за которую назначена Цена
// НоваяЕдиница - ссылка на справочник "ЕдиницыИзмерения", определяет единицу, за которую надо получить
// новое значение цены. Если не заполнено, то устанавливается равной ЕдиницаЦены без пересчета.
//
// Возвращаемое значение:
// Новое значение цены.
//
Функция ПересчитатьЦенуПриИзмененииЕдиницы(Цена, ЕдиницаЦены, НоваяЕдиница) Экспорт
НовоеЗначениеЦены = Цена;
Если ЕдиницаЦены <> НоваяЕдиница Тогда
Если НЕ ЗначениеЗаполнено(НоваяЕдиница) Тогда // параметр единицы не задан, значить надо возвращать в единице цены
Если НЕ ЗначениеЗаполнено(ЕдиницаЦены) Тогда // если не задана единица цены, то будем счатать цену нулевой
НовоеЗначениеЦены = 0;
Иначе
НоваяЕдиница = ЕдиницаЦены;
КонецЕсли;
Иначе // если единица цены не совпадает с параметром, то надо пересчитать
Если НЕ ЗначениеЗаполнено(ЕдиницаЦены) Тогда // если не задана единица цены, то будем счатать цену нулевой
НовоеЗначениеЦены = 0;
Иначе
КоэффициентЦены = ЕдиницаЦены.Коэффициент;
НовоеЗначениеЦены = ?(НЕ ЗначениеЗаполнено(КоэффициентЦены), 0,
НовоеЗначениеЦены * НоваяЕдиница.Коэффициент / КоэффициентЦены)
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат НовоеЗначениеЦены;
КонецФункции // ПересчитатьЦенуПриИзмененииЕдиницы()
// Пересчитывает цену в другую валюту
//
// Цена - число, значение цены, которое надо пересчитать,
// ВалютаЦены - ссылка на справочник "Валюты", определяет валюту, в которой назначена Цена
// НоваяВалюта - ссылка на справочник "Валюты", определяет валюту, в которой надо получить
// новое значение цены. Если не заполнено, то устанавливается равной ВалютаЦены без пересчета,
// КурсНовойВалюты - курс новой валюты, по которому надо пересчитать цену, если не задан, то берем курс по справочнику
// КратностьНовойВалюты - кратность новой валюты, по которой надо пересчитать цену, если не задана, то берем курс по справочнику
// Дата - дата, на которую надо пересчитать цену.
//
// Возвращаемое значение:
// Новое значение цены.
//
Функция ПересчитатьЦенуПриИзмененииВалюты(Цена, ВалютаЦены, НоваяВалюта, КурсНовойВалюты = 0, КратностьНовойВалюты = 1, Дата = Неопределено ) Экспорт
НовоеЗначениеЦены = Цена;
Если НЕ ЗначениеЗаполнено(НоваяВалюта) Тогда // параметр валюты не задан, значить надо возвращать в валюте цены
НоваяВалюта = ВалютаЦены;
Иначе
Если НоваяВалюта <> ВалютаЦены Тогда // если валюта цены не совпадает с параметром, то надо пересчитать
Если НЕ ЗначениеЗаполнено(ВалютаЦены) Тогда // если не задана валюта цены, то будем счатать цену нулевой
НовоеЗначениеЦены = 0;
Иначе // валюты заданы и не совпадают, надо пересчитывать
СтруктураКурсЦены = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаЦены, Дата);
КурсЦены = СтруктураКурсЦены.Курс;
КратностьЦены = СтруктураКурсЦены.Кратность;
Если НЕ ЗначениеЗаполнено(КурсНовойВалюты) Тогда // если не задан курс, то курс берем по справочнику
СтруктураКурсНовойВалюты = МодульВалютногоУчета.ПолучитьКурсВалюты(НоваяВалюта, Дата);
КурсНовойВалюты = СтруктураКурсНовойВалюты.Курс;
КратностьНовойВалюты = СтруктураКурсНовойВалюты.Кратность;
КонецЕсли;
НовоеЗначениеЦены = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(НовоеЗначениеЦены, ВалютаЦены, НоваяВалюта,
КурсЦены, КурсНовойВалюты,КратностьЦены,КратностьНовойВалюты);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат НовоеЗначениеЦены;
КонецФункции // ПересчитатьЦенуПриИзмененииВалюты()
// Позволяет получить список реквизитов документа, необходимых для дальнейшей
// передачи в обработку заполнения цен и валют.