При разработке в среде 1С программисты часто сталкиваются с необходимостью получения актуальных данных из периодических регистров сведений, таких как цены номенклатуры, курсы валют или лимиты остатков. Метод ПолучитьПоследнее является стандартным инструментом для решения этой задачи, однако при его использовании нередко возникает ошибка: «Ошибка при вызове метода контекста (ПолучитьПоследнее) по причине: Недопустимое значение параметра (параметр номер '2')». Рассмотрим подробно причины возникновения этой проблемы и разберем правильные способы работы с регистрами сведений.
Проанализируем ситуацию: в коде формируется структура отбора, которая затем передается в метод ПолучитьПоследнее. Ошибка в «параметре номер 2» почти всегда указывает на то, что переданная Структура содержит некорректные данные или ключи, которые система не может сопоставить с измерениями регистра.
В приведенном примере кода была допущена типичная ошибка:
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Номенклатура);
Отбор.Вставить("Контрагент", Объект.Контрагент); // Здесь была ошибка
Данные = РегистрыСведений.ЦеныПоставщиков.ПолучитьПоследнее(Объект.Дата, Отбор);
Выясним причину: в конфигураторе измерение регистра сведений называлось Контрагенты (во множественном числе), а в коде при формировании структуры был указан ключ Контрагент. Система 1С строго проверяет, чтобы ключи в структуре отбора точно совпадали с именами измерений регистра. Даже разница в одну букву приведет к фатальной ошибке выполнения.
Важное правило: всегда проверяйте точное написание имен измерений в дереве метаданных конфигурации перед написанием кода.
Рассмотрим ситуацию, когда имена ключей в структуре указаны верно, но ошибка всё равно сохраняется. Проанализируем типы данных. Если измерение регистра имеет тип СправочникСсылка.Номенклатура, а вы передаете в отбор строку (артикул или наименование), система выдаст ту же ошибку «Недопустимое значение параметра».
Перед передачей значений в структуру отбора рекомендуется проверять их тип. Особенно это актуально, когда данные приходят из элементов формы или внешних источников. Пример безопасного заполнения:
Отбор = Новый Структура;
Если ЗначениеЗаполнено(ВыбраннаяНоменклатура) Тогда
Отбор.Вставить("Номенклатура", ВыбраннаяНоменклатура);
КонецЕсли;
Разберем важный нюанс производительности. Метод ПолучитьПоследнее удобен для получения единичного значения (например, при изменении одной строки в документе). Однако, если нам нужно получить цены для всей табличной части из 100 или 1000 строк, использовать этот метод в цикле — плохая практика.
Каждый вызов ПолучитьПоследнее — это отдельное обращение к базе данных. Проанализируем альтернативный, более быстрый подход с использованием запроса к виртуальной таблице СрезПоследних:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныПоставщиковСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныПоставщиков.СрезПоследних(&Период, Номенклатура В (&МассивНоменклатуры)) КАК ЦеныПоставщиковСрезПоследних";
Запрос.УстановитьПараметр("Период", Объект.Дата);
Запрос.УстановитьПараметр("МассивНоменклатуры", Объект.Товары.ВыгрузитьКолонку("Номенклатура"));
РезультатЗапроса = Запрос.Выполнить();
// Далее обрабатываем результат за один проход
Использование запроса позволяет получить все необходимые данные за один программный вызов, что значительно ускоряет работу системы на реальных объемах данных.
Посмотрим на типичную ошибку обращения к результату: Возврат Данные.Цена;. Проблема заключается в том, что если в регистре нет ни одной записи, соответствующей вашему отбору, метод ПолучитьПоследнее вернет структуру, заполненную значениями по умолчанию (например, 0 для чисел или пустая ссылка для справочников).
Однако, в некоторых контекстах или при сложных отборах, обращение к несуществующему свойству может вызвать ошибку. Проанализируем правильный подход к получению значения:
ЗаполнитьЗначенияСвойств или явную проверку, если ожидаем, что данных может не быть.Получить(), так как он работает эффективнее для актуальных данных без истории.Выясним, как дата влияет на результат. Метод ПолучитьПоследнее ищет запись, актуальную на указанный момент времени включительно. Если в одну и ту же секунду в системе зарегистрирована и цена, и документ, который пытается её получить, могут возникнуть неоднозначности.
Если вам нужно получить значение строго до момента времени текущего документа (не включая его движения), используем объект Граница:
МоментВремени = Новый Граница(Объект.Дата, ВидГраницы.Исключая);
Данные = РегистрыСведений.ЦеныПоставщиков.ПолучитьПоследнее(МоментВремени, Отбор);
Для того чтобы поиск по регистру сведений (будь то запрос или метод менеджера) работал максимально быстро, обратим внимание на настройки в конфигураторе:
Номенклатура или Контрагенты), установлен признак Индексировать.Ведущее. Это создаст автоматический индекс и ускорит выборку.Подведем итог: ошибка «Недопустимое значение параметра» в 90% случаев вызвана банальной опечаткой в имени измерения или неверным типом данных в структуре отбора. Внимательная проверка метаданных и переход к использованию запросов при обработке массивов данных — залог стабильной и быстрой работы вашей конфигурации.