Почему форма 1С при закрытии возвращает числовой индекс вместо выбранного объекта?

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

В процессе разработки на управляемых формах часто возникает ситуация, когда при попытке получить результат выбора из открытой формы вместо ожидаемого объекта (например, справочника Партия) мы получаем число. Это число зачастую является индексом выбранной строки, хотя в коде мы явно передаем объект в метод Закрыть(). Давайте разберемся, почему так происходит и как с этим работать.

Выясняем причину проблемы

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

В такой ситуации вызов Закрыть(ВыбПартия) игнорируется платформой в части передачи объекта, так как механизм РежимВыбора имеет приоритет. Платформа самостоятельно определяет, что нужно передать вызывающему коду, ориентируясь на текущую строку списка, что и приводит к появлению числа (индекса) в переменной, которая должна была получить ссылку на элемент.

Разбираем варианты решения

Для исправления этой ситуации существует несколько подходов, в зависимости от того, как именно вы открываете форму и какие задачи перед ней стоят.

Вариант 1: Отключение режима выбора

Если вам не требуется стандартное поведение формы как «выбирающей» (например, если вы не используете эту форму в полях ввода с автоподбором), самый простой способ — отключить свойство РежимВыбора. После этого метод Закрыть() будет работать корректно и передавать именно то значение, которое вы указали в скобках.

Вариант 2: Использование оповещений

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

Вместо использования ОткрытьФормуМодально, рассмотрим использование ОткрытьФорму с параметром ОписаниеОповещения. В таком случае в самой форме, которую мы открываем, вместо Закрыть() следует использовать:


// В форме выбора
ОповеститьОВыборе(ВыбПартия);
// Или для немодального режима
Закрыть(ВыбПартия);

А в вызывающей форме необходимо описать обработчик, который будет перехватывать результат:


// В вызывающей форме
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораПартии", ЭтаФорма);
ОткрытьФорму("Справочник.Партии.ФормаВыбора", , , , , , ОписаниеОповещения);

// Далее обработчик
&НаКлиенте
Процедура ПослеВыбораПартии(Результат, ДопПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        // Здесь мы получим корректный объект, а не индекс
        Партия = Результат;
    КонецЕсли;
КонецПроцедуры

Вариант 3: Анализ контекста при использовании Режима выбора

Если вы по каким-то причинам вынуждены оставить РежимВыбора = Истина, то необходимо понимать, как именно платформа обрабатывает выбор. В режиме выбора платформа может ожидать, что вы не используете Закрыть() напрямую для передачи значения, а используете событие Выбор или стандартный механизм выбора из таблицы.

  1. Проверьте, не установлен ли в свойствах таблицы параметр выбора ИспользоватьСтандартнуюОбработку.
  2. Убедитесь, что вы не используете перехват событий, которые автоматически закрывают форму с передачей индекса.
  3. Если вы используете ОткрытьФормуМодально, попробуйте передать параметр РежимВыбора = Ложь во входящей структуре параметров открытия формы, даже если в конфигураторе он стоит в Истина.

Важное примечание: Переход на немодальные методы открытия форм с использованием ОписаниеОповещения является предпочтительным стандартом для платформы 1С:Предприятие 8.3. Это избавляет от множества проблем с контекстом и позволяет избежать конфликтов, возникающих при автоматическом управлении результатами выбора со стороны платформы.

Подводя итог: если вы столкнулись с тем, что форма «возвращает число», первым делом проверяйте свойство РежимВыбора. Чаще всего именно оно заставляет систему игнорировать ваш вызов Закрыть() и подменять результат стандартным индексом строки.

← На главную