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

16:26
Задача 1.6 Оперативный учет
 
 

Регистр сведений УчетнаяПолитика с реквизитом КонтролироватьОтрицательныеОстатки тип булево периодичность год

1)  Учет ведется в разрезе сроков годности .поэтому в регистры остатки ,продажи добавляем измерение СрокГодности тип дата и в таб часть Приходной.

2) в Приходной пишем след код :


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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый() и ЭтотОбъект.Дата< НачалоДня(ТекущаяДата()) Тогда
  Сообщение = Новый СообщениеПользователю;
  Сообщение.Текст = "нельзя вводить документ задним числом";
  Сообщение.Поле = "";
  Сообщение.УстановитьДанные(ЭтотОбъект);
  Сообщение.Сообщить();
  Отказ=Истина;
  
  КонецЕсли;
СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма");  
КонецПроцедуры


В Расходной  след код:



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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый() и ЭтотОбъект.Дата< НачалоДня(ТекущаяДата()) Тогда
  Сообщение = Новый СообщениеПользователю;
  Сообщение.Текст = "нельзя вводить документ задним числом";
  Сообщение.Поле = "";
  Сообщение.УстановитьДанные(ЭтотОбъект);
  Сообщение.Сообщить();
  Отказ=Истина;
  
  КонецЕсли;
СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма");  
КонецПроцедуры



Отчеты :

1) Продажи 


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




2) Ведомость по Партиям:

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


2) ресурсы выбираем все 

3)Параметры НачПериода КонПериода

4) Группировки  Детальные , СрокГодности

5)Выбранные поля разбиваем по группам ресурсы расп авто.


Задача решена.
 
Просмотров: 5481 | Добавил: moshefoo | Рейтинг: 4.2/5
Всего комментариев: 1
1 Добрый вечер  
1. Приходная накладная создает движения:
- приход по табличной части
- сторно всей или части записи расходной накладной
Это приведет к задвоению поступления в части сторнируемой номенклатуры
2. Наличие отрицательных остатков никак не зависит от текущей политики, эта политика влияет только на возможность списания в минус. Поэтому проверка этого условия в приходной излишняя.

Имя *:
Email *:
Код *: