понедельник, 2 марта 2015 г.

1c специалист задача 1.21

Условие из сборника:
Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа – «Расходная накладная». Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части. Учет товаров ведется в разрезе складов. Каждый из складов имеет свой приоритет, который может меняться не чаще чем 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. Если у вас были финансовые проблемы, тогда вам пора улыбаться. Вам нужно всего лишь связаться с г-ном Бенджамином, чтобы узнать сумму, которую вы хотите занять, и период платежа, который вас устраивает, и вы получите ваш кредит в течение трех рабочих дней. Я только что в шестой раз получил кредит в 700 тысяч долларов на срок 180 месяцев с возможностью оплаты до истечения срока. Мистер Бенджамин помогает мне с кредитом. Свяжитесь с ним, и вы увидите, что он очень честный человек с добрым сердцем. Его электронная почта lfdsloans@outlook.com и его номер телефона в WhatApp + 1-989-394- 3740.

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