16:06 Задача1.7 Опеаративный учет | |
В этой задаче отчеты не трогаем те же остатки и продажи . как их делать мы уже знаем из задач 1.2 1.3 1 ) списание себестоимости будет здесь в разрезе складов по фифо лифо выполняется расчет позднее с помощью обработки расчет себестоимости начиная с первого документа прихода по дате (партии) итак 1) как всегда создаем регистр сведений УчетнаяПолитика с периодичностью в год в шапку документов добавляем поле склад = справочник.склады 2) в модуле объекта код: Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОстаткиНоменклатуры Расход Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Себестоимость.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение = Движения.Себестоимость.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; КонецПроцедуры В Расходной в модуле объекта код: Процедура ОбработкаПроведения(Отказ, Режим) //ЗАПИСЫВАЮ КАК ЕСТЬ Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Если ТекСтрокаСписокНоменклатуры.Номенклатура.Услуга Тогда Продолжить; КонецЕсли; Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; Движения.ОстаткиНоменклатуры.Записать(); //ПРОВЕРЯЮ НЕ СПИСАЛОСЬ ЛИ ЧЕГО ЛИШНЕГО Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад КАК Склад, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ТЧ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад, | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Склад, | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура, | ОстаткиНоменклатурыОстатки.Склад, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.Номенклатура.Представление |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | , | (Номенклатура, Склад) В | (ВЫБРАТЬ | ТЧ.Номенклатура, | ТЧ.Склад | ИЗ | ТЧ КАК ТЧ)) КАК ОстаткиНоменклатурыОстатки |ГДЕ | ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Ругнемся количество надо убавить: "+ВыборкаДетальныеЗаписи.НоменклатураПредставление+" "+ВыборкаДетальныеЗаписи.КоличествоОстаток; Сообщение.УстановитьДанные(ссылка); Сообщение.Сообщить(); Отказ = Истина; КонецЦикла; Если Отказ Тогда Возврат; КонецЕсли; // ЕСЛИ ЛИШНЕГО НЕ СПИСАЛИ ДВИГАЕМ ПРОДАЖИ Движения.Продажи.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //ПОМЕСТИМ ДОКУМЕНТ В ПОСЛЕДОВАТЕЛЬНОСТЬ Набор = Последовательности.Себестоимость.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Ссылка); Запись = Набор.Добавить(); Запись.Регистратор = Ссылка; Запись.Период = Ссылка.Дата; Набор.Записать(); КонецПроцедуры 3) Далее создаем Общий модуль с именем РегламентныеПроцедуры. галочки сервер вызов сервера пишем в нем код : Процедура РасчетСебестоимости() Экспорт Попытка Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Запуск регламентного задания расчет себестоимости" + ТекущаяДата(); Сообщение.Сообщить(); исключение КонецПопытки; Обработки.РасчетСебестоимости.РасчетВМодулеМенеджера(); КонецПроцедуры 4) Создаем обработку с именем РасчетСебестоимости Создаем форму обработки создаем команду Расчет привязываем команду к кнопке ФормаРасчет в модуле формы код: &НаКлиенте Процедура Расчет(Команда) РасчетСебестоимости(); КонецПроцедуры &НаСервере Процедура РасчетСебестоимости() Обработки.РасчетСебестоимости.РасчетВМодулеМенеджера(); КонецПроцедуры 5) в Модуль Менеджера обработки пишем код: Процедура РасчетВМодулеМенеджера() Экспорт //ПОЛУЧИМ СПИСОК ДОКУМЕНТОВ ИЗ ПОСЛЕДОВАТЕЛЬНОСТИ Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Себестоимость.Регистратор КАК Ссылка, | Себестоимость.МоментВремени КАК МоментВремени |ИЗ | Последовательность.Себестоимость КАК Себестоимость | |УПОРЯДОЧИТЬ ПО | МоментВремени"; Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); //ДЛЯ КАЖДОГО ДОКУМЕНТА ДОБАВИМ ДВИЖЕНИЯ ПО СПИСАНИЮ СЕБЕСТОИМОСТИ Пока ВыборкаДетальныеЗаписи.Следующий() Цикл НачатьТранзакцию(); СписаниеСебестоимостиПоДокументу(ВыборкаДетальныеЗаписи.Ссылка); //очистим обрабтаный документ из таблици последовательности Набор = Последовательности.Себестоимость.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Ссылка); Набор.Записать(); ЗафиксироватьТранзакцию(); КонецЦикла; КонецПроцедуры Процедура СписаниеСебестоимостиПоДокументу(ДокументСсылка) Набор = РегистрыНакопления.Себестоимость.СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(ДокументСсылка); Набор.БлокироватьДляИзменения = Истина; Набор.Записывать = Истина; Набор.Записать(); Метод = ?(РегистрыСведений.УчетнаяПолитика.СрезПоследних(ДокументСсылка.Дата,)[0].МетодСписания = Перечисления.МетодыСписания.FIFO,"ВОЗР","УБЫВ"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | И (НЕ РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга) | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧ.Номенклатура КАК Номенклатура, | СебестоимостьОстатки.Партия КАК Партия, | ТЧ.Количество КАК Количество, | СебестоимостьОстатки.КоличествоОстаток КАК КоличествоОстаток, | СебестоимостьОстатки.СуммаОстаток, | СебестоимостьОстатки.СуммаОстаток / СебестоимостьОстатки.КоличествоОстаток КАК Цена |ИЗ | ТЧ КАК ТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Себестоимость.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ТЧ.Номенклатура | ИЗ | ТЧ КАК ТЧ)) КАК СебестоимостьОстатки | ПО ТЧ.Номенклатура = СебестоимостьОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | Партия "+Метод+" |ИТОГИ | МАКСИМУМ(Количество), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", ДокументСсылка.МоментВремени()); Запрос.УстановитьПараметр("Ссылка", ДокументСсылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); ОсталосьСписать = ВыборкаНоменклатура.Количество; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Запись = Набор.Добавить(); Запись.Регистратор = ДокументСсылка; Запись.Активность = Истина; Запись.Период = ДокументСсылка.Дата; Запись.ВидДвижения = ВидДвиженияНакопления.Расход; Запись.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Запись.Партия = ВыборкаДетальныеЗаписи.Партия; Запись.Количество = Мин(ВыборкаДетальныеЗаписи.КоличествоОстаток,ОсталосьСписать); Запись.Сумма = ?(Запись.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток,ВыборкаДетальныеЗаписи.СуммаОстаток,Запись.Количество*ВыборкаДетальныеЗаписи.Цена); ОсталосьСписать = ОсталосьСписать-Запись.Количество; Если ОсталосьСписать<=0 Тогда Прервать; КонецЕсли; КонецЦикла; КонецЦикла; Набор.Записать(); КонецПроцедуры Теперь о регистрах в остатках добавить новое измерение склад добавить регистр накопления остатков Себестоимость , изм Номенклатура,Партия рес Количество Сумма И под конец создадим регламентное задание РасчетСебестоимости свяжем рег задание с методом в котором опишем код: Процедура РасчетСебестоимости() Экспорт Попытка Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Запуск регламентного задания расчет себестоимости" + ТекущаяДата(); Сообщение.Сообщить(); исключение КонецПопытки; Обработки.РасчетСебестоимости.РасчетВМодулеМенеджера(); КонецПроцедуры настроим расписание задания каждые 7 сек каждый день . Ну и Отчеты : 1) продажи код: ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Продажа, СебестоимостьОбороты.СуммаРасход КАК Себестоимость, ПродажиОбороты.СуммаОборот - ЕСТЬNULL(СебестоимостьОбороты.СуммаРасход, 0) КАК Прибыль ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Себестоимость.Обороты КАК СебестоимостьОбороты ПО ПродажиОбороты.Номенклатура = СебестоимостьОбороты.Номенклатура 2) Остатки код: ВЫБРАТЬ ОстаткиНоменклатурыОстатки.Номенклатура, ОстаткиНоменклатурыОстатки.Склад, ОстаткиНоменклатурыОстатки.КоличествоОстаток ИЗ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки Задача решена | |
|
Всего комментариев: 1 | |
| |