С подобной ошибкой любой разработчик встречался хотя бы один раз. Ее непосредственная причина – попытка запроса использовать параметр, который в запрос не был помещен.
Почему так происходит? Код постоянно меняется, текст запросов, параметры могут переименовываться, добавляться, удаляться, но в ходе работы формируются различные приемы и методики, позволяющие данную проблему нивелировать.
При инициализации запроса, параметры необходимо указывать до текста запроса. Таким образом, еще до чтения текста, вы объявляете параметры, с которым необходимо работать. Также это позволяет улучшить самоконтроль – сначала определяем параметр, а потом его используем.
Бывают ситуации, когда параметры в зависимости от различных условий не нужны.
Самое простое решение – это использовать дополнительный параметр с типом Булево, определяющий необходимость использования основного параметра.
Функция ЗапросОстатковПоСкладу(Дата, Организация = Неопределено)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаОстатков", Дата);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ОтборПоОрганизации", Организация Неопределено);
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Организация,
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладе.Остатки(
| &ДатаОстатков,
| НЕ &ОтборПоОрганизации
| ИЛИ Организация = &Организация) КАК
Остатки"
;
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса;
КонецФункции
Такой запрос не вполне оптимален с точки зрения быстродействия (из-за конструкции ИЛИ в условии отбора), но если потери быстродействия терпимы, то ими можно пренебречь.
Более технологичным решением может быть использование возможностей компоновщика. Для простых случаев подойдет построитель запроса. Вы можете инициализировать запрос построителем, а параметры добавлять динамически.
Функция ЗапросОстатковПоСкладу(Дата, Организация = Неопределено)
ТекстЗапроса =
"ВЫБРАТЬ"
| Остатки.Организация,
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладе.Остатки(&ДатаОстатков, ) КАК
Остатки"
Построитель = Новый ПостроительЗапроса(пТекстЗапроса);
Построитель.ЗаполнитьНастройки();
Если Организация <> Неопределено Тогда
ЭлементОтбора = Построитель.Отбор.Добавить("Организация", "Организация");
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.Значение = Организация;
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
Запрос = Построитель.ПолучитьЗапрос();
Иначе
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
КонецЕсли;
Запрос.УстановитьПараметр("ДатаОстатков", Дата);
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса;
КонецФункции
Данный код приведен в качестве примера и скомпонован с целью повышения наглядности. Рекомендуется не использовать его в чистом виде, а реализовать в виде полноценного инструмента по динамической работе с отборами в запросе.
ВЫБРАТЬ
КурсыВалют.Валюты,
КурсыВалют.КурсПродажи,
КурсыВалют.КурсКонвертации,
КурсыВалют.КурсПокупки,
КурсыВалют.КурсМагазинов,
КурсыВалют.КурсЦБ,
КурсыВалют.ПроцентКурсаПокупки,
КурсыВалют.ПроцентКурсаПродажи,
КурсыВалют.ПроцентКурсаКонвертации,
КурсыВалют.Период
ИЗ
РегистрСведений.Валюты КАК КурсыВалют
ГДЕ
(КурсыВалют.Период >= &НачалоПериода) И
(КурсыВалют.Период <= &ОкончаниеПериода)
ВЫБРАТЬ
КурсыВалют.Валюты,
КурсыВалют.КурсПродажи,
КурсыВалют.КурсКонвертации,
КурсыВалют.КурсПокупки,
КурсыВалют.КурсМагазинов,
КурсыВалют.КурсЦБ,
КурсыВалют.ПроцентКурсаПокупки,
КурсыВалют.ПроцентКурсаПродажи,
КурсыВалют.ПроцентКурсаКонвертации,
КурсыВалют.Период
ИЗ
РегистрСведений.Валюты КАК КурсыВалют
{ГДЕ
(КурсыВалют.Период >= &НачалоПериода),
(КурсыВалют.Период <= &ОкончаниеПериода)}
Результат:
Ошибка исполнения отчета
по причине:
Ошибка получения данных
по причине:
Ошибка создания набора данных «НаборДанных1»
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(16, 23)}: Не задано значение параметра «НачалоПериода»
КурсыВалют.Период >= <<?>>&НачалоПериода
Результат:
Корректная отработка отчета
СКД: если не задано значение параметра-даты |
Я |
05.12.13 — 11:30
Простым запросом отбираются движения за определенный период &НачалоПериода и &КонецПериода.
Если значения этих параметров не задали в настройках, нужно, чтобы брались все движения.
Как это сделать?
СКД ругается:
Ошибка компоновки данных
по причине:
Ошибка получения данных
по причине:
Ошибка создания набора данных «Запрос»
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(xx, xx)}: Не задано значение параметра «НачалоПериода»
1 — 05.12.13 — 11:38
закладка Компоновка в конструкторе запроса
2 — 05.12.13 — 11:39
+(1) ну или в фигурные скобки возьми
3 — 05.12.13 — 11:40
(0) {&НачалоПериода} , {&КонецПериода}
4 — 05.12.13 — 11:49
(0) Так ругается, кажись, только если галка использования у параметра не стоит. Так что для начала задай для параметров режим использования «Всегда». После этого отчет должен формироваться без ошибок, но пустой. И лучше, честно говоря, на этом и остановиться.
Но если ты настаиваешь, то создай доп-параметр, который будет в отчете будет вместо пустой даты конца периода брать текущую дату, например, и используй его в запросах.
5 — 05.12.13 — 11:52
(4) Иногда лучше жевать…
6 — 05.12.13 — 11:53
на последних релизах 8.2 замечал, что параметры можно и не задавать и скд их нормально воспринимает…
7 — 05.12.13 — 11:59
ВЫБРАТЬ
ТоварыНаСкладахОбороты.Склад,
ТоварыНаСкладахОбороты.КоличествоОборот,
ТоварыНаСкладахОбороты.КоличествоПриход,
ТоварыНаСкладахОбороты.КоличествоРасход
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты({(&НачалоПериода)}, {(&ОкончаниеПериода)}, , ) КАК ТоварыНаСкладахОбороты
8 — 05.12.13 — 12:02
Добавил {…}:
ВЫБРАТЬ МойРегистрОстаткиИОбороты.измерение1 КАК Измерение1, МойРегистрОстаткиИОбороты.Измерение2 КАК Измерение2, МойРегистрОстаткиИОбороты.Период КАК ПериодМесяц, МойРегистрОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток, МойРегистрОстаткиИОбороты.СуммаПриход КАК СуммаПриход, МойРегистрОстаткиИОбороты.СуммаРасход КАК СуммаРасход, МойРегистрОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток {ВЫБРАТЬ Измерение1.*, Измерение2, ПериодМесяц, СуммаНачальныйОстаток, СуммаПриход, СуммаРасход, СуммаКонечныйОстаток} ИЗ РегистрНакопления.МойРегистр.ОстаткиИОбороты(, , Месяц, , {(Измерение1).* КАК Измерение1, (Измерение2) КАК Измерение2, (Измерение3).* КАК Измерение3, (Измерение3.Дата >= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)) КАК НачалоПериода, (Измерение3.Дата <= КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)) КАК КонецПериода}) КАК МойРегистрОстаткиИОбороты
Теперь параметры вообще игнорируются (
Измерение3 — это ссылка на документ (не регистратор).
9 — 05.12.13 — 12:03
help!
10 — 05.12.13 — 12:04
у тебя нет параметров, (, , Месяц — тут пусто
11 — 05.12.13 — 12:05
(8) не там добавил
12 — 05.12.13 — 12:06
Мне надо отбор именно по датам документов из измерения3.
13 — 05.12.13 — 12:07
(5) А иногда — говорить
14 — 05.12.13 — 12:10
(13) Не в твоем случае. В первых постах были нормальные советы. В твоем — нет.
15 — 05.12.13 — 12:12
(12) может регистр не правильно спроектирован?
16 — 05.12.13 — 12:18
(14) В первых постах — советы бесполезные. &НачалоПериода и &КонецПериода — и так автоматом генерятся как дефолтовые параметры СКД для периодов виртуальных таблиц.
17 — 05.12.13 — 12:19
Разве что он автозаполнение отключил…
18 — 05.12.13 — 12:19
(15) Есть документы, в табличных частях которых указываются некоторые показатели на определенные месяцы года, на весь год.
Эти показатели пишутся в регистр на месяцы из ТЧ (делают приход и расход).
По этим данным строится другой отчет — там всё Ок.
Это что-то типа планирования бюджета на год.
Последующие документы как бы корректируют данные других документов.
Теперь понадобилось отбирать движения еще и по датам документов, которые создают эти движения…
Т.е., как было запланировано на дату этого документа, как потом изменилась картина после этого документа и т.д.
19 — 05.12.13 — 12:21
(17)(14) по (8)(18) подскажите, что-нибудь.
20 — 05.12.13 — 12:22
(19) см (7) что еще надо
21 — 05.12.13 — 12:24
(20) Этот вариант мне не подходит.
22 — 05.12.13 — 12:25
(21) почему?
23 — 05.12.13 — 12:29
(22) Нужен отбор по датам документов, которые содержатся в измерении, не по датам регистратора.
24 — 05.12.13 — 12:29
ВЫБРАТЬ
ТоварыНаСкладахОбороты.Склад,
ТоварыНаСкладахОбороты.КоличествоОборот,
ТоварыНаСкладахОбороты.КоличествоПриход,
ТоварыНаСкладахОбороты.КоличествоРасход
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(, , , {(Измерение3.Дата > НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)}) КАК ТоварыНаСкладахОбороты
25 — 05.12.13 — 12:30
(23) Точнее, не по датам движений, а по датам документов из измерения.
26 — 05.12.13 — 12:30
(24) Я так и сделал. См. (8) Теперь параметры игнорируются вообще.
27 — 05.12.13 — 12:30
(25) ну вот это что за бред?
(Измерение3.Дата >= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)) КАК НачалоПериода
то есть у вас булево значение в НАчалоПериода присваивается?
28 — 05.12.13 — 12:34
(21) запрос покажи
xaozai
29 — 05.12.13 — 12:37
(27) О! Супер! Убрал в (8) «КАК НачалоПериода» и «КАК КонецПериода» — заработало как нужно )
Спасибо!
Вы здесь
Значение параметра не задано
Опубликовано ср, 18/09/2013 — 20:51 пользователем mak118
Добрый день! Помоги пожалуйста, я в этом новичок
Формирую в запросе ЗаказПокупателя во вложенном запросе
ВЫБРАТЬ
| ЗаказПокупателяТовары.Номенклатура,
| ТиповойОстатки.КоличествоОстаток
|ИЗ
| Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Типовой.Остатки(, Счет = &Счет1330, , ) КАК ТиповойОстатки
| ПО ЗаказПокупателяТовары.Номенклатура = ТиповойОстатки.Субконто1
|ГДЕ
| ЗаказПокупателяТовары.Ссылка = &ТекущийЗаказ
|
|СГРУППИРОВАТЬ ПО
| ЗаказПокупателяТовары.Номенклатура,
| ТиповойОстатки.КоличествоОстаток
В итоге выходит ошибка,
Не задано значение параметра Счет1330.
Что я делаю не так ?
-
Здрасьте всем.
Захожу в некоторые ШТАТНЫЕ отчеты и обработки, и пишется вот такая штука:
Ошибка при выполнении запроса.
по причине:
Ошибка получения данных
по причине:
Ошибка создания набора данных «НаборДанныхДинамическогоСписка»
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(25, 43)}: Не задано значение параметра «Характеристика»
И (НастройкаДляТовара.Характеристика = <<?>>&Характеристика)Началось это даже не помню с чего. То ли после обновления, то ли еще когда то.
Раньше такого не было.
Учет товаров в разрезе характеристик не ведем. Но, когда включают галку, на Характеристики Нмнкл, то ошибка не выдается, а если снять, то выдается.
Что делать и кто виноват?
Спасибо. -
Offline
mialord
Модераторы
Команда форума
Модератор- Регистрация:
- 31 июл 2009
- Сообщения:
- 5.460
- Симпатии:
- 53
- Баллы:
- 54
Добрый день!
Смотрите опцию программы, скорее всего включили учет по характеристикам и теперь запрос расширяется до учета харктеристик, отключите и будет всё нормально -
Дык я ж говорю, что наоборот, если в настройках включить работу с характеристиками, то ошибка не выдается. А если выключить, то выдается. При этом характеристики не используем в работе.
-
Offline
Konst82
Опытный в 1С- Регистрация:
- 29 авг 2014
- Сообщения:
- 67
- Симпатии:
- 4
- Баллы:
- 29
есть опция включения характеристик у вида номенклатуры и есть опция по всей программе (администрирование — настройка параметров системы — номенклатура). проверьте обе.
-
Вообщем, как пришло, так и ушло. Может быть после обновления. Или после очистки кэша, т.к. за этот период было и то, и другое.
Сейчас ошибки нет.