При обновлении расширений или доработке конфигураций на платформе 1С:Предприятие 8.3 часто возникают ситуации, когда привычный код из предыдущих версий перестает работать. Одной из частых проблем при переходе с УТ 11.4 на УТ 11.5 является ошибка: «Нельзя задавать параметры для таблицы...». Давайте разберем, почему это происходит и как правильно писать запросы к современным регистрам.
Для начала проанализируем, почему 1С выдает такую ошибку. В языке запросов 1С существует фундаментальное различие между двумя типами таблиц:
Остатки() или Обороты() у регистров накопления. Для них допустим синтаксис с параметрами в скобках, например: РегистрНакопления.СвободныеОстатки.Остатки(&Период, ).ГДЕ.Проблема автора заключалась в том, что в УТ 11.5 регистр РаспределениеЗапасов является обычной физической таблицей. Попытка обратиться к нему через РегистрСведений.РаспределениеЗапасов(, Номенклатура=&Номенклатура) приводит к ошибке, так как платформа ждет обращения к виртуальной таблице, которой у этого регистра не существует.
Если нам нужно отфильтровать записи физической таблицы, мы должны перенести условие в секцию ГДЕ. Рассмотрим на примере, как корректно составить такой запрос. Допустим, мы хотим получить данные по определенной номенклатуре и конкретному состоянию записи.
Правильный синтаксис запроса будет выглядеть следующим образом:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ИнформацияОДоступности.Номенклатура КАК Номенклатура,
ИнформацияОДоступности.Характеристика КАК Характеристика,
ИнформацияОДоступности.Склад КАК Склад,
ИнформацияОДоступности.Свободно КАК Свободно,
ИнформацияОДоступности.Резерв КАК Резерв,
ИнформацияОДоступности.ВНаличии КАК ВНаличии,
РазмещениеНоменклатурыПоСкладскимЯчейкам.Ячейка КАК Ячейка
ИЗ
РегистрСведений.РаспределениеЗапасов КАК ИнформацияОДоступности
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РазмещениеНоменклатурыПоСкладскимЯчейкам КАК РазмещениеНоменклатурыПоСкладскимЯчейкам
ПО ИнформацияОДоступности.Номенклатура = РазмещениеНоменклатурыПоСкладскимЯчейкам.Номенклатура
И ИнформацияОДоступности.Склад = РазмещениеНоменклатурыПоСкладскимЯчейкам.Склад
И РазмещениеНоменклатурыПоСкладскимЯчейкам.ОсновнаяЯчейка = ИСТИНА
ГДЕ
ИнформацияОДоступности.Номенклатура = &Номенклатура
И ИнформацияОДоступности.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОстатокНаСкладе)
Разберем основные моменты, которые помогут вам избежать синтаксических ошибок в будущем:
ГДЕ должна идти строго после всех СОЕДИНЕНИЙ. Если вы разместите ГДЕ перед ЛЕВОЕ СОЕДИНЕНИЕ, платформа выдаст ошибку «Синтаксическая ошибка: ЛЕВОЕ».В версии 11.4 активно использовался РегистрНакопления.СвободныеОстатки, который предоставлял виртуальную таблицу Остатки. В 11.5 этот регистр был удален, а его функции взяли на себя другие механизмы. Ошибка возникает не из-за того, что изменились правила языка, а из-за того, что изменилась сама структура объектов метаданных. Переходя на новые версии, будьте готовы к тому, что логика обращения к данным через виртуальные таблицы может потребовать пересмотра, если объект был заменен на физический регистр сведений.
Надеемся, что теперь при возникновении подобных ошибок вы сможете быстро определить тип таблицы и корректно перенести условия фильтрации в нужную секцию запроса!