8.х Как работает запрос ?

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Spiritok, 23 май 2012.

  1. TopicStarter Overlay
    Spiritok
    Offline

    Spiritok

    Регистрация:
    23 май 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Суть проблемы отсутствие опыта!
    Хочу понять как работает Запрос и как записывать его результаты
    К примеру есть Путевой лист с реквизитами Автомобиль, Водитель, Начальные показания спидометра, Конечные показания, Норма расхода, Норма топлива и Количество топлива.
    Есть Регистр сведений НормыРасхода с измерение Автомобиль и Ресурсами Нормаи Расход.

    На модуле формы АвтомобильОбработкаВыбора строю запрос примерно как-то так
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | НормыРасходаСрезПоследних.Расход
    |ИЗ
    | РегистрСведений.НормыРасхода.СрезПоследних КАК НормыРасходаСрезПоследних";
    Как мне результат запроса записать в объект формы Норма топлива??
  2. Максим
    Offline

    Максим Опытный в 1С

    Регистрация:
    28 фев 2008
    Сообщения:
    688
    Симпатии:
    8
    Баллы:
    29
    "Как мне результат запроса записать в объект формы Норма топлива?" (с). В форму ничего нельзя записывать, на форму можно выводить, записывать можно в базу данных.
    Т.е. в путевом листе вы выбираете автомобиль и хотите добавить эту запись Автомобиль+Норма и Расход в регистр сведений НормыРасхода, Я правильно понял (если нет опишите подробнее, что такое "объект формы Норма топлива")? Регистр периодический?
  3. TopicStarter Overlay
    Spiritok
    Offline

    Spiritok

    Регистрация:
    23 май 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Извиняюсь что не правильно выражаюсь, Автомобиль - тип СправочникСсылка.Автомобиль, хочу что бы при выборе авто на форму выводилась Норма топлива, которая хранится у меня в Регистре сведений Нормы расхода!

    Прикреплю скрин

    Вложения:

    • 1.jpg
      1.jpg
      Размер файла:
      154,8 КБ
      Просмотров:
      54
  4. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    Повесить обрабочик события ПриИзменении() поля автомобиль, и в этом обработчике выбирать данные по данному авто из РС.
  5. TopicStarter Overlay
    Spiritok
    Offline

    Spiritok

    Регистрация:
    23 май 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Реализуем это с помощью запроса...второй вопрос как вывести результат запроса на форму, я еще не очень хорошо знаком с запросами!
  6. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    Запрос нужно выполнять на сервере (т.к. в 8.2 на клиенте вообще нет никаких данных, кроме открытой формы:)))), потом возвращать на форму. Хотя в 8.2 (конкретно в вашем варианте) можно попробовать так:
    Код:
    &НаКлиенте
    Процедура АвтомобильПриИзменении(Элемент)
    Объект.НормаТоплива = ПолучитьНормуТопливаАвто(Объект.Автомобиль, [b]ДатаСреза[/b]);
    КонецПроцедуры
    &НаСервере
    Функция ПолучитьНормуТопливаАвто(СсылкаНаАвто, АктуальнаяДата)
    Отбор = Новый Структура("Автомобиль", СсылкаНаАвто);
    НормаТоплива = РегистрыСведений.ВашРегистрСведений.ПолучитьПоследнее(АктуальнаяДата, Отбор);
    Возврат НормаТоплива.Расход;
    КонецФункции
    Только вот нужно как-то определиться с Датой, передаваемой в функцию. Я как понял у вас документ, при создании - дата дока - пустая, соответственно нужно брать текущую. И при изменении авто в уже созданных документах - дата будет стоять, соответственно нужно добавлять дополнительное условие - если Новый - ТекущаяДата(), иначе - Объект.Дата.

    Код в коментариях нуждается ?
  7. TopicStarter Overlay
    Spiritok
    Offline

    Spiritok

    Регистрация:
    23 май 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Поступил следующим образом

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

    Теперь думаю каким образом мне вывести на форму полученное значение...
    Есть вариант
    Код:
    Результат = Запрос.Выполнить().Выбрать();
    Если Результат.Следующий() Тогда
    Возврат Результат.Получить();
    Иначе
    Возврат 0;
    КонецЕсли;
  8. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    Думаю как-то так:
    Код:
    Результат = Запрос.Выполнить().Выбрать();
    Если Результат.Количество <> 0 Тогда
    Пока Результат.Следующий() Цикл
    РасходТоплива = Результат.Расход;
    КонецЦикла;
    Иначе
    РасходТоплива = 0;
    КонецЕсли;
    Возврат РасходТоплива;
    В 8.2 облегчили получение данных из РН, можно использовать ПолучитьПоследнее, с теми же отборами.
  9. TopicStarter Overlay
    Spiritok
    Offline

    Spiritok

    Регистрация:
    23 май 2012
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Конечный результат такой:

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

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