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