8.х Коварный отчет

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем 3oleg, 12 дек 2008.

  1. TopicStarter Overlay
    3oleg
    Offline

    3oleg

    Регистрация:
    12 дек 2008
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте. Я сделал конфигурацию для организации, с одной стороны там вроде все работало но недавно я сталкнулся с такой проблеммой. Вот кусок кода

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

    Вообщем отчет строится на основе запроса, а запрос выбирает из справочника того человека, который имеет в табличной части определенную строку и определенное число.
    Проблемма в том, что просматривается вся табличная часть и если в одной строке подходит название курсов а в другой число то считается чо условие выполнено, а мне надо чтобы строки по отдельности обрабатывались. Что делать?
    :unsure: :smile:
    Ради этого отчета конфигурация и строилась, чтобы вручную не искать просроченные курсы..
  2. tirk
    Offline

    tirk Опытный в 1С

    Регистрация:
    1 сен 2008
    Сообщения:
    1.142
    Симпатии:
    0
    Баллы:
    26
    Какое условие??? Какие строки по отдельности?? Непонятно?
  3. TopicStarter Overlay
    3oleg
    Offline

    3oleg

    Регистрация:
    12 дек 2008
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Код:
       | Студенты.Курсы.Название = &НазваниеКурсов 
    |    
    | 
    |   И Студенты.Курсы.ДействительныДо МЕЖДУ &ПросроченыПосле И &ДатаРасчета";
    
    это означает что в справочнике студенты есть табличная часть курсы из которой берется название курсов и дата которая находится в определенном промежутке времени. Если в табличной части 1 строка, то все нормально работает. Но бывает что в ней несколько строк вот например
    1. оператор газовой кательной -- 28.12.2009
    2. стропальщик -- 28.12.2012
    если параметры запроса будут Студенты.Курсы.Название = стропальщик (есть во второй строке но нет в 1й) и Студенты.Курсы.ДействительныДо МЕЖДУ 27.12.2009 и 31.12.2009 (подходит для 1й строки но не для 2й) то в отчет добавится фамилия имя и отчество человека но данных об обучении не добавится.

    И еще отладка показывает:
    Код:
    ВыборкаДетали = Результат.Выбрать(); //нормально до выборки детальных записей из табл. части
    счетчик=0;	
    Пока ВыборкаДетали.Следующий() Цикл
    ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
    ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
    
    ТабДок.НачатьГруппуСтрок(, ложь);
    ТабДок.Вывести(КурсыОбластьШапкаТаблицы);
    ТабДок.НачатьАвтогруппировкуСтрок();
    
    КурсыВыборкаДетали = ВыборкаДетали.Курсы.Выбрать();
    
    Пока КурсыВыборкаДетали.Следующий() Цикл //КурсыВыборкаДетали=[font="Arial Black"][color="#FF0000"]ошибка чтения значения[/font]
    КурсыОбластьДетальныхЗаписей.Параметры.Заполнить(КурсыВыборкаДетали);
    ТабДок.Вывести(КурсыОбластьДетальныхЗаписей, КурсыВыборкаДетали.Уровень());
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    ТабДок.Вывести(КурсыОбластьПодвалТаблицы);
    ТабДок.ЗакончитьГруппуСтрок();
    счетчик = счетчик+1;
    Надпись1 = "По запросу найдено " + счетчик + " человек(а).";
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    ТабДок.Вывести(ОбластьПодвалТаблицы);
    ТабДок.Вывести(ОбластьПодвал);
    Надпись1 = "По запросу найдено " + счетчик + " человек(а).";
    //}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ
    КонецПроцедуры
    
    Прикладываю файл своей конфигурации, я новичек в этом деле, ни каких курсов не проходил, прошу сильно ногами не пинать.

    Вложения:

    • 3oleg.rar
      Размер файла:
      153,5 КБ
      Просмотров:
      24
  4. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Мне вот не нравятся ваши условия.
    Названия курсов - это булево? Или название как строка?
  5. TopicStarter Overlay
    3oleg
    Offline

    3oleg

    Регистрация:
    12 дек 2008
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    В начале я выложил измененный код, потому что писал сообщение в процессе работы над конфигурацией и совсем забыл про то что он изменен. Вот оригинальный.

    Код:
           "|ИЗ
    |    Справочник.Студенты КАК Студенты
    |ГДЕ
    |    (Студенты.Курсы.Название = &НазваниеКурсов
    |            ИЛИ &НазваниеКурсов = ИСТИНА)
    |    И (Студенты.Предприятие.Наименование = &Предприятие
    |            ИЛИ &Предприятие = ИСТИНА)
    |    И Студенты.Курсы.ДействительныДо МЕЖДУ &ПросроченыПосле И &ДатаРасчета";
    
    
    Запрос.УстановитьПараметр("ДатаРасчета", ДатаРасчета);
    Запрос.УстановитьПараметр("ПросроченыПосле", ПросроченыПосле);
    
    если НазваниеКурсов=неопределено тогда
    Запрос.УстановитьПараметр("НазваниеКурсов", истина);        
    иначе    
    Запрос.УстановитьПараметр("НазваниеКурсов", НазваниеКурсов);
    конецесли;
    
    если Предприятие= справочники.Предприятия.ПустаяСсылка() тогда
    Запрос.УстановитьПараметр("Предприятие", истина);        
    иначе
    Запрос.УстановитьПараметр("Предприятие", Предприятие.Наименование);
    конецесли;
    Результат = Запрос.Выполнить();
    
    
    Отчет строится по нескольким параметрам, если какой то параметр не задан (например предприятие) то отчет вообще ничего не выведет. А я сделал так что он просто приравнивается к истине (до этого ведь небыло явного определения типа параметра) и в запросе условие подправил. Таким образом если какой - либо параметр не задан то он будет игнорироваться. Ни знаю правельно это или нет, но в других отчетах работает. Да и в этом работает. Проблемма совсем ни в нем. Мне знакомый сказал что нужно использовать некий вложенный запрос в такой ситтуации. А я даже примерно ни знаю что это такое.

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