Язык Запросов

1. _7445_ 22.02.19 11:05 Сейчас в теме
Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 1С программирование. В УТ 10.3. Написал запрос с пакетам. Все работает. Сам код показывает сообщению пользователя когда остаток на складах меньше количество минимум. Это работает но есть токая проблема что если в документе есть 2 или более товары тогда код выбирает только последних из них. И не проверяет остальные товары. С отладкчиком смотрел но ошибку не нашло. Можете дать подсказку что где может быть проблем?
Спасибо всем за ранее. Документ - Реализация Товаров Услуг - Модуль Объекта - Процедура Обработка Проведения.
Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|Номенклатура.Ссылка,
	|Номенклатура.Мин КАК Минимум
	|ПОМЕСТИТЬ втМинимум
	|ИЗ
	|Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|Номенклатура.Ссылка.ЭтоГруппа = ЛОЖЬ И Номенклатура.Ссылка = &Номенклатура 
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|ТоварыНаСкладахОстатки.Номенклатура,
	|ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
	|ПОМЕСТИТЬ втОстаток
	|ИЗ
	|РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|втОстаток.Номенклатура,
	|ЕСТЬNULL(втМинимум.Минимум, 0) КАК Минимум,
	|ЕСТЬNULL(ВЫРАЗИТЬ(втОстаток.КоличествоОстаток КАК ЧИСЛО(15, 2)), 0) КАК Остаток
	|ИЗ
	|втОстаток КАК втОстаток
	|ЛЕВОЕ СОЕДИНЕНИЕ втМинимум КАК втМинимум
	|ПО втОстаток.Номенклатура = втМинимум.Ссылка";
	
	Стр = ЭтотОбъект.ПолучитьФорму("ФормаДокумента").ЭлементыФормы.Товары.ТекущиеДанные;
	//Запрос.УстановитьПараметр("Дата", КонецДня(ТекущаяДата()));
	Запрос.УстановитьПараметр("Номенклатура", Стр.Номенклатура); 
	Выборка = Запрос.Выполнить().Выбрать();	
	Пока Выборка.Следующий() Цикл
		Остаток = Выборка.Остаток - Стр.Количество;
			Если Остаток < Выборка.Минимум Тогда
			//ПоказатьОповещениеПользователя("Информация",,"Siz qalıq sayını keçdiniz. " + Стр.Номенклатура + "Minimum say - " + Выборка.Остаток,,СтатусОповещенияПользователя.Информация,);
			Сообщить("Siz " + Выборка.Номенклатура + " - məhsulu üzrə daxil eilmiş minimum miqdarı keçdiniz. Minimum miqdar = " 
			+ Выборка.Минимум + " Anbar üzrə məhsulun qalıq sayı = " + Остаток, СтатусСообщения.Информация);
		Иначе
		КонецЕсли;
		КонецЦикла;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. login1020 143 22.02.19 11:14 Сейчас в теме
(1)
Стр = ЭтотОбъект.ПолучитьФорму("ФормаДокумента").ЭлементыФормы.Товары.ТекущиеДанные; //Запрос.УстановитьПараметр("Дата", КонецДня(ТекущаяДата())); Запрос.УстановитьПараметр("Номенклатура", Стр.Номенклатура);


Потому что код возвращает данные по текущей активной строке таблицы Товары.

Соответственно, если у вас 100 строк в тч, и активная 99, то только по ней остаток и собирается.

(1)
- məhsulu üzrə daxil eilmiş minimum miqdarı keçdiniz. Minimum miqdar =

Класс) Это на каком языке?
4. _7445_ 22.02.19 11:31 Сейчас в теме
(2) Азербайджанский язык
3. oleg-x 23 22.02.19 11:27 Сейчас в теме
Надо менять логику проверки в принципе.
В запросе надо получать остаток по списку номенклатуры Товары.ВыгрузитьКолонку("Номенклатура") - получим массив номенклатуры. Но это, если нет учета по характеристикам и/или сериям.
А потом получаем таблицу товаров
ТабТоваров = Товары.Выгрузить(); //Получаем таблицу товаров.
ТабТоваров.Свернуть("Номенклатура","Количество"); //Группируем, если вдруг какой то товар двумя строчками.

Пока Выборка.Следующий() Цикл
//Находим в таблице товаров нужную номенклатуру и проверяем хватает ли остатка. 
//Только учти,что если нет остатка, то в запросе не будет данной номенклатуры.
КонецЦикла;
Kuzya_brаtsk; _7445_; +2 Ответить
5. _7445_ 22.02.19 11:50 Сейчас в теме
(3)Спасибо за вниманию. Но можете немного подробнее?
6. _7445_ 22.02.19 11:54 Сейчас в теме
(3)
Изменил запрос, в консоль показывает но ..
ВЫБРАТЬ
	|	РеализацияТоваровУслугТовары.Номенклатура.Ссылка КАК Номенклатура,
	|	Справочники.Мин
	|ПОМЕСТИТЬ втДокумент
	|ИЗ
	|	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Справочники
	|		ПО РеализацияТоваровУслугТовары.Номенклатура.Ссылка = Справочники.Ссылка
	|ГДЕ
	|	РеализацияТоваровУслугТовары.Ссылка = &СсылкаДокумента
	|;
	
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ТоварыНаСкладахОстатки.Номенклатура,
	|	ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток
	|ПОМЕСТИТЬ втОстаток
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
	|;
	
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	втДокумент.Номенклатура,
	|	ЕСТЬNULL(ВЫРАЗИТЬ(втОстаток.Остаток КАК ЧИСЛО(15, 2)), 0) КАК Остаток,
	|	ЕСТЬNULL(втДокумент.Мин, 0) КАК Минимум
	|ИЗ
	|	втДокумент КАК втДокумент
	|		ЛЕВОЕ СОЕДИНЕНИЕ втОстаток КАК втОстаток
	|		ПО втДокумент.Номенклатура.Ссылка = втОстаток.Номенклатура.Ссылка
Запрос.УстановитьПараметр("СсылкаДокумента", ЭтотОбъект.ПолучитьФорму("ФормаДокумента").Ссылка);
Показать
Прикрепленные файлы:
7. Release 22.02.19 12:00 Сейчас в теме
1. В запросе заменить
= &Номенклатура
на
В (&Номенклатура)

Эти строки
    Стр = ЭтотОбъект.ПолучитьФорму("ФормаДокумента").ЭлементыФормы.Товары.ТекущиеДанные;
    //Запрос.УстановитьПараметр("Дата", КонецДня(ТекущаяДата()));
    Запрос.УстановитьПараметр("Номенклатура", Стр.Номенклатура);

заменить на
    тзТовары = Товары.Выгрузить();
    тзТовары.Свернуть("Номенклатура");
    СписокНоменклатуры = тзТовары.ВыгрузитьКолонку("Номенклатура");

    Запрос.УстановитьПараметр("Номенклатура", СписокНоменклатуры);
8. _7445_ 22.02.19 12:14 Сейчас в теме
(7)
тзТовары = Товары.Выгрузить();
тзТовары.Свернуть("Номенклатура");
СписокНоменклатуры = тзТовары.ВыгрузитьКолонку("Номенклатура");

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

Так?
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |Номенклатура.Ссылка,
    |Номенклатура.Мин КАК Минимум
    |ПОМЕСТИТЬ втМинимум
    |ИЗ
    |Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |Номенклатура.Ссылка.ЭтоГруппа = ЛОЖЬ И Номенклатура.Ссылка = В (&Номенклатура) 
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    |ТоварыНаСкладахОстатки.Номенклатура,
    |ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
    |ПОМЕСТИТЬ втОстаток
    |ИЗ
    |РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    |втОстаток.Номенклатура,
    |ЕСТЬNULL(втМинимум.Минимум, 0) КАК Минимум,
    |ЕСТЬNULL(ВЫРАЗИТЬ(втОстаток.КоличествоОстаток КАК ЧИСЛО(15, 2)), 0) КАК Остаток
    |ИЗ
    |втОстаток КАК втОстаток
    |ЛЕВОЕ СОЕДИНЕНИЕ втМинимум КАК втМинимум
    |ПО втОстаток.Номенклатура = втМинимум.Ссылка";
	
	тзТовары = Товары.Выгрузить();
    тзТовары.Свернуть("Номенклатура");
	    СписокНоменклатуры = тзТовары.ВыгрузитьКолонку("Номенклатура");
	
    Запрос.УстановитьПараметр("Номенклатура", СписокНоменклатуры);
	
    //Стр = ЭтотОбъект.ПолучитьФорму("ФормаДокумента").ЭлементыФормы.Товары.ТекущиеДанные;
    //Запрос.УстановитьПараметр("Дата", КонецДня(ТекущаяДата()));
    //Запрос.УстановитьПараметр("Номенклатура", Стр.Номенклатура); 
    Выборка = Запрос.Выполнить().Выбрать();    
    Пока Выборка.Следующий() Цикл
		//Остаток = Выборка.Остаток - Количество;
            Если Выборка.Остаток < Выборка.Минимум Тогда
            //ПоказатьОповещениеПользователя("Информация",,"Siz qalıq sayını keçdiniz. " + Стр.Номенклатура + "Minimum say - " + Выборка.Остаток,,СтатусОповещенияПользователя.Информация,);
            Сообщить("Siz " + Выборка.Номенклатура + " - məhsulu üzrə daxil eilmiş minimum miqdarı keçdiniz. Minimum miqdar = " 
            + Выборка.Минимум + " Anbar üzrə məhsulun qalıq sayı = " + Выборка.Остаток, СтатусСообщения.Информация);
        Иначе
        КонецЕсли;
        КонецЦикла;
Показать
9. Release 22.02.19 12:17 Сейчас в теме
(8) Тут тоже:
РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки
10. _7445_ 22.02.19 12:23 Сейчас в теме
(9)
Есть проблема по моему
Как изменить стр.Количество?
тзТовары = Товары.Выгрузить();
    тзТовары.Свернуть("Номенклатура");
	СписокНоменклатуры = тзТовары.ВыгрузитьКолонку("Номенклатура");
	
    Запрос.УстановитьПараметр("Номенклатура", СписокНоменклатуры);
	
    //Стр = ЭтотОбъект.ПолучитьФорму("ФормаДокумента").ЭлементыФормы.Товары.ТекущиеДанные;
    //Запрос.УстановитьПараметр("Дата", КонецДня(ТекущаяДата()));
    //Запрос.УстановитьПараметр("Номенклатура", Стр.Номенклатура); 
    Выборка = Запрос.Выполнить().Выбрать();    
    Пока Выборка.Следующий() Цикл
		//Остаток = Выборка.Остаток - Стр.Количество;
            Если Выборка.Остаток < Выборка.Минимум Тогда
            //ПоказатьОповещениеПользователя("Информация",,"Siz qalıq sayını keçdiniz. " + Стр.Номенклатура + "Minimum say - " + Выборка.Остаток,,СтатусОповещенияПользователя.Информация,);
            Сообщить("Siz " + Выборка.Номенклатура + " - məhsulu üzrə daxil eilmiş minimum miqdarı keçdiniz. Minimum miqdar = " 
            + Выборка.Минимум + " Anbar üzrə məhsulun qalıq sayı = " + Выборка.Остаток, СтатусСообщения.Информация);
        Иначе
        КонецЕсли;
        КонецЦикла;
Показать
11. _7445_ 22.02.19 12:25 Сейчас в теме
(9) Но так не работает
тзТовары = Товары.Выгрузить();
    тзТовары.Свернуть("Номенклатура");
 тзТовары.Свернуть("Количество");
	СписокНоменклатуры = тзТовары.ВыгрузитьКолонку("Номенклатура");
	Количество = тзТовары.ВыгрузитьКолонку("Количество"); 
    Запрос.УстановитьПараметр("Номенклатура", СписокНоменклатуры);
	
    
    Выборка = Запрос.Выполнить().Выбрать();    
    Пока Выборка.Следующий() Цикл
		Остаток = Выборка.Остаток - Количество;
            Если Остаток < Выборка.Минимум Тогда
     
            Сообщить("Siz " + Выборка.Номенклатура + " - məhsulu üzrə daxil eilmiş minimum miqdarı keçdiniz. Minimum miqdar = " 
            + Выборка.Минимум + " Anbar üzrə məhsulun qalıq sayı = " + Остаток, СтатусСообщения.Информация);
        Иначе
        КонецЕсли;
        КонецЦикла;
Показать
12. Release 22.02.19 12:38 Сейчас в теме
(11) Добавьте после
   Пока Выборка.Следующий() Цикл

стр = Товары.Найти(Выборка.Номенклатура, "Номенклатуры");
13. _7445_ 22.02.19 13:41 Сейчас в теме
(12)
стр = Товары.Найти(Выборка.Номенклатура, "Номенклатуры");

Сейчас выбирает только первый
14. Release 22.02.19 14:29 Сейчас в теме
(13) Покажите ваш текущий код и скрин ТЧ тестового документа.
15. _7445_ 22.02.19 16:39 Сейчас в теме
(14)
Спасибо за все. В соединение надо было изменить место втМинимум на втОстаток
16. гаврюша 3 25.02.19 07:58 Сейчас в теме
(15) Правильно. Соединение должно быть
 втМинимум КАК втМинимум
    ЛЕВОЕ СОЕДИНЕНИЕ втОстаток КАК втОстаток

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

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот