вторник, 10 марта 2015 г.

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

Условие из сборника:
Организация занимается оказанием услуг. Стоимость услуг определяется в условных единицах, а их оплата происходит в рублях, причем курс условной единицы определяется для каждого контрагента индивидуально. Расчеты в условных единицах ведутся только с покупателями. Оказание услуг отражается с помощью документа «Расходная накладная». Стоимость услуг указывается в условных единицах. При проведении документа формируется проводка:
Дт «Покупатели» - Кт «Прибыли и убытки»
на сумму оказанных услуг в условных единицах и в рублях (по текущему
курсу). Текущий курс условной единицы устанавливается регламентным документом (создается только один экземпляр этого документа в месяц). В табличной части указывается контрагент и курс условной единицы. Документ может быть сформирован в любое время месяца, но с его помощью определяется курс ТЕКУЩЕГО месяца. Курсы условных единиц назначаются пользователями вручную. Важно учесть ситуацию, что данный документ может, вводиться ПОСЛЕ проведения ряда документов продажи текущего месяца. Т.е. он установит новый курс, но в этом месяце есть документы, сделавшие движения по старому курсу. В таком случае документ ввода курса должен сделать корректирующие движения: Если курс условной единицы уменьшился (задолженность покупателя должна уменьшиться) то проводка будет выглядеть следующим образом:
Дт «Прибыли и убытки» - Кт «Покупатели»
на разницу во взаиморасчетах (в рублях), которая возникла в результате
смены курса В противном случае:
Дт «Покупатели» - Кт «Прибыли и убытки»
на разницу во взаиморасчетах (в рублях), которая возникла в результате
смены курса. Пример: курс прошлого месяца 26 рублей, в этом месяце покупатель приобрел товара на 1000 у.е. В результате курс устанавливается в значение 27 рублей за 1 у.е., и делается проводка:
Дт «Покупатели» - Кт «Прибыли и убытки» на сумму (27-26)X1000= 1000
рублей. Решение должно предусматривать возможность корректного перепроведения документа «Расходная накладная» от начала месяца, после того как в середине месяца был введен документ «Установка курсов».

Решение:

Для решения задачи задействуем следующие объекты:
1) ПВХ "Виды субконто". 

  • Заполняем типы значений характеристик и дополнительные значения характеристик. 
  • Согласно условия задачи заводим  предопределенные  элементы  "Контрагенты","Накладная".

2) Дорабатываем план счетов. 
  •  на закладке "субконто" заполняем тип субконто и устанавливаем значение субконто=2.
  • Редактируем предопределенный счет "Покупатели".(признак учета и субконто).
3) Добавляем регистр бухгалтерии "Управленческий".
  • Связываем его с планом счетов
  • Добавляем ресурсы ( сумма, СуммаУЕ)
  • Выбираем регистраторы.
4) Не забываем о том, что в задачах бухгалтерского учета необходимо добавить документ,  с помощью которого можно добавлять записи в регистр вручную. Назовем его "Ручная операция".  укажем что он является регистратором нашего регистра. 
добавим форму на форму вытащим реквизит Объект-движения-управленческий.

5) Добавим РС "Курсы контрагентов".

6) Документ "Установка Курсов".
Добавим ТЧ Курсы с реквизитами "Контрагент" и "курсУЕ".

При проведении документ должен записать в РС сведений записать новые курсы в регистр сведений, но и сделать при необходимости дополнительные движения по регистру бухгалтерии.


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

Процедура ПриЗаписи(Отказ)
Дата = НачалоМесяца(Дата);
КонецПроцедуры


7) Документ "Расходная накладная".
При проведении должен не только, сформировать движения по текущему курсу но и проверить есть ли записи по текущей накладной в документе "Установка курсов" этого месяца.Если записи есть их удаляем.


Процедура ОбработкаПроведения(Отказ, Режим)
// регистр Управленческий 
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
//блокировка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий");
ЭлементБлокировки.УстановитьЗначение("Счет",ПланыСчетов.Управленческий.Покупатели);
ЭлементБлокировки.УстановитьЗначение("Субконто1",Контрагент);
ЭлементБлокировки.УстановитьЗначение("Субконто2",Ссылка);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Отбор = Новый("Структура");
Отбор.Вставить("Контрагент",Контрагент);
ТекКурс = РегистрыСведений.КурсыКонтрагентов.ПолучитьПоследнее(Дата,Отбор).КурсУЕ;
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.Период = Дата;
Движение.СуммаУЕ = СуммаПоДокументу;
Движение.Сумма =СуммаПоДокументу* ТекКурс;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Накладная] = Ссылка;
// Проверка
Если Курс <> ТекКурс Тогда
ВыборкаДок = Документы.УстановкаКурсов.Выбрать(НачалоМесяца(Дата),КонецМесяца(Дата));
Если ВыборкаДок.Следующий() Тогда
Док = ВыборкаДок.ПолучитьОбъект();
Набор  = Док.Движения.Управленческий;
Набор.Прочитать();
Для Каждого ТекСтрока Из Набор Цикл
Если ТекСтрока.СубконтоДт.Накладная = Ссылка Или ТекСтрока.СубконтоКт.Накладная= Ссылка Тогда 
Набор.Удалить(ТекСтрока);
КонецЕсли;
КонецЦикла;
Набор.Записать();
КонецЕсли;
КонецЕсли;
Курс = ТекКурс;
КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма");
КонецПроцедуры





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

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