8.х Каким образом в тексте запроса вызывать функцию, которая написана в модуле?

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

  1. TopicStarter Overlay
    alex-79
    Offline

    alex-79 Опытный в 1С

    Регистрация:
    21 сен 2006
    Сообщения:
    643
    Симпатии:
    1
    Баллы:
    29
    Каким образом в 1C 8.0 в тексте запроса вызывать функцию, которая написана в модуле?
  2. AlexeyTiRe
    Offline

    AlexeyTiRe

    Регистрация:
    27 фев 2007
    Сообщения:
    44
    Симпатии:
    0
    Баллы:
    1
    Таких способов нет.
  3. coder1cv8
    Offline

    coder1cv8 Опытный в 1С

    Регистрация:
    30 авг 2007
    Сообщения:
    101
    Симпатии:
    0
    Баллы:
    26
    Хотелось бы узнать, зачем в запросе вызывать функции модуля?...
  4. TopicStarter Overlay
    alex-79
    Offline

    alex-79 Опытный в 1С

    Регистрация:
    21 сен 2006
    Сообщения:
    643
    Симпатии:
    1
    Баллы:
    29
    Просто в обработке нужно произвести поиск контрагентов по параметрам, которые задает пользователь. Допустим пользователь хочет найти контрагента по юридическому адресу. Он в форме обработки заполняет соответствующее поле ввода адресом для поиска и выполняет поиск. В процедуре поиска запускается запрос с перебором контрагентов. В регистре сведений "Контактная информация" адрес представлен ввиде строки и поэтому перед сравнением строки поля ввода с адресом и выбранным значением регистра сведений нужно удалить все лишние символы, типа пробелы, точки и т.д и превести значение адреса к верхнему регистру. Это делает функция которая написана в модуле. Такая же история и с поиском номера телефона, ИНН и т.д. В 1С7.7 можно было указывать функцию прямо в тексте запроса. Если в 8-ке нельзя сделать, то получается, что из запроса я получаю огромную таблицу значений и потом в цикле перебераю элементы. Или всё-таки от запроса отказаться в этом случае? :unsure: Подскажите как сделать оптимальнее?
  5. AlexeyTiRe
    Offline

    AlexeyTiRe

    Регистрация:
    27 фев 2007
    Сообщения:
    44
    Симпатии:
    0
    Баллы:
    1
    Поиск по строке с приведением к верхнему регистру... Ничего лучше, чем получение запросом полной таблицы со сведениями из регистра сведений, а потом поиск по ней, в голову не приходит.
  6. lazy
    Offline

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

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

    Mark768 Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    158
    Симпатии:
    1
    Баллы:
    29
    Я бы запросом выгружал в таблицу значений все необходимые данные из контрагентов, затем приводил необходимые поля к нужному виду (тут понятно, как использовать имеющиеся процедуры и функции), затем в этих полях осуществлял поиск и т.д.
  8. TopicStarter Overlay
    alex-79
    Offline

    alex-79 Опытный в 1С

    Регистрация:
    21 сен 2006
    Сообщения:
    643
    Симпатии:
    1
    Баллы:
    29
    Спасибо за советы. Я выполнил запрос и потом уже функциями обрабатывал таблицу значений с результатом запроса.
  9. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Это порочная практика, и показатель не опытного программиста на 8. Если у тебя справочник на несколько сотен тысяч элементов - умрешь пока дождешься выгрузки(хе-хе, если памяти машины хватит). Учите язык запросов - он только с виду страшный, зато когда в нем разберешься - отчеты получаются очень быстрыми, особенно для SQL варианта платформы...
  10. AlexeyTiRe
    Offline

    AlexeyTiRe

    Регистрация:
    27 фев 2007
    Сообщения:
    44
    Симпатии:
    0
    Баллы:
    1
    Запросы - конечно, штука мощная и быстрая. Но не все можно сделать в запросе, к сожалению. Это, по-моему, как раз тот случай.
  11. Mark768
    Offline

    Mark768 Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    158
    Симпатии:
    1
    Баллы:
    29
    Ну несколько сотен тысяч для справочника Контрагенты - это круто :unsure:. Если подобную операцию нужно производить со справочником при таком количестве, то я бы создал доп. поля в этом справочнике, которые бы автоматом заполнялись при записи элемента. А уже запросом бы ползал по этим полям...
  12. AlexeyTiRe
    Offline

    AlexeyTiRe

    Регистрация:
    27 фев 2007
    Сообщения:
    44
    Симпатии:
    0
    Баллы:
    1
    Здесь поиск не по справочнику, а по регистру сведений. Да и какие поля можно сделать для поиска по подстроке без учета регистра?
    Я скорее поверю, что можно сконструировать такой шаблон для фнкции "ПОДСТРОКА", с помощью которого этот поиск будет возможен.
  13. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Смейтесь, смейтесь я тоже когда то не понимал язык запросов - работал семерочными методами - через выборку... %-)
    Потом наловчился выгружать через запрос в ТЗ и ее обрабатывать, потом уже начал более активно работать с запросами.
    Вы идете стандартным путем самоучек и семерочников перешедших на 8.
    Ничего, созреете еще, вспомните мои слова... :)
  14. TopicStarter Overlay
    alex-79
    Offline

    alex-79 Опытный в 1С

    Регистрация:
    21 сен 2006
    Сообщения:
    643
    Симпатии:
    1
    Баллы:
    29
    Ответ lazy. У тебя сначала тратится время на выполнение запроса, а потом ты перебираешь элементы таблицы значений результата выполнения запроса. Временная задержка на выполнение всей задачи в целом будет больше. :unsure:
  15. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Вот поэтому и нужно знать язык запросов ;)
  16. AlexeyTiRe
    Offline

    AlexeyTiRe

    Регистрация:
    27 фев 2007
    Сообщения:
    44
    Симпатии:
    0
    Баллы:
    1
    Никто и не смеется. Я сам всегда стараюсь свести отчет к выполнению запроса и заполнению макета сразу из полей выборки (запросы, правда, получаются с большой кучей таблиц, 3-4 уровнями вложенности и размеров просто устрашающих, но оно того стоит). Просто есть такие случаи, которые в запросе никак нельзя разрулить.

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