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

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

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

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

Добавлен: 28.03.2023

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

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

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

КонецФункции // ПересчитатьЦенуПриИзмененииЕдиницы()

// Пересчитывает цену в другую валюту

//

// Цена - число, значение цены, которое надо пересчитать,

// ВалютаЦены - ссылка на справочник "Валюты", определяет валюту, в которой назначена Цена

// НоваяВалюта - ссылка на справочник "Валюты", определяет валюту, в которой надо получить

// новое значение цены. Если не заполнено, то устанавливается равной ВалютаЦены без пересчета,

// КурсНовойВалюты - курс новой валюты, по которому надо пересчитать цену, если не задан, то берем курс по справочнику

// КратностьНовойВалюты - кратность новой валюты, по которой надо пересчитать цену, если не задана, то берем курс по справочнику

// Дата - дата, на которую надо пересчитать цену.

//

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

// Новое значение цены.

//

Функция ПересчитатьЦенуПриИзмененииВалюты(Цена, ВалютаЦены, НоваяВалюта, КурсНовойВалюты = 0, КратностьНовойВалюты = 1, Дата = Неопределено ) Экспорт

НовоеЗначениеЦены = Цена;

Если НЕ ЗначениеЗаполнено(НоваяВалюта) Тогда // параметр валюты не задан, значить надо возвращать в валюте цены

НоваяВалюта = ВалютаЦены;

Иначе

Если НоваяВалюта <> ВалютаЦены Тогда // если валюта цены не совпадает с параметром, то надо пересчитать

Если НЕ ЗначениеЗаполнено(ВалютаЦены) Тогда // если не задана валюта цены, то будем счатать цену нулевой

НовоеЗначениеЦены = 0;

Иначе // валюты заданы и не совпадают, надо пересчитывать

СтруктураКурсЦены = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаЦены, Дата);

КурсЦены = СтруктураКурсЦены.Курс;

КратностьЦены = СтруктураКурсЦены.Кратность;

Если НЕ ЗначениеЗаполнено(КурсНовойВалюты) Тогда // если не задан курс, то курс берем по справочнику

СтруктураКурсНовойВалюты = МодульВалютногоУчета.ПолучитьКурсВалюты(НоваяВалюта, Дата);

КурсНовойВалюты = СтруктураКурсНовойВалюты.Курс;

КратностьНовойВалюты = СтруктураКурсНовойВалюты.Кратность;

КонецЕсли;

НовоеЗначениеЦены = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(НовоеЗначениеЦены, ВалютаЦены, НоваяВалюта,

КурсЦены, КурсНовойВалюты,КратностьЦены,КратностьНовойВалюты);

КонецЕсли;

КонецЕсли;

КонецЕсли;

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

КонецФункции // ПересчитатьЦенуПриИзмененииВалюты()

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

// передачи в обработку заполнения цен и валют.

//

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

// ДокументОбъект - объект документа, для реквизитов будет производится заполнение


// СтруктураИсключений - структура, в которую передаются те исключения, которые или невозможно

// определить по метаданным, или, несмотря ни на что, нельзя включать в

// возвращаемую структуру.

// В структуре - ключ = имя реквизита, значение = истина (необходимо добавить

// в структуру) или ложь (нельзя добавлять в структуру)

//

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

// Сформированная структура реквизитов документа.

//

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

МетаданныеДокумента = ДокументОбъект.Метаданные();

// Зададим, какие реквизиты вообще нам могут быть нужны.

СтруктураВозможныхВариантовРеквизитов = Новый Структура;

СтруктураВозможныхВариантовРеквизитов.Вставить("ТипЦен");

СтруктураВозможныхВариантовРеквизитов.Вставить("ВалютаДокумента");

СтруктураВозможныхВариантовРеквизитов.Вставить("КурсДокумента");

СтруктураВозможныхВариантовРеквизитов.Вставить("КратностьДокумента");

СтруктураВозможныхВариантовРеквизитов.Вставить("КурсВзаиморасчетов");

СтруктураВозможныхВариантовРеквизитов.Вставить("КратностьВзаиморасчетов");

СтруктураВозможныхВариантовРеквизитов.Вставить("УчитыватьНДС");

СтруктураВозможныхВариантовРеквизитов.Вставить("СуммаВключаетНДС");

СтруктураВозможныхВариантовРеквизитов.Вставить("ИспользоватьПлановуюСебестоимость");

СтруктураВозможныхВариантовРеквизитов.Вставить("РегистрироватьЦеныПоставщика");

СтруктураВозможныхВариантовРеквизитов.Вставить("УсловиеПродаж");

// Зададим, какие реквизиты надо редактировать.

СтруктураРеквизитовДокумента = Новый Структура;

Для Каждого ТекущийЭлементСтруктуры Из СтруктураВозможныхВариантовРеквизитов Цикл

НужныйРеквизитДокумента = ТекущийЭлементСтруктуры.Ключ;

Если ОбщегоНазначения.ЕстьРеквизитДокумента(НужныйРеквизитДокумента, МетаданныеДокумента) Тогда

СтруктураРеквизитовДокумента.Вставить(НужныйРеквизитДокумента);

КонецЕсли;

КонецЦикла;

// Теперь проверим исключения.

Если СтруктураИсключений <> Неопределено Тогда

Для Каждого ТекущийЭлементСтруктуры Из СтруктураИсключений Цикл

Если ТекущийЭлементСтруктуры.Значение Тогда // надо добавить реквизит, если его еще нет СтруктураРеквизитовДокумента.Вставить(ТекущийЭлементСтруктуры.Ключ);

Иначе // надо удалить реквизит, если он есть СтруктураРеквизитовДокумента.Удалить(ТекущийЭлементСтруктуры.Ключ);


КонецЕсли;

КонецЦикла;

КонецЕсли;

Возврат СтруктураРеквизитовДокумента;

КонецФункции // ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования()

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

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

//

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

// Номенклатура - ссылка на элемент справочника "Номенклатура", для которого надо получить цену,

// ХарактеристикаНоменклатуры - ссылка на элемент справочника "ХарактеристикаНоменклатуры",

// ТипЦен - ссылка на элемент справочника "Типы цен", опредедяет цену какого типа надо получить,

// Дата - дата, на которую надо получить цену, если не заполнено, то берется рабочая дата

// ЕдиницаИзмерения - ссылка на элемент справочника "Единицы измерения", определяет для какой единицы надо получить

// цену, если не заполнен, то заполняется единицей цены

// Валюта - ссылка на элемент справочника "Валюты", определяет валюту. в которой надо вернуть цену,

// если не заполнен, то заполняется валютой цены

// Курс - число, курс требуемой валюты, если не заполнен, берется курс из регистра

// сведений "Курсы валют",

// Кратность - число, кратность требуемой валюты, если не заполнена, берется курс из регистра

// сведений "Курсы валют",

// ПроцентСкидкиНаценки - число, процент наценки (скидки) на базовый тип цен, заполняется процентом

// наценки (скидки) цены для цен, которые не рассчитываются автоматически.

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

// Число, рассчитанное значение цены.

//

Функция ПолучитьЦенуНоменклатуры(Номенклатура, ХарактеристикаНоменклатуры = Неопределено, Знач ТипЦен, ДатаПараметр = Неопределено, ЕдиницаИзмерения = Неопределено,

Валюта = Неопределено, Курс = 0, Кратность = 1, ПроцентСкидкиНаценки = 0, ДоговорКонтрагента = Неопределено,

УсловиеПродаж = Неопределено) Экспорт

Если ЕдиницаИзмерения = Неопределено Тогда

ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.ПустаяСсылка(); // для услуг

КонецЕсли;

ХарактеристикиНоменклатуры = ПолучитьМассивХарактеристик(ХарактеристикаНоменклатуры);

Дата = ПолучитьАктуальнуюДатуРасчетаЦен(ДатаПараметр);

ПолученнаяЦена = 0;

Если ДоговорКонтрагента <> Неопределено Тогда

Запрос = Новый Запрос;

Запрос.УстановитьПараметр("Дата", Дата);

Запрос.УстановитьПараметр("Договор", ДоговорКонтрагента);

Запрос.УстановитьПараметр("Номенклатура", Номенклатура); Запрос.УстановитьПараметр("ХарактеристикиНоменклатуры", ХарактеристикиНоменклатуры);


ТекстЗапроса = "

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

| УсловияПоставок.Цена КАК Цена,

| ВЫБОР КОГДА сНоменклатура.Услуга И УсловияПоставок.ЕдиницаИзмерения = ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)

| ТОГДА сНоменклатура.ЕдиницаХраненияОстатков

| ИНАЧЕ УсловияПоставок.ЕдиницаИзмерения

| КОНЕЦ КАК ЕдиницаИзмерения,

| УсловияПоставок.ВалютаЦены КАК ВалютаЦены

|ИЗ

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

| ДоговорКонтрагента = &Договор И Номенклатура = &Номенклатура

| И ХарактеристикаНоменклатуры В (&ХарактеристикиНоменклатуры)) КАК УсловияПоставок

|ВНУТРЕННЕЕ СОЕДИНЕНИЕ

| Справочник.Номенклатура КАК сНоменклатура

|ПО

| сНоменклатура.Ссылка = УсловияПоставок.Номенклатура

|ГДЕ

| УсловияПоставок.Цена <> 0 И сНоменклатура.Ссылка = &Номенклатура

|УПОРЯДОЧИТЬ ПО

| УсловияПоставок.ХарактеристикаНоменклатуры УБЫВ

|";

Запрос.Текст = ТекстЗапроса;

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

ПолученнаяЦена = ПересчитатьЦенуПриИзмененииЕдиницы(Выборка.Цена, Выборка.ЕдиницаИзмерения, ЕдиницаИзмерения);

ПолученнаяЦена = ПересчитатьЦенуПриИзмененииВалюты(ПолученнаяЦена, Выборка.ВалютаЦены, Валюта, Курс, Кратность, Дата);

КонецЕсли;

// Проверим, не установлены ли по этому договору типы цен для групп.

Если ПолученнаяЦена = 0 Тогда

Запрос = Новый Запрос;

Запрос.УстановитьПараметр("Дата", Дата);

Запрос.УстановитьПараметр("Контрагент", ДоговорКонтрагента.Владелец);

Запрос.УстановитьПараметр("Группы", ПолучитьМассивГруппНоменклатуры(Номенклатура));

Запрос.Текст = "

|ВЫБРАТЬ

| ТипыЦенПоГруппам.ТипЦен КАК ТипЦен

|ИЗ

| РегистрСведений.ТипыЦенПоГруппамНоменклатурыДляПокупателей.СрезПоследних(&Дата, Контрагент = &Контрагент

| И НоменклатурнаяЦеноваяГруппа В (&Группы)) КАК ТипыЦенПоГруппам

|";

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Если Не Выборка.ТипЦен.Пустая() Тогда // переопределим тип цен для расчета

ТипЦен = Выборка.ТипЦен;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЕсли;

Если ПолученнаяЦена = 0 И ЗначениеЗаполнено(ТипЦен) Тогда // особых условий нет

Запрос = Новый Запрос;

Запрос.УстановитьПараметр("Дата", Дата);

Запрос.УстановитьПараметр("Номенклатура", Номенклатура); Запрос.УстановитьПараметр("ХарактеристикиНоменклатуры", ХарактеристикиНоменклатуры);


Если ТипЦен.Рассчитывается Тогда // надо достать цену базового типа и рассчитать по наценке

Запрос.УстановитьПараметр("ТипЦен", ТипЦен.БазовыйТипЦен);

Запрос.УстановитьПараметр("ТипЦенРасчетный", ТипЦен);

Запрос.УстановитьПараметр("СпособРасчета", ТипЦен.СпособРасчетаЦены);

Запрос.УстановитьПараметр("ПроцентНаценки", ТипЦен.ПроцентСкидкиНаценки);

Иначе

Запрос.УстановитьПараметр("ТипЦен", ТипЦен);

КонецЕсли;

Запрос.Текст = "

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

| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,

| ВЫБОР КОГДА сНоменклатура.Услуга И ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения = ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)

| ТОГДА сНоменклатура.ЕдиницаХраненияОстатков

| ИНАЧЕ ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения

| КОНЕЦ КАК ЕдиницаИзмерения,

|";

Если ТипЦен.Рассчитывается Тогда

Запрос.Текст = Запрос.Текст + "

| ЕСТЬNULL(ВложенныйЗапрос.ПроцентСкидкиНаценки, &ПроцентНаценки) КАК ПроцентСкидкиНаценки,

| ЕСТЬNULL(ВложенныйЗапрос.СпособРасчетаЦены, &СпособРасчета) КАК СпособРасчетаЦены,

|";

КонецЕсли;

Запрос.Текст = Запрос.Текст + "

| ЦеныНоменклатурыСрезПоследних.Валюта

|ИЗ

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

| И ТипЦен = &ТипЦен И ХарактеристикаНоменклатуры В (&ХарактеристикиНоменклатуры)

| ) КАК ЦеныНоменклатурыСрезПоследних

|";

Если ТипЦен.Рассчитывается Тогда

Запрос.Текст = Запрос.Текст + "

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

| (ВЫБРАТЬ

| ЦеныНоменклатурыСрезПоследних.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки,

| ЦеныНоменклатурыСрезПоследних.СпособРасчетаЦены КАК СпособРасчетаЦены,

| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,

| ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры

| ИЗ

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

| И ТипЦен = &ТипЦенРасчетный

| И ХарактеристикаНоменклатуры В (&ХарактеристикиНоменклатуры)

| ) КАК ЦеныНоменклатурыСрезПоследних

| ) КАК ВложенныйЗапрос

|ПО

| ЦеныНоменклатурыСрезПоследних.Номенклатура = ВложенныйЗапрос.Номенклатура И ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры = ВложенныйЗапрос.ХарактеристикаНоменклатуры

|";

КонецЕсли;

Запрос.Текст = Запрос.Текст + "

|ВНУТРЕННЕЕ СОЕДИНЕНИЕ

| Справочник.Номенклатура КАК сНоменклатура