При списании товара со склада 1 проверяется остаток на нём и если товара недостаточно, проверяется остаток на складе 2.
Имеется функция глСписаниеОстатковТМЦ, немного подправленная
Если КонтрольОстатков = 1 Тогда
...
в подсчёте остатков по фирме добавлено:
Если СокрЛП(Склад.Наименование)="Склад 1" Тогда
//Получаем остатки по обоим складам
ОстатокНаСкладе = ОстатокНаСкладе +
ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,"Количество");
Иначе
//Получаем остатки только по складу 2
ОстатокНаСкладе = ОстатокНаСкладе +
ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,Склад,,"Количество");
КонецЕсли;
...
Если СокрЛП(Склад.Наименование)="Склад 1" Тогда
ОстатокНал=0;
ОстатокБезНал=0;
//Получаем остатки по Складу 1
СпрВремСклад.НайтиПоНаименованию("Склад 1",0,1);
ОстатокНал = ВремОстаткиТМЦ.СводныйОстаток(Конт.Фирма,ТекНоменклатура,СпрВремСклад.ТекущийЭлемент(),,"Количество");
//Получаем остатки по Складу 2
СпрВремСклад.НайтиПоНаименованию("Склад 2",0,1);
ОстатокБезНал = ВремОстаткиТМЦ.СводныйОстаток(Конт.Фирма,ТекНоменклатура,СпрВремСклад.ТекущийЭлемент(),,"Количество");
//Если на Складе 1 не хватает товаров,то получаем неостающее кол-во со второго склада
Если (ОстатокНал<ТаблНоменклатуры.Количество) Тогда
СписатьКолСБезнала=ТаблНоменклатуры.Количество-ОстатокНал;
Если ОстатокНал<>0 Тогда
РегОстатки.Фирма = Фирма;
СпрВремСклад.НайтиПоНаименованию("Склад 1",0,1);
РегОстатки.Склад = СпрВремСклад.ТекущийЭлемент();
РегОстатки.Номенклатура = ТекНоменклатура;
РегОстатки.Количество = ОстатокНал;
РегОстатки.ЦенаПрод = Цена;
РегОстатки.Внутреннее = ВнутреннееПеремещение;
РегОстатки.ДвижениеРасходВыполнить();
КонецЕсли;
РегОстатки.Фирма = Фирма;
СпрВремСклад.НайтиПоНаименованию("Склад 2",0,1);
РегОстатки.Склад = СпрВремСклад.ТекущийЭлемент();
РегОстатки.Номенклатура = ТекНоменклатура;
РегОстатки.Количество = СписатьКолСБезнала;
РегОстатки.ЦенаПрод = Цена;
РегОстатки.Внутреннее = ВнутреннееПеремещение;
РегОстатки.ДвижениеРасходВыполнить();
//Остатков хватает на Складе 1
ИначеЕсли (ОстатокНал>=ТаблНоменклатуры.Количество) Тогда
РегОстатки.Фирма = Фирма;
СпрВремСклад.НайтиПоНаименованию("Склад Нал",0,1);
РегОстатки.Склад = СпрВремСклад.ТекущийЭлемент();
РегОстатки.Номенклатура = ТекНоменклатура;
РегОстатки.Количество = ТаблНоменклатуры.Количество;
РегОстатки.ЦенаПрод = Цена;
РегОстатки.Внутреннее = ВнутреннееПеремещение;
РегОстатки.ДвижениеРасходВыполнить();
КонецЕсли;
Иначе
// измерения
РегОстатки.Фирма = Фирма;
РегОстатки.Склад = Склад;
РегОстатки.Номенклатура = ТекНоменклатура;
//ресурсы
РегОстатки.Количество = ТаблНоменклатуры.Количество;
РегОстатки.ЦенаПрод = Цена;
//реквизиты
РегОстатки.Внутреннее = ВнутреннееПеремещение;
РегОстатки.ДвижениеРасходВыполнить();
КонецЕсли;
КонецЕсли;
Показать
Не могу отследить следующий глюк или мою оплошность - иногда,видимо, СводныйОстаток по Складу 1 получается неверный.
Пример:
На Складе 1 Товара "Игрушка" 15 штук
На Складе 1 Товара "Игрушка" 30 штук
Надо списать 20 штук товара "Игрушка"
В накладной указан склад 1
То есть со склада 1 должен списать 15 и со склада 2 должен списать 5
А реально со склада 1 может списать 20 штук и остаток уйдёт в минус.
и почему в накладной у тебя указан изначально склад 1
перед формированием ее из заявки проверяешь что где и сколько
и делаешь сразу 2 накладные
одну на 1 склад, другую на 2
(как у тебя потом кладовщики видят , что откуда списалось - по факту ?) а документы у них для отчетности для отгрузки какие ?
у тебя измерения регистра идут именно в такой последовательности
Фирма, Товар, Склад ?а не (фирма,склад,товар) Что за конфигурация ?
и на какой ты все время ищешь
СпрВремСклад.НайтиПоНаименованию();
Показать
ну да,в такой. ТиС 954
Ёпрст пишет:
а завтра наименование склада поменяют и ппц всему алгоритму ?
не,названия не поменяют
Ёпрст пишет:
+1 да и нафига ветка Иначе в условии, при первых 2-х условий на меньше и больше или равно ?
Иначе к другому условию относится же.
Tatitutu пишет:
и почему в накладной у тебя указан изначально склад 1
перед формированием ее из заявки проверяешь что где и сколько
и делаешь сразу 2 накладные
одну на 1 склад, другую на 2
(как у тебя потом кладовщики видят , что откуда списалось - по факту ?) а документы у них для отчетности для отгрузки какие ?
Нужно именно одной накладной.
Ну так для этого и делаются движения по двум складам,чтобы видеть что списалось.
+7 ладно там, реквизит склад бы загнал в ТЧ дока, еще туда сюда, но автоматическое списание с разных складов... потом разгребать это всё кому-то придётся.
Да еще и с поиском по наименованию.. вообще жесть.
+7 ладно там, реквизит склад бы загнал в ТЧ дока, еще туда сюда, но автоматическое списание с разных складов... потом разгребать это всё кому-то придётся.
Да еще и с поиском по наименованию.. вообще жесть.
Да не,для отчётности им нужен склад 2,по которому не идёт движений с разных складов.
Ну так идейки есть почему могу остатки не верные получаться? :)
Функция глСписаниеОстатковТМЦ(Конт,ТаблНоменклатуры,СписокПараметров, ВремОстаткиТМЦ, ВремРезервыТМЦ = "") Экспорт
Перем КонтрольОстатков, КонтрольРезервов;
СпрВремСклад=СоздатьОбъект("Справочник.Склады");
РегОстатки = Конт.Регистр.ОстаткиТМЦ;
Фирма = СписокПараметров.Получить("Фирма");
ФирмаДляОстатковТМЦ = СписокПараметров.Получить("ФирмаДляОстатковТМЦ");
Склад = СписокПараметров.Получить("Склад");
ТекДок = СписокПараметров.Получить("ТекДок");
Договор = СписокПараметров.Получить("Договор");
КодОперации = СписокПараметров.Получить("КодОперации");
ВнутреннееПеремещение = ?(((КодОперации = глКО.Перемещение) или (КодОперации = глКО.ПередачаВРозницу)
или (КодОперации = глКО.ВозвратИзРозницы)),1,0);
КонтрольРезервов = 0;
Если Константа.КонтрольОтрицательныхОстатков = Перечисление.СпособыКонтроляОстатковТМЦ.НеКонтролировать Тогда
КонтрольОстатков = 0;
Иначе
КонтрольОстатков = 1;
Если глПолучитьПолномочие("РазрешитьПродаватьРезерв") = 0 Тогда
КонтрольРезервов = 1;
КонецЕсли;
КонецЕсли;
Если (Склад.РозничныйСклад = 1) Тогда
// розничный склад будем контролировать всегда, поскольку там идет
// учет в разрезе цен и работа задним числом сильно затруднена.
КонтрольОстатков=1;
КонецЕсли;
ТаблНоменклатуры.ВыбратьСтроки();
Пока ТаблНоменклатуры.ПолучитьСтроку()=1 Цикл
ТекНоменклатура = ТаблНоменклатуры.Номенклатура;
Если (ТекНоменклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга)
или (ТекНоменклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа)
или (ТаблНоменклатуры.Количество = 0) Тогда
Продолжить;
КонецЕсли;
Цена = ТаблНоменклатуры.ЦенаПрод;
РезервНаСкладе = 0;
РезервПоФирме = 0;
Если (ТипЗначенияСтр(ВремРезервыТМЦ) = "Регистр")
и (КонтрольРезервов = 1)
Тогда
Если ПустоеЗначение(ФирмаДляОстатковТМЦ) = 1 Тогда // Фильтр по фирме не нужен
РезервНаСкладе = ВремРезервыТМЦ.СводныйОстаток(,ТекНоменклатура,Склад,,,"Количество");
Если (ВнутреннееПеремещение = 0) Тогда
// для внутренних перемещений не конролируем резерв по фирму в целом
// (поскольку он на самом деле не изменится)
РезервПоФирме = ВремРезервыТМЦ.СводныйОстаток(,ТекНоменклатура,,,,"Количество");
КонецЕсли;
Если (ПустоеЗначение(Договор) = 0) Тогда
// вычтем резервы, котрые сделал наш же покупатель
РезервНаСкладе = РезервНаСкладе -
ВремРезервыТМЦ.СводныйОстаток(,ТекНоменклатура,Склад,Договор,,"Количество");
Если (ВнутреннееПеремещение = 0) Тогда
РезервПоФирме = РезервПоФирме -
ВремРезервыТМЦ.СводныйОстаток(,ТекНоменклатура, ,Договор,,"Количество");
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда // Нужны сводные остатки по нескольким фирмам
СчетчикЦикла = 0;
Для СчетчикЦикла = 1 По ФирмаДляОстатковТМЦ.РазмерСписка() Цикл
ТекФирма = ФирмаДляОстатковТМЦ.ПолучитьЗначение(СчетчикЦикла);
РезервНаСкладе = РезервНаСкладе +
ВремРезервыТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,Склад,,,"Количество");
Если (ВнутреннееПеремещение = 0) Тогда
РезервПоФирме = РезервПоФирме +
ВремРезервыТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,,"Количество");
КонецЕсли;
Если (ПустоеЗначение(Договор) = 0) Тогда
// вычтем резервы, котрые сделал наш же покупатель
РезервНаСкладе = РезервНаСкладе -
ВремРезервыТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,Склад,Договор,,"Количество");
Если (ВнутреннееПеремещение = 0) Тогда
РезервПоФирме = РезервПоФирме -
ВремРезервыТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура, ,Договор,,"Количество");
КонецЕсли;
КонецЕсли;
КонецЦикла;
ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда // нужны сводные остатки только по одной фирме
РезервНаСкладе = ВремРезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,Склад,,,"Количество");
Если (ВнутреннееПеремещение = 0) Тогда
РезервПоФирме = ВремРезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,,,,"Количество");
КонецЕсли;
Если (ПустоеЗначение(Договор) = 0) Тогда
// вычтем резервы, котрые сделал наш же покупатель
РезервНаСкладе = РезервНаСкладе -
ВремРезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,Склад,Договор,,"Количество");
Если (ВнутреннееПеремещение = 0) Тогда
РезервПоФирме = РезервПоФирме -
ВремРезервыТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,,Договор,,"Количество");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ОстатокНаСкладе = 0;
ОстатокПоФирме = 0;
ОстатокНаСкладеЦ = 0;
Если КонтрольОстатков = 1 Тогда
// остаток на складе
Если ПустоеЗначение(ФирмаДляОстатковТМЦ) = 1 Тогда
ОстатокНаСкладе = ВремОстаткиТМЦ.СводныйОстаток(,ТекНоменклатура,Склад,,"Количество");
Если (ВнутреннееПеремещение = 0) Тогда
ОстатокПоФирме = ВремОстаткиТМЦ.СводныйОстаток(,ТекНоменклатура,,,"Количество");
КонецЕсли;
Если Склад.РозничныйСклад = 1 Тогда
ОстатокНаСкладеЦ = ВремОстаткиТМЦ.СводныйОстаток(,ТекНоменклатура,Склад,Цена,"Количество");
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда
ОстатокНаСкладе = ВремОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,Склад,,"Количество");
Если (ВнутреннееПеремещение = 0) Тогда
ОстатокПоФирме = ВремОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,,,"Количество");
КонецЕсли;
Если Склад.РозничныйСклад = 1 Тогда
ОстатокНаСкладеЦ = ВремОстаткиТМЦ.Остаток(ФирмаДляОстатковТМЦ,ТекНоменклатура,Склад,Цена,"Количество");
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "СписокЗначений" Тогда
СчетчикЦикла = 0;
Для СчетчикЦикла = 1 По ФирмаДляОстатковТМЦ.РазмерСписка() Цикл
ТекФирма = ФирмаДляОстатковТМЦ.ПолучитьЗначение(СчетчикЦикла);
Если СокрЛП(Склад.Наименование)="Склад 1" Тогда
ОстатокНаСкладе = ОстатокНаСкладе +
ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,"Количество");
Иначе
ОстатокНаСкладе = ОстатокНаСкладе +
ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,Склад,,"Количество");
КонецЕсли;
Если (ВнутреннееПеремещение = 0) Тогда
ОстатокПоФирме = ОстатокПоФирме +
ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,"Количество");
КонецЕсли;
Если Склад.РозничныйСклад = 1 Тогда
ОстатокНаСкладеЦ = ОстатокНаСкладеЦ +
ВремОстаткиТМЦ.Остаток(ТекФирма,ТекНоменклатура,Склад,Цена,"Количество");
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе
ОстатокНаСкладе = ТаблНоменклатуры.Количество;
ОстатокПоФирме = ТаблНоменклатуры.Количество;
КонецЕсли; // КонтрольОстатков = 1
// проверка резерва на складе
Если (ОстатокНаСкладе - РезервНаСкладе) < ТаблНоменклатуры.Количество Тогда
глНеПроводить(Конт,"На складе нет нужного свободного количества ТМЦ "+ТекНоменклатура.Наименование
+?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(ТекНоменклатура.Артикул), "")
+". "+РазделительСтрок+" Всего осталось "+Строка(ОстатокНаСкладе)+" "+ТекНоменклатура.БазоваяЕдиница
+?(РезервНаСкладе <> 0 ,". "+РазделительСтрок+" Зарезервировано по выписанным Заявкам "+Строка(РезервНаСкладе) +" "+ТекНоменклатура.БазоваяЕдиница,"")
+"."+РазделительСтрок+"Требуемое количество "+Строка(ТаблНоменклатуры.Количество)+" "+ТекНоменклатура.БазоваяЕдиница);
Возврат (0);
КонецЕсли;
// а также по фирме в целом
Если (ВнутреннееПеремещение = 0) Тогда
Если (ОстатокПоФирме - РезервПоФирме) < ТаблНоменклатуры.Количество Тогда
глНеПроводить(Конт,"На фирме в целом нет нужного свободного количества ТМЦ "+ТекНоменклатура.Наименование
+?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(ТекНоменклатура.Артикул), "")
+". "+РазделительСтрок+" Всего осталось "+Строка(ОстатокПоФирме)+" "+ТекНоменклатура.БазоваяЕдиница
+?(РезервПоФирме<>0,". "+РазделительСтрок+" Зарезервировано по выписанным Заявкам "+Строка(РезервПоФирме) +" "+ТекНоменклатура.БазоваяЕдиница,"")
+"."+РазделительСтрок+"Требуемое количество "+Строка(ТаблНоменклатуры.Количество)+" "+ТекНоменклатура.БазоваяЕдиница);
Возврат (0);
КонецЕсли;
КонецЕсли;
// проверка цены реализации для розничного склада
Если (Склад.РозничныйСклад = 1) Тогда
Если (ОстатокНаСкладеЦ) < ТаблНоменклатуры.Количество Тогда
глНеПроводить(Конт,"На розничном складе нет ТМЦ "+ТекНоменклатура.Наименование
+?(Константа.ПоказыватьАртикул = 1, " " + СокрЛП(ТекНоменклатура.Артикул), "")
+" по указанной цене "+глФРМ(Цена)+" "+глРубли
+". "+РазделительСтрок+" Всего осталось по указанной цене "+Строка(ОстатокНаСкладеЦ)+" "+ТекНоменклатура.БазоваяЕдиница
+"."+РазделительСтрок+"Требуемое количество "+Строка(ТаблНоменклатуры.Количество)+" "+ТекНоменклатура.БазоваяЕдиница);
Возврат (0);
КонецЕсли;
КонецЕсли;
Если СокрЛП(Склад.Наименование)="Склад 1" Тогда
ОстатокНал=0;
ОстатокБезНал=0;
СпрВремСклад.НайтиПоНаименованию("Склад 1",0,1);
ОстатокНал = ВремОстаткиТМЦ.СводныйОстаток(Конт.Фирма,ТекНоменклатура,СпрВремСклад.ТекущийЭлемент(),,"Количество");
СпрВремСклад.НайтиПоНаименованию("Склад 2",0,1);
ОстатокБезНал = ВремОстаткиТМЦ.СводныйОстаток(Конт.Фирма,ТекНоменклатура,СпрВремСклад.ТекущийЭлемент(),,"Количество");
Если (ОстатокНал<ТаблНоменклатуры.Количество) Тогда
СписатьКолСБезнала=ТаблНоменклатуры.Количество-ОстатокНал;
Если ОстатокНал<>0 Тогда
РегОстатки.Фирма = Фирма;
СпрВремСклад.НайтиПоНаименованию("Склад 1",0,1);
РегОстатки.Склад = СпрВремСклад.ТекущийЭлемент();
РегОстатки.Номенклатура = ТекНоменклатура;
РегОстатки.Количество = ОстатокНал;
РегОстатки.ЦенаПрод = Цена;
РегОстатки.Внутреннее = ВнутреннееПеремещение;
РегОстатки.ДвижениеРасходВыполнить();
КонецЕсли;
РегОстатки.Фирма = Фирма;
СпрВремСклад.НайтиПоНаименованию("Склад 2",0,1);
РегОстатки.Склад = СпрВремСклад.ТекущийЭлемент();
РегОстатки.Номенклатура = ТекНоменклатура;
РегОстатки.Количество = СписатьКолСБезнала;
РегОстатки.ЦенаПрод = Цена;
РегОстатки.Внутреннее = ВнутреннееПеремещение;
РегОстатки.ДвижениеРасходВыполнить();
ИначеЕсли (ОстатокНал>=ТаблНоменклатуры.Количество) Тогда
РегОстатки.Фирма = Фирма;
СпрВремСклад.НайтиПоНаименованию("Склад 1",0,1);
РегОстатки.Склад = СпрВремСклад.ТекущийЭлемент();
РегОстатки.Номенклатура = ТекНоменклатура;
РегОстатки.Количество = ТаблНоменклатуры.Количество;
РегОстатки.ЦенаПрод = Цена;
РегОстатки.Внутреннее = ВнутреннееПеремещение;
РегОстатки.ДвижениеРасходВыполнить();
КонецЕсли;
Иначе
// измерения
РегОстатки.Фирма = Фирма;
РегОстатки.Склад = Склад;
РегОстатки.Номенклатура = ТекНоменклатура;
//ресурсы
РегОстатки.Количество = ТаблНоменклатуры.Количество;
РегОстатки.ЦенаПрод = Цена;
//реквизиты
РегОстатки.Внутреннее = ВнутреннееПеремещение;
РегОстатки.ДвижениеРасходВыполнить();
КонецЕсли;
КонецЦикла;
Возврат (1);
КонецФункции // глСписаниеОстатковТМЦ()
(0) Извини меня... или сегодня пятница или я устал от жару
откуда ты эту функцию скопипастил ? из глобального модуля ?
еще раз извини , но честно не врубаюсь
что там делает код "движения регистров"?
>>>При списании товара со склада 1 проверяется остаток на нём и если товара недостаточно, проверяется остаток на складе 2.
Вот это условие у тебя никогда не проверяется.
Если склад = Склад1, то смотришь всегда по ВСЕМ складам...
вот и в минус летишь по складу 1.
смотри, сначала проверяю общее кол-во на обоих складах:
Если КонтрольОстатков = 1 Тогда
...
Если СокрЛП(Склад.Наименование)="Склад 1" Тогда
ОстатокНаСкладе = ОстатокНаСкладе +
ВремОстаткиТМЦ.СводныйОстаток(ТекФирма,ТекНоменклатура,,,"Количество");
...
Показать
если на обоих складах в сумме товара меньше,чем требуется,то выдаётся сообщение о нехватке товара.
уже после этой проверки получаю остатки по каждому складу