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