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

14:02
Задача 1.2 Оперативный учет
Все те же яйца только в профиль

1) в этой задаче мы партии берем не из регистра остатки, а прямо из шапки документа расходная 


в приходной можно для красоты вставить след код: в модуле формы создадим форму документа приходная

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

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

КонецПроцедуры


хотя нам по условию это и не нужно .

в модуле объекта: след код


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Вставить содержимое обработчика.
Движения.ОстаткиНоменклатуры.Записывать = истина;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
              | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
              | СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма,
              | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура,
              | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка КАК Партия,
              | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка.Дата КАК Период
              |ИЗ
              | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры
              |ГДЕ
              | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
              | И ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры = &ВидНоменклатры
              |
              |СГРУППИРОВАТЬ ПО
              | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура,
              | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка,
              | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка.Дата";
  Запрос.УстановитьПараметр("Ссылка",Ссылка);
  Запрос.УстановитьПараметр("ВидНоменклатры",Перечисления.ВидыНоменклатуры.Товар);
  Движения.ОстаткиНоменклатуры.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры

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


в документе Расходная : пишем след код 


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


УчетнаяПолитика = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).Политика;

СтрокаСОртировки = "";
Если УчетнаяПолитика = Перечисления.УчетнаяПолитика.ФИФО тогда
СтрокаСОртировки = " ВОЗР ";
иначе                       
СтрокаСОртировки = " УБЫВ ";
конецЕсли;


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

КонецПроцедуры

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




Отчеты здесь точно такие же как в задаче 1.1 опер учет. поэтому описывать не буду.







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