[РЕШЕНО] Опять про Выбор в запросе к регистру

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

  1. TopicStarter Overlay
    ФинанСист
    Offline

    ФинанСист

    Регистрация:
    14 июл 2008
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    На форме поле выбора с именем СсылкаЛС
    и типом: СправочникСсылка.ЛицевойСчет


    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | РегистрЛСОстаткиИОбороты.ЛС,
    | РегистрЛСОстаткиИОбороты.СуммаОборот, |

    |ИЗ
    | РегистрНакопления.РегистрЛС.ОстаткиИОбороты(&НачПериода, &КонПериода) КАК РегистрЛСОстаткиИОбороты

    |ГДЕ
    //|ВЫБОР
    //| КОГДА ЗНАЧЕНИЕ(Справочник.ЛицевойСчет.ПустаяСсылка)
    //| ТОГДА ИСТИНА
    //| ИНАЧЕ РегистрЛСОстаткиИОбороты.ЛС = &СЛС
    //|КОНЕЦ


    | ВЫБОР
    | КОГДА ЗначениеЗаполнено(СсылкаЛС) ТОГДА
    | РегистрЛСОстаткиИОбороты.ЛС = &СЛС
    | ИНАЧЕ ИСТИНА
    | КОНЕЦ
    |";


    Запрос.УстановитьПараметр("СЛС", СсылкаЛС);

    Запрос.УстановитьПараметр("Начпериода", НачПериода);
    Запрос.УстановитьПараметр("КонПериода", КонПериода);


    Не проходит ни один из вариантов ВЫБОРА. По первому -нет ни одной выборки при пустом поле. По второму – ошибка.
    СКД не применять. Спасибо.
  2. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    Код:
    ".....
    |ГДЕ
    |    РегистрЛСОстаткиИОбороты.ЛС В ИЕРАРХИИ (&СЛС)"
    А вообще, условие лучше указывать не в секции "ГДЕ", а в параметрах виртуальной таблицы.
  3. TopicStarter Overlay
    ФинанСист
    Offline

    ФинанСист

    Регистрация:
    14 июл 2008
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Спасибо... уточню вопрос: Выбор необходим для ИСКЛЮЧЕНИЯ отбора при незаполненном поле на форме. В сети, дейст-вно, предлагают оба места указания условия. Я (пока) остановился на описанном. Почему он не работает?
  4. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    В данном случае, это я просто так... к сведению написал, что лучше условия задавать в параметрах виртуальной таблицы. На результат запроса, в данном случае, это не влияет. Влияет только на скорость его выполнения.

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

    Второй вариант выдает ошибку, потому что, сами понимаете, в языке запросов нет функции "ЗначениеЗаполнено()".

    Ну я ж Вам предложил использовать оператор "В ИЕРАРХИИ" (без всякого выбора).
    Не работает? Или Вы не пробовали?
  5. TopicStarter Overlay
    ФинанСист
    Offline

    ФинанСист

    Регистрация:
    14 июл 2008
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Я ошибочно подумал, что Вы не поняли суть вопроса.... Но фактически я видимо вообще не в теме((( При чем тут В ИЕРАРХИИ и куда его вставлять? Не могли бы Вы побольше написать? Спасибо большое за внимание!
    1. Я не пойму, как можно при всех этих случаях оставлять строку:
    Запрос.УстановитьПараметр("СЛС", СсылкаЛС); - ведь это однозначно говорит, что БУДЕТ выполнен отбор?
    2. У меня нет параметра отбора, кроме периода:
    РегистрНакопления.РегистрЛС.ОстаткиИОбороты(&НачПериода, &КонПериода) КАК РегистрЛСОстаткиИОбороты
    Если он здесь нужен, то как это записать?
    Последнее редактирование: 5 апр 2014
  6. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    Попробуйте так:
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | РегистрЛСОстаткиИОбороты.ЛС,
    | РегистрЛСОстаткиИОбороты.СуммаОборот,
    |ИЗ
    | РегистрНакопления.РегистрЛС.ОстаткиИОбороты(&НачПериода, &КонПериода, , , ЛС В ИЕРАРХИИ (&СЛС)) КАК РегистрЛСОстаткиИОбороты";
    
    Запрос.УстановитьПараметр("СЛС", СсылкаЛС);
    Запрос.УстановитьПараметр("Начпериода", НачПериода);
    Запрос.УстановитьПараметр("КонПериода", КонПериода);
    --- Объединение сообщений, 5 апр 2014 ---
    Оператор "В ИЕРАРХИИ" работает таким образом, что если в параметр передается пустая ссылка (т.е., в данном случае, поле осталось незаполненным), то в выборку попадают все значения (т.е. как бы без отбора).

    Правда, если в поле Вы выберите не элемент справочника, а группу (папку), то в выборку попадут все элементы, находящиеся в этой группе.
    Но Вы, как я понял, выбираете только элементы, верно?
    Тогда можете смело пользоваться оператором "В ИЕРАРХИИ".
    Последнее редактирование: 5 апр 2014
  7. TopicStarter Overlay
    ФинанСист
    Offline

    ФинанСист

    Регистрация:
    14 июл 2008
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Попробовал....Увы, нет выборки при пустом реквизите на форме. "ГДЕ..." убрал. В РегистреЛС только одно измерение. Хотя где-то счас читал, что "ВИерархии" должно помочь.... Поставил ровно 3 запятых, хотя не понимаю, как узнавать сколько их нужно(((
    --- Объединение сообщений, 5 апр 2014 ---
    Вот эксперименты:
    ГДЕ
    // | ЗНАЧЕНИЕ(Справочник.ЛицевойСчет.ПустаяСсылка) = &СЛС // не заполнено форма, тогда ВСЕ . Заполнено = тогда НИКТО
    //| РегистрЛСОстаткиИОбороты.ЛС = &СЛС // не заполнено, тогда НИКТО. Заполнено - тогда один
    Оба не катят((( Надо как-то их соединить как-бы.... Т.е. напрашивается ВЫБОР... Но смысл его не понятен. Что означает "ИСТИНА" там?
    --- Объединение сообщений, 5 апр 2014 ---
    Верно. Так, опсссс... конфа рукописная... с нуля... что надо сообщить по настройкам регистра, чтобы догадаться в чем дело?
    Последнее редактирование: 5 апр 2014
  8. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    Посмотреть можно в конструкторе запроса, зайдя в настройку параметров виртуальной таблицы:

    Параметры виртуальной таблицы.png
  9. TopicStarter Overlay
    ФинанСист
    Offline

    ФинанСист

    Регистрация:
    14 июл 2008
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Понял, это очень важно для меня! Спасибо за "приятность знания"! Давайте добъем запрос, плз!
    Что еще... Посмотрел, вид регистра ЛС - "Остатки"... Но ведь запрос -то работает, надо только условия как-то поставить....
  10. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    Да, я думаю, ничего там такого нет глобального.
    Сохраните базу в файл и прикрепите сюда. Я посмотрю и скажу, в чем проблема.
    Потому что тут, вроде, все просто...Не знаю, почему у Вас не работает оператор "В ИЕРАРХИИ".
    --- Объединение сообщений, 5 апр 2014 ---
    Давайте ))
    Базу только прикрепите, пожалуйста )
  11. TopicStarter Overlay
    ФинанСист
    Offline

    ФинанСист

    Регистрация:
    14 июл 2008
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Отлично! Она малюсенькая))) Счас.
    --- Объединение сообщений, 5 апр 2014 ---
    http://yadi.sk/d/-8lK1iUqLqwsj
    2,7 Мб... сюда не получилось. Встроенный "Отчет3"
  12. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    Дело в следующем.
    Действительно, оператор "В ИЕРАРХИИ" в данном конкретном случае не срабатывает.
    А не срабатывает он по той простой причине, что справочник НЕ иерархический.
    Честно говоря, я сам не знал о такой особенности )) Как-то не подумал, что этот оператор привычным образом работает только с иерархическими справочниками... хотя название оператора на это намекает :).

    Ну тогда для решения задачи стоит прибегнуть к наиболее классическому варианту - формировать текст запроса по условию. Т.е. если поле заполнено, вставляете в текст запроса условие, если не заполнено, - не вставляете:

    Код:
    Если ЗначениеЗаполнено(СсылкаЛС) Тогда
        УсловиеЛицевойСчет = "ЛС = &СЛС";
    Иначе
        УсловиеЛицевойСчет = "";
    КонецЕсли;
     
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    РегистрЛСОстаткиИОбороты.ЛС
    |ИЗ
    |    РегистрНакопления.РегистрЛС.ОстаткиИОбороты(&НачПериода, &КонПериода,,," + УсловиеЛицевойСчет + ") КАК РегистрЛСОстаткиИОбороты";
    А оператор "ВЫБОР КОГДА ТОГДА ......" тут, насколько знаю, не поможет.
    --- Объединение сообщений, 5 апр 2014 ---
    Ну или просто сделайте справочник иерархическим.
    Тогда оператор "В ИЕРАРХИИ" отлично сработает ))
    Последнее редактирование: 5 апр 2014
    ФинанСист нравится это.
  13. TopicStarter Overlay
    ФинанСист
    Offline

    ФинанСист

    Регистрация:
    14 июл 2008
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    перекушу... 5 мин))) переварю, в любом случае напишу благодарность!!
  14. TopicStarter Overlay
    ФинанСист
    Offline

    ФинанСист

    Регистрация:
    14 июл 2008
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Все ОК! Сделал оба справочника иерархическими и через И добавил в запрос. Без вашей помощи, думаю, еще бы день проковырялся бы.... Спасибо! Ищу кнопочку "баллы"...
  15. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    Не за что )

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