7.7 Помогите с запросом

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Asttoxa, 30 янв 2012.

  1. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Нужно внести в список только имеющие в наличие товары на складе.
    Конфигурация ТиС 7.7
    В справочнике Номенклатура содержится и товар и услуги. Нужен только товар.
    Выбирать по складу в переменной ВыбСклад.

    Делаю такой запрос:

    Код:
    |ОбрабатыватьДокументы все;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Номенклатура = Справочник.Номенклатура.ТекущийЭлемент;
    |ВидНоменклатуры = Справочник.Номенклатура.ВидНоменклатуры;
    |ОстаткиТМЦ = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Номенклатура без групп;
    |Условие(ВидНоменклатуры =  Перечисление.ВидыНоменклатуры.Товар);
    |Условие(Склад = ВыбСклад);
    |Условие(КоличествоКонОст > 0);
    
    Выдает ошибку :(

    Может вообще все не правильно делаю...вообщем мне нужно в список значений запихнуть номенклатуру, количество которое не равно "0" на определенном складе. При этом отсеяв Группы и Услуги.
    Запрос должен быть максимально быстрым.

    Заранее спасибо.
  2. Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Код:
    Запрос = СоздатьОбъект("ЗАпрос");
    ТекстЗапроса = "
    |С НачДата по КонДата;
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Номенклатура без групп;
    |Условие(Склад = ВыбСклад);  
    |Условие(ЗАпрос.КоличествоКонОст > 0); ";
    Если запрос.Выполнить(ТекстЗапроса)=0 Тогда
    Возврат;
    КонецЕсли;
    Пока ЗАпрос.группировка(1)=1 Цикл
    Сообщить("  "+Запрос.Номенклатура);
    КонецЦикла;
    
    Услуги на остатках быть не должно
  3. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Спасибо запрос работает исправно.
  4. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Опаньки... Работать работает, но результаты не верно выдает. :(
    Разнятся результаты остатков если сравнивать с отчетом "Остатки ТМЦ". ПОчему?

    А вот этот код правильные данные выдает:
    Код:
     Рег = СоздатьОбъект("Регистр.ОстаткиТМЦ");
    Рег.УстановитьЗначениеФильтра("Номенклатура",ТекущийЭлемент());
    Рег.УстановитьЗначениеФильтра("Склад",ВыбСклад);
    
    ТабИтогов = СоздатьОбъект("ТаблицаЗначений");
    Рег.ВыгрузитьИтоги(ТабИтогов);
    Рез = ТабИтогов.Итог("Количество");
    
    Если Рез = 0 Тогда Возврат "" КонецЕсли;
    
    Возврат ""+ Рез + " шт.";
    
  5. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Посмотрел в регистр там идет разные Фирмы. Поэтому лезут не верные остатки.
    Подскажите как мне в тексте запроса объединить остатки по всем фирмам?? тоесть например если по одной фирме +1 по другой -1 то результат должен быть "0"
  6. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Сделал вот так:
    Код:
     СписокНоменклатуры=СоздатьОбъект("СписокЗначений");
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(СписокДоступнойНоменклатуры)
    |ОбрабатыватьДокументы все;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Фирма = Регистр.ОстаткиТМЦ.Фирма;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Номенклатура без групп;
    |Группировка Фирма;
    |Условие(Склад = ВыбСклад);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат "" ;
    КонецЕсли;
    Пока Запрос.Группировка(1) = 1 Цикл
    Результат=0;
    Пока Запрос.Группировка(2) = 1 Цикл
    Результат=Результат+Запрос.КоличествоКонОст;
    КонецЦикла;
    Если Результат>0 Тогда
    СписокНоменклатуры.ДобавитьЗначение(запрос.Номенклатура);
    КонецЕсли;
    КонецЦикла;
    Все отлично работает...
    Но можно ли как нибудь последнюю часть впихнуть в текст запроса, чтобы он быстрее работал ??? (мы отсеем много движений по регистру таких как "+5" на "-5")

    Спасибо.
  7. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а поставить условие в запрос на Количество >0 не пробовали?
  8. Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    У тебя условие в запросе неправильное немного.
    Обход делаешь по группировкам : Номенклатура, Фирма (<Каждый товар>, <на каждой фирме> тут тогда нужно ещё группировку <на каждом складе>)
    А проверяешь в уловии на склад. Но в твоём случае, запрос не будет перебирать склады, а соответстенно не выведет чать товара .

Поделиться этой страницей