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