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

16:06
Задача1.7 Опеаративный учет
В этой задаче  отчеты не трогаем  те же остатки и продажи . как их делать мы уже  знаем из задач 1.2 1.3

1 )  списание себестоимости будет здесь в разрезе складов  по фифо лифо

выполняется расчет позднее с помощью обработки расчет себестоимости  начиная с первого документа прихода по дате (партии)

итак

1) как всегда создаем регистр сведений УчетнаяПолитика с периодичностью в год

в шапку документов добавляем поле склад = справочник.склады


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


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

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




В Расходной в модуле объекта код:



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

Запрос.УстановитьПараметр("Ссылка", Ссылка);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Ругнемся количество надо убавить: "+ВыборкаДетальныеЗаписи.НоменклатураПредставление+" "+ВыборкаДетальныеЗаписи.КоличествоОстаток;
Сообщение.УстановитьДанные(ссылка);
Сообщение.Сообщить();
Отказ = Истина;
КонецЦикла;
Если Отказ Тогда 
Возврат;
КонецЕсли; // ЕСЛИ ЛИШНЕГО НЕ СПИСАЛИ ДВИГАЕМ ПРОДАЖИ

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

3) Далее создаем Общий модуль с именем РегламентныеПроцедуры. галочки сервер вызов сервера 

пишем в нем код :

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

4) Создаем обработку с именем РасчетСебестоимости

Создаем форму обработки создаем команду Расчет привязываем команду к кнопке ФормаРасчет

в модуле формы код:

&НаКлиенте
Процедура Расчет(Команда)
РасчетСебестоимости();
КонецПроцедуры

&НаСервере
Процедура РасчетСебестоимости()
Обработки.РасчетСебестоимости.РасчетВМодулеМенеджера();
КонецПроцедуры

5) в Модуль Менеджера обработки пишем код:


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

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();
//ДЛЯ КАЖДОГО ДОКУМЕНТА ДОБАВИМ ДВИЖЕНИЯ ПО СПИСАНИЮ СЕБЕСТОИМОСТИ
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НачатьТранзакцию();
СписаниеСебестоимостиПоДокументу(ВыборкаДетальныеЗаписи.Ссылка);
//очистим обрабтаный документ из таблици последовательности
Набор = Последовательности.Себестоимость.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Ссылка);
Набор.Записать();
ЗафиксироватьТранзакцию();
КонецЦикла;
КонецПроцедуры

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

Теперь о регистрах 

в остатках  добавить новое измерение склад

добавить регистр накопления остатков Себестоимость  , изм Номенклатура,Партия
рес Количество Сумма



И под конец создадим регламентное  задание РасчетСебестоимости

свяжем рег задание с методом в котором опишем код:

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

настроим расписание  задания  каждые 7 сек каждый день .




Ну и Отчеты :

1) продажи код:

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


2) Остатки код:

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



Задача решена

Просмотров: 3148 | Добавил: moshefoo | Рейтинг: 0.0/0
Всего комментариев: 1
1 shorve  
Блокировки не делаем управляемыми?

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