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

После "Выборка = Запрос.Выполнить().Выбрать()" строка в выборке автоматически переключается сама

Автор Rusler, 29 мар 2018, 20:27

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

Rusler

Ребятки, не судите строго, только начал вникать в сию систему. Стараюсь во всём разобраться самостоятельно, но тут произошла какая-то дичь.

После выполнения строки кода

<Выборка = Запрос.Выполнить().Выбрать()>

Чудным образом начинается перебор значений в выборке ВНЕ ЗАВИСИМОСТИ ОТ ТОГО, КАКАЯ СТРОКА В КОДЕ СЛЕДУЮЩАЯ! Т.е., даже не приходится ждать когда выполнится строка <Пока Выборка.Следующий>
Это я при отладке "Выборка.Сотрудник" в Табло отслеживаю. У меня скоро пол головы седой станет, а вторая половина лысой. Вот процедура:

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

Запрос.УстановитьПараметр("Водитель", Водитель);
Запрос.УстановитьПараметр("Грузчик1", Грузчик1);
Запрос.УстановитьПараметр("Грузчик2", Грузчик2);
Запрос.УстановитьПараметр("Период", НачалоДня(ДатаПрохожденияМО));

РезМедосм = Истина;

Выборка = Запрос.Выполнить().Выбрать();
   
ЕстьВодитель = Ложь;
ЕстьГрузчик1 = Ложь;
ЕстьГрузчик2 = Ложь;
   
Пока Выборка.Следующий() Цикл
   
Если Водитель = Выборка.Сотрудник Тогда
ЕстьВодитель = Истина;
Если Выборка.ОтметкаОМедосмотре = Перечисления.ОтметкаОМедосмотре.НеДопущен Тогда
Сообщить( "Сотрудник "+Водитель+
" не допущен по результатам медосмотра "+Формат(ДатаПрохожденияМО,"ДЛФ=DD") );
РезМедосм = Ложь;
КонецЕсли;
Продолжить; 
КонецЕсли;

Если Грузчик1 = Выборка.Сотрудник Тогда 
ЕстьГрузчик1 = Истина; 
Если Выборка.ОтметкаОМедосмотре = Перечисления.ОтметкаОМедосмотре.НеДопущен Тогда
Сообщить( "Грузчик "+Грузчик1+
" не допущен по результатам медосмотра "+Формат(ДатаПрохожденияМО,"ДЛФ=DD") );
РезМедосм = Ложь; 
КонецЕсли;
Продолжить; 
КонецЕсли;

Если Грузчик2 = Выборка.Сотрудник Тогда 
ЕстьГрузчик2 = Истина;
Если Выборка.ОтметкаОМедосмотре = Перечисления.ОтметкаОМедосмотре.НеДопущен Тогда
Сообщить( "Грузчик "+Грузчик2+
" не допущен по результатам медосмотра "+Формат(ДатаПрохожденияМО,"ДЛФ=DD") );
РезМедосм = Ложь;
КонецЕсли;
Продолжить; 
КонецЕсли;
КонецЦикла;

Если Не ЕстьВодитель Тогда
Сообщить( "Запись о медосмотре водителя "+Водитель+" на "
+Формат(ДатаПрохожденияМО,"ДЛФ=DD")+" не найдена!");
РезМедосм = Ложь; 
КонецЕсли;

Если Не ЕстьГрузчик1 Тогда
Сообщить( "Запись о медосмотре грузчика "+Грузчик1+" на "
+Формат(ДатаПрохожденияМО,"ДЛФ=DD")+" не найдена!");
РезМедосм = Ложь; 
КонецЕсли;

Если Не ЕстьГрузчик2 Тогда
Сообщить( "Запись о медосмотре грузчика "+Грузчик2+" на "
+Формат(ДатаПрохожденияМО,"ДЛФ=DD")+" не найдена!");
РезМедосм = Ложь; 
КонецЕсли; 

Возврат РезМедосм;
КонецФункции


Rusler

Чтоб ещё более понятно было... При прохождении курсора на строку 
ЕстьВодитель = Ложь; // Тут у меня Выборка.Сотрудник уже равно сотруднику с первой строки
ЕстьГрузчик1 = Ложь; // тут уже равно сотруднику со второй
ЕстьГрузчик2 = Ложь; // а тут с третьей.

пробовал ещё добавлять произвольные строки после представленных. Результат останавливается на последней (у меня третьей, три всего) и больше не изменяется.

Luzer1C

%) Зачем всё так сложно?
Делаешь так:
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Истина; // РезМедосм
Иначе
Выборка = Результат.Выбрать();
.....
Возврат Ложь; // РезМедосм
КонецЕсли;


И текст запроса добавит условие:
"ВЫБРАТЬ
    |    ПрохождениеМедосмотра.Сотрудник,
    |    ПрохождениеМедосмотра.ОтметкаОМедосмотре
    |ИЗ
    |    РегистрСведений.ПрохождениеМедосмотра КАК ПрохождениеМедосмотра
    |ГДЕ
    |    (ПрохождениеМедосмотра.Сотрудник = &Водитель
    |            ИЛИ ПрохождениеМедосмотра.Сотрудник = &Грузчик1
    |            ИЛИ ПрохождениеМедосмотра.Сотрудник = &Грузчик2)
    |    И ПрохождениеМедосмотра.Период = &Период
   |   И ПрохождениеМедосмотра.ОтметкаОМедосмотре = Значение(Перечисление.ОтметкаОМедосмотре.НеДопущен)";
Добавлено: 30 мар 2018, 05:19


Самый простой способ - добавить Водителя, Грузчика1 и Грузчика2 в список значений, потом при прокручивании выборки удалять их из списка. Потом после цикла с выборкой крутить этот список значений. Если он пустой, то не выдаст водителей/грузчиков, у которых нет медосмотра.
Добавлено: 30 мар 2018, 05:20


Задача простая как 3 копейки.
Халамбалам.

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

Рейтинг@Mail.ru

Поиск