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

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

Запрос.УстановитьПараметр("ЭтотУзел"+СчетчикПараметров, ПланыОбмена[ПланОбмена.Имя].ЭтотУзел());
9 ras27
 
26.06.20
08:28
"&ЭтотУзел" ? - нет не надо, параметр устанавливается по имени, это внутри запроса уже "&ЭтотУзел"
Ниже есть
Запрос.УстановитьПараметр("ДатаСвертки", Объект.ДатаСверткиИБ);
и вот это работает нормально - параметр добавляется.

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

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

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

Авторитет 1С сильно упал в моих глазах. :)
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший