В разработке на платформе 1С часто возникает задача открыть одну форму из другой и передать в нее некоторые начальные данные. Обычно для этого используется метод ОткрытьФормуМодально() и структура параметров. Однако иногда разработчики сталкиваются с ситуацией, когда форма открывается, но код, который должен обработать эти параметры в событии ПриСозданииНаСервере, не срабатывает. Давайте разберем типичную ошибку и выясним, как ее исправить.
Проанализируем ситуацию: из одной формы мы вызываем другую, передавая ей ссылку на документ.
Код в вызывающей форме:
СтруктураПараметров = Новый Структура("СсылкаДок", Объект.ЗаданиеМнд);
ОткрытьФормуМодально("Обработка.Оформление.Форма.ВыборДока", СтруктураПараметров, ЭтаФорма);
В открываемой форме мы пытаемся эти параметры обработать, но сталкиваемся с проблемой. Код в обработчике ПриСозданииНаСервере выглядит так, но почему-то не выполняется:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Эта проверка является причиной ошибки
Если ТипЗнч(Параметры) = Тип("Структура") Тогда
Если Параметры.Свойство("СсылкаДок") Тогда
// ...здесь должен быть код обработки, но он не выполняется
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Форма открывается, но запрос, который зависит от переданных параметров, не работает. Отладчик в процедуру ПриСозданииНаСервере не заходит, или, если и заходит, то не выполняет код внутри условия. Выясним причину такого поведения.
Главная ошибка кроется в строке Если ТипЗнч(Параметры) = Тип("Структура") Тогда. Хотя мы передаем в метод открытия формы объект типа Структура, внутри формы, в обработчике ПриСозданииНаСервере, эти данные доступны через системный объект Параметры. И этот объект не является типом Структура.
На самом деле, Параметры — это объект специального типа ФиксированнаяСтруктура. Поэтому проверка ТипЗнч(Параметры) = Тип("Структура") всегда будет возвращать Ложь, и код внутри этого условия никогда не выполнится.
Более того, сама по себе эта проверка избыточна. Платформа 1С:Предприятие гарантирует, что если при открытии формы были переданы параметры, то объект Параметры будет существовать и будет доступен в обработчике ПриСозданииНаСервере. Проверять его наличие или тип не нужно.
Чтобы код работал корректно и был устойчив к ошибкам, необходимо убрать неверную проверку типа и обращаться к свойствам параметров напрямую, предварительно проверив их наличие.
Рассмотрим по шагам, как исправить код.
Если ТипЗнч(Параметры) = Тип("Структура").
Свойство(). Для того чтобы избежать ошибки, если форма будет открыта без нужного параметра (например, из другого места программы), рекомендуется проверять наличие ключа в структуре параметров. Для этого идеально подходит метод Параметры.Свойство("ИмяПараметра"). Он проверяет, есть ли свойство с таким именем, и если есть, то возвращает его значение.
Корректный код для обработки переданного параметра в процедуре ПриСозданииНаСервере будет выглядеть так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, был ли передан параметр с ключом "СсылкаДок"
Если Параметры.Свойство("СсылкаДок") Тогда
// Если параметр есть, получаем его значение
МойРеквизитФормы = Параметры.СсылкаДок;
// Теперь здесь можно выполнять дальнейшие действия:
// например, заполнять данные на форме по ссылке, выполнять запрос и т.д.
// ...
Сообщить("Параметр 'СсылкаДок' успешно получен!");
КонецЕсли;
КонецПроцедуры
Этот подход является стандартной и рекомендуемой практикой. Он делает код надежным и читаемым.
Иногда бывает так, что код написан правильно, но отладчик не останавливается в серверных процедурах, таких как ПриСозданииНаСервере. Это особенно актуально для клиент-серверного варианта работы базы данных.
Возможная причина: на сервере 1С:Предприятия отключена возможность отладки.
Чтобы проверить, выполняется ли ваш код в принципе, можно использовать простой диагностический прием — вывод служебных сообщений с помощью процедуры Сообщить().
Если вы не уверены, что отладка на сервере работает, попробуйте следующий способ для проверки:
&НаКлиенте
Процедура ПроверитьСерверныйВызов()
ПроверкаСервера();
КонецПроцедуры
&НаСервере
Процедура ПроверкаСервера()
Сообщить("Сообщение с сервера: все работает!");
КонецПроцедуры
ПроверитьСерверныйВызов().
Этот же метод можно применить и к нашей исходной проблеме — просто добавьте строку Сообщить("Процедура ПриСозданииНаСервере была вызвана!"); в самое начало вашего обработчика, чтобы убедиться, что система в него вообще заходит.