Ошибка «Недопустимое значение параметра (параметр номер '1')» — одна из самых коварных в системе 1С. Она является универсальной и сигнализирует о том, что в первый аргумент вызванной функции или метода были переданы данные, которые система не может обработать. Причины могут варьироваться от банальной опечатки в имени макета до фундаментального непонимания того, как работают коллекции данных или менеджеры объектов (быстро получить корректный каркас кода поможет ИИ-помощник — см. ИИ-помощник для генерации кода 1С). В этой статье мы подробно разберем три наиболее распространенных сценария возникновения этой ошибки и найдем пути их решения.
Рассмотрим ситуацию, когда программист пытается вывести HTML-документ на форму справочника. В коде это выглядит примерно так:
&НаСервере
Процедура ЗаполнитьМакетHTML()
ТекМакет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетОтчётПоИнвентаризации");
Объект.ПолеHTML = ТекМакет.ПолучитьТекст();
КонецПроцедуры
Проанализируем, почему здесь возникает ошибка. Метод РеквизитФормыВЗначение("Объект") преобразует данные формы в объект справочника. Когда мы вызываем ПолучитьМакет, система ищет этот макет именно внутри метаданных данного справочника. Если макет был создан в какой-то внешней обработке, а код был просто скопирован в модуль справочника — система не найдет макет и выдаст ошибку в первом параметре (для таких случаев полезно расширение для отладки внешних отчетов и обработок — см. расширение для пошаговой отладки кода).
Как решить проблему:
МакетОтчётПоИнвентаризации действительно существует в дереве конфигурации именно у того объекта, из которого вызывается код (посмотреть полное дерево свойств метаданных можно через специальный Информер — поможет инструменты разработчика для анализа метаданных).
// Если макет находится в обработке "ПечатьДокументов"
ТекМакет = Обработки.ПечатьДокументов.ПолучитьМакет("МакетОтчётПоИнвентаризации");
Выясним причину внимательнее: всегда проверяйте точность написания имени макета в кавычках. Лишний пробел или использование кириллицы в похожих по написанию буквах (например, латинская «c» вместо русской «с») также приведет к этой ошибке.
Второй частый случай связан с использованием метода Получить() для регистров сведений, особенно при работе с производственным календарем или курсами валют. Рассмотрим пример кода, который вызывает сбой:
СведенияНаДень = РегистрыСведений.ДанныеПроизводственногоКалендаря.Получить(Новый Структура("Дата", ДатаПлатежа));
Проанализируем ситуацию. Метод Получить() предназначен для получения значений ресурсов одной конкретной записи регистра. Чтобы система смогла найти эту запись, в Структуре отбора необходимо передать значения всех измерений регистра. Если регистр ДанныеПроизводственногоКалендаря имеет измерения ПроизводственныйКалендарь, Год и Дата, а мы передаем только Дата, система не понимает, какую именно запись вернуть, и сообщает о недопустимом параметре.
Рассмотрим правильное решение задачи:
Нам необходимо заполнить структуру всеми ключевыми полями. Посмотрим на пример корректного кода:
Отбор = Новый Структура;
// Указываем конкретный календарь (например, РФ)
Отбор.Вставить("ПроизводственныйКалендарь", Справочники.ПроизводственныеКалендари.НайтиПоКоду("РФ"));
Отбор.Вставить("Дата", ДатаПлатежа);
// Год должен соответствовать году из даты платежа
Отбор.Вставить("Год", Год(ДатаПлатежа));
СведенияНаДень = РегистрыСведений.ДанныеПроизводственногоКалендаря.Получить(Отбор);
Важно помнить, что если вы работаете с периодическим регистром сведений, то вместо Получить зачастую правильнее использовать методы СрезПоследних или СрезПервых, которые позволяют получить данные на определенный момент времени, даже если точного совпадения по секундам в базе нет.
Иногда ошибка возникает в самом простом месте — при инициализации новой структуры. Разберем по шагам следующий код:
СтруктураНомер = Новый Структура("Номер строки");
Здесь проблема кроется в правилах именования ключей структуры в 1С. Ключ структуры — это идентификатор. К нему применяются те же правила, что и к именам переменных:
Как исправить ситуацию:
Если вам нужно передать данные, используйте «верблюжий регистр» или подчеркивания:
// Правильный вариант
СтруктураНомер = Новый Структура("НомерСтроки", 10);
// Или использование объекта "Соответствие", если пробелы критичны
Данные = Новый Соответствие;
Данные.Вставить("Номер строки", 10);
Разница между ними в том, что к Структуре можно обращаться через точку (СтруктураНомер.НомерСтроки), а к Соответствию — только через квадратные скобки (Данные["Номер строки"]).
Если вы столкнулись с этой ошибкой, и ни один из вышеперечисленных случаев не подходит, рекомендуем воспользоваться следующей методикой:
Shift+F9, чтобы проверить содержимое переменной, которую вы передаете в метод. Часто визуально «правильная» переменная на поверку оказывается равной Неопределено или имеет тип Строка вместо нужной Ссылки.Число, а вы передаете туда Строку, система может выдать ошибку параметра.Совместными усилиями мы разобрали основные причины сбоев. Помните, что 1С требует строгой дисциплины в именовании объектов и заполнении параметров методов. Внимательность к деталям — залог стабильной работы вашей конфигурации.