Имя: Пароль:
1C
1С v8
РегистрыНакопление.СвободныеОстатки
0 asrv12
 
30.08.12
12:37
Доброго времени суток! Может кто сталкивался. Проблема такова: Есть заявка покупателя который резервирует товар в РЕГИСТРЕ резервы. А реализация списывает товар в РИГИСТРЕ СвободныеОстатки. И так я сделал так, чтоб при проведении реализацию, проверял свободные остатки, ну естетственно с учетом РЕЗЕРВЫ. Допустим Ручка на свободныеОстатки 10 шт.
Создаем заявку и резервируем 6 шт.
Реализация списываем 6 шт. проводим и отказ 2 шт недостаточно на складе!
А вот когда Реализация вводится на основании заявки тогда проводится. Тут реализация списывает из резерва и из СвободныеОстатки
Вот мой пример:


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

   Пока ВыборкаИтогов.Следующий() Цикл
               Если ВыборкаИтогов.Количество > ВыборкаИтогов.КолвоНаСкладеОстаток  Тогда
           
           Нехватка = ВыборкаИтогов.Количество - ВыборкаИтогов.КолвоНаСкладеОстаток;
           Сообщить("На складе "+Склад.Наименование+
           ", товар: "+ВыборкаИтогов.Номенклатура+
           " арт.: " +ВыборкаИтогов.Артикул+
           " осталось "+ВыборкаИтогов.КолвоНаСкладеОстаток+" "+ТекСтрокаТовары.Единица.Наименование+"."
           " требуемая кол. "+ВыборкаИтогов.Количество+" "+ТекСтрокаТовары.Единица.Наименование+".");
           Отказ = Истина;
       КонецЕсли;
       
   КонецЦикла;

   //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА


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

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

   Пока ВыборкаИтогов.Следующий() Цикл
               Если ВыборкаИтогов.Количество > ВыборкаИтогов.КолвоНаСкладеОстаток  Тогда
           
           Нехватка = ВыборкаИтогов.Количество - ВыборкаИтогов.КолвоНаСкладеОстаток;
           Сообщить("На складе "+Склад.Наименование+
           ", товар: "+ВыборкаИтогов.Номенклатура+
           " арт.: " +ВыборкаИтогов.Артикул+
           " осталось "+ВыборкаИтогов.КолвоНаСкладеОстаток+" "+ТекСтрокаТовары.Единица.Наименование+"."
           " требуемая кол. "+ВыборкаИтогов.Количество+" "+ТекСтрокаТовары.Единица.Наименование+".");
           Отказ = Истина;
       КонецЕсли;
       
   КонецЦикла;

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


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


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

   КонецЕсли;


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

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


Есть какой нибудь более по проще способ? Пожалуйста помогите!
1 del123
 
30.08.12
12:41
Таки уже определитесь РЕГИСТРЕ ИЛИ РИГИСТРЕ)
А типовые средства не работают?
2 asrv12
 
30.08.12
12:45
В типовом при проведении реализацию не учитывает резерв
3 asrv12
 
30.08.12
12:48
Извините опчатка РЕГИСТРЫ
4 pessok
 
30.08.12
12:49
(2) ЧТО?
5 acsent
 
30.08.12
12:49
(0) >>А вот когда Реализация вводится на основании заявки тогда проводится
Абсолютно логично
6 pessok
 
30.08.12
12:49
+(4) человек, перед тем как писать очередную нетленку, изучи таки механизм полностью
7 shuhard
 
30.08.12
12:52
(2)[В типовом при проведении реализацию не учитывает резерв]
брехня
топик в топку
8 pessok
 
30.08.12
12:54
(7) плюсцую
9 asrv12
 
30.08.12
13:07
pessok
Я смотрю, ты такой умный!
10 hhhh
 
30.08.12
14:30
(9)  У вас 10 ручек на складе. Один чел пришел и отложил себе 6 ручек (зарезервировал). Пришел второй чел и захотел тоже 6 ручек. Программа ему говорит, 4 ручки только осталось. 2-х ручек не хватает.

А когда приходит первый чел, он спокойно выписывает себе реализацию, и забирает свои шесть ручек, которые он резервировал.

Программа работает абсолютно правильно. Не парьте нам мозг.
11 eklmn
 
гуру
30.08.12
14:35
(10) он сначала поламал, теперь героически пытаеться "сделать"
12 del123
 
30.08.12
14:44
(11) тоже чтоли так начать делать.. А то иной раз скучно так становится...
13 chelentano
 
30.08.12
14:56
(2) насколько я знаю, в типовом нет регистра СвободныеОстатки
14 mikecool
 
30.08.12
14:58
(13) как нет? его можно использовать, а можно не использовать
15 pessok
 
30.08.12
14:59
(13) есть. в настройках выбираешь - узать или нет
16 chelentano
 
30.08.12
15:00
(14),(15) это что за конфигурация такая?
17 mikecool
 
30.08.12
15:02
(16) я видел в упп
18 del123
 
30.08.12
15:03
(16) в комплексной тоже присутствует)
19 chelentano
 
30.08.12
15:05
(17),(18) о как, спасибо, буду в курсе хоть :)
20 pessok
 
30.08.12
15:08
(19) да и в УТ вроде есть
21 pessok
 
30.08.12
15:08
+(20) а не, нету