Почему возникает ошибка «Нельзя задавать параметры для таблицы» при обращении к регистру сведений в 1С:Управление торговлей 11.5?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При обновлении расширений или доработке конфигураций на платформе 1С:Предприятие 8.3 часто возникают ситуации, когда привычный код из предыдущих версий перестает работать. Одной из частых проблем при переходе с УТ 11.4 на УТ 11.5 является ошибка: «Нельзя задавать параметры для таблицы...». Давайте разберем, почему это происходит и как правильно писать запросы к современным регистрам.

Суть проблемы: физические и виртуальные таблицы

Для начала проанализируем, почему 1С выдает такую ошибку. В языке запросов 1С существует фундаментальное различие между двумя типами таблиц:

  1. Виртуальные таблицы: Это таблицы, которые платформа вычисляет «на лету». Примеры таких таблиц — Остатки() или Обороты() у регистров накопления. Для них допустим синтаксис с параметрами в скобках, например: РегистрНакопления.СвободныеОстатки.Остатки(&Период, ).
  2. Физические таблицы: Это прямые таблицы базы данных, в которых хранятся записи. Для них нельзя задавать параметры в скобках, так как платформа не умеет «рассчитывать» их содержимое через параметры запроса. Любая фильтрация записей в таких таблицах должна происходить в блоке ГДЕ.

Проблема автора заключалась в том, что в УТ 11.5 регистр РаспределениеЗапасов является обычной физической таблицей. Попытка обратиться к нему через РегистрСведений.РаспределениеЗапасов(, Номенклатура=&Номенклатура) приводит к ошибке, так как платформа ждет обращения к виртуальной таблице, которой у этого регистра не существует.

Как правильно задать фильтрацию для физического регистра

Если нам нужно отфильтровать записи физической таблицы, мы должны перенести условие в секцию ГДЕ. Рассмотрим на примере, как корректно составить такой запрос. Допустим, мы хотим получить данные по определенной номенклатуре и конкретному состоянию записи.

Правильный синтаксис запроса будет выглядеть следующим образом:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ИнформацияОДоступности.Номенклатура КАК Номенклатура,
    ИнформацияОДоступности.Характеристика КАК Характеристика,
    ИнформацияОДоступности.Склад КАК Склад,
    ИнформацияОДоступности.Свободно КАК Свободно,
    ИнформацияОДоступности.Резерв КАК Резерв,
    ИнформацияОДоступности.ВНаличии КАК ВНаличии,
    РазмещениеНоменклатурыПоСкладскимЯчейкам.Ячейка КАК Ячейка
ИЗ
    РегистрСведений.РаспределениеЗапасов КАК ИнформацияОДоступности
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РазмещениеНоменклатурыПоСкладскимЯчейкам КАК РазмещениеНоменклатурыПоСкладскимЯчейкам
        ПО ИнформацияОДоступности.Номенклатура = РазмещениеНоменклатурыПоСкладскимЯчейкам.Номенклатура
            И ИнформацияОДоступности.Склад = РазмещениеНоменклатурыПоСкладскимЯчейкам.Склад
            И РазмещениеНоменклатурыПоСкладскимЯчейкам.ОсновнаяЯчейка = ИСТИНА
ГДЕ
    ИнформацияОДоступности.Номенклатура = &Номенклатура
    И ИнформацияОДоступности.Состояние = ЗНАЧЕНИЕ(Перечисление.РаспределениеЗапасовСостояния.ОстатокНаСкладе)

Важные правила при составлении запросов

Разберем основные моменты, которые помогут вам избежать синтаксических ошибок в будущем:

Почему код из 11.4 перестал работать?

В версии 11.4 активно использовался РегистрНакопления.СвободныеОстатки, который предоставлял виртуальную таблицу Остатки. В 11.5 этот регистр был удален, а его функции взяли на себя другие механизмы. Ошибка возникает не из-за того, что изменились правила языка, а из-за того, что изменилась сама структура объектов метаданных. Переходя на новые версии, будьте готовы к тому, что логика обращения к данным через виртуальные таблицы может потребовать пересмотра, если объект был заменен на физический регистр сведений.

Надеемся, что теперь при возникновении подобных ошибок вы сможете быстро определить тип таблицы и корректно перенести условия фильтрации в нужную секцию запроса!

← На главную