понедельник, 25 мая 2015 г.

1c специалист. Задача 2.30


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

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

 5) Переходим к Приходной накладной.

  • С помощью конструктора движений формируем обработку проведения.


Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Управленческий.Записывать = Истина; 
Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл 
 Движение = Движения.Управленческий.Добавить();
 Движение.СчетДт = ПланыСчетов.Управленческий.Материалы; 
 Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; 
 Движение.Период = Дата; 
 Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; 
 Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; КонецЦикла; 
КонецПроцедуры


6) Потребуется регистр сведений "Стоимости работ"
В спавочник "Номенклатура" добавляем булевый  признак "ЭтоРабота". Добавляем проверку чтобы в регистре были только позиции с признаком "ЭтоРабота".

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


7) Переходим к "Сборке".


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

8) Отчет
ВЫБРАТЬ
УправленческийОборотыВыпуск.Субконто1 КАК Изделие,
УправленческийОборотыСписание.Субконто1 КАК Материал,
ЕСТЬNULL(УправленческийОборотыСписание.КоличествоОборотКт, 0) КАК КоличествоСписание,
ЕСТЬNULL(УправленческийОборотыВыпуск.КоличествоОборотДт, 0) КАК КоличествоВыпуск,
ЕСТЬNULL(УправленческийОборотыВыпуск.СуммаОборотДт, 0) КАК СуммаВыпуск,
ЕСТЬNULL(УправленческийОборотыСписание.СуммаОборотКт, 0) КАК СуммаСписание
ПОМЕСТИТЬ ВТ
ИЗ
РегистрБухгалтерии.Управленческий.Обороты(, , Регистратор, Счет = &СчетТовары, &ВидСубконто, , КорСчет = &СчетОП, ) КАК УправленческийОборотыВыпуск
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Обороты(, , Регистратор, Счет = &СчетМатериалы, &ВидСубконто, , КорСчет = &СчетОП, ) КАК УправленческийОборотыСписание
ПО УправленческийОборотыВыпуск.Регистратор = УправленческийОборотыСписание.Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Изделие,
ВТ.Материал,
СРЕДНЕЕ(ВТ.КоличествоСписание) КАК КоличествоСписание,
СУММА(ВТ.КоличествоВыпуск) КАК КоличествоВыпуск,
СУММА(ВТ.СуммаВыпуск) КАК СуммаВыпуск,
СРЕДНЕЕ(ВТ.СуммаСписание) КАК СуммаСписание
ИЗ
ВТ КАК ВТ

СГРУППИРОВАТЬ ПО
ВТ.Материал,
ВТ.Изделие

Далее добавляем 2 вычисляемых поля
Сумма и количество
Выражение для к-ва: 
Выбор Когда КоличествоВыпуск>0 Тогда КоличествоВыпуск Иначе КоличествоСписание Конец
В ресурсах дважды выводим эти поля




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

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

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