7.7 Обход справоничка

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем igorekkrav, 25 фев 2011.

  1. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Разумеется. Запрос делается с учетом фильтра. Потом результат выгружается в ТаблицуЗначений и там уже идет анализ. Будет НАМНОГО быстрее чем простым перебором
  2. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Согласен с Бухгалтерский угодник. Можно только ВыбратьЭлементы() заменить указанным запросом. А дальше перебор элементов из запроса. Методика сравнения такая же, как и при выборке элементов справочника.
  3. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Понял , спасибо. Пошел дальше ковырять:(
  4. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    А вот тут не согласен. Не всегда запрос работает быстрее простого перебора. AFAIK, при выборке данные выбираются частями, а запрос отбирает все сразу. И если, как в данном случае, сначала отобрать данные, а потом их перебирать то НАМНОГО не получиться.
  5. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Все зависит от объема справочника и грамтно составленного запроса (группировки). Конечно если в справочнике 20-30 элементов разница не велика. А если 10000?
  6. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Думаю будет в сторону 10000 :)
    Эх вроде такое простое задание , а оказывается столько камней подводных:)
  7. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Про грамотно составленный запрос согласен. Если запрос с условием - тоже согласен.
    А вот про количество элементов нет. При выборе всех элементов на 20-30 элементах выборка будет не быстрее запроса, а вот при увеличении количества элементов запрос будет проигрывать выборке в скорости все больше и больше.

    P.S. Из личного опыта.
  8. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    А можно ли при обходе элементов справочника задать период в отчете ? В запросе понятно как , а тут не знаю.
  9. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Период чего? При выборе элементов справочника в запросе он не нужен, если нет периодических реквизитов.
  10. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Нет просто в Выборке

    Код:
    Спр.ВыбратьЭлементы(); 
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
    ДатаК = Спр.ДатаКонтакта;  
    ДатаП = Спр.ДатаКонтакта1;
    
    

    Могу я ограничить ДатаК и ДатаП ? в форме отчет задать ограничения .
  11. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Зачем? Задавайте ограничения в фильтрах запроса!
    В выборке фильтр задать можно только по КОНКРЕТНОМУ значению (больше/меньше/интервал не прокатит)
  12. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Можно. Это условие через Если.
    Но при условии уже лучше использовать запрос. Тем более я недосмотрел в прошлый раз:
    Код:
    Условие(Менеджер в ВыбМенеджер);
    
  13. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Чего то я запутался.
    Есть справочник (могу получить данные выборкой могу запросом). В выборке могу обработать так как мне его надо в запросе так не получается.
    В итоге понял что нужно получить данные из справочника запросом, потом поместить их таблицу значений .
    И обойти её выборкой ?Или отдельно получить значения выборкой и сравнить данные табличных значений выборки и запроса?

    P.S. Извиняюсь если пишу какие-то глупости , опыта не хватает очень сильно
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Да. Просто циклом по строкам ТЗ.
    Код:
    ТЗЗапроса.ВыбратьСтроки();
    Пока ТЗЗапроса.ПолучитьСтроку()=1 Цикл
    //делаем то что нужно
    КонецЦикла;
    
    
  15. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Все понял!


    :angry:
  16. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    Код:
         ПредЭлемент = "";
    ТекЭлемент = "";
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("Компания");
    ТЗ.НоваяКолонка("Менеджер"); 
    ТЗ.НоваяКолонка("ДатаКонтакта"); 
    ТЗ.НоваяКолонка("ДатаСЛКонтакта"); 
    
    
    Пока Запрос.Группировка(1) = 1 Цикл
    ТЗ.НоваяСтрока();
    ТЗ.Компания = Запрос.Владелец;
    ТЗ.Менеджер = Запрос.Менеджер; 
    ТЗ.ДатаКонтакта = Запрос.ДатаКонтакта;
    ТЗ.ДатаСлКонтакта = Запрос.ДатаКонтакта1; 
    КонецЦикла;
    
    
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
    ТекЭлемент = ТЗ.ТекущаяСтрока();
    Если ПустоеЗначение(ПредЭлемент)  = 0 Тогда
    Если  ТекЭлемент.ТЗ.ДатаКонтакта <> ПредЭлемент.ТЗ.ДатаСлКонтакта   Тогда  
    Сообщить (""+ПредЭлемент+"");
    КонецЕсли; 
    ПредЭлемент = ТЗ.ТекущаяСтрока(); 
    КонецЕсли;
    КонецЦикла;
    
    
    
    В итоге застрял на этом. Так же как с выборкой в справочнике не получается сравнить. Там был ТекущийЭлемент , тут поставил ТекущаяСтрока но видимо не правильно. Напомню пытаюсь сравнить элементы справочника (ДатаКонтакта) и следующую строку (ДатаСлКонтакта)
  17. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    1. Таблицу значений можно получить просто выгрузив запрос не перебирая его:
    Код:
    Запрос.Выгрузить(ТЗ);
    
    
    2. Через текущую строку не обратитесь. Есть два варианта: либо через ТЗ.ТекущийЭлемент, либо через переменные ПредДатаКонтакта и ПредДатаКонтакта1, куда будете сохранять значения предыдущего элемента.
    Хотя есть еще 3-ий вариант через ПолучитьЗначение():
    Код:
    ПредДатаКонтакта = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки - 1, "ДатаКонтакта");
    ПредДатаКонтакта1 = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки - 1, "ДатаКонтакта1");
    
    Проверку только на первую строку надо добавить.
  18. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Как-то так:
    Код:
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
    Если ТЗ.НомерСтроки  > 1 Тогда
    Если  ТЗ.ДатаКонтакта <> ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки - 1, "ДатаКонтакта1")   Тогда  
    Сообщить (""+ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки - 1, "ТекущийЭлемент")+"");
    КонецЕсли; 
    КонецЕсли;
    КонецЦикла;
    
  19. TopicStarter Overlay
    igorekkrav
    Offline

    igorekkrav Опытный в 1С

    Регистрация:
    29 апр 2010
    Сообщения:
    223
    Симпатии:
    0
    Баллы:
    26
    2. Через текущую строку не обратитесь. Есть два варианта: либо через ТЗ.ТекущийЭлемент, либо через переменные ПредДатаКонтакта и ПредДатаКонтакта1, куда будете сохранять значения предыдущего элемента.

    Через текущий пишет ошибку:

    ТекЭлемент = ТЗ.ТекущийЭлемент();
    {Отчет.Планирование.Форма.Модуль(104)}: Поле агрегатного объекта не обнаружено (ТекущийЭлемент)
  20. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Скобки не надо. ТекущийЭлемент это (из запроса):
    Код:
    "ТекущийЭлемент = Справочник.ХКК.ТекущийЭлемент;"
    
    
    P.S. Хотя через ПолучитьЗначение() мне больше нравиться - кода меньше, да и переменных лишних не надо.

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