Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не коректно виконується умова в запиті
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
mister-x
//====================
функция ПроверкаСтраны(Страна)
    
    возврат СписокСубконто.принадлежит(Страна);
    
конецфункции

//===========================
Процедура Сформировать()
....
        Запрос = создатьОбъект("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(п)
        |Обрабатывать НеПомеченныеНаУдаление;
        |Сотрудники = Справочник.Сотрудники.ТекущийЭлемент;
        |Страна = Справочник.Сотрудники.Страна; // чи так Страна = Справочник.Сотрудники.Страна.ТекущийЭлемент;
        |Группировка Сотрудники упорядочить по Сотрудники.Наименование;
        |Условие(ПроверкаСтраны(Страна)=1);
        |Условие(Сотрудники.этоГруппа()=0);
        |"//}}ЗАПРОС
;
....

СписокСубконто - список країн на формі, питання в тому, що у виборку попадають співробітники в яких Страна не заповнена взагалі. Чому?

ЗІ. наразі вирішив не оптимальним варіантом - перебором списку країн і довідника і порівнянням
Стрелок
1 страна может периодика?
2 СписокСубконто должен содержать страны? точно?
2. зачем писать внешнюю функцию если то же самое можно написать в запросе?

Условие(СписокСубконто.Принадлежит(Страна)=1);
mister-x
зробив так
СписСотрудники = создатьОбъект("СписокЗначений");

    Запрос = создатьОбъект("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(п)
        |Обрабатывать НеПомеченныеНаУдаление;
        |Сотрудники = Справочник.Сотрудники.ТекущийЭлемент;
        |Страна = Справочник.Сотрудники.Страна;
        |Группировка Сотрудники упорядочить по Сотрудники.Наименование;
        |Условие(СписокСубконто.принадлежит(Страна)=1);
        |Условие(Сотрудники.этоГруппа()=0);
        |"//}}ЗАПРОС
;
        если Запрос.Выполнить(ТекстЗапроса)=0 тогда
            сообщить("Запит не виконаний");
        конецесли;
        
        пока запрос.группировка(1)=1 цикл
            Сотрудник = Запрос.Сотрудники;
            если Сотрудник.выбран()= 0 тогда продолжить конецесли;
            
            если СписСотрудники.принадлежит(Сотрудник)=0 тогда
                СписСотрудники.добавитьЗначение(Сотрудник);        
            конецесли
        конеццикла;

результат не змінився, Страна - не періодичний реквізит

в список попадають всі співробітники, а має попасти один (тільки в нього наразі країна заповнена) - по методиці неоптимального варіанту все коректно працює

ось неоптимальний варіант - робочий
для к=1 по СписокСубконто.размерСписка() цикл 
        _страна = СписокСубконто.получитьЗначение(к);
        спрСотрудники = создатьОбъект("Справочник.Сотрудники");
        спрСотрудники.выбратьЭлементы();
        пока спрСотрудники.получитьЭлемент()=1 цикл
            если (спрСотрудники.ЭтоГруппа()=1)  или (спрСотрудники.пометкаУдаления()=1) тогда продолжить конецесли;
            
            если (спрСотрудники.Страна = _страна) и (СписСотрудники.принадлежит(спрСотрудники.текущийЭлемент())=0) тогда
                СписСотрудники.добавитьЗначение(спрСотрудники.текущийЭлемент());    
            конецесли    
        конеццикла    
    конеццикла;

Реліз платформи 27, хз може тут причина.
Zaval
Я б замість умови на групу використав "без групп" в рядку "Группировка".
А в другій умові - "Страна В &СписокСубконто"

Перевірте, що саме в тому "СписокСубконто" - це тип "СписокЗначений"? Як він формується? Якщо через ВидиСубконто і дозволено пусте - то чи не додається туди порожнє субконто?
alex040269
витяг з синтаксис-помічника:

Оператор языка запросов ''Условие (А в Б);'' говорит о том, что условие истинно, когда значение А является подмножеством значения Б. Следует особо отметить, что если значение Б пустое (объект не выбран), то условие является истинным, в отличие от оператора ''='' (равно)

тому пропоную додактокву умову
|Условие ПустоеЗначение(Страна) = 0

mister-x
Цитата(alex040269 @ 26.12.12, 14:57) необходимо зарегистрироваться для просмотра ссылки
Оператор языка запросов ''Условие (А в Б);''

тут його немає, є умова щодо приналежності списку на формі, вона в неоптимальному варіанті працює правильно
Цитата(Zaval @ 26.12.12, 14:57) необходимо зарегистрироваться для просмотра ссылки
А в другій умові - "Страна В &СписокСубконто"

тут 7.7, а не 8.х smile.gif
Цитата(Zaval @ 26.12.12, 14:57) необходимо зарегистрироваться для просмотра ссылки
Я б замість умови на групу використав "без групп" в рядку "Группировка".

дякую, добавлю
Zaval
Цитата(mister-x @ 26.12.12, 15:03) необходимо зарегистрироваться для просмотра ссылки
тут 7.7, а не 8.х smile.gif


smile.gif так, для 7.7 - без "&"
mister-x
так працює
Запрос = создатьОбъект("Запрос");
        ТекстЗапроса =
        "//{{ЗАПРОС(п)
        |Обрабатывать НеПомеченныеНаУдаление;
        |Сотрудники = Справочник.Сотрудники.ТекущийЭлемент;
        |Страна = Справочник.Сотрудники.Страна;
        |Группировка Сотрудники упорядочить по Сотрудники.Наименование без групп;
        |Условие((Страна в СписокСубконто) и (ПустоеЗначение(Страна) = 0));     
        |"//}}ЗАПРОС
    ;

отже, надалі на замітку метод для списку значень Принадлежит в запиті працює як оператор В


всім дякую
XBrut
Коли щось уже зовсім мутне, вивожу результат умови у вікно повідомлень

функция ПроверкаСтраны(Страна)
    
    Результат = СписокСубконто.принадлежит(Страна);
    Сообщить(Результат);
    Возврат Результат;
    
конецфункции

P.S.
доречно завжди використовувати оператор " В ", крім випадків, коли він , (падло) , не працює. (див. вашу ж тему про глюки) smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.