Комплексная задача 4.1 из материалов по экзамену на 1С специалист

Материал из КинтВики
Перейти к: навигация, поиск


Материалы

Материалы

Конфигурации

Задача

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, небалансовый, признак учета "Количественный"
  • Регистраторы - РасходнаяНакладная

Добавлены отчеты

  • МатериальнаяВедомость
  • ДвижениеТоваров

Расчет зарплаты

Информация


См. также


В /Планы видов расчета/ОсновныеНачисления:

  • нужно установить флаг "Расчет/Использует период действия"
  • Расчет/Зависимость от базы: Зависит по периоду действия
  • добавить предопределенный элемент "Премия"
    • установить флаги Базовые/Оклад
    • установить флаги Ведущие/Оклад


Добавить /Регистры расчета/ОсновноеНачисление

  • значение "Основные/План видов расчета" установлено в "/Планы видов расчета/ОсновныеНачисления"
  • установлен флаг "Основные/Период действия"
    • это означает что у каждой записи регистра есть интервал действия
  • установлен флаг "Основные/Базовый период"
    • это означает что у каждой записи регистра есть базовый период
  • значение "Основные/График" установлено в "/Справочники/ГрафикиРаботы"
  • значение "Основные/Значение графика" установлено в "/Регистры сведений/ГрафикиРаботы/Ресурсы/Значение"
  • значение "Основные/Дата графика" установлено в "/Регистры сведений/ГрафикиРаботы/Измерения/Дата"
  • добавлен ресурс "Данные/Ресурсы/Результат" типа "Число.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, процент);
		
	Исключение
		Сообщить("Тест не пройден" + ОписаниеОшибки());
	КонецПопытки;
	
	
	ОтменитьТранзакцию();
КонецПроцедуры