8.х Как убрать бесконечный цикл (или где ошибка)

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем burbon, 8 июл 2009.

  1. TopicStarter Overlay
    burbon
    Offline

    burbon Опытный в 1С

    Регистрация:
    5 май 2009
    Сообщения:
    228
    Симпатии:
    0
    Баллы:
    26
    Вот текст процедуры нажатия кнопки:

    Процедура ПолучитьНажатие(Элемент)
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ОтпускаОрганизацийРаботникиОрганизации.ДатаНачала КАК ДатаНачала,
    | ОтпускаОрганизацийРаботникиОрганизации.ДатаОкончания КАК ДатаОкончания,
    | ОтпускаОрганизацийРаботникиОрганизации.ПричинаОтсутствия КАК ПричинаОтсутствия,
    | ОтпускаОрганизацийРаботникиОрганизации.Сотрудник КАК Сотрудник,
    | ОтпускаОрганизацийРаботникиОрганизации.ФизЛицо.ДатаРождения,
    | КонтактнаяИнформация.Поле5,
    | КонтактнаяИнформация.Поле6,
    | КонтактнаяИнформация.Поле7,
    | КонтактнаяИнформация.Поле9
    |ИЗ
    | Документ.ОтпускаОрганизаций.РаботникиОрганизации КАК ОтпускаОрганизацийРаботникиОрганизации,
    | РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    | ОтпускаОрганизацийРаботникиОрганизации.ПричинаОтсутствия = &ПричинаОтсутствия
    |
    |УПОРЯДОЧИТЬ ПО
    | Сотрудник,
    | ПричинаОтсутствия,
    | ДатаНачала,
    | ДатаОкончания";
    Запрос.УстановитьПараметр("ПричинаОтсутствия", Перечисления.ПричиныОтсутствияНаРаботеВОрганизации.ОтпускЧАЭС);
    Результат = Запрос.Выполнить().Выгрузить();
    Для каждого рез из результат Цикл
    Если рез.ДатаНачала >= ДатаНачалаПериода и рез.ДатаОкончания <= ДатаКонечногоПериода Тогда
    СотрудникПроверка = рез.Сотрудник;
    Сотрудник = рез.Сотрудник;
    СтрокаПервая = Найти(Сотрудник, " ");
    ПолучитьФ = Лев(Сотрудник, СтрокаПервая - 1);
    ПолучитьИО = Прав(Сотрудник, СтрДлина(Сотрудник) - СтрокаПервая);
    СтрокаВторая = Найти(ПолучитьИО, " ");
    ПолучитьИ = Лев(ПолучитьИО, СтрокаВторая - 1);
    ПолучитьО = Прав(Сотрудник, СтрДлина(Сотрудник) - (СтрокаПервая + СтрокаВторая));
    Сообщить(ПолучитьФ);
    Сообщить(ПолучитьИ);
    Сообщить(ПолучитьО);
    Сообщить("Дата Начала: " + Формат(рез.ДатаНачала, "ДЛФ=Д"));
    Сообщить("Дата Окончания: " + Формат(рез.ДатаОкончания, "ДЛФ=Д"));
    Сообщить("Дата Рождения: " + Формат(рез.ФизЛицоДатаРождения, "ДЛФ=Д"));
    Сообщить("Населенный пункт: " + рез.Поле5);
    Сообщить("Улица: " + рез.Поле6);
    Сообщить("Дом: " + рез.Поле7);
    Сообщить("Квартира: " + рез.Поле9);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

    Всё выводит нормально, но бесконечно. В чём ошибка или где я чего не досмотрел?
  2. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Данный цикл не бесконечен, он просто очень длинный.
    Перед:
    Код:
    Для каждого рез из результат Цикл
    
    Добавьте такой код, сможите сориентироватся, каково количество строк в результате запроса:
    Код:
    Сообщить("Всего в результирующей ТЗ: "+Результат.Количество()+" строк");
    
  3. TopicStarter Overlay
    burbon
    Offline

    burbon Опытный в 1С

    Регистрация:
    5 май 2009
    Сообщения:
    228
    Симпатии:
    0
    Баллы:
    26
    Он бесконечный. Но если убрать вот эту часть:

    | КонтактнаяИнформация.Поле5,
    | КонтактнаяИнформация.Поле6,
    | КонтактнаяИнформация.Поле7,
    | КонтактнаяИнформация.Поле9
    |ИЗ
    | Документ.ОтпускаОрганизаций.РаботникиОрганизации КАК ОтпускаОрганизацийРаботникиОрганизации,
    | РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация


    То выводит результат условия и там 8 записей:

    Если рез.ДатаНачала >= ДатаНачалаПериода и рез.ДатаОкончания <= ДатаКонечногоПериода Тогда
    СотрудникПроверка = рез.Сотрудник;
    Сотрудник = рез.Сотрудник;
    СтрокаПервая = Найти(Сотрудник, " ");
    ПолучитьФ = Лев(Сотрудник, СтрокаПервая - 1);
    ПолучитьИО = Прав(Сотрудник, СтрДлина(Сотрудник) - СтрокаПервая);
    СтрокаВторая = Найти(ПолучитьИО, " ");
    ПолучитьИ = Лев(ПолучитьИО, СтрокаВторая - 1);
    ПолучитьО = Прав(Сотрудник, СтрДлина(Сотрудник) - (СтрокаПервая + СтрокаВторая));
    Сообщить(ПолучитьФ);
    Сообщить(ПолучитьИ);
    Сообщить(ПолучитьО);
    Сообщить("Дата Начала: " + Формат(рез.ДатаНачала, "ДЛФ=Д"));
    Сообщить("Дата Окончания: " + Формат(рез.ДатаОкончания, "ДЛФ=Д"));
    Сообщить("Дата Рождения: " + Формат(рез.ФизЛицоДатаРождения, "ДЛФ=Д"));


    Видимо ошибка в запросе. Не могу связать РегистрСведений КонтактнаяИнформация и ОтпускаОрганизации.
  4. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    1. Уверяю, что цикл не бесконечный. Например на моей базе дает больше миллиона записей. Учитывая что сама функция Сообщить() работает сравнительно медленно и прибавив к этому дополнительные вычисления ФИО производящиеся над каждой записью получаем ооооочень долгий период ожидания конца вывода информации на экран. Но конец у него все же будет :unsure:
    2. Для того, чтобы соединить две таблицы базы данных необходимо использовать СОЕДИНЕНИЕ в данном случае подойдет ЛЕВОЕ. Запрос будет выглядеть примерно так:
    Код:
    "ВЫБРАТЬ
    |    ОтпускаОрганизацийРаботникиОрганизации.ДатаНачала КАК ДатаНачала,
    |    ОтпускаОрганизацийРаботникиОрганизации.ДатаОкончания КАК ДатаОкончания,
    |    ОтпускаОрганизацийРаботникиОрганизации.ПричинаОтсутствия КАК ПричинаОтсутствия,
    |ОтпускаОрганизацийРаботникиОрганизации.ФизЛицо.ДатаРождения,
    |    КонтактнаяИнформация.Поле5,
    |    КонтактнаяИнформация.Поле6,
    |    КонтактнаяИнформация.Поле7,
    |    КонтактнаяИнформация.Поле9
    |ИЗ
    |    Документ.ОтпускаОрганизаций.РаботникиОрганизации КАК ОтпускаОрганизацийРаботникиОрганизации
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |        ПО ОтпускаОрганизацийРаботникиОрганизации.ФизЛицо = КонтактнаяИнформация.Объект
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПричинаОтсутствия,
    |    ДатаНачала,
    |    ДатаОкончания";
    
    
    
    
    
  5. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Хочу так же обратить Ваше внимание, что в целом запрос по документам кажется мне не совсем корректным. Конечно, не зная условий задачи я не могу утверждать на 100%, но все же осмелюсь настоятельно рекомендовать в будущем использовать для сбора информации регистры, в которых делают записи нужные документы. А если уж доводится использовать документы, то не забывать проверять их на предмет проведения. Потому, что можно наткнуться на помеченный на удаление или не проведенный документ, которые ничего общего с реальным положением дел не имеют...

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