[Специалист профессионал 1С 8.2 8.3 ]

13:42
Задача 1.1 оперативный учет
1) добавляем в справ номенклатура реквезит видНоменклатуры =ПеречислениеСсылка.ВидыНоменклатуры

2)фифо перв пришел перв ушел лифо послед пришел первым ушел

3) по партиям с переодичн  в год 
поэтому создаем регистр сведений УчетнаяПолитика с реквизитом ресурс  называем его как Значение  с ссылкой на перечисление ПеречислениеСсылка.УчетнаяПолитика  
4) в регистр  ОстаткиНоменклатуры  добавляем  измерение Партия с ссылкой на =ДокументСсылка.ПриходнаяНакладная и ресурс стоимость  
5)скопируем регистр ОстаткиНоменклатуры и сделаем его оборотным,переименуем его назовем Продажи  измерения не меняем, ресурсы будут такие количество .себестоимость.СуммаПродаж
5)в  модуле объекта приходной пишем след код :

Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры



6) в модуле объекта Расходной пишем след код:


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




Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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



Переходим к отчетам


1) Остатки   

пишем запрос :

ВЫБРАТЬ
ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
ОстаткиНоменклатурыОстатки.Партии,
ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество,
ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК Сумма
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки


2) выбираем ресурсы  сумма ,количество

3) Параметры Период,День   (День  в поле Выражение  втавляем КонецПериода(&КонецДня, "День")

4)группировки номенклатура партии
5) делаем видимым параметры в форме отчета

Отчет Продажи

1) пишем такой запрос:

ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество,
СУММА(ПродажиОбороты.СебестоимостьОборот) КАК Себестоимость,
СУММА(ПродажиОбороты.СуммаПродажОборот) КАК Продажа,
СУММА(ПродажиОбороты.СуммаПродажОборот - ПродажиОбороты.СебестоимостьОборот) КАК Выручка
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

СГРУППИРОВАТЬ ПО
ПродажиОбороты.Номенклатура

2)группировки детальные записи

3) параметры НачалоПериода,КонецПериода   выражение КонецПериода(&ОкончаниеПериода, "День")  тип  дата

задача решена.

Просмотров: 4043 | Добавил: moshefoo | Рейтинг: 4.4/5
Всего комментариев: 0
Имя *:
Email *:
Код *: