Как исправить ошибку «Недопустимое значение параметра (параметр номер '2')» при вызове метода ПолучитьПоследнее

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

При разработке в среде 1С программисты часто сталкиваются с необходимостью получения актуальных данных из периодических регистров сведений, таких как цены номенклатуры, курсы валют или лимиты остатков. Метод ПолучитьПоследнее является стандартным инструментом для решения этой задачи, однако при его использовании нередко возникает ошибка: «Ошибка при вызове метода контекста (ПолучитьПоследнее) по причине: Недопустимое значение параметра (параметр номер '2')». Рассмотрим подробно причины возникновения этой проблемы и разберем правильные способы работы с регистрами сведений.

Разбор основной причины ошибки: несоответствие имен измерений

Проанализируем ситуацию: в коде формируется структура отбора, которая затем передается в метод ПолучитьПоследнее. Ошибка в «параметре номер 2» почти всегда указывает на то, что переданная Структура содержит некорректные данные или ключи, которые система не может сопоставить с измерениями регистра.

В приведенном примере кода была допущена типичная ошибка:


Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Номенклатура);
Отбор.Вставить("Контрагент", Объект.Контрагент); // Здесь была ошибка
Данные = РегистрыСведений.ЦеныПоставщиков.ПолучитьПоследнее(Объект.Дата, Отбор);

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

Важное правило: всегда проверяйте точное написание имен измерений в дереве метаданных конфигурации перед написанием кода.

Проверка типов данных в структуре отбора

Рассмотрим ситуацию, когда имена ключей в структуре указаны верно, но ошибка всё равно сохраняется. Проанализируем типы данных. Если измерение регистра имеет тип СправочникСсылка.Номенклатура, а вы передаете в отбор строку (артикул или наименование), система выдаст ту же ошибку «Недопустимое значение параметра».

Перед передачей значений в структуру отбора рекомендуется проверять их тип. Особенно это актуально, когда данные приходят из элементов формы или внешних источников. Пример безопасного заполнения:


Отбор = Новый Структура;
Если ЗначениеЗаполнено(ВыбраннаяНоменклатура) Тогда
    Отбор.Вставить("Номенклатура", ВыбраннаяНоменклатура);
КонецЕсли;

Оптимизация: когда метод ПолучитьПоследнее лучше заменить запросом

Разберем важный нюанс производительности. Метод ПолучитьПоследнее удобен для получения единичного значения (например, при изменении одной строки в документе). Однако, если нам нужно получить цены для всей табличной части из 100 или 1000 строк, использовать этот метод в цикле — плохая практика.

Каждый вызов ПолучитьПоследнее — это отдельное обращение к базе данных. Проанализируем альтернативный, более быстрый подход с использованием запроса к виртуальной таблице СрезПоследних:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЦеныПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
    |	ЦеныПоставщиковСрезПоследних.Цена КАК Цена
    |ИЗ
    |	РегистрСведений.ЦеныПоставщиков.СрезПоследних(&Период, Номенклатура В (&МассивНоменклатуры)) КАК ЦеныПоставщиковСрезПоследних";

Запрос.УстановитьПараметр("Период", Объект.Дата);
Запрос.УстановитьПараметр("МассивНоменклатуры", Объект.Товары.ВыгрузитьКолонку("Номенклатура"));

РезультатЗапроса = Запрос.Выполнить();
// Далее обрабатываем результат за один проход

Использование запроса позволяет получить все необходимые данные за один программный вызов, что значительно ускоряет работу системы на реальных объемах данных.

Безопасная обработка результата

Посмотрим на типичную ошибку обращения к результату: Возврат Данные.Цена;. Проблема заключается в том, что если в регистре нет ни одной записи, соответствующей вашему отбору, метод ПолучитьПоследнее вернет структуру, заполненную значениями по умолчанию (например, 0 для чисел или пустая ссылка для справочников).

Однако, в некоторых контекстах или при сложных отборах, обращение к несуществующему свойству может вызвать ошибку. Проанализируем правильный подход к получению значения:

  1. Сначала получаем структуру данных из регистра.
  2. Используем метод ЗаполнитьЗначенияСвойств или явную проверку, если ожидаем, что данных может не быть.
  3. Если регистр непериодический, используем метод Получить(), так как он работает эффективнее для актуальных данных без истории.

Работа с периодичностью и границей времени

Выясним, как дата влияет на результат. Метод ПолучитьПоследнее ищет запись, актуальную на указанный момент времени включительно. Если в одну и ту же секунду в системе зарегистрирована и цена, и документ, который пытается её получить, могут возникнуть неоднозначности.

Если вам нужно получить значение строго до момента времени текущего документа (не включая его движения), используем объект Граница:


МоментВремени = Новый Граница(Объект.Дата, ВидГраницы.Исключая);
Данные = РегистрыСведений.ЦеныПоставщиков.ПолучитьПоследнее(МоментВремени, Отбор);

Рекомендации по настройке метаданных

Для того чтобы поиск по регистру сведений (будь то запрос или метод менеджера) работал максимально быстро, обратим внимание на настройки в конфигураторе:

Подведем итог: ошибка «Недопустимое значение параметра» в 90% случаев вызвана банальной опечаткой в имени измерения или неверным типом данных в структуре отбора. Внимательная проверка метаданных и переход к использованию запросов при обработке массивов данных — залог стабильной и быстрой работы вашей конфигурации.

← На главную