Комплексная задача 4.1 из материалов по экзамену на 1С специалист
Содержание
- 1 Материалы
- 2 Материалы
- 3 Задача
- 4 Решение
- 4.1 Текущее состояние
- 4.2 Метаданные
- 4.3 Модуль проведения ПриходнаяНакладная
- 4.4 Модуль проведения РасходнаяНакладная
- 4.5 Модуль формы документа РасходнаяНакладная
- 4.6 Общий модуль ТоварныеДокументы
- 4.7 Отчет "Материальная ведомость"
- 4.8 Отчет "Движение товаров"
- 4.9 Модуль проведения "НачислениеЗарплаты"
- 4.10 Обработка "Заполнение графика"
- 4.11 Общий модуль "Зарплата"
- 4.12 Модуль формы "НачислениеЗарплаты"
- 4.13 Модуль формы обработки "ПерерасчетЗарплаты"
- 4.14 Отчет "ОтчетПоПремиям"
- 4.15 Модуль тестирования
Материалы
Материалы
- используется платформа 8.1
- можно использовать Учебная версия (1Cv8)
- задачи из Медиа:ATT81PL.RTF
- Профессиональная разработка в системе 1С:Предприятие 8
- А.П. Габец, Д.И. Гончаров. 1С:Предприятие 8.1. Простые примеры разработки
Конфигурации
- Медиа:НачальнаяИБДляСборника.dt - каркасная конфигурация
- Медиа:ПримерыДляСборника.dt - решения примеров для сборника
- Медиа:Комплексная задача 4_1.dt (История) - решение
Задача
4.1 Склады, торговля со скидками, управленческий бухгалтерский учет и окладно–премиальная схема оплаты
В качестве исходной использовать каркасную конфигурацию.
Добавить в конфигурацию справочник "МестаХранения" (Склады).
Добавить учет остатков номенклатуры в разрезе складов. Проведение расходной накладной по регистру "ОстаткиНоменклатуры" организовать с контролем остатка товаров в разрезе складов и со списанием себестоимости по средневзвешенному (по складу) методу.
Добавить автоматический расчет скидки покупателю при оформлении расходной накладной. Размер скидки зависит от суммы уже произведенных закупок в предыдущем месяце:
Объем закупки | Процент скидки |
---|---|
от 1 000 р | 2 % |
от 3 000 р | 5 % |
от 5 000 р | 10 % |
от 10 000 р | 15 % |
При подборе товара цена должна рассчитываться следующим образом:
Цена = ЦенаЧист*(100-ПроцСкидки)/100
При изменении клиента должны: устанавливаться соответствующий ему процент скидки; пересчитываться цены в строках накладной.
Использовать оборотный регистр для накопления и выдачи объемов закупки.
Прописать проведение документа "Расходная накладная" по регистру бухгалтерии "Управленческий". В бухгалтерском учете суммовой и количественный учет товаров ведется на счете "Товары" в разрезе справочника "Номенклатура", учет по складам не ведется.
Себестоимость списываемого товара рассчитывается по средневзвешенному методу. Проводки:
- Дебет счета "Капитал" / кредит счета "Товары" на сумму себестоимости
- Дебет счета "Дебиторка" / кредит счета "Капитал" на сумму в продажных ценах
Сформировать конструктором отчеты:
- По регистру накопления – "Материальная ведомость" (начальный остаток, приход, расход, остаток) в разрезе складов и товаров;
- По регистру бухгалтерии - "Движение товаров" (сальдо на начало дебетовое, дебетовый оборот, кредитовый оборот, сальдо на конец дебетовое) по счету "Товары" в разрезе субконто этого счета.
Начислить зарплату менеджерам. В организации используется повременно-премиальная система оплаты труда по часам.
Премиальная часть зарплаты зависит от суммы продаж, выполненных данным менеджером в прошлом месяце. Если менеджер осуществил продаж на сумму больше нормы за месяц, то ему положена премия:
- если норма превышена на 1/2 - 20% от оклада;
- если норма превышена на 3/4 - 30% от оклада;
- если норма превышена на 100 процентов - 50% от оклада.
Результаты расчетов должны выполняться в общем модуле.
Разработать "Отчет по премиям". Для построения отчета использовать систему компоновки данных. Формат отчета:
Сотрудник | 20% | 30% | 50% |
---|---|---|---|
<Сотрудник> | <Сумма> | <Сумма> | <Сумма> |
Итого: | <Итого> | <Итого> | <Итого> |
Обязательно использовать перерасчет. Учесть следствие возможного изменения результата начисления "Оклада" сотрудников (работающих в каком-то подразделении на какой-то должности), - необходимость пересчета записи регистра расчетов, содержащие вид расчета "Премия".
В рамках данной задачи необходимо создать обработку "ПересчетЗарплаты". При ее открытии пользователь должен увидеть записи, которые требуется перерасчитать (вследствие произошедших изменений) и документы, в которых эти записи присутствуют.
Саму процедуру перерасчета реализовывать не требуется.
Решение
Текущее состояние
Готовность: 100%
Конфигурация: Медиа:Комплексная задача 4_1.dt (История)
Метаданные
Оперативный учет
Добавлен /Справочники/МестаХранения
В /Документы/РасходнаяНакладная
- добавлен реквизит шапки Склад (тип /Справочники/МестаХранения)
- добавлен реквизит шапки ПроцентСкидки (тип Число.2.0)
- добавлен реквизит ТЧ Товары ЦенаБезСкидки (тип Число.10.2)
В /Документы/ПриходнаяНакладная
- добавлен реквизит шапки Склад (тип /Справочники/МестаХранения)
В /РегистрыНакопления/ОстаткиНоменклатуры
- добавлено измерение Склад (тип /Справочники/МестаХранения)
- добавлен ресурс Сумма, тип Число.18.2
Добавлен /РегистрыНакопления/ОбъемПродаж
- оборотный, период - месяц
- измерения
- Контрагент, тип /Справочники/Контрагенты
- ресурсы
- Сумма, тип Число.18.2
Управленческий учет
см. Признак учета, признак учета субконто (1Cv8)
В /ПланыСчетов/Управленческий/ПризнакиУчета
- добавлен признак учета ПризнакиУчета/Количественный
- добавлен предопределенный счет 01.09 "Активы/Дебиторка"
- активно/пассивный
- субконто Контрагенты
- у предопределенного счета 01.02 "Активы/Товары"
- установлен признак учета "Количественный"
- добавлено субконто Номенклатуры
- добавлен предопределенный счет 03.01 ПрибылиУбытки/Капитал
- активно/пассивный
- без субконто
Добавлен /РегистрыБухгалтерии/Управленческий
- план счетов (Основные/План счетов) установлен в /ПланыСчетов/Управленческий
- установлен флаг Основные/Корреспонденция
- ресурс Сумма - число 18.2, балансовый
- ресурс Количество - число 9.3, небалансовый, признак учета "Количественный"
- Регистраторы - РасходнаяНакладная
Добавлены отчеты
- МатериальнаяВедомость
- ДвижениеТоваров
Расчет зарплаты
Информация
- Сборник задач 1С Специалист 8. Задача 3.1
- План видов расчетов (1Cv8)
- Регистр расчета (1Cv8)
- Профессиональная разработка в системе 1С:Предприятие 8
- ГЛАВА 10. РЕАЛИЗАЦИЯ СЛОЖНЫХ ПЕРИОДИЧЕСКИХ РАСЧЕТОВ (315)
- М. Г. Радченко 1С: Предприятие 8.1. Практическое пособие разработчика
- Глава 9. План видов расчета, регистр расчета
- Глава 10. Использование регистра расчета
- С.Митичкин. Разработка в системе 1С:Предприятие 8.0
- Глава 11, "Сложные периодические расчеты"
- А.П. Габец, Д.И. Гончаров. 1С:Предприятие 8.1. Простые примеры разработки
- Глава 3. Прикладные объекты
- Сложные периодические расчеты
- Глава 3. Прикладные объекты
См. также
- Использование графиков с регистрами расчета (1Cv8)
- Использование расчетов по базе с регистрами расчета (1Cv8)
В /Планы видов расчета/ОсновныеНачисления:
- нужно установить флаг "Расчет/Использует период действия"
- Расчет/Зависимость от базы: Зависит по периоду действия
- добавить предопределенный элемент "Премия"
- установить флаги Базовые/Оклад
- установить флаги Ведущие/Оклад
Добавить /Регистры расчета/ОсновноеНачисление
- значение "Основные/План видов расчета" установлено в "/Планы видов расчета/ОсновныеНачисления"
- установлен флаг "Основные/Период действия"
- это означает что у каждой записи регистра есть интервал действия
- установлен флаг "Основные/Базовый период"
- это означает что у каждой записи регистра есть базовый период
- значение "Основные/График" установлено в "/Справочники/ГрафикиРаботы"
- значение "Основные/Значение графика" установлено в "/Регистры сведений/ГрафикиРаботы/Ресурсы/Значение"
- значение "Основные/Дата графика" установлено в "/Регистры сведений/ГрафикиРаботы/Измерения/Дата"
- добавлен ресурс "Данные/Ресурсы/Результат" типа "Число.12.2"
- добавлен реквизит "Данные/Реквизиты/Размер" типа "Число.12.2"
- установлен регистратор "Регистраторы/Регистраторы/НачислениеЗарплаты"
В /Регистры расчета/ОсновноеНачисление добавлен перерасчет "ПоСотрудникам"
- измерение "Сотрудник"
- связь "Измерение регистра": Сотрудник
- связь "Данные ведущих регистров": РегистрыРасчета/ОсновныеНачисления/Измерения/Сотрудник
- !!! без этого не будет работать перерасчет!!!
В документе НачислениеЗарплаты:
- добавлен реквизит шапки ПериодРегистрации
Для учета объема продаж по менеджерам:
- в /РегистрНакопления/ОбъемПродаж добавлено измерение "Менеджер" (Справочник.ФизическоеЛицо)
- в шапку /Документ/РасходнаяНакладная добавлен реквизит "Менеджер" (Справочник.ФизическоеЛицо)
- доработано проведение /Документ/РасходнаяНакладная
Добавлен /Отчет/ОтчетПоПремиям
Модуль проведения ПриходнаяНакладная
Сгенерирован конструктором движений:
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаТовары Из Товары Цикл
// регистр ОстаткиНоменклатуры Приход
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаТовары.Количество;
Движение.Сумма = ТекСтрокаТовары.Сумма;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Модуль проведения РасходнаяНакладная
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаДокумента=Товары.Итог("Сумма")+Издержки.Итог("Сумма");
КонецПроцедуры
Функция ПолучитьДанные()
запрос = Новый Запрос("ВЫБРАТЬ
| РасходнаяНакладнаяТовары.Номенклатура,
| СУММА(РасходнаяНакладнаяТовары.Сумма) КАК Сумма,
| СУММА(РасходнаяНакладнаяТовары.Количество) КАК Количество
|ПОМЕСТИТЬ Товары
|ИЗ
| Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
|ГДЕ
| РасходнаяНакладнаяТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяТовары.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
| Товары.Количество,
| Товары.Сумма,
| Товары.Номенклатура
|ИЗ
| Товары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &МоментВремени,
| Склад = &Склад
| И Номенклатура В
| (ВЫБРАТЬ
| Товары.Номенклатура
| ИЗ
| Товары КАК Товары)) КАК ОстаткиНоменклатурыОстатки
| ПО (ОстаткиНоменклатурыОстатки.Номенклатура = Товары.Номенклатура)");
запрос.УстановитьПараметр("Ссылка", Ссылка);
запрос.УстановитьПараметр("МоментВремени", МоментВремени());
запрос.УстановитьПараметр("Склад", Склад);
Возврат запрос.Выполнить().Выгрузить();
КонецФункции
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
тзДанные = ПолучитьДанные();
Для Каждого строка Из тзДанные Цикл
Если строка.Количество = 0 Тогда
Продолжить;
КонецЕсли;
Если строка.Количество > строка.КоличествоОстаток Тогда
Отказ = Истина;
Сообщить("Недостаточно товара """ + строка.Номенклатура + """. Остаток на складе: " + строка.КоличествоОстаток + ", требуется: " + строка.Количество);
Продолжить;
КонецЕсли;
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = строка.Номенклатура;
Движение.Склад = Склад;
Себестоимость = строка.СуммаОстаток / строка.КоличествоОстаток * строка.Количество;
Движение.Сумма = Себестоимость;
Движение.Количество = строка.Количество;
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Капитал;
Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
Движение.Период = Дата;
Движение.Сумма = Себестоимость;
Движение.КоличествоКт = строка.Количество;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = строка.Номенклатура;
КонецЦикла;
Движение = Движения.ОбъемПродаж.Добавить();
Движение.Период = Дата;
Движение.Сумма = СуммаДокумента;
Движение.Контрагент = Контрагент;
Движение.Менеджер = Менеджер;
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Дебиторка;
Движение.СчетКт = ПланыСчетов.Управленческий.Капитал;
Движение.Период = Дата;
Движение.Сумма = СуммаДокумента;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
КонецПроцедуры
Модуль формы документа РасходнаяНакладная
Процедура ТоварыКоличествоПриИзменении(Элемент)
СтрокаТЧ = ЭлементыФормы.Товары.ТекущиеДанные;
ПересчитатьСумму(СтрокаТЧ);
КонецПроцедуры
Процедура ПересчитатьСумму(СтрокаТЧ)
СтрокаТЧ.Сумма = СтрокаТЧ.Цена * СтрокаТЧ.Количество;
КонецПроцедуры
Процедура КонтрагентПриИзменении(Элемент)
ПроцентСкидки = ТоварныеДокументы.ПолучитьПроцентСкидки(Контрагент, Дата);
ПрименитьСкидкуКДокументу();
КонецПроцедуры
Процедура ПрименитьСкидкуКДокументу()
Для каждого СтрокаТЧ из ДокументОбъект.Товары Цикл
ПрименитьСкидку(СтрокаТЧ);
КонецЦикла;
КонецПроцедуры
Процедура ПрименитьСкидку(СтрокаТЧ)
СтрокаТЧ.Цена = СтрокаТЧ.ЦенаБезСкидки * (100 - ПроцентСкидки) / 100;
ПересчитатьСумму(СтрокаТЧ);
КонецПроцедуры
Процедура ТоварыЦенаБезСкидкиПриИзменении(Элемент)
СтрокаТЧ = ЭлементыФормы.Товары.ТекущиеДанные;
ПрименитьСкидку(СтрокаТЧ);
КонецПроцедуры
Процедура ПроцентСкидкиПриИзменении(Элемент)
ПрименитьСкидкуКДокументу();
КонецПроцедуры
Общий модуль ТоварныеДокументы
Функция ПолучитьПроцентСкидки(Контрагент, Дата) Экспорт
запрос = Новый Запрос("ВЫБРАТЬ
| СУММА(ОбъемПродажОбороты.СуммаОборот) КАК СуммаОборот
|ИЗ
| РегистрНакопления.ОбъемПродаж.Обороты(&НачалоПериода, &КонецПериода, Месяц, Контрагент = &Контрагент) КАК ОбъемПродажОбороты");
прошлыйМесяц = ДобавитьМесяц(Дата, -1);
запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(прошлыйМесяц));
запрос.УстановитьПараметр("КонецПериода", КонецМесяца(прошлыйМесяц));
запрос.УстановитьПараметр("Контрагент", Контрагент);
тзДанные = запрос.Выполнить().Выгрузить();
оборот = тзДанные.Итог("СуммаОборот");
Если оборот < 1000 Тогда
Возврат 0;
ИначеЕсли оборот < 3000 Тогда
Возврат 2;
ИначеЕсли оборот < 5000 Тогда
Возврат 5;
ИначеЕсли оборот < 10000 Тогда
Возврат 10;
Иначе
Возврат 15;
КонецЕсли;
КонецФункции
Функция ПолучитьРазмерПремии(Менеджер, Дата) Экспорт
Норма = 30000;
запрос = Новый Запрос("ВЫБРАТЬ
| СУММА(ОбъемПродажОбороты.СуммаОборот) КАК СуммаОборот
|ИЗ
| РегистрНакопления.ОбъемПродаж.Обороты(&НачалоПериода, &КонецПериода, Месяц, Менеджер = &Менеджер) КАК ОбъемПродажОбороты");
прошлыйМесяц = ДобавитьМесяц(Дата, -1);
запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(прошлыйМесяц));
запрос.УстановитьПараметр("КонецПериода", КонецМесяца(прошлыйМесяц));
запрос.УстановитьПараметр("Менеджер", Менеджер);
тзДанные = запрос.Выполнить().Выгрузить();
оборот = тзДанные.Итог("СуммаОборот");
Если оборот < Норма * 50 / 100 Тогда
Возврат 0;
ИначеЕсли оборот < Норма * 75 / 100 Тогда
Возврат 20;
ИначеЕсли оборот < Норма * 100 / 100 Тогда
Возврат 30;
Иначе
Возврат 50;
КонецЕсли;
КонецФункции
Отчет "Материальная ведомость"
Запрос СКД:
ВЫБРАТЬ
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход,
ОстаткиНоменклатурыОстаткиИОбороты.Склад,
ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , )
КАК ОстаткиНоменклатурыОстаткиИОбороты
Отчет "Движение товаров"
Запрос СКД:
ВЫБРАТЬ
УправленческийОстаткиИОбороты.СуммаНачальныйОстатокДт,
УправленческийОстаткиИОбороты.КоличествоНачальныйОстатокДт,
УправленческийОстаткиИОбороты.СуммаКонечныйОстатокДт,
УправленческийОстаткиИОбороты.КоличествоКонечныйОстатокДт,
УправленческийОстаткиИОбороты.СуммаОборотДт,
УправленческийОстаткиИОбороты.СуммаОборотКт,
УправленческийОстаткиИОбороты.КоличествоОборотДт,
УправленческийОстаткиИОбороты.КоличествоОборотКт,
УправленческийОстаткиИОбороты.Субконто1
ИЗ
РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, ,
Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары), , ) КАК УправленческийОстаткиИОбороты
Модуль проведения "НачислениеЗарплаты"
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаОсновныеНачисления Из ОсновныеНачисления Цикл
// регистр ОсновныеНачисления
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета;
Движение.ПериодДействияНачало = ТекСтрокаОсновныеНачисления.ДатаНачала;
Движение.ПериодДействияКонец = КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания);
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.БазовыйПериодНачало = ТекСтрокаОсновныеНачисления.ДатаНачала;
Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаОсновныеНачисления.ДатаОкончания);
Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник;
Движение.Размер = ТекСтрокаОсновныеНачисления.Размер;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
Движения.ОсновныеНачисления.Записать(Истина, Ложь);
Зарплата.Рассчитать(Ссылка, Движения);
КонецПроцедуры
Обработка "Заполнение графика"
В каркасную конфигурацию входит обработка ЗаполнениеГрафика, ее надо использовать для заполнения регистра сведений ГрафикиРаботы.
В этом задании ее можно использовать без модификации.
Особенность: выходные указываются как строка "6,7" - суббота,воскресенье.
Общий модуль "Зарплата"
Процедура Рассчитать(Ссылка, Движения) Экспорт
Для каждого запись из Движения.ОсновныеНачисления Цикл
Если запись.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
норма = ПолучитьНормуГрафика(запись);
факт = ПолучитьФактГрафика(запись);
запись.Результат = ?(норма = 0, 0, запись.Размер * факт / норма);
КонецЕсли;
КонецЦикла;
Движения.ОсновныеНачисления.Записать(, Истина);
Для каждого запись из Движения.ОсновныеНачисления Цикл
Если запись.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
оклад = ПолучитьБазу(запись);
запись.Результат = оклад * запись.Размер / 100;
КонецЕсли;
КонецЦикла;
Движения.ОсновныеНачисления.Записать(, Истина);
КонецПроцедуры
Функция ПолучитьНормуГрафика(запись)
тзНорма = запись.ПолучитьДанныеГрафика(ВидПериодаРегистраРасчета.ПериодДействия);
Возврат тзНорма[0].Значение;
КонецФункции
Функция ПолучитьФактГрафика(запись)
тзФакт = запись.ПолучитьДанныеГрафика(ВидПериодаРегистраРасчета.ФактическийПериодДействия);
Возврат тзФакт[0].Значение;
КонецФункции
Функция ПолучитьБазу(запись)
Ресурсы = Новый Массив;
Ресурсы.Добавить("ОсновныеНачисления.Результат");
Измерения = Новый Структура("Сотрудник", "ОсновныеНачисления.Сотрудник");
тзБаза = запись.ПолучитьБазу(Ресурсы, Измерения);
Возврат тзБаза[0].Результат;
Конецфункции
Модуль формы "НачислениеЗарплаты"
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Если ЭтоНовый() Тогда
ПериодРегистрации = НачалоМесяца(ТекущаяДата());
КонецЕсли;
КонецПроцедуры
Процедура ОсновныеНачисленияСотрудникПриИзменении(Элемент)
УстановитьРазмерПремии(ЭлементыФормы.ОсновныеНачисления.ТекущиеДанные)
КонецПроцедуры
Процедура ОсновныеНачисленияВидРасчетаПриИзменении(Элемент)
УстановитьРазмерПремии(ЭлементыФормы.ОсновныеНачисления.ТекущиеДанные)
КонецПроцедуры
Процедура УстановитьРазмерПремии(строка)
Если строка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
строка.Размер = ТоварныеДокументы.ПолучитьРазмерПремии(строка.Сотрудник, Дата);
КонецЕсли;
КонецПроцедуры
Модуль формы обработки "ПерерасчетЗарплаты"
Процедура КнопкаВыполнитьНажатие(Кнопка)
запрос = Новый Запрос("ВЫБРАТЬ
| ОсновныеНачисленияПоСотрудникам.ОбъектПерерасчета,
| ОсновныеНачисленияПоСотрудникам.ВидРасчета,
| ОсновныеНачисленияПоСотрудникам.Сотрудник
|ИЗ
| РегистрРасчета.ОсновныеНачисления.ПоСотрудникам КАК ОсновныеНачисленияПоСотрудникам");
ТабличноеПоле1 = запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
КнопкаВыполнитьНажатие(Неопределено);
КонецПроцедуры
Отчет "ОтчетПоПремиям"
Запрос СКД:
ВЫБРАТЬ
ОсновныеНачисления.Сотрудник,
ОсновныеНачисления.Результат КАК Сумма,
ОсновныеНачисления.Размер КАК Процент
ИЗ
РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
ГДЕ
ОсновныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Премия)
Модуль тестирования
Перем ссСклад;
Перем ссТовар;
Перем ссКлиент;
Перем ссНакладная;
Перем ссМенеджер;
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика.
КонецПроцедуры
Процедура СоздатьЭлементы()
обЭлемент = Справочники.МестаХранения.СоздатьЭлемент();
обЭлемент.Наименование = "Склад 1";
обЭлемент.Записать();
ссСклад = обЭлемент.Ссылка;
обЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
обЭлемент.Наименование = "Товар 1";
обЭлемент.Записать();
ссТовар = обЭлемент.Ссылка;
обЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
обЭлемент.Наименование = "Контрагент 1";
обЭлемент.Записать();
ссКлиент = обЭлемент.Ссылка;
обЭлемент = Справочники.ФизическиеЛица.СоздатьЭлемент();
обЭлемент.Наименование = "Тестов 1";
обЭлемент.Записать();
ссМенеджер = обЭлемент.Ссылка;
КонецПроцедуры
Процедура ПроверитьРавенство(об1, об2)
Если об1 <> об2 Тогда
ВызватьИсключение Строка(об1) + " не равен " + Строка(об2);
КонецЕсли;
КонецПроцедуры
Процедура СоздатьОстатки(Товар, Количество, Сумма, НаДату)
обДокумент = Документы.ПриходнаяНакладная.СоздатьДокумент();
обДокумент.Дата = НаДату;
обДокумент.Склад = ссСклад;
строка = обДокумент.Товары.Добавить();
строка.Номенклатура = Товар;
строка.Количество = Количество;
строка.Сумма = Сумма;
обДокумент.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Функция СоздатьРасход(Количество, Сумма, НаДату)
обДокумент = Документы.РасходнаяНакладная.СоздатьДокумент();
обДокумент.Дата = НаДату;
обДокумент.Склад = ссСклад;
обДокумент.Контрагент = ссКлиент;
строка = обДокумент.Товары.Добавить();
строка.Номенклатура = ссТовар;
строка.Количество = Количество;
строка.Сумма = Сумма;
обДокумент.Записать(РежимЗаписиДокумента.Проведение);
Возврат обДокумент.Ссылка;
КонецФункции
Процедура ПроведениеНакладнойНажатие(Элемент)
НачатьТранзакцию();
фПроведен = Ложь;
Попытка
СоздатьЭлементы();
обДокумент = Документы.РасходнаяНакладная.СоздатьДокумент();
обДокумент.Дата = ТекущаяДата();
обДокумент.Склад = ссСклад;
строка = обДокумент.Товары.Добавить();
строка.Номенклатура = ссТовар;
строка.Количество = 1;
строка.Сумма = 10;
Попытка
обДокумент.Записать(РежимЗаписиДокумента.Проведение);
//тзДвижения = ПолучитьОстатки
фПроведен = Истина;
Исключение
КонецПопытки;
ПроверитьРавенство(Ложь, фПроведен);
Исключение
Сообщить("Тест не пройден");
КонецПопытки;
ОтменитьТранзакцию();
КонецПроцедуры
Процедура СписаниеПоСебестоимостиНажатие(Элемент)
НачатьТранзакцию();
Попытка
СоздатьЭлементы();
СоздатьОстатки(ссТовар, 1, 100, ТекущаяДата());
СоздатьОстатки(ссТовар, 1, 200, ТекущаяДата());
обДокумент = Документы.РасходнаяНакладная.СоздатьДокумент();
обДокумент.Дата = ТекущаяДата();
обДокумент.Склад = ссСклад;
строка = обДокумент.Товары.Добавить();
строка.Номенклатура = ссТовар;
строка.Количество = 2;
строка.Сумма = 10;
обДокумент.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный);
тзДвижения = ПолучитьДвиженияОстаткиНоменлатуры(обДокумент.Ссылка);
ПроверитьРавенство(1, тзДвижения.Количество());
ПроверитьРавенство(300, тзДвижения[0].Сумма);
ПроверитьРавенство(2, тзДвижения[0].Количество);
Исключение
Сообщить("Тест не пройден" + ОписаниеОшибки());
КонецПопытки;
ОтменитьТранзакцию();
КонецПроцедуры
Функция ПолучитьДвиженияОстаткиНоменлатуры(ссДокумент)
запрос = Новый Запрос("ВЫБРАТЬ
| ОстаткиНоменклатуры.ВидДвижения,
| ОстаткиНоменклатуры.Склад,
| ОстаткиНоменклатуры.Номенклатура,
| ОстаткиНоменклатуры.Количество,
| ОстаткиНоменклатуры.Сумма
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры КАК ОстаткиНоменклатуры
|ГДЕ
| ОстаткиНоменклатуры.Регистратор = &Регистратор");
запрос.УстановитьПараметр("Регистратор", ссДокумент);
Возврат запрос.Выполнить().Выгрузить();
КонецФункции
Функция ПолучитьДвиженияОбъемПродаж(ссДокумент)
запрос = Новый Запрос("ВЫБРАТЬ
| ОбъемПродаж.Контрагент,
| ОбъемПродаж.Сумма,
| ОбъемПродаж.Менеджер
|ИЗ
| РегистрНакопления.ОбъемПродаж КАК ОбъемПродаж
|ГДЕ
| ОбъемПродаж.Регистратор = &Регистратор");
запрос.УстановитьПараметр("Регистратор", ссДокумент);
Возврат запрос.Выполнить().Выгрузить();
КонецФункции
Процедура ДвиженияОбъемПродажНажатие(Элемент)
НачатьТранзакцию();
Попытка
СоздатьЭлементы();
СоздатьОстатки(ссТовар, 1, 100, ТекущаяДата());
обДокумент = Документы.РасходнаяНакладная.СоздатьДокумент();
обДокумент.Дата = ТекущаяДата();
обДокумент.Склад = ссСклад;
обДокумент.Контрагент = ссКлиент;
обДокумент.Менеджер = ссМенеджер;
строка = обДокумент.Товары.Добавить();
строка.Номенклатура = ссТовар;
строка.Количество = 1;
строка.Сумма = 10;
обДокумент.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный);
тзДвижения = ПолучитьДвиженияОбъемПродаж(обДокумент.Ссылка);
ПроверитьРавенство(1, тзДвижения.Количество());
ПроверитьРавенство(10, тзДвижения[0].Сумма);
ПроверитьРавенство(ссКлиент, тзДвижения[0].Контрагент);
ПроверитьРавенство(ссМенеджер, тзДвижения[0].Менеджер);
Исключение
Сообщить("Тест не пройден" + ОписаниеОшибки());
КонецПопытки;
ОтменитьТранзакцию();
КонецПроцедуры
Процедура ПолучитьПроцентСкидкиНажатие(Элемент)
НачатьТранзакцию();
Попытка
прошлыйМесяц = ДобавитьМесяц(ТекущаяДата(), -1);
СоздатьЭлементы();
СоздатьОстатки(ссТовар, 100, 10000, прошлыйМесяц - 1);
СоздатьРасход(1, 100, прошлыйМесяц);
процент = ТоварныеДокументы.ПолучитьПроцентСкидки(ссКлиент, прошлыйМесяц);
ПроверитьРавенство(0, процент);
процент = ТоварныеДокументы.ПолучитьПроцентСкидки(ссКлиент, ТекущаяДата());
ПроверитьРавенство(0, процент);
СоздатьРасход(1, 1000, прошлыйМесяц);
процент = ТоварныеДокументы.ПолучитьПроцентСкидки(ссКлиент, ТекущаяДата());
ПроверитьРавенство(2, процент);
СоздатьРасход(1, 2000, прошлыйМесяц);
процент = ТоварныеДокументы.ПолучитьПроцентСкидки(ссКлиент, ТекущаяДата());
ПроверитьРавенство(5, процент);
СоздатьРасход(1, 2000, прошлыйМесяц);
процент = ТоварныеДокументы.ПолучитьПроцентСкидки(ссКлиент, ТекущаяДата());
ПроверитьРавенство(10, процент);
СоздатьРасход(1, 5000, прошлыйМесяц);
процент = ТоварныеДокументы.ПолучитьПроцентСкидки(ссКлиент, ТекущаяДата());
ПроверитьРавенство(15, процент);
Исключение
Сообщить("Тест не пройден" + ОписаниеОшибки());
КонецПопытки;
ОтменитьТранзакцию();
КонецПроцедуры