Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Не срабатывает Запрос.УстановитьПараметр()

Не срабатывает Запрос.УстановитьПараметр()
Я
   ras27
 
26.06.20 - 05:47
Что-то туплю - что такое Запрос.Параметры? Это список переменных в тексте Запроса или результат выполнения Запрос.УстановитьПараметр() ?
Короче - есть модуль, там текст Запроса формируется программно, в цикле добавляется кусок текста и выполняется Запрос.УстановитьПараметр().
Так вот после цикла Запрос.Параметры - пустой (нет ни одного элемента). После цикла Текст помещается в Запрос.Текст и еще выполняется
Запрос.УстановитьПараметр(), так вот этот параметр в списке Запрос.Параметры появляется. Соответственно при попытке выполнить Запрос - ошибка
"значения параметра не задано" - для тех параметров которые устанавливались в цикле.
Самое интересное - модуль не мой - из стандартной не измененной конфигурации. Затыкается на этой ошибке.
   ras27
 
1 - 26.06.20 - 05:51
Если нужно :
Управление торговлей, редакция 11 (11.4.6.200)
1С:Предприятие 8.3 (8.3.16.1224)
   Провинциальный 1сник
 
2 - 26.06.20 - 06:21
Устанавливай параметры после того, как полностью сформирован "Запрос.Текст". Установка параметров в запросе с изменяющимся текстом недокументирована и может вести себя непредсказуемо.
   ДенисЧ
 
3 - 26.06.20 - 06:24
(2) Фигня. Параметры можно установить запросу даже тогда, когда у него текста ещё нет вооще
(0) Доставай и показывай.
   sitex
 
4 - 26.06.20 - 07:21
(0) Отладчиком глянь до выполнения запроса что в параметрах. Делов то.
   ras27
 
5 - 26.06.20 - 08:15
(2) не охота включать режим изменения для конфигурации - потом обновляться долго будет.
кусок модуля - см ниже
   ras27
 
6 - 26.06.20 - 08:15
Запрос = Новый Запрос;
    ТекстЗапроса = "";
    СчетчикПараметров = 1;
    Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл
        Если ПланОбмена.Реквизиты.Найти("ДатаНачалаВыгрузкиДокументов") = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда
            ТекстЗапроса = ТекстЗапроса + "ОБЪЕДИНИТЬ ВСЕ
            |";
        КонецЕсли;
        ТекстЗапроса = ТекстЗапроса + "
            |ВЫБРАТЬ
            |    Ссылка,
            |    ПометкаУдаления
            |" + ?(СчетчикПараметров = 1, "ПОМЕСТИТЬ УзлыОбмена","") + "
            |ИЗ
            |    ПланОбмена." + ПланОбмена.Имя + "
            |ГДЕ
            |    Ссылка <> &ЭтотУзел"+СчетчикПараметров+"
            |    И ДатаНачалаВыгрузкиДокументов <= &ДатаСвертки
            |";
        Запрос.УстановитьПараметр("&ЭтотУзел"+СчетчикПараметров, ПланыОбмена[ПланОбмена.Имя].ЭтотУзел());
        СчетчикПараметров = СчетчикПараметров + 1;
    КонецЦикла;
    Запрос.Текст = ТекстЗапроса;

    Запрос.УстановитьПараметр("ДатаСвертки", Объект.ДатаСверткиИБ);
    
    ВыборкаУзлов = Запрос.Выполнить().Выбрать();
   ras27
 
7 - 26.06.20 - 08:19
Отладчиком лазил - самое интересное на 
Запрос.УстановитьПараметр("&ЭтотУзел"+СчетчикПараметров, ПланыОбмена[ПланОбмена.Имя].ЭтотУзел());
и до него Запрос.Параметры пусто и сразу ПОСЛЕ него тоже пусто. Т.е. ничего не добавляет но и ошибок не выдает.
Там кстати добавляется пустая ссылка, но все равно должен же добавить параметр хоть пустой.
   maip1
 
8 - 26.06.20 - 08:23
(7) & не надо
Запрос.УстановитьПараметр("ЭтотУзел"+СчетчикПараметров, ПланыОбмена[ПланОбмена.Имя].ЭтотУзел());
   ras27
 
9 - 26.06.20 - 08:28
"&ЭтотУзел" ? - нет не надо, параметр устанавливается по имени, это внутри запроса уже "&ЭтотУзел"
Ниже есть
Запрос.УстановитьПараметр("ДатаСвертки", Объект.ДатаСверткиИБ);
и вот это работает нормально - параметр добавляется.

Может глюк релиза платформы. Плохо не могу базу взять на другой комп - очень большая, пишет "ограничение размера внутреннего файла"
   ДенисЧ
 
10 - 26.06.20 - 09:02
(9) Так поменяй формат файла базы...
Или просто скопируй, зачем выгрузку делать?
   ras27
 
11 - 26.06.20 - 09:04
База на сервере SQL, как я ее скопирую ? И как поменять формат? На файловый? Выгружается нормально в dt, а вот при загрузке в файловую
начинает грузить а потом пишет про ограничение размера внутреннего файла.
   fisher
 
12 - 26.06.20 - 09:06
(2) Чушь. Недокументировано то, что порядок применения УстановитьПараметр имеет значение. Со своей колокольни я убежден что никакого значения это в принципе иметь не может. Это просто заполнение коллекции, которая анализируется только при начале исполнения запроса. Уже очень давно практикую "предварительную" установку параметров, так как такой стиль мне кажется более читабельным.
   ДенисЧ
 
13 - 26.06.20 - 09:07
(11) backup database
   ДенисЧ
 
14 - 26.06.20 - 09:08
(11) Поставь себе локально скуль-сервер
   Провинциальный 1сник
 
15 - 26.06.20 - 09:20
(12) Нигде не документировано, что параметры это просто коллекция, значения из которой подставляются в запрос на этапе его выполнения. Это кажется очевидным, но 1с может подножку подставить..
   fisher
 
16 - 26.06.20 - 09:32
(15) Мы расходимся в трактовке термина "недокументировано". Лично я использую метод УстановитьПараметр() в полном соответствии с документацией.
   Провинциальный 1сник
 
17 - 26.06.20 - 10:23
(16) В документации не прописано, в какой момент можно устанавливать параметр. Поэтому наиболее логично рассчитывать на худшее и устанавливать его как можно позже)
   RomanYS
 
18 - 26.06.20 - 10:32
(17) что за бред.
Параметры это обычная структура, никаких упоминаний об автоматическом сбросе/заполнении/перезаполнении нигде нет. У тебя другая документация?
   acht
 
19 - 26.06.20 - 10:37
(17) Если правильно использовать твою логику, то так как в документации не написано в какой точно момент устанавливать параметры, то устанавливать их нельзя вообще.
   Михаил Козлов
 
20 - 26.06.20 - 11:06
(17) В типовых полно мест, где параметры устанавливаются до формирования текста запроса.
   fisher
 
21 - 26.06.20 - 11:52
(20) И так легче читать код. Выполнение запроса можно сравнить с вызовом функции, а параметры запроса - с параметрами функции. Пролистывать тело функции чтобы добраться до входящих параметров - неудобно.
   Ёпрст
 
22 - 26.06.20 - 12:28
(6)

>>>>>>>Запрос.УстановитьПараметр("&ЭтотУзел"+СчетчикПараметров, ПланыОбмена[ПланОбмена.Имя].ЭтотУзел());
говорилb ужо , не ? Лень читать, &  выкинь отсюда
   1Сергей
 
23 - 26.06.20 - 13:16
(6) это типовой код? Расстрелять!
   ras27
 
24 - 02.07.20 - 06:29
Да похоже ошибка была 
     Запрос.УстановитьПараметр("&ЭтотУзел"+СчетчикПараметров, ПланыОбмена[ПланОбмена.Имя].ЭтотУзел());
а нужно бкз "&"
     Запрос.УстановитьПараметр("ЭтотУзел"+СчетчикПараметров, ПланыОбмена[ПланОбмена.Имя].ЭтотУзел());

Это типовой код - мало того накатывал 4 обновления и проверял - ошибка оставалась.
Короче решил - сделал РасширениеКонфигурации - там подправил - все заработало.

Авторитет 1С сильно упал в моих глазах. :)


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.