Файл: Разработка конфигурации «Взаиморасчеты с поставщиками» в среде 1С:Предприятие 8.3.(Выбор комплекса задач автоматизации).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.03.2023

Просмотров: 549

Скачиваний: 6

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

// Дата - дата (со временем), на которую будут рассчитаны цены.

//

Функция ПолучитьАктуальнуюДатуРасчетаЦен(ДатаЦен) Экспорт

ТекДата = ТекущаяДата();

Если НЕ ЗначениеЗаполнено(ДатаЦен) Тогда

Результат = ТекДата;

ИначеЕсли ДатаЦен = НачалоДня(ТекДата) Тогда

Результат = ТекДата;

Иначе

Результат = ДатаЦен;

КонецЕсли;

Возврат Результат;

КонецФункции // ПолучитьАктуальнуюДатуРасчетаЦен()

// Функция возвращает массив получателей скидки, для которых необходимо рассчитать скидки.

//

// Параметры:

// ВидРеализации - значение перечисления "ВидыСкидок".

// ДокументОбъект - объект документа.

//

// Возвращаемое значение:

// Массив - массив с получателями скидки.

//

Функция ПолучитьМассивПолучателейСкидки(ВидРеализации, ДокументОбъект) Экспорт

МассивПолучателей = Новый Массив;

Если ВидРеализации = Перечисления.ВидыСкидок.Розничная Тогда

МассивПолучателей.Добавить(ДокументОбъект.Склад);

МассивПолучателей.Добавить(Справочники.Склады.ПустаяСсылка());

Иначе

МассивПолучателей.Добавить(ДокументОбъект.Контрагент);

МассивПолучателей.Добавить(ДокументОбъект.ДоговорКонтрагента);

МассивПолучателей.Добавить(Справочники.ДоговорыКонтрагентов.ПустаяСсылка());

КонецЕсли;

Возврат МассивПолучателей;

КонецФункции // ПолучитьМассивПолучателейСкидки()

// Функция проверяет, является ли набор-комплект спец. предложением на указанную дату.

//

// Параметры:

// Номенклатура - набор-комплект, который нужно проверить.

// Дата - дата, на которую нужно проверить.

//

// Возвращаемое значение:

// Булево - Истина, если переданный набор-комплект является спец. предложением.

//

Функция ЭтоСпецПредложение(Дата, Номенклатура, ХарактеристикаНоменклатуры, МассивПолучателей) Экспорт

Запрос = Новый Запрос("

|ВЫБРАТЬ ПЕРВЫЕ 1

| 1 КАК Результат

|ИЗ

| РегистрСведений.СкидкиНоменклатурыНатуральные.СрезПоследних(&Дата,

| ПолучательСкидки В (&МассивПолучателей)) КАК СкидкиНатуральные

|ЛЕВОЕ СОЕДИНЕНИЕ

| РегистрСведений.ВремяДействияСкидок КАК ВремяДействия

|ПО

| СкидкиНатуральные.Регистратор = ВремяДействия.Регистратор

|ГДЕ

| СкидкиНатуральные.СпецПредложение = &Номенклатура

| И СкидкиНатуральные.ХарактеристикаСпецПредложения = &ХарактеристикаНоменклатуры

| И (ВремяДействия.Регистратор ЕСТЬ NULL

| ИЛИ ВремяДействия.ДеньНедели = &ДеньНедели

| И (&ТекущееВремя МЕЖДУ ВремяДействия.ВремяНачала И ВремяДействия.ВремяОкончания)


| И (СкидкиНатуральные.ДатаОкончания = ДАТАВРЕМЯ(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,

НовоеЗначениеЦены * НоваяЕдиница.Коэффициент / КоэффициентЦены)

КонецЕсли;

КонецЕсли;

КонецЕсли;

Возврат НовоеЗначениеЦены;