8.х Примеры запросов в цикле

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Bkmz, 7 мар 2017.

  1. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    459
    Симпатии:
    13
    Баллы:
    29
    Подскажите пожалуйста примеры запросов в цикле и как с ними бороться?
  2. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    459
    Симпатии:
    13
    Баллы:
    29
    Запрос в цикле

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

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

    Код:
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ДатаДокумента", Дата);
    Запрос.УстановитьПараметр("ОбъектыПроката", Строка.Номенклатура);
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.Текст = "ВЫБРАТЬ
    |  ПриходнаяТЧ.Номенклатура КАК Номенклатура
    |ПОМЕСТИТЬ ДокТЧ
    |ИЗ
    |  Документ.Приходная.ТЧ КАК ПриходнаяТЧ
    |ГДЕ
    |  ПриходнаяТЧ.Ссылка = &Ссылка
    |;
    |
    |////////////////////////////////////////////////////////////
    |
    ВЫБРАТЬ ПЕРВЫЕ 1
    |  ОстатокОбъектовОстатки.ОбъектыПроката
    |ИЗ
    |  РегистрНакопления.ОстатокОбъектов.Остатки(&ДатаДокумента, ) КАК
    |  ОстатокОбъектовОстатки
    |ГДЕ
    | ОстатокОбъектовОстатки.ОбъектыПроката В (ВЫБРАТЬ ДокТЧ.Номенклатура
    |  ИЗ ДокТЧ )
    |";
    
    Так правильно будет? Есть ли ошибки?
    Последнее редактирование: 7 мар 2017
  3. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.828
    Симпатии:
    1.024
    Баллы:
    204
    Правильно будет отбор по номенклатуре выполнить через параметры виртуальной таблицы, а не через ГДЕ.
    Выбирать первые нет необходимости, т.к. это подразумевает сортировку таблицы перед собственно самим процессом выбора.
    Параметр даты должен быть моментом времени, а не абсолютной датой.
    Bkmz нравится это.
  4. TopicStarter Overlay
    Bkmz
    Offline

    Bkmz Опытный в 1С

    Регистрация:
    6 июл 2013
    Сообщения:
    459
    Симпатии:
    13
    Баллы:
    29
    Т.е. правильней будет переделать так?

    Исходный:

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

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

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

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

    Регистрация:
    16 сен 2009
    Сообщения:
    8.070
    Симпатии:
    542
    Баллы:
    204
    Первый вариант, только вместо
    Код:
    Запрос.УстановитьПараметр("ОбъектыПроката", Строка.Номенклатура);
    Код:
    Запрос.УстановитьПараметр("ОбъектыПроката", Массив);
    Bkmz нравится это.
  6. Andriy
    Offline

    Andriy

    Регистрация:
    9 мар 2017
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1
    Добрый день!

    Хочу перевести обычные формы в УФ
    Подскажите как писать запросы в УФ?

    Нужно, по окончании ввода по строке выполнять запрос, нужно ли запускать в режиме "Клиент -сервер" или не обязательно???

    Код:
    Процедура ТелАвтоПодбор()
       
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Документ1.Тел
    |ИЗ
    |    Документ.Документ1 КАК Документ1
    |ГДЕ
    |    Документ1.Тел = &Телефон";
    
    Запрос.УстановитьПараметр("Телефон", "097");
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Телефон);
    КонецЦикла;
    КонецПроцедуры
    
  7. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    559
    Баллы:
    204
    Andriy, создайте отдельную тему.