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

09:32
Задачи 1.8
В справочнике подразделения добавим реквизит ПроцентНадбавки тип число .2


Для документа приходная 

след код 

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

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

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


Для докум Расходная добавляем  в шапку реквизит Перемещение (Тип Булево)

реквизит Подразделение спр Подразделения


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



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

Если Перемещение Тогда
ПеремещениеТовара(Отказ);
Иначе
СписаниеТовара(Отказ);
КонецЕсли;

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

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

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



Отчет:Дижение товаров

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


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


Группировки Подразделения Детальные записи

Параметры НачДата КонДата


Задача Решена




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