Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 фев 2024, 01:27

Не верная логика обработки результата запроса

Автор justmuve, 18 янв 2024, 12:53

0 Пользователей и 1 гость просматривают эту тему.

justmuve

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

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

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

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

        КонецЦикла;
    КонецЕсли;
КонецПроцедуры


LexaK

justmuve, без отладчика и консоли запросов - ни как.

как вариант проверьте настройки проведения, режим: Удаление движений - что у вас в нем?
если помогло нажмите: Спасибо!

justmuve

LexaK,
две одинаковые записи никаких сообщений не было, удаление движение поставил автоматически

justmuve


LexaK

justmuve
(как-то не сразу сообразил)
попробуйте такой запрос

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

justmuve

LexaK, + еще в цикле ВыборкаЗанятости.Следующий() добавил проверку првоерку по часу, и дню
по тестам проверил, вроде работает

LexaK

justmuve, будет время (и желание) придумайте как проверку сделать ОДНИМ запросом!
а не в цикле как это у вас сейчас!
если помогло нажмите: Спасибо!

justmuve


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск