|
Не срабатывает Запрос.УстановитьПараметр() | ☑ | ||
---|---|---|---|---|
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С сильно упал в моих глазах. :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |