
- •Курсовой проект
- •Введение
- •Аналитическая часть
- •1.1 Описание решаемой задачи.
- •1.2. Структура конфигурации. Описание метаобъектов и связей между ними
- •1.3. Функциональные модули и их спецификации
- •1.4 Описание основных алгоритмов проведения документов.
- •2. Практическая часть
- •2.1 Физическая структура конфигурации
- •2.2 Описание разработанных алгоритмов учёта
- •2.3 Пример реализации
- •Заключение
- •Список литературы
2. Практическая часть
2.1 Физическая структура конфигурации
Была создана физическая структура конфигурации, включающая четыре справочника, два документа, три регистра сведений, три регистра расчета, два отчета, одна обработка, три плана видов расчета на основе описания объектов, относящихся к предметной области, которое было представлено в разделах 1.2 и 1.3.
Справочники:
Справочники.Номенклатура
Имя: "Номенклатура"
Иерархический: "Истина"
ДлинаКода: "9"
ДлинаНаименования: "80"
ТипКода: "Число"
ДопустимаяДлинаКода: "Фиксированная"
СерииКодов: "ВоВсемСправочнике"
КонтрольУникальности: "Истина"
ВводПоСтроке:
"Наименование,
Код"
Справочники.ФизическиеЛица
Имя: "ФизическиеЛица"
Иерархический: "Ложь"
ДлинаКода: "25"
ДлинаНаименования: "25"
ТипКода: "Строка"
ДопустимаяДлинаКода: "Переменная"
ВводПоСтроке:
"Наименование,
Код"
Справочники.Подразделения
Имя: "Подразделения"
ПринадлежностьОбъекта: "Собственный"
Иерархический: "Истина"
ВидИерархии: "ИерархияЭлементов"
ДлинаКода: "9"
ДлинаНаименования: "25"
ТипКода: "Строка"
ВводПоСтроке:
"Наименование,
Код"
Справочники.Графики
Имя: "Графики"
ПринадлежностьОбъекта: "Собственный"
Иерархический: "Ложь"
ОграничиватьКоличествоУровней: "Ложь"
КоличествоУровней: "2"
ДлинаКода: "9"
ДлинаНаименования: "25"
ВводПоСтроке:
"Наименование,
Код"
Документы
Документы.РасходнаяНакладная
Имя: "РасходнаяНакладная"
ВводПоСтроке: "Номер"
ОперативноеПроведение: "Разрешить"
УдалениеДвижений: "УдалятьАвтоматическиПриОтменеПроведения"
ЗаписьДвиженийПриПроведении: "ЗаписыватьВыбранные"
Движения: "РегистрРасчета.ДопЗаписи"
ПривилегированныйРежимПриПроведении: "Истина"
ПривилегированныйРежимПриОтменеПроведения:
"Истина"
Документы.НачислениеЗарплаты
Имя: "НачислениеЗарплаты"
ВводПоСтроке:
"Номер"
УдалениеДвижений: "УдалятьАвтоматическиПриОтменеПроведения"
ЗаписьДвиженийПриПроведении: "ЗаписыватьВыбранные"
ЗаполнениеПоследовательностей: "ЗаполнятьАвтоматически"
Движения:
"РегистрРасчета.ДополнительныеНачисления"
"РегистрРасчета.ОсновныеНачисления"
Регистры Сведений
РегистрыСведений.ГрафикиРаботы
Имя: "ГрафикиРаботы"
РегистрыСведений.СведенияОСотрудниках
Имя: "СведенияОСотрудниках"
РегистрыСведений.НадбавкиОтПродаж
Имя: "НадбавкиОтПродаж"
Планы Видов Расчета
ПланыВидовРасчета.ОсновныеНачисления
Имя: "ОсновныеНачисления"
ПланыВидовРасчета.ДополнительныеНачисления
Имя: "ДополнительныеНачисления"
ПланыВидовРасчета.ДопЗаписи
Имя: "ДопЗаписи"
Регистры Расчета
РегистрыРасчета.ОсновныеНачисления
Имя: "ОсновныеНачисления"
РегистрыРасчета.ДополнительныеНачисления
Имя: "ДополнительныеНачисления"
РегистрыРасчета.ДопЗаписи
Имя: "ДопЗаписи"
2.2 Описание разработанных алгоритмов учёта
Рассмотрим основные процедуры проведения документов.
Обработка документа «Расходная Накладная» представлена в таблице 1.
Таблица 1 - Обработка документа «Расходная Накладная»
Процедура ОбработкаПроведения(Отказ, Режим) Движения.ДопЗаписи.Записывать = Истина; Движения.ДопЗаписи.Очистить(); Движение = Движения.ДопЗаписи.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ПланыВидовРасчета.ДопЗаписи.Продажа; Движение.ПериодРегистрации = Дата; Движение.Подразделение = Подразделение; Движение.Результат = СуммаПоДокументу; КонецПроцедуры |
Обработка документа «Начисление Зарплаты» представлена в таблице 2.
Таблица 2 - Обработка документа «Начисление Зарплаты»
Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОсновныеНачисления Движения.ОсновныеНачисления.Записывать = Истина; Движения.ОсновныеНачисления.Очистить(); Движения.ДополнительныеНачисления.Записывать = Истина; Движения.ДополнительныеНачисления.Очистить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОН.Сотрудник КАК Сотрудник, | ОН.Подразделение КАК Подразделение, | ОН.ВидРасчета, | ОН.График, | ОН.ДатаНачала, | ОН.ДатаОкончания |ПОМЕСТИТЬ ОН |ИЗ | Документ.НачислениеЗарплаты.ОсновныеНачисления КАК ОН |ГДЕ | ОН.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Сотрудник, | Подразделение |; |ВЫБРАТЬ | ОН.Сотрудник, | ОН.Подразделение, | ОН.ВидРасчета, | ОН.График, | ОН.ДатаНачала, | ОН.ДатаОкончания, | ЕСТЬNULL(Сведения.ТарифнаяСтавка, 0) КАК ТарифнаяСтавка |ИЗ | ОН КАК ОН | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних( | &ПериодРегистрации, | (Сотрудник, Подразделение) В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ОН.Сотрудник, | ОН.Подразделение | ИЗ | ОН КАК ОН)) КАК Сведения | ПО ОН.Подразделение = Сведения.Подразделение | И ОН.Сотрудник = Сведения.Сотрудник"; Запрос.УстановитьПараметр("ПериодРегистрации", ПериодРегистрации); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = Выборка.ВидРасчета; Движение.ПериодДействияНачало = Выборка.ДатаНачала; Движение.ПериодДействияКонец = Выборка.ДатаОкончания; Движение.ПериодРегистрации = ПериодРегистрации; Движение.Подразделение = Выборка.Подразделение; Движение.Сотрудник = Выборка.Сотрудник; Движение.Размер = Выборка.ТарифнаяСтавка; Движение.График = Выборка.График; КонецЦикла; // регистр ДополнительныеНачисления Для Каждого ТекСтрока Из ДополнительныеНачисления Цикл Движение = Движения.ДополнительныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрока.ВидРасчета; Движение.ПериодРегистрации = ПериодРегистрации; Если ТекСтрока.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.Надбавка Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -3); Движение.БазовыйПериодКонец = ПериодРегистрации - 1; ИначеЕсли ТекСтрока.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.ПремияРуководителя Тогда Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -1); Движение.БазовыйПериодКонец = ПериодРегистрации - 1; Движение.Размер = ТекСтрока.Размер; КонецЕсли; Движение.Подразделение = ТекСтрока.Подразделение; Движение.Сотрудник = ТекСтрока.Сотрудник; КонецЦикла; Движения.Записать(); Расчеты.РассчитатьОсновныеНачисления(Движения.ОсновныеНачисления, Ссылка); Расчеты.РассчитатьДополнительныеНачисления(Движения.ДополнительныеНачисления, Ссылка); КонецПроцедуры
|
Также в работе используется Общий модуль для расчетов начислений.
Код общего модуля «Модуль» для подсчета основных начислений представлен в таблице 3.
Данная процедура рассчитывает основные начисления для заданного набора записей, используя тариф из плана видов расчета. Если в наборе нет записей, процедура завершается. Если тариф найден в наборе, производится запрос к регистру расчета Основные начисления, и для каждой записи из набора рассчитывается результат на основе данных из запроса. Результат записывается обратно в набор.
Таблица 3 - Процедура «РассчитатьОсновныеНачисления»
Процедура РассчитатьОсновныеНачисления(Набор, Регистратор) Экспорт Если Набор.Количество() = 0 Тогда Возврат; КонецЕсли; МассивВР = Набор.ВыгрузитьКолонку("ВидРасчета"); Тариф = ПланыВидовРасчета.ОсновныеНачисления.Тариф; Рассчитывать = МассивВР.Найти(Тариф) <> Неопределено; Если Рассчитывать Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДанныеГрафика.НомерСтроки, | ЕСТЬNULL(ДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ЧасовФакт |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика( | ВидРасчета = &Тариф | И Регистратор = &Регистратор) КАК ДанныеГрафика Запрос.УстановитьПараметр("Регистратор", Регистратор); Запрос.УстановитьПараметр("Тариф", Тариф); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого Запись из Набор Цикл Если Запись.ВидРасчета <> Тариф Тогда Продолжить; КонецЕсли; Выборка.Сбросить(); Поиск.НомерСтроки = Запись.НомерСтроки; Если Выборка.НайтиСледующий(Поиск) Тогда Запись.Результат = Выборка.ЧасовФакт * Запись.Размер; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); КонецЕсли; КонецПроцедуры |
Код общего модуля «Модуль» для подсчета дополнительных начислений представлен в таблице 4.
Таблица 4. Процедура «РассчитатьДополнительныеНачисления»
Процедура РассчитатьДополнительныеНачисления(Набор, Регистратор) Экспорт Если Набор.Количество() = 0 Тогда Возврат; КонецЕсли; МассивВР = Набор.ВыгрузитьКолонку("ВидРасчета");
Надбавка = ПланыВидовРасчета.ДополнительныеНачисления.Надбавка; Рассчитывать = МассивВР.Найти(Надбавка) <> Неопределено; Если Рассчитывать Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | База.НомерСтроки, | База.РезультатБаза, | ЕСТЬNULL(НадбавкиОтПродаж.Процент, 0) КАК Процент |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаДопЗаписи( | &Измерения, | &Измерения, | , | Регистратор = &Регистратор | И ВидРасчета = &Надбавка) КАК База | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НадбавкиОтПродаж КАК НадбавкиОтПродаж | ПО База.РезультатБаза >= НадбавкиОтПродаж.От | И База.РезультатБаза < НадбавкиОтПродаж.До"; Измерения = Новый Массив; Измерения.Добавить("Подразделение"); Запрос.УстановитьПараметр("Регистратор", Регистратор); Запрос.УстановитьПараметр("Надбавка", Надбавка); Запрос.УстановитьПараметр("Измерения", Измерения); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки"); Для каждого Запись из Набор Цикл Если Запись.ВидРасчета <> Надбавка Тогда Продолжить; КонецЕсли; Выборка.Сбросить(); Поиск.НомерСтроки = Запись.НомерСтроки; Если Выборка.НайтиСледующий(Поиск) Тогда Запись.Размер = Выборка.Процент; Запись.СуммаПродаж = Выборка.РезультатБаза; Запись.Результат = Запись.СуммаПродаж * Запись.Размер / 100; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); КонецЕсли; Премия = ПланыВидовРасчета.ДополнительныеНачисления.ПремияРуководителя; Рассчитывать = МассивВР.Найти(Премия) <> Неопределено; Если Рассчитывать Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | База.НомерСтроки, | СУММА(База.РезультатБаза) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления( | &Измерения, | &Измерения, | &Разрезы, | Регистратор = &Регистратор | И ВидРасчета = &Премия) КАК База |ГДЕ | База.Сотрудник <> База.СотрудникРазрез | |СГРУППИРОВАТЬ ПО | База.НомерСтроки"; Измерения = Новый Массив; Измерения.Добавить("Подразделение"); Разрезы = Новый Массив; Разрезы.Добавить("Сотрудник"); Запрос.УстановитьПараметр("Регистратор", Регистратор); Запрос.УстановитьПараметр("Премия", Премия); Запрос.УстановитьПараметр("Измерения", Измерения); Запрос.УстановитьПараметр("Разрезы", Разрезы); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Поиск = Новый Структура("НомерСтроки") Для каждого Запись из Набор Цикл Если Запись.ВидРасчета <> Премия Тогда Продолжить; КонецЕсли; Выборка.Сбросить(); Поиск.НомерСтроки = Запись.НомерСтроки; Если Выборка.НайтиСледующий(Поиск) Тогда Запись.Результат = Выборка.РезультатБаза * Запись.Размер / 100; КонецЕсли; КонецЦикла; Набор.Записать(, Истина); КонецЕсли; КонецПроцедуры |
Данный код представляет собой процедуру "РассчитатьДополнительныеНачисления" для расчета дополнительных начислений на основе данных, переданных в наборе "Набор" и регистраторе "Регистратор". В процедуре производится выгрузка колонки "ВидРасчета" из набора и проверка наличия двух видов расчета - "Надбавка" и "Премия Руководителя". Для расчета каждого вида начисления выполняется запрос к регистру расчета "ДополнительныеНачисления.БазаДополнительные Начисления". Если вид расчета "Надбавка" найден в наборе, выполняется запрос с указанными параметрами и для каждой записи в наборе вычисляется размер начисления и сумма продаж, на основании которых был рассчитан размер начисления. После этого результаты записываются в набор. Если вид расчета "ПремияРуководителя" найден в наборе, выполняется аналогичный запрос и результат записывается в набор.