Почему не работает код в `ПриСозданииНаСервере` при передаче параметров в модальную форму 1С?

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

В разработке на платформе 1С часто возникает задача открыть одну форму из другой и передать в нее некоторые начальные данные. Обычно для этого используется метод ОткрытьФормуМодально() и структура параметров. Однако иногда разработчики сталкиваются с ситуацией, когда форма открывается, но код, который должен обработать эти параметры в событии ПриСозданииНаСервере, не срабатывает. Давайте разберем типичную ошибку и выясним, как ее исправить.

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

Код в вызывающей форме:


СтруктураПараметров = Новый Структура("СсылкаДок", Объект.ЗаданиеМнд);
ОткрытьФормуМодально("Обработка.Оформление.Форма.ВыборДока", СтруктураПараметров, ЭтаФорма);

В открываемой форме мы пытаемся эти параметры обработать, но сталкиваемся с проблемой. Код в обработчике ПриСозданииНаСервере выглядит так, но почему-то не выполняется:


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

Форма открывается, но запрос, который зависит от переданных параметров, не работает. Отладчик в процедуру ПриСозданииНаСервере не заходит, или, если и заходит, то не выполняет код внутри условия. Выясним причину такого поведения.

Причина проблемы: неверный тип объекта "Параметры"

Главная ошибка кроется в строке Если ТипЗнч(Параметры) = Тип("Структура") Тогда. Хотя мы передаем в метод открытия формы объект типа Структура, внутри формы, в обработчике ПриСозданииНаСервере, эти данные доступны через системный объект Параметры. И этот объект не является типом Структура.

На самом деле, Параметры — это объект специального типа ФиксированнаяСтруктура. Поэтому проверка ТипЗнч(Параметры) = Тип("Структура") всегда будет возвращать Ложь, и код внутри этого условия никогда не выполнится.

Более того, сама по себе эта проверка избыточна. Платформа 1С:Предприятие гарантирует, что если при открытии формы были переданы параметры, то объект Параметры будет существовать и будет доступен в обработчике ПриСозданииНаСервере. Проверять его наличие или тип не нужно.

Правильный способ обработки параметров формы

Чтобы код работал корректно и был устойчив к ошибкам, необходимо убрать неверную проверку типа и обращаться к свойствам параметров напрямую, предварительно проверив их наличие.

Рассмотрим по шагам, как исправить код.

  1. Убираем лишнее условие. Удаляем проверку Если ТипЗнч(Параметры) = Тип("Структура").
  2. Используем безопасный метод Свойство(). Для того чтобы избежать ошибки, если форма будет открыта без нужного параметра (например, из другого места программы), рекомендуется проверять наличие ключа в структуре параметров. Для этого идеально подходит метод Параметры.Свойство("ИмяПараметра"). Он проверяет, есть ли свойство с таким именем, и если есть, то возвращает его значение.

Корректный код для обработки переданного параметра в процедуре ПриСозданииНаСервере будет выглядеть так:


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

        // Теперь здесь можно выполнять дальнейшие действия:
        // например, заполнять данные на форме по ссылке, выполнять запрос и т.д.
        // ...
        Сообщить("Параметр 'СсылкаДок' успешно получен!");
    КонецЕсли;
КонецПроцедуры

Этот подход является стандартной и рекомендуемой практикой. Он делает код надежным и читаемым.

Что делать, если отладчик все равно не останавливается на сервере?

Иногда бывает так, что код написан правильно, но отладчик не останавливается в серверных процедурах, таких как ПриСозданииНаСервере. Это особенно актуально для клиент-серверного варианта работы базы данных.

Возможная причина: на сервере 1С:Предприятия отключена возможность отладки.

Чтобы проверить, выполняется ли ваш код в принципе, можно использовать простой диагностический прием — вывод служебных сообщений с помощью процедуры Сообщить().

Если вы не уверены, что отладка на сервере работает, попробуйте следующий способ для проверки:

  1. Создайте тестовую процедуру. В модуле формы, где возникает проблема, добавьте простой клиент-серверный вызов.
    
    &НаКлиенте
    Процедура ПроверитьСерверныйВызов()
        ПроверкаСервера();
    КонецПроцедуры
    
    &НаСервере
    Процедура ПроверкаСервера()
        Сообщить("Сообщение с сервера: все работает!");
    КонецПроцедуры
    
  2. Вызовите ее. Добавьте на форму временную кнопку и в обработчике ее нажатия вызовите процедуру ПроверитьСерверныйВызов().
  3. Проанализируйте результат. Запустите 1С в режиме предприятия, откройте форму и нажмите на кнопку. Если в окне служебных сообщений появится текст "Сообщение с сервера: все работает!", значит, серверные вызовы в целом проходят. Если же сообщения нет, то проблема, скорее всего, в настройках сервера, и нужно обратиться к системному администратору для включения отладки на сервере 1С.

Этот же метод можно применить и к нашей исходной проблеме — просто добавьте строку Сообщить("Процедура ПриСозданииНаСервере была вызвана!"); в самое начало вашего обработчика, чтобы убедиться, что система в него вообще заходит.

← На главную