Имя: Пароль:
1C
 
выбрать остатки товара на складе
0 MrZLO
 
01.03.10
13:35
Функция ОстаткиТовараНаСкладе(Номенклатура)
   
   Запрос = новый Запрос;
   
   Запрос.Текст =
   
   "ВЫБРАТЬ
   |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
   |ИЗ
   |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
   |ГДЕ
   |    ТоварыНаСкладахОстатки.Номенклатура = &номенклатура";    
   
   Запрос.УстановитьПараметр("номенклатура",Номенклатура);
   
   Результат = Запрос.Выполнить().Выгрузить();
   
   Если Результат.Количество() > 0 Тогда
       
       Сообщить("остаток есть");
       
       Сообщить(Результат.Получить(0));
       
       Возврат Результат.Получить(0);
       
   КонецЕсли;
   
КонецФункции

чёта недогнал последнюю часть, чу что-то не то пишу...

вопрос: есть ли в 1с8 что-то вроде?

Запрос.Выполнить().ВзятьОдноЗначение();

:)
1 Ненавижу 1С
 
гуру
01.03.10
13:37
почему не то?
2 Defender aka LINN
 
01.03.10
13:40
(0) За такой запрос - пожизненный эцих без гвоздей!
3 Maxus43
 
01.03.10
13:41
(0) остаток имеет смысл на опред дату брать. вот и будет тебе одно значение в результате запроса этого
4 zmb
 
01.03.10
13:42
(0) мб указать в отборе склад?
5 MrZLO
 
01.03.10
13:43
(3) а по умолчанию он на текущую не берут чтоли?
(4) я его для простоты пока убрал, там он есть в оригинале
6 Ненавижу 1С
 
гуру
01.03.10
13:43
(0) Фильтр на номенклатуру в параметр запроса вставь
7 zmb
 
01.03.10
13:48
ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(
       &Дата,
       Номенклатура = &Номенклатура
           И Склад = &Склад) КАК ТоварыНаСкладахОстатки
8 MrZLO
 
01.03.10
13:50
у меня пока так

Функция ОстаткиТовараНаСкладе(Номенклатура, СкладНазвание)
   
   Перем ОстатокНаСкладе;
   
   Склад = Справочники.Склады.НайтиПоНаименованию(СкладНазвание).Ссылка;
   
   Запрос = новый Запрос;
   
   Запрос.Текст =
   
   "ВЫБРАТЬ
   |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
   |ИЗ
   |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
   |ГДЕ
   |    ТоварыНаСкладахОстатки.Склад = &склад
   |    И ТоварыНаСкладахОстатки.Номенклатура = &номенклатура";
   
   Запрос.УстановитьПараметр("склад",Склад);
   Запрос.УстановитьПараметр("номенклатура",Номенклатура);
       
   Выборка = Запрос.Выполнить().Выбрать();
   
   Пока Выборка.Следующий() Цикл
       
       ОстатокНаСкладе = Выборка.Остаток;
       
   КонецЦикла;
   
   Если Выборка.Количество() > 0 Тогда
       
       Возврат ОстатокНаСкладе;
       
   КонецЕсли;
   
КонецФункции
9 Sekho
 
01.03.10
13:51
Фильтр = Новый Структура;
Фильтр.Вставить("Номенклатура",ВыбНоменклатура);
ТабОстатков = РегистрыНакопления.ТоварыНаСкладах.Остатки(Дата,Фильтр,
              "Номенклатура", "Количество");
10 MrZLO
 
01.03.10
13:51
(6) а для чего он? мне же только одно значение надо с остатком?
11 zmb
 
01.03.10
13:51
(8) Запрос сделай как в (7)
12 Defender aka LINN
 
01.03.10
13:51
(8) Цикл-лишний. И в (2) я, похоже, погорячился. Надо пожизненный эцих с гвоздями давать.
13 Maxus43
 
01.03.10
13:51
(8) Сойдёт, только запрос переделай, как в (7). Иначе (2)
14 Ненавижу 1С
 
гуру
01.03.10
13:53
(10) почитай про параметры виртуальных таблиц
15 Sekho
 
01.03.10
13:53
(9) получишь одну строку таблицы значений. Без запроса
16 Киборг
 
01.03.10
13:54
Если Выборка.Следующий() Тогда
       
       Возврат Выборка.Остаток;
       
   Иначе
       
       Возврат 0;
       
   КонецЕсли;
17 MrZLO
 
01.03.10
14:00
(7) я так понял условие где можно сразу писать в ИЗ... типа продвинутый синтаксис
18 Ненавижу 1С
 
гуру
01.03.10
14:01
(17) дело не в синтаксисе, по другому строится SQL-запрос
19 MrZLO
 
01.03.10
14:03
(18) я через конструктор запросов делал, да и обычно из библии
select что надо from откуда where условие
20 Ненавижу 1С
 
гуру
01.03.10
14:04
(19) так вот это ОТКУДА не просто таблица, а ВИРТУАЛЬНАЯ
а по сути подзапрос
21 zmb
 
01.03.10
14:06
(17) В твоем запросе ты выбираешь остатки по всей номенклатуре по всем складам, затем из этой кучи выбираешь по одной номенклатуре и одному складу, а в (7) ты изначально получаешь остатки по номенклатуре и складу.
22 MrZLO
 
01.03.10
14:11
(20), (21) прояснилось :)

в итоге:

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

матерится по страшному...
{Документ.СчетНаОплатуПокупателю.Форма.ФормаДокумента(74)}: Поле объекта не обнаружено (Остаток)
       Возврат Выборка.Остаток;

видимо это лучше оставить
Если Выборка.Количество() > 0 Тогда
23 MrZLO
 
01.03.10
14:12
блин ступил как остаток забыл
24 Ненавижу 1С
 
гуру
01.03.10
14:14
наверное надо КоличествоОстаток
25 MrZLO
 
01.03.10
14:14
получилось! спасибо всем, пойду читать про запросы...
26 Рэйв
 
01.03.10
14:15
(25)Странные люди....сначала делают, а потом читать идут:)
27 Ненавижу 1С
 
гуру
01.03.10
14:19
(26) это Россия! Наша Раша!