helpf.pro
Регистрация

v8: Не работает запрос

Ermak
29.12.2015 17:36Прочитано: 4025

Добрый вечер, встала такая задача, нужно чтобы заявки добавлялись определенное количество, вот создал Регистр сведений где определили количество заявок, написал код но почему то запрос не работаю, я могу добавить заявок сколько хочется, подскажите что не так

Код 1C v 8.х
 Фильтр = Новый Структура();     
Фильтр.Вставить("Маршрут",ЛицевойСчет.Участок);
КоличествоЗ=РегистрыСведений.ПланировщикРемонтныхЗаявок.ПолучитьПоследнее(КонецДня(Дата),Фильтр).Количество;

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| РемонтныеЗаявки.Период КАК Период,
| СУММА(ЕСТЬNULL(РемонтныеЗаявки.Количество, 0)) КАК Количество,
| РемонтныеЗаявки.Участок
|ИЗ
| РегистрНакопления.РемонтныеЗаявки КАК РемонтныеЗаявки
|ГДЕ
| РемонтныеЗаявки.Период МЕЖДУДатаНач ИДатаКон
| И РемонтныеЗаявки.Участок =Участок
|
|СГРУППИРОВАТЬ ПО
| РемонтныеЗаявки.Период,
| РемонтныеЗаявки.Участок";

Запрос.УстановитьПараметр("Участок",ЛицевойСчет.Участок);
Запрос.УстановитьПараметр("ДатаНач",НачалоДня(Дата));
Запрос.УстановитьПараметр("ДатаКон",КонецДня(Дата));
КоличествоЗаявок=0;
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл              
КоличествоЗаявок=Результат.Количество;
КонецЦикла;

Если КоличествоЗаявок <= КоличествоЗ Тогда
Движение = Движения.СтатусЗаявокНаРемонт.Добавить();
Движение.Период = НачалоДня(Дата);
Движение.ДатаЗаявки=НачалоДня(Дата);
Движение.Участок=ЛицевойСчет.Участок; 
Движение.Заявка = Ссылка;
Движение.ЛицевойСчет = ЛицевойСчет;
Движение.Статус=Перечисления.СтатусЗаявки.Новая;
Иначе
Предупреждение("На этот день количество заявок закончились!"+Символы.ПС+"Выберите другую дату.");
КонецЕсли;


Yandex
Возможно, вас также заинтересует
Реклама на портале
IBReiter
30.12.2015 08:52Ответ № 1

В консоли запросов в предприятии сначала проверяйте, как он работает, а потом уже помещайте в код.

И вообще, чтобы понимать, почему не работает запрос, - нужен пример таблицы с именами колонок и значениями

Ermak
30.12.2015 09:07Ответ № 2

Сначала данные в Регистре нет, так как еще не было заявок. Что именно Вам показать?

IBReiter
30.12.2015 09:27Ответ № 3

Вы пишете, что не работает запрос: как вы поняли, что он не работает? работает ли запрос в режиме предприятия в консоли запросов? какие данные хранятся в вашем регистре? проверяли ли вы отладкой свой алгоритм?

Ermak
30.12.2015 10:08Ответ № 4

Что то не понимаю, когда Параметры Дата убераю тогда все работает, а с ними нет

IBReiter
30.12.2015 10:15Ответ № 5

Значит РемонтныеЗаявки.Период не попадает в интервал МЕЖДУ ДатаНач И ДатаКон

Ermak
30.12.2015 10:29Ответ № 6

При создании первого документа сначала в Регистре нет этого периода, по создание документ появляется с этим периодом, когда создаем второй документ запрос уже должен проверять и найти один документ, а он его не находит, почему?

IBReiter
30.12.2015 10:53Ответ № 7

Сделайте в предприятии скрин регистра сведений уже с записями первого документа и двух ваших документов

Ermak
30.12.2015 12:54Ответ № 8

Я вроде понял в чем дело, можете подсказать как суммировать Ресурс если он имеет тип Перечисление? Или можно как сто суммировать Измерения

IBReiter
30.12.2015 13:11Ответ № 9

Количество(Ресурс) КАК Количество

Ermak
30.12.2015 16:51Ответ № 10

Не тот использовал регистр. Переделал вот так, но почему то не срабатывает

Код 1C v 8.х
 ТЗ=ПолучитьЗаявки(ЛицевойСчет,Перечисления.СтатусЗаявки.Новая);   

Вот код

Код 1C v 8.х
 Функция ПолучитьЗаявки(ЛицевойСчет,Статус)

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СтатусЗаявокНаРемонт.Период КАК Период,
| СтатусЗаявокНаРемонт.Участок КАК Маршрут,
| КОЛИЧЕСТВО(СтатусЗаявокНаРемонт.Статус) КАК Статус
|ИЗ
| РегистрСведений.СтатусЗаявокНаРемонт КАК СтатусЗаявокНаРемонт
|ГДЕ
| СтатусЗаявокНаРемонт.Участок =Маршрут
| И СтатусЗаявокНаРемонт.Период МЕЖДУДатаНач ИДатаКон
|
|СГРУППИРОВАТЬ ПО
| СтатусЗаявокНаРемонт.Период,
| СтатусЗаявокНаРемонт.Участок";

Запрос.УстановитьПараметр("Маршрут",ЛицевойСчет.Участок);
Запрос.УстановитьПараметр("ДатаНач",НачалоДня(Дата));
Запрос.УстановитьПараметр("ДатаКон",КонецДня(Дата));
Результат = Запрос.Выполнить().Выгрузить();

Отбор = Новый Структура;
Отбор.Вставить("Статус", Статус);
Возврат Результат.НайтиСтроки(Отбор);

КонецФункции


Процедура ОбработкаПроведения(Отказ, Режим)
Фильтр = Новый Структура();     
Фильтр.Вставить("Маршрут",ЛицевойСчет.Участок);
КоличествоЗ=РегистрыСведений.ПланировщикРемонтныхЗаявок.ПолучитьПоследнее(КонецДня(Дата),Фильтр).Количество;

ТЗ=Новый ТаблицаЗначений;
ТЗ=ПолучитьЗаявки(ЛицевойСчет,Перечисления.СтатусЗаявки.Новая);

Если ТЗ.Количество() <= КоличествоЗ Тогда
Движение = Движения.СтатусЗаявокНаРемонт.Добавить();
Движение.Период = НачалоДня(Дата);
Движение.ДатаЗаявки=НачалоДня(Дата);
Движение.Участок=ЛицевойСчет.Участок; 
Движение.Заявка = Ссылка;
Движение.ЛицевойСчет = ЛицевойСчет;
Движение.Статус=Перечисления.СтатусЗаявки.Новая;
Иначе
Предупреждение("На этот день количество заявок закончились!"+Символы.ПС+"Выберите другую дату.");
КонецЕсли;
КонецПроцедуры
IBReiter
09.01.2016 17:45Ответ № 11

Вам нужно отладчиком смотреть в вашей базе по шагам, только тогда вы поймете, почему не работает.

Сначала проверьте что возвращает запрос, потом - что возвращает функция по результату запроса, потом условие в обработке проведения, сами значения, которые в условии вы сравниваете, потом уже тело условия с движениями ну и т.д.

И "не срабатывает" что именно?

LTrigubovich
14.01.2016 12:41Ответ № 12

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

| И СтатусЗаявокНаРемонт.Статус =Статус"; Запрос.УстановитьПараметр("Маршрут",ЛицевойСчет.Участок);

Запрос.УстановитьПараметр("Маршрут",ЛицевойСчет.Участок);Запрос.УстановитьПараметр("ДатаНач",НачалоДня(Дата)); Запрос.УстановитьПараметр("ДатаКон",КонецДня(Дата));Возврат Запрос.Выполнить().Выгрузить(); КонецФункции

LTrigubovich
14.01.2016 12:46Ответ № 13

Пардон, забыл отформатировать )Но вообще вижу 2 ошибки:1) в тексте запроса у параметров должен быть суффикс "&", например:

Код 1C v 8.2 УП
 И СтатусЗаявокНаРемонт.Период МЕЖДУДатаНач ИДатаКон   

2) Функция НайтиСтроки(...) возвращает массив, а не таблицу значений.

Поэтому оператор:

Код 1C v 8.2 УП
 ТЗ=Новый ТаблицаЗначений;   

не имеет смысла.

Ermak
14.01.2016 23:59Ответ № 14

Спасибо за помощь, я разобрался чтобы выводила Предупреждение("На этот день количество заявок закончились!"+Символы.ПС+"Выберите другую дату.");, но почему все равно добавляет?

Код 1C v 8.х
 	Фильтр = Новый Структура();     
Фильтр.Вставить("Маршрут",ЛицевойСчет.Участок);
КоличествоЗ=РегистрыСведений.ПланировщикРемонтныхЗаявок.ПолучитьПоследнее(КонецДня(Дата),Фильтр).Количество;

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

Запрос.УстановитьПараметр("Маршрут",ЛицевойСчет.Участок);
Запрос.УстановитьПараметр("ДатаНач",НачалоДня(Дата));
Запрос.УстановитьПараметр("ДатаКон",КонецДня(Дата));
Результат = Запрос.Выполнить().Выбрать();


Пока Результат.Следующий() Цикл              
КоличествоЗаявок=Результат.Количество;

КонецЦикла;


Если КоличествоЗаявок < КоличествоЗ Тогда
Движение = Движения.СтатусЗаявокНаРемонт.Добавить();
Движение.Период = НачалоДня(Дата);
Движение.ДатаЗаявки=НачалоДня(Дата);
Движение.Участок=ЛицевойСчет.Участок; 
Движение.Заявка = Ссылка;
Движение.ЛицевойСчет = ЛицевойСчет;
Движение.Статус=Перечисления.СтатусЗаявки.Новая;
Иначе
Предупреждение("На этот день количество заявок закончились!"+Символы.ПС+"Выберите другую дату.");
КонецЕсли;
Ermak
15.01.2016 08:40Ответ № 15

Я заметил что он не записывает в регистр СтатусЗаявокНаРемонт и просто создает документ

Ermak
15.01.2016 09:15Ответ № 16

Сделал так, не знаю правильно это или нет

Код 1C v 8.х
 Иначе
Предупреждение("На этот день количество заявок закончились!"+Символы.ПС+"Выберите другую дату.");
Отказ=Истина;
КонецЕсли;
Подсказка:Вы можете добавить любую страничку в Социальные закладки щелкнув по значку соцсетей (в вверху)
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.