воскресенье, 1 марта 2015 г.

1c специалист задача 1.20

Условие из сборника:
Задача 1.20. Компания занимается оптовой торговлей. Все операции отражаются документами «Приходная накладная», «Расходная накладная», «Приход денег» и «Расход денег», причем для каждого из них может быть указана своя статья затрат. Таким образом, документ «Расход денег» может отражать операции например по оплате поставщику или возврата от покупателя в зависимости от выбранной статьи затрат. Структурно компания состоит из нескольких подразделений. В целях ведения управленческого учета для каждого отдела заводится бюджет (документ «Бюджет») на предстоящий месяц с указанием всех предполагаемых статей затрат, сумм по ним и возможного превышения этих сумм в суммовом выражении. Следует считать, что каждое подразделение может вводить несколько документов «Бюджет», данные которых должны суммироваться для формирования итогового бюджета. В целях контроля над исполнением бюджета при проведении любого документа должен происходить анализ фактических затрат и выводится соответствующее предупреждение, в случае превышения над бюджетом. Например, если по статье «оплата поставщикам» запланировано 100 000 и 20 000, то при суммарной оплате более 100 000 и более 120 000 должны быть выданы соответствующие предупреждения. Можно считать, что документы задним числом не вводятся, но существующие документы могут быть перепроведены. Необходимо создать отчет по исполнению бюджета за период, кратный месяцу.


Решение:
Возможно, мне на до конца удалось постичь весь глубокий замысел составителей задачи. Реально тяжело представить как в реальной жизни документом "Приход денег" списываются затраты. Но делать нечего, приходится абстрагироваться.
1) Заведем оборотный регистр "Бюджет" и справочник "СтатьиЗатрат".
 В регистре 2 измерения "Подразделение" и "Статья" и 3 ресурса (ПланСумма. планСуммапревышений, и факт).
2) Создаем все необходимые документы: «Приходная накладная», «Расходная накладная», «Приход денег» и «Расход денег»,"Бюджет"(у него еще реквизит "сумма план превышений")  у каждого реквизиты шапки "Подразделение", СтатьяЗатрат и "СуммаДокумента".
Каждый из Них является регистратором регистра "Бюджет".
3) Пишем обработку проведения документа "Бюджет"

Процедура ОбработкаПроведения(Отказ, Режим)

// регистр Бюджет
Движения.Бюджет.Записывать = Истина;
Движение = Движения.Бюджет.Добавить();
Движение.Период = Дата;
Движение.Подразделение = Подразделение;
Движение.СтатьяЗатрат = СтатьяЗатрат;
Движение.ПлановаяСуммаЗатрат = ПлановаяСумма;
Движение.ПлановаяСуммаПревышения = ПлановаяСуммаПревышения;
КонецПроцедуры


4) Пишем обработку проведения остальных документов. Она будет одинакова для всех документов.
// регистр Бюджет
Движения.Бюджет.Записывать = Истина;
Движение = Движения.Бюджет.Добавить();
Движение.Период = Дата;
Движение.Подразделение = Подразделение;
Движение.СтатьяЗатрат = СтатьяЗатрат;
Движение.ФактическаяСумма = СуммаДокумента;

Движения.Бюджет.Записать();
Бюджет.АнализФактическихЗатрат(Подразделение, СтатьяЗатрат,Дата);

Обратите внимание на команду Записать() перед вызовом процедуры общего модуля, иначе  движения текущего документа не будут учтены.

5) Процедура общего модуля

Процедура АнализФактическихЗатрат(Подразделение,СтатьяЗатрат, ДатаДок) Экспорт
Запрос = Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
             | БюджетОбороты.Подразделение КАК Подразделение,
             | БюджетОбороты.СтатьяЗатрат КАК СтатьяЗатрат,
             | ЕСТЬNULL(БюджетОбороты.ПлановаяСуммаЗатратОборот, 0) КАК ПлановаяСуммаЗатрат,
             | ЕСТЬNULL(БюджетОбороты.ПлановаяСуммаПревышенияОборот, 0) КАК ПлановаяСуммаПревышения,
             | ЕСТЬNULL(БюджетОбороты.ФактическаяСуммаОборот, 0) КАК ФактическаяСумма
             |ИЗ
             | РегистрНакопления.Бюджет.Обороты(
             | &НачалоПериода,
             | &КонецПериода,
             | ,
             | Подразделение = &Подразделение
             | И СтатьяЗатрат = &СтатьяЗатрат) КАК БюджетОбороты
             |ИТОГИ
             | СУММА(ПлановаяСуммаЗатрат),
             | СУММА(ПлановаяСуммаПревышения),
             | СУММА(ФактическаяСумма)
             |ПО
             | СтатьяЗатрат" ;
Запрос.УстановитьПараметр("Подразделение",Подразделение);
Запрос.УстановитьПараметр("СтатьяЗатрат",СтатьяЗатрат);
Запрос.УстановитьПараметр("НачалоПериода",НачалоМесяца(ДатаДок));
Запрос.УстановитьПараметр("КонецПериода",КонецМесяца(ДатаДок));
ТекстСообщения ="";
ВыборкаИтоги = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"СтатьяЗатрат");
ВыборкаИтоги.Следующий();
Если ВыборкаИтоги.ФактическаяСумма > ВыборкаИтоги.ПлановаяСуммаЗатрат  Тогда
СуммаПревышения = ВыборкаИтоги.ФактическаяСумма - ВыборкаИтоги.ПлановаяСуммаЗатрат ;
ТекстСообщения = ТекстСообщения + "Фактическая сумма затрат по статье "+ ВыборкаИтоги.СтатьяЗатрат + " превышает плановую сумму на " +СуммаПревышения  ;
КонецЕсли;
Если ВыборкаИтоги.ФактическаяСумма > ВыборкаИтоги.ПлановаяСуммаЗатрат+ВыборкаИтоги.ПлановаяСуммаПревышения Тогда
СуммаПревышения = ВыборкаИтоги.ФактическаяСумма-   ВыборкаИтоги.ПлановаяСуммаЗатрат-ВыборкаИтоги.ПлановаяСуммаПревышения;
ТекстСообщения = ТекстСообщения +Символы.ПС+ "Фактическая сумма затрат по статье "+ ВыборкаИтоги.СтатьяЗатрат + " превышает плановую сумму с превышением на " +СуммаПревышения  ;
КонецЕсли;
Если ЗначениеЗаполнено(ТекстСообщения) Тогда 
Сообщение = Новый("СообщениеПользователю");
Сообщение.Текст= ТекстСообщения;
Сообщение.Сообщить();
КонецЕсли;

КонецПроцедуры

6) Отчет
Текст запроса:
ВЫБРАТЬ
БюджетОбороты.Период,
БюджетОбороты.Подразделение,
БюджетОбороты.СтатьяЗатрат,
БюджетОбороты.ПлановаяСуммаЗатратОборот КАК План,
БюджетОбороты.ФактическаяСуммаОборот КАК Факт,
ВЫБОР
КОГДА БюджетОбороты.ПлановаяСуммаЗатратОборот <> 0
ТОГДА ВЫРАЗИТЬ(БюджетОбороты.ФактическаяСуммаОборот / БюджетОбороты.ПлановаяСуммаЗатратОборот * 100 КАК ЧИСЛО(13, 2))
КОНЕЦ КАК Процент
ИЗ
РегистрНакопления.Бюджет.Обороты(&ДатаНачала, &ДатаОкончания, Месяц, ) КАК БюджетОбороты

ресурсы рассчитываем по "статье затрат".

Скачать решение задачи 1.20

Комментариев нет:

Отправить комментарий