При разработке внешних отчетов и обработок на управляемых формах в среде 1С:Предприятие 8.3 разработчики нередко сталкиваются с системной ошибкой времени выполнения: «Недопустимое значение параметра (параметр номер 1)». Особенность этой ситуации заключается в том, что лаконичное системное окно не всегда сразу указывает на проблемный модуль или строку кода, из-за чего подозрение часто ошибочно падает на тексты запросов или алгоритмы построения печатных форм.
Разберем детально, почему возникает данное исключение, какие методы платформы чаще всего становятся его источником и как правильно оптимизировать код.
Проанализируем контекст управляемой формы. Когда серверному коду требуется получить прикладной объект (например, для вызова объектных методов, формирования макета или выполнения встроенных процедур модуля объекта), используется контекстный метод РеквизитФормыВЗначение.
Первым параметром этот метод строго ожидает строковое имя реквизита формы, связанного с прикладными данными. В платформе 1С приняты следующие соглашения по умолчанию:
Объект (тип ДанныеФормыСтруктура, связанный с ВнешняяОбработкаОбъект или ОбработкаОбъект).Отчет (тип ДанныеФормыСтруктура, связанный с ВнешнийОтчетОбъект или ОтчетОбъект).Если код был скопирован из обработки в отчет без адаптации, вызов РеквизитФормыВЗначение("Объект") пытается найти на форме несуществующий реквизит Объект, что приводит к генерации исключения с указанием на ошибочный параметр №1.
Посмотрим на пример исправления кода на сервере формы отчета:
// Ошибочный вариант (характерен для внешней обработки, но вызовет ошибку в отчете):
// ВнешнийОтчетОбъект = РеквизитФормыВЗначение("Объект");
// Корректный вариант для отчета:
ВнешнийОтчетОбъект = РеквизитФормыВЗначение("Отчет");
ВнешнийОтчетОбъект.СформироватьОтчет(ТабличныйДокумент);
Рассмотрим еще одну распространенную ситуацию, с которой сталкиваются разработчики. Исключение возникает при динамическом получении или открытии форм с помощью функций ПолучитьФорму или ОткрытьФорму:
ВыбФормаОтчета = ПолучитьФорму(мВыбраннаяФорма);
В этом случае платформа ожидает первым параметром точное строковое имя формы из метаданных (например, "Отчет.РегламентированныйОтчетАвансыИмущество.Форма.ФормаОтчета2024Кв1"). Ошибка «Недопустимое значение параметра (параметр номер 1)» возникает, если:
мВыбраннаяФорма не инициализирована и содержит Неопределено, NULL или пустую строку.Рассмотрим исходный запрос для сбора реестра документов «Поступление товаров и услуг» с объединением множества табличных частей (товары, услуги, оборудование, объекты строительства). Исходное использование конструкции ПОЛНОЕ СОЕДИНЕНИЕ с подзапросом на базе ОБЪЕДИНИТЬ ВСЕ создает избыточную нагрузку на СУБД и может искажать итоговую выборку.
Для повышения производительности и читаемости кода перепишем выборку с использованием временных таблиц и левого соединения:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЧ.Ссылка КАК Ссылка,
| СУММА(ТЧ.Сумма) КАК Сумма,
| СУММА(ТЧ.СуммаНДС) КАК СуммаНДС
|ПОМЕСТИТЬ ВТ_ИтогиТабличныхЧастей
|ИЗ
| (ВЫБРАТЬ
| Оборудование.Ссылка КАК Ссылка,
| Оборудование.Сумма КАК Сумма,
| Оборудование.СуммаНДС КАК СуммаНДС
| ИЗ
| Документ.ПоступлениеТоваровУслуг.Оборудование КАК Оборудование
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Товары.Ссылка,
| Товары.Сумма,
| Товары.СуммаНДС
| ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК Товары
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Услуги.Ссылка,
| Услуги.Сумма,
| Услуги.СуммаНДС
| ИЗ
| Документ.ПоступлениеТоваровУслуг.Услуги КАК Услуги
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ОбъектыСтроительства.Ссылка,
| ОбъектыСтроительства.Сумма,
| ОбъектыСтроительства.СуммаНДС
| ИЗ
| Документ.ПоступлениеТоваровУслуг.ОбъектыСтроительства КАК ОбъектыСтроительства) КАК ТЧ
|
|СГРУППИРОВАТЬ ПО
| ТЧ.Ссылка
|
|ИНДЕКСИРОВАТЬ ПО
| Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Поступление.Дата КАК Дата,
| Поступление.Ссылка КАК Документ,
| Поступление.Контрагент КАК Контрагент,
| ЕСТЬNULL(ВТ.Сумма, 0) КАК Сумма,
| ЕСТЬNULL(ВТ.СуммаНДС, 0) КАК СуммаНДС
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Поступление
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИтогиТабличныхЧастей КАК ВТ
| ПО Поступление.Ссылка = ВТ.Ссылка
|УПОРЯДОЧИТЬ ПО
| Поступление.Дата,
| Поступление.Ссылка";
Разберем преимущества такой структуры:
ИНДЕКСИРОВАТЬ ПО Ссылка позволяет СУБД выполнить соединение с таблицей шапки документов максимально быстро.ЛЕВОЕ СОЕДИНЕНИЕ гарантирует, что в отчет попадут все документы поступления, а функция ЕСТЬNULL корректно обработает документы с пустыми табличными частями.РеквизитФормыВЗначение.