Версия для печати темы (https://pro1c.org.ua/index.php?s=731360f7f453ebd512e4a703ccf16962&showtopic=41106)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Помогите пожалуйста! при записи регистр не записывает запрос.

Автор: Noviscok 18.10.17, 8:25

Стоит задача: создать регистр, в который при проведении документа записывать минимальное, среднее и максимальное значение температуры за день, а также количество осадков.
я создал регистр. написал запрос. он почему-то выполняет движение, а запрос нет. Помогите!


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

    КонецПроцедуры



 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 9
 

Автор: sava1 18.10.17, 8:34

Для начала просто почитайте теорию. Гугль в этом поможет.
Для того, чтобы кто-то что-то помог - сначала надо правильно поставить вопрос.

Автор: Bernet 18.10.17, 8:36

Noviscok @ Сегодня, 9:25 * ,
Запрос никаких "движений" и не должен делать, он данные выбирает.
Во-вторых, у вас в запросе нет условия по ссылке на документ, у вас данные будут тянуться со всех документов. Нужно добавить отбор по текущему документу:

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

// и перед выполнением установить параметр

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

// а потом обходить результат запроса:
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
       Движение = Движения.Регистр.Добавить();
       Движение.Период = Дата;
       Движение.Осадки = Выборка.Осадки;
// и т.д.
КонецЦикла;

Автор: Noviscok 18.10.17, 9:22

Соглашусь вопрос корректен. Что нужно написать в движении чтоб регистр записывал макс, мин и сред? Надо создать временную таблицу?

Автор: Bernet 18.10.17, 9:32

Noviscok @ Сегодня, 10:22 * ,
Давайте по шагам:
1) Все необходимые для этого действия пишем в модуле объекта документа в процедуре "Обработка проведения"
2) Для того чтобы что-то записать в регистр, нужно выбрать необходимые данные, для этого вам и нужен Запрос. Можно делать это так как делали вы в первом посте - напрямую читать данные из табличной части и писать их в регистр, но это считается неоптимальным, т.к. при каждом обращении к реквизитам таб. части идет обращение к базе, по сути это лишняя нагрузка. Поэтому лучше делать через запрос. Для этого нужно в запросе выбрать поля, которые вас интересуют, указать источник данных - это ваша таблица документа, и указать что мы берем конкретный текущий документ - то условие про которое я писал постом выше (конструкция "ГДЕ").
3) После того как запрос есть, нам необходимо передать все параметры в запрос, это то что идет со значком "&"
4) После этого запрос готов к выполнению, выполняем его и получаем выборку нужных нам данных. За это отвечают строки

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

5) Дальше вам необходимо прочитать из этой выборки каждую строку, для этого делаем цикл по выборке
Пока Выборка.Следующий() Цикл
  
КонецЦикла;

6) В цикле вы добавляете каждую запись в регистр.
       Движение = Движения.Регистр.Добавить();
       Движение.Период = Дата;
       Движение.Осадки = Выборка.Осадки;
       Движение.МинТемпература = Выборка.МинТемпература;
       Движение.МаксТемпература = Выборка.МаксТемпература;
       // и т.д. все поля которые нужно записать в регистр.
       // P.S. естественно для записи в регистр у вас там должны быть соотвествующие поля "Осадки ", "МинТемпература", "МаксТемпература "

как-то так. надеюсь понятнее пояснил

Автор: Noviscok 18.10.17, 10:02

Bernet @ Сегодня, 14:32 * ,
У меня не было полей макс и мин. После Вашего ответа я создал эти поля. Все получилось. Просто у меня уже каша в голове. Спасибо Вам огромное, все понял.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua