Условие из сборника:
Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа – «Расходная накладная». Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части. Учет товаров ведется в разрезе складов. Каждый из складов имеет свой приоритет, который может меняться не чаще чем 1 раз в месяц. При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара вообще. Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. Списание себестоимости товаров должно быть организовано по складам, в зависимости от текущего (на момент проведения документа) значения их приоритета. В первую очередь товар списывается со склада с минимальным приоритетом, потом со следующего склада с большим приоритетом и т.д. Себестоимость товаров рассчитывается как средняя по складу. Поступление товара происходит на один выбранный пользователем в документе «Приходная накладная» склад. Закупки производятся менеджерами, причем менеджер никак не связан со складом, на который приходуется товар. Необходимо построить отчеты о закупках за период товаров менеджерами и анализ продаж за период.
Решение:
1) Добавляем недостающие объекты:
В системе будет 3 регистра накопления( Остатки номенклатуры(тип остатки) и 2 оборотных "Продажи" и "Закупки".
2) добавим справочник "склады" и регистр сведений "Приоритеты складов", заполним этот регистр.
3) Опишем обработку проведения "Приходной накладной".
Склад и менеджер - реквизиты шапки.
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Закупки.Записывать = Истина;
Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
// регистр ОстаткиНоменклатуры Приход
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма;
Запись = Движения.Закупки.Добавить();
Запись.Период = Дата;
Запись.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Запись.Менеджер = Менеджер;
Запись.Количество = ТекСтрокаСписокНоменклатуры.Количество;
Запись.Склад = Склад;
КонецЦикла;
КонецПроцедуры
4) Проведя несколько приходных накладных можем сделать отчет по закупкам.
5) Пишем обработку проведения расходной накладной.
//1 Очистка движений
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Очистить();
Движения.ОстаткиНоменклатуры.Записать();
Движения.Продажи.Записывать = Истина;
Движения.Продажи.Очистить();
Движения.Продажи.Записать();
// Блокировка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();
//Запрос
Запрос = Новый("Запрос");
Запрос.Текст = "ВЫБРАТЬ
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
|ПОМЕСТИТЬ ДокТЧ
|ИЗ
| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
|ГДЕ
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПриоритетыСкладовСрезПоследних.Приоритет КАК Приоритет,
| ДокТЧ.Номенклатура КАК Номенклатура,
| ДокТЧ.Количество КАК КолДок,
| ДокТЧ.Сумма КАК СумДок,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК ОстатокКол,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК ОстатокСум,
| ОстаткиНоменклатурыОстатки.Склад КАК Склад
|ИЗ
| ДокТЧ КАК ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &ТочкаИтогов,
| Номенклатура В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура
| ИЗ
| ДокТЧ)) КАК ОстаткиНоменклатурыОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетыСкладов.СрезПоследних(&Период, ) КАК ПриоритетыСкладовСрезПоследних
| ПО ОстаткиНоменклатурыОстатки.Склад = ПриоритетыСкладовСрезПоследних.Склад
| ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| Приоритет
|ИТОГИ
| МАКСИМУМ(КолДок),
| МАКСИМУМ(СумДок),
| СУММА(ОстатокКол),
| СУММА(ОстатокСум)
|ПО
| Номенклатура";
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Запрос.УстановитьПараметр("Период",Дата);
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
ТочкаИтогов=Неопределено;
Иначе
ТочкаИтогов = Новый Граница(МоментВремени(),ВидГраницы.Исключая);
КонецЕсли;
Запрос.УстановитьПараметр("ТочкаИтогов", ТочкаИтогов);
ВыборкаНоменлатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура");
Пока ВыборкаНоменлатура.Следующий() Цикл
Если ВыборкаНоменлатура.ОстатокКол < ВыборкаНоменлатура.КолДок Тогда
Отказ = Истина;
Сообщение = Новый("СообщениеПользователю");
Сообщение.Текст ="Недостаточно товара "+ ВыборкаНоменлатура.Номенклатура +" надо еще " +(ВыборкаНоменлатура.колДок - ВыборкаНоменлатура.ОстатокКол);
Сообщение.Сообщить();
Иначе
ОсталосьСписать = ВыборкаНоменлатура.КолДок;
Товар = ВыборкаНоменлатура.Номенклатура;
ВыборкаСклад = ВыборкаНоменлатура.Выбрать();
Пока ВыборкаСклад.Следующий() и ОсталосьСписать>0 Цикл
КоличествоКСписанию = Мин(ОсталосьСписать, ВыборкаСклад.ОстатокКол);
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Товар;
Движение.Склад = ВыборкаСклад.Склад;
Движение.Количество = КоличествоКСписанию;
Если ВыборкаСклад.ОстатокКол <> 0 Тогда
Себестоимость= КоличествоКСписанию * ВыборкаСклад.ОстатокСум/ВыборкаСклад.ОстатокКол;
Иначе
Себестоимость =0;
КонецЕсли;
Движение.Сумма = Себестоимость;
//продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Товар;
Движение.Количество = КоличествоКСписанию;
Движение.Себестоимость = Себестоимость;
Движение.СуммаПродаж = КоличествоКСписанию * (ВыборкаСклад.СумДок/ВыборкаСклад.КолДок);
ОсталосьСписать = ОсталосьСписать - КоличествоКСписанию;
КонецЦикла;
КонецЕсли;
КонецЦикла;
5) Делаем отчет по продажам.
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СебестоимостьОборот КАК Себестоимость,
ПродажиОбороты.СуммаПродажОборот КАК Продажа,
ЕСТЬNULL(ПродажиОбороты.СуммаПродажОборот, 0) - ЕСТЬNULL(ПродажиОбороты.СебестоимостьОборот, 0) КАК Прибыль
ПОМЕСТИТЬ Продажи
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот,
ПродажиОбороты.СебестоимостьОборот,
ПродажиОбороты.СуммаПродажОборот
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.Количество,
Продажи.Себестоимость,
Продажи.Продажа,
Продажи.Прибыль,
МИНИМУМ(ПродажиОбороты.Регистратор.Дата) КАК ДатаПервой,
МАКСИМУМ(ПродажиОбороты.Регистратор.Дата) КАК ДатаПоследней,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор.Ссылка) КАК РегистраторСсылка,
ВЫБОР
КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор) = 1
ТОГДА "Разовая"
ИНАЧЕ РАЗНОСТЬДАТ(МИНИМУМ(ПродажиОбороты.Регистратор.Дата), МАКСИМУМ(ПродажиОбороты.Регистратор.Дата), ДЕНЬ) / КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор)
КОНЕЦ КАК Интервал,
РАЗНОСТЬДАТ(МАКСИМУМ(ПродажиОбороты.Регистратор.Дата), &ДатаОкончания, ДЕНЬ) КАК Срок
ИЗ
Продажи КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, Авто, ) КАК ПродажиОбороты
ПО Продажи.Номенклатура = ПродажиОбороты.Номенклатура
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура,
Продажи.Количество,
Продажи.Себестоимость,
Продажи.Продажа,
Продажи.Прибыль
Скачать решение задачи 1.21 (1с специалист)
Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа – «Расходная накладная». Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части. Учет товаров ведется в разрезе складов. Каждый из складов имеет свой приоритет, который может меняться не чаще чем 1 раз в месяц. При проведении расходной накладной необходимо в первую очередь контролировать хватает ли товара вообще. Если нет – выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ. Списание себестоимости товаров должно быть организовано по складам, в зависимости от текущего (на момент проведения документа) значения их приоритета. В первую очередь товар списывается со склада с минимальным приоритетом, потом со следующего склада с большим приоритетом и т.д. Себестоимость товаров рассчитывается как средняя по складу. Поступление товара происходит на один выбранный пользователем в документе «Приходная накладная» склад. Закупки производятся менеджерами, причем менеджер никак не связан со складом, на который приходуется товар. Необходимо построить отчеты о закупках за период товаров менеджерами и анализ продаж за период.
Решение:
1) Добавляем недостающие объекты:
В системе будет 3 регистра накопления( Остатки номенклатуры(тип остатки) и 2 оборотных "Продажи" и "Закупки".
2) добавим справочник "склады" и регистр сведений "Приоритеты складов", заполним этот регистр.
3) Опишем обработку проведения "Приходной накладной".
Склад и менеджер - реквизиты шапки.
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Закупки.Записывать = Истина;
Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
// регистр ОстаткиНоменклатуры Приход
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;
Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма;
Запись = Движения.Закупки.Добавить();
Запись.Период = Дата;
Запись.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Запись.Менеджер = Менеджер;
Запись.Количество = ТекСтрокаСписокНоменклатуры.Количество;
Запись.Склад = Склад;
КонецЦикла;
КонецПроцедуры
5) Пишем обработку проведения расходной накладной.
//1 Очистка движений
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Очистить();
Движения.ОстаткиНоменклатуры.Записать();
Движения.Продажи.Записывать = Истина;
Движения.Продажи.Очистить();
Движения.Продажи.Записать();
// Блокировка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();
//Запрос
Запрос = Новый("Запрос");
Запрос.Текст = "ВЫБРАТЬ
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
|ПОМЕСТИТЬ ДокТЧ
|ИЗ
| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
|ГДЕ
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПриоритетыСкладовСрезПоследних.Приоритет КАК Приоритет,
| ДокТЧ.Номенклатура КАК Номенклатура,
| ДокТЧ.Количество КАК КолДок,
| ДокТЧ.Сумма КАК СумДок,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК ОстатокКол,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК ОстатокСум,
| ОстаткиНоменклатурыОстатки.Склад КАК Склад
|ИЗ
| ДокТЧ КАК ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &ТочкаИтогов,
| Номенклатура В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура
| ИЗ
| ДокТЧ)) КАК ОстаткиНоменклатурыОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПриоритетыСкладов.СрезПоследних(&Период, ) КАК ПриоритетыСкладовСрезПоследних
| ПО ОстаткиНоменклатурыОстатки.Склад = ПриоритетыСкладовСрезПоследних.Склад
| ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| Приоритет
|ИТОГИ
| МАКСИМУМ(КолДок),
| МАКСИМУМ(СумДок),
| СУММА(ОстатокКол),
| СУММА(ОстатокСум)
|ПО
| Номенклатура";
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Запрос.УстановитьПараметр("Период",Дата);
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
ТочкаИтогов=Неопределено;
Иначе
ТочкаИтогов = Новый Граница(МоментВремени(),ВидГраницы.Исключая);
КонецЕсли;
Запрос.УстановитьПараметр("ТочкаИтогов", ТочкаИтогов);
ВыборкаНоменлатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура");
Пока ВыборкаНоменлатура.Следующий() Цикл
Если ВыборкаНоменлатура.ОстатокКол < ВыборкаНоменлатура.КолДок Тогда
Отказ = Истина;
Сообщение = Новый("СообщениеПользователю");
Сообщение.Текст ="Недостаточно товара "+ ВыборкаНоменлатура.Номенклатура +" надо еще " +(ВыборкаНоменлатура.колДок - ВыборкаНоменлатура.ОстатокКол);
Сообщение.Сообщить();
Иначе
ОсталосьСписать = ВыборкаНоменлатура.КолДок;
Товар = ВыборкаНоменлатура.Номенклатура;
ВыборкаСклад = ВыборкаНоменлатура.Выбрать();
Пока ВыборкаСклад.Следующий() и ОсталосьСписать>0 Цикл
КоличествоКСписанию = Мин(ОсталосьСписать, ВыборкаСклад.ОстатокКол);
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = Товар;
Движение.Склад = ВыборкаСклад.Склад;
Движение.Количество = КоличествоКСписанию;
Если ВыборкаСклад.ОстатокКол <> 0 Тогда
Себестоимость= КоличествоКСписанию * ВыборкаСклад.ОстатокСум/ВыборкаСклад.ОстатокКол;
Иначе
Себестоимость =0;
КонецЕсли;
Движение.Сумма = Себестоимость;
//продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Товар;
Движение.Количество = КоличествоКСписанию;
Движение.Себестоимость = Себестоимость;
Движение.СуммаПродаж = КоличествоКСписанию * (ВыборкаСклад.СумДок/ВыборкаСклад.КолДок);
ОсталосьСписать = ОсталосьСписать - КоличествоКСписанию;
КонецЦикла;
КонецЕсли;
КонецЦикла;
5) Делаем отчет по продажам.
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СебестоимостьОборот КАК Себестоимость,
ПродажиОбороты.СуммаПродажОборот КАК Продажа,
ЕСТЬNULL(ПродажиОбороты.СуммаПродажОборот, 0) - ЕСТЬNULL(ПродажиОбороты.СебестоимостьОборот, 0) КАК Прибыль
ПОМЕСТИТЬ Продажи
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот,
ПродажиОбороты.СебестоимостьОборот,
ПродажиОбороты.СуммаПродажОборот
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.Количество,
Продажи.Себестоимость,
Продажи.Продажа,
Продажи.Прибыль,
МИНИМУМ(ПродажиОбороты.Регистратор.Дата) КАК ДатаПервой,
МАКСИМУМ(ПродажиОбороты.Регистратор.Дата) КАК ДатаПоследней,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор.Ссылка) КАК РегистраторСсылка,
ВЫБОР
КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор) = 1
ТОГДА "Разовая"
ИНАЧЕ РАЗНОСТЬДАТ(МИНИМУМ(ПродажиОбороты.Регистратор.Дата), МАКСИМУМ(ПродажиОбороты.Регистратор.Дата), ДЕНЬ) / КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор)
КОНЕЦ КАК Интервал,
РАЗНОСТЬДАТ(МАКСИМУМ(ПродажиОбороты.Регистратор.Дата), &ДатаОкончания, ДЕНЬ) КАК Срок
ИЗ
Продажи КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, Авто, ) КАК ПродажиОбороты
ПО Продажи.Номенклатура = ПродажиОбороты.Номенклатура
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура,
Продажи.Количество,
Продажи.Себестоимость,
Продажи.Продажа,
Продажи.Прибыль
Если у вас были финансовые проблемы, тогда вам пора улыбаться. Вам нужно всего лишь связаться с г-ном Бенджамином, чтобы узнать сумму, которую вы хотите занять, и период платежа, который вас устраивает, и вы получите ваш кредит в течение трех рабочих дней. Я только что в шестой раз получил кредит в 700 тысяч долларов на срок 180 месяцев с возможностью оплаты до истечения срока. Мистер Бенджамин помогает мне с кредитом. Свяжитесь с ним, и вы увидите, что он очень честный человек с добрым сердцем. Его электронная почта lfdsloans@outlook.com и его номер телефона в WhatApp + 1-989-394- 3740.
ОтветитьУдалить