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

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

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

Разбор ситуации: почему возникает ошибка?

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ОбъектОтчет = ДанныеФормыВЗначение(Отчет, Тип("ОтчетОбъект.РеестрИнцидентов"));
    // Дальнейшая логика...
КонецПроцедуры

Выясним причину сбоя. Когда отчет находится внутри конфигурации, система четко знает его тип — ОтчетОбъект.РеестрИнцидентов. Метод ДанныеФормыВЗначение требует во втором параметре точного указания типа, в который мы хотим преобразовать данные из формы. Пока отчет «встроенный», это работает идеально.

Однако, как только мы сохраняем отчет как внешний (файл .erf), его природа меняется. Для платформы это больше не ОтчетОбъект.РеестрИнцидентов. С точки зрения системы это объект типа ВнешнийОтчетОбъект. Пытаясь принудительно привести внешний отчет к типу внутреннего метаданного, мы получаем исключение «Недопустимое значение параметра», так как типы несовместимы.

Решение проблемы: переход на универсальный метод

Рассмотрим, как исправить эту ошибку наиболее эффективным способом. Вместо использования функции ДанныеФормыВЗначение, которая требует жесткого указания типа, воспользуемся методом управляемой формы РеквизитФормыВЗначение.

Разберем по шагам, почему этот метод лучше:

  1. Автоматическое определение типа: Метод сам анализирует метаданные реквизита. Если форма принадлежит встроенному отчету, он вернет ОтчетОбъект. Если внешнему — ВнешнийОтчетОбъект.
  2. Лаконичность кода: Нам не нужно использовать функцию Тип() и прописывать строковое имя объекта из конфигурации.
  3. Универсальность: Один и тот же код будет работать и внутри конфигурации, и во внешнем файле.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Используем строковое имя реквизита формы (обычно это "Отчет" или "Объект")
    ОбъектОтчет = РеквизитФормыВЗначение("Отчет");
    
    // Теперь мы можем вызывать экспортные методы из модуля объекта
    упрсн_ВосстановитьНастройкиПриОткрытии(ОбъектОтчет);
    
    Если ЗначениеЗаполнено(ОбъектОтчет.СохранённаяНастройка) Тогда
        УстановитьНастройкиФормы(ОбъектОтчет.СохранённаяНастройка);
        
        // Если мы изменили данные в ОбъектОтчет, их нужно вернуть на форму
        ЗначениеВДанныеФормы(ОбъектОтчет, Отчет);
    КонецЕсли;
КонецПроцедуры

Важный нюанс: Обратите внимание, что в метод РеквизитФормыВЗначение передается строка (имя реквизита в кавычках), а не само значение реквизита.

Сравнение методов: ДанныеФормыВЗначение vs РеквизитФормыВЗначение

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

ДанныеФормыВЗначение:

РеквизитФормыВЗначение:

Дополнительные сложности при работе с внешними отчетами

Выясним, какие еще преграды могут возникнуть после исправления типизации. Даже если отчет начал открываться, он может «падать» на других участках кода.

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

2. Безопасный режим и профили безопасности
При открытии внешнего отчета система может автоматически включать безопасный режим. В этом режиме запрещены:

Если логика отчета требует таких действий, его необходимо регистрировать в справочнике «Дополнительные отчеты и обработки» с предоставлением соответствующих разрешений.

3. Имена основных реквизитов
Проанализируем структуру формы. Обычно основной реквизит называется Отчет (для отчетов) или Объект (для обработок). Если вы переименовали этот реквизит в редакторе формы, например, в ДанныеРеестра, то и в коде нужно писать:

ОбъектОтчет = РеквизитФормыВЗначение("ДанныеРеестра");

Рекомендация по обратной конвертации

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

Для синхронизации данных обратно в интерфейс обязательно используйте обратный метод:

ЗначениеВДанныеФормы(ОбъектОтчет, Отчет);

Где ОбъектОтчет — это программная переменная (тип ВнешнийОтчетОбъект), а Отчет — это путь к данным формы (реквизит формы).

Соблюдение этих простых правил позволит вам создавать надежные и переносимые инструменты, которые одинаково стабильно работают в любых условиях эксплуатации платформы 1С.

← На главную