среда, 27 мая 2015 г.

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

Решение:
Для начала определимся что делать с загадочной фразой из условия: "Система должна обеспечивать пользователя возможностью ведения складского учета не только на счете «Товары», но и на любом другом выбранным пользователем счете".

Наименее "порнографическим" мне показался следующая интерпретация:
Понял так, что пользователь может выбирать счет на котором будет вести учет товаров. Храниться это значение будет в константе.


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

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

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


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

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

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

7) Переходим к Расходной накладной.


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

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

8) Отчет 

Отчет строится из таблицы оборотов по счету "ПрибылиУбытки", поэтому  в субконто к этому счету добавлен вид  субконто "Номенклатура".

Задаем условие Субконто1.ЭтоКомплект  для того чтобы в отчет попадали только комплекты.

ВЫБРАТЬ
УправленческийОбороты.Субконто1 КАК Комплект,
УправленческийОбороты.КорСубконто2 КАК Материал,
СУММА(УправленческийОбороты.СуммаОборотКт) КАК Продажа,
СУММА(УправленческийОбороты.СуммаОборотДт) КАК Себестоимость,
СУММА(УправленческийОбороты.КоличествоКорОборотДт) КАК Колво
ИЗ
РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), , Субконто1.ЭтоКомплект, , ) КАК УправленческийОбороты

СГРУППИРОВАТЬ ПО
УправленческийОбороты.Субконто1,
УправленческийОбороты.КорСубконто2


1 комментарий:

  1. все хорошо, но если количество молоко домик в деревне поставить на приходе в основном складе 20 шт вместо 100, то расходная накладная проведется и остатки уйдут в минус

    ОтветитьУдалить