Имя: Пароль:
1C
1С v8
Помогите пожалуйста разобраться с контролем остатков.
0 MihaSerb
 
17.02.13
14:34
Контроль остатков работает только тогда когда номенклатура есть на складе(при вводе сверх лимита), когда на складе нет товара документ расходная накладная все равно проводится хотя в регистр не показывается

ВЫБРАТЬ
               |    ТоварыНаСкладеОстатки.Номенклатура,
               |    ТоварыНаСкладеОстатки.КоличествоОстаток,
               |    ТоварыНаСкладеОстатки.Склад
               |ИЗ
               |    РегистрНакопления.ТоварыНаСкладе.Остатки(
               |            ,
               |            Номенклатура В
               |                    (ВЫБРАТЬ
               |                        ДокТЧ.Номенклатура
               |                    ИЗ
               |                        ДокТЧ КАК ДокТЧ)
               |                И Склад В
               |                    (ВЫБРАТЬ
               |                        ДокТЧ.Склад
               |                    ИЗ
               |                        ДокТЧ КАК ДокТЧ)) КАК ТоварыНаСкладеОстатки
               |ГДЕ
               |    ТоварыНаСкладеОстатки.КоличествоОстаток <= 0";
               

       Результат = Запрос.Выполнить();
       ВыборкаДетальныеЗаписи = Результат.Выбрать();
           
       Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
           Сообщение = Новый СообщениеПользователю();
           Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Номенклатура + """";
           Сообщение.Сообщить();
           Отказ = Истина;
       КонецЦикла;
1 GROOVY
 
17.02.13
14:43
Нулевые остатки ты из регистра не получишь.
2 GROOVY
 
17.02.13
14:44
И еще условие в ВТ я бы переписал:

(Номенклатура, Склад) В
               |                    (ВЫБРАТЬ
               |                        ДокТЧ.Номенклатура, Склад
               |                    ИЗ
               |                        ДокТЧ КАК ДокТЧ)
3 MihaSerb
 
17.02.13
14:49
А как быть тогда если нулевые остьтки не получить?
4 GROOVY
 
17.02.13
14:57
Левым соединением таблицу документа с таблицей регистра.
5 GROOVY
 
17.02.13
14:59
ВЫБРАТЬ
ДокТЧ.Номенклатура, ISNULL(Рег.КоличествоОстаток)
ИЗ
ДокТЧ КАК ДокТЧ
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.ТоварыНаСкладе.Остатки(
               |            ,
(Номенклатура, Склад) В
               |                    (ВЫБРАТЬ
               |                        ДокТЧ.Номенклатура, Склад
               |                    ИЗ
               |                        ДокТЧ КАК ДокТЧ) КАК Рег

ПО ДокТЧ.Номенклатура = Рег.Номенклатура


Как то так.
6 GROOVY
 
17.02.13
15:01
7 MihaSerb
 
17.02.13
15:13
Спасибо!!!
8 MihaSerb
 
17.02.13
16:30
Попробовал ваш вариант при проведении документа всегда вылезает ошибка, По ссылке я пробовал делать там я не могу понять что делать с складом у меня просто он в реквезите табличной части а в ссылке в реквезите документа.
9 GROOVY
 
17.02.13
16:58
По ссылке есть мультики по основам запросов.
текст ошибки приведите, я как до нормальной клавы доберусь - помогу.
10 MihaSerb
 
18.02.13
16:26
"ВЫБРАТЬ
               |    ДокТЧ.Номенклатура,
               |    ЕСТЬNULL(ТоварыНаСкладе.КоличествоОстаток, 0) КАК КоличествоОстаток
               |ИЗ
               |    ДокТЧ КАК ДокТЧ
               |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
               |                ,
               |                (Номенклатура, Склад) В
               |                    (ВЫБРАТЬ
               |                        ДокТЧ.Номенклатура,
               |                        ДокТЧ.Склад
               |                    ИЗ
               |                        ДокТЧ КАК ДокТЧ)) КАК ТоварыНаСкладе
               |        ПО ДокТЧ.Номенклатура = ТоварыНаСкладе.Номенклатура";
               

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




Происходит следующие: при проведении документа всегда выскакивает ошибка, если вбить количество меньше чем есть на складе то КолОстаток - Количество = число с минусом показывается в ошибке, если вбить больше то от колтчества отнимается количество остаток и высвечивается. Если вбить склад на котором нет номенклатуры то в ошибке всегда высвечивается не хватает 0 материала.
11 GROOVY
 
18.02.13
16:28
Так может стоит условие добавить на количество?
12 MihaSerb
 
18.02.13
16:38
А как сделать так чтобы при выборе других складов при проведении тоже выдавалась ошибка?
13 MihaSerb
 
18.02.13
16:40
А то сейчас на складе товара нет а документ все равно проводится хоть и в регистре не указывается?
14 MihaSerb
 
18.02.13
17:22
И Получилось у меня что и было(((
15 Леха Дум
 
18.02.13
17:41
(0) попробуй разобраться с контролем остатков в УТ11, там механизм реализован немного по-другому, запросы для контроля остатков производятся не в каждом документе, а в контролируемом регистре.
16 MihaSerb
 
19.02.13
00:07
у меня строго регламентированиое задание.
17 iceman2112
 
19.02.13
06:06
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Установитьпараметр("Склад", Склад);
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.Текст =
"ВЫБРАТЬ
|    ДокТЧ.Номенклатура,
|    ЕСТЬNULL(ТоварыНаСкладе.КоличествоОстаток, 0) КАК КоличествоОстаток
|ИЗ
|    ДокТЧ КАК ДокТЧ
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
|                &Дата,
|                Номенклатура В
|                    (ВЫБРАТЬ РАЗЛИЧНЫЕ
|                        ДокТЧ.Номенклатура,
|                    ИЗ
|                        ДокТЧ КАК ДокТЧ)
|                    ГДЕ ДокТЧ.Ссылка = &Ссылка)
|                 И Склад = &Склад
|                 КАК ТоварыНаСкладе
|                
|        ПО ДокТЧ.Номенклатура = ТоварыНаСкладе.Номенклатура
|ГДЕ ДокТЧ.Ссылка = &Ссылка
18 Лефмихалыч
 
19.02.13
08:02
(0) ты забыл соединить регистр левым соединеним с табличной частью. Ветку не читал, иболень
19 Xapac_2
 
19.02.13
08:13
(10)дак ты условие ставь, если количество меньше 0.
20 MihaSerb
 
19.02.13
13:53
У меня склад в реквезитах табличной части расходной накладной.
21 iceman2112
 
19.02.13
14:46
ну тогда как в (10) только дату добавь и ссылку
22 MihaSerb
 
20.02.13
15:51
Сейчас он мне постоянно выдает одну и туже ошибку, что не хватает материала.
23 MihaSerb
 
20.02.13
15:54
Может я что то не так делаю, что то совсем врубиться не могу, Мне необходимо Организовать количественно-суммовой учёт товара в регистре"ТоварыНаСкладах". Измерения "Номенклатура" и "Склад" Ресурсы:"Сумма", "Количество".  Создать документ "Расходная накладная". Реквизитов в шапке нет.Табличная часть "товары" содержит реквизиты: номенклатура, склад,количество, цена, сумма. (Склад в табличной части, следовательнодокументом можно продать товары с нескольких складов).

Документ Расходная накладная списывает товары со складов по
себестоимости (определяет стоимость товара в регистре и делает движение "расход"). Если товара на складе не хватает, документсообщает об этом и не проводится.
24 MihaSerb
 
20.02.13
15:55
Может я в начале гдето ошибся, гляньте пожалуйста а то не знаю что уже делать.



Процедура ОбработкаПроведения(Отказ, Режим)

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

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

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

   Движения.ТоварыНаСкладе.Записывать = Истина;
   МенеджерВТ = Новый МенеджерВременныхТаблиц;
   Запрос = Новый Запрос;
   // Укажем, какой менеджер временных таблиц использует этот запрос

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

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

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

КонецПроцедуры
26 Aleks73
 
20.02.13
16:16
Такое впечатление, что это студент(подаван) сдает курсовую(тест на знание 1с).
Если так, лучше поискать ответ в интернете.
27 GANR
 
20.02.13
16:20
(26) задачка на спеца по полатформе
28 Aleks73
 
20.02.13
16:25
(27) Тогда - я мельком просмотрел ссылку (6) - может там на форуме и разбирается решение ?
Если да - интересно, в какой ветке ?
29 Aleks73
 
20.02.13
16:31
(27) по (25) - для чего в ВТ помещается "ссылка" ?
   |    РасходнаяНакладная.Ссылка
30 MihaSerb
 
21.02.13
02:10
(26) Да я пробовал но нечего не смог найти, если вы найдете я буду очень благодарен.
31 MihaSerb
 
21.02.13
02:12
(29) эту строчку сам не понял, но выше на форуме посоветовали так сделать.
32 MihaSerb
 
21.02.13
15:51
Я почти также делал как предлагают в (25) но уменя что не получилось, а это правельный вариант, только небольшой нюанс при выборе склада где нет товара он выдает ошибку нехватает 0 товара, а требуется что бы выдавал сколько нехватает.
33 MihaSerb
 
21.02.13
16:01
Спасибо большое уже разобрался!!!!!!!!!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн