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