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

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

Часто при разработке управляемых форм в 1С возникает ситуация: мы программно заполняем список выбора для поля ввода, пользователь видит этот список, выбирает из него значение, но оно не сохраняется в данных. Поле остается пустым, как будто никакого выбора и не было. Разберем, почему так происходит и как это исправить.

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


СписокВыбора = ЭтаФорма.Элементы.ТоварыВидТранспорта.СписокВыбора;
СписокВыбора.Очистить();
СписокВыбора.Добавить("10", "10 - Морской/речной транспорт");
СписокВыбора.Добавить("20", "20 - Железнодорожный транспорт");
СписокВыбора.Добавить("30", "30 - Автодорожный транспорт...");
// ... и так далее
ЭтаФорма.Элементы.ТоварыВидТранспорта.РежимВыбораИзСписка = Истина;

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

Решение №1: Проверка свойства "ПутьКДанным" (основной способ)

Самая распространенная причина такого поведения — это отсутствие связи между визуальным элементом на форме и реквизитом, в котором должны храниться данные. За эту связь отвечает свойство элемента формы ПутьКДанным.

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

  1. Укажите путь к данным. Откройте палитру свойств для вашего элемента формы (в примере это ТоварыВидТранспорта). Найдите свойство ПутьКДанным и выберите из списка реквизит формы, в который должно сохраняться выбранное значение. Например, если у вас в табличной части "Товары" есть колонка "ВидТранспорта", то путь будет выглядеть как Объект.Товары.ВидТранспорта (для реквизита объекта) или ИмяТабличнойЧасти.ВидТранспорта (для реквизита формы).
  2. Проверьте соответствие типов. Это второй критически важный момент. Тип данных реквизита, указанного в ПутьКДанным, должен в точности совпадать с типом значений, которые вы добавляете в список выбора. Посмотрим на пример кода: СписокВыбора.Добавить("10", "10 - Морской/речной транспорт"); Здесь первым параметром идет значение "10" — это строка. Вторым параметром — представление "10 - Морской/речной транспорт", которое видит пользователь. Это означает, что реквизит формы, связанный с этим полем, обязательно должен иметь тип "Строка". Если бы вы добавляли значения как числа (СписокВыбора.Добавить(10, ...)), то и тип реквизита должен был бы быть "Число".

В 95% случаев правильная настройка свойства ПутьКДанным и соответствие типов полностью решают проблему. Это стандартный и наиболее правильный механизм работы платформы.

Решение №2: Программная обработка выбора (альтернативный способ)

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

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

Рассмотрим по шагам, как это реализовать:

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

Посмотрим на пример такого обработчика, если бы наше поле находилось в табличной части "Товары":


&НаКлиенте
Процедура ТоварыВидТранспортаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // Получаем текущую строку табличной части, для которой был сделан выбор
    ТекущиеДанные = Элементы.Товары.ТекущиеДанные;

    // Проверяем, что текущая строка определена
    Если ТекущиеДанные <> Неопределено Тогда
        // Вручную присваиваем выбранное значение реквизиту строки
        ТекущиеДанные.ВидТранспорта = ВыбранноеЗначение;
    КонецЕсли;

    // Отменяем стандартный механизм присвоения значения,
    // так как мы все сделали сами.
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

Когда стоит использовать этот метод?

Однако стоит помнить, что использование свойства ПутьКДанным — это более декларативный, простой и поддерживаемый подход для стандартных задач простого выбора и сохранения значения.

Итог: если у вас не сохраняется значение из списка выбора, в первую очередь проверьте свойство ПутьКДанным у элемента формы и убедитесь, что тип связанного с ним реквизита соответствует типу значений в вашем списке. Только если вам нужна дополнительная логика, прибегайте к программной обработке события ОбработкаВыбора.

← На главную