Почему при выборе из списка в табличную часть записывается строка вместо ссылки?

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

При разработке и доработке документов на обычных формах (в таких конфигурациях, как «Управление торговлей 10.3», «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1») разработчики нередко сталкиваются с ситуацией: в колонке табличной части с составным типом данных при выборе элемента из выпадающего списка в реквизит попадает не ссылка на справочник (СправочникСсылка.Организации или СправочникСсылка.Контрагенты), а строковое представление выбранного объекта. Проанализируем, почему возникает такое поведение платформы 1С и как его исправить.

Причины возникновения проблемы

Разберем механизм работы элементов управления табличного поля при работе с составными типами:

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

Способ 1. Замена элемента управления колонки на «ПолеВыбора»

Рассмотрим самое простое и надежное решение, если в колонке табличного поля не требуется ручной ввод произвольного текста с клавиатуры:

  1. Откроем форму документа в конфигураторе и выделим элемент ТабличноеПоле.
  2. Откроем свойства нужной колонки (например, ОтКого или Кому).
  3. Найдем свойство ЭлементУправления и выберем значение ПолеВыбора вместо ПолеВвода.

Элемент ПолеВыбора гарантирует прямую запись объекта из свойства Значение элемента списка в реквизит строки табличной части без промежуточного текстового преобразования.

Способ 2. Корректная настройка свойств элемента «ПолеВвода»

Если необходимо оставить именно ПолеВвода, настроим его свойства таким образом, чтобы запретить свободный ввод текста и включить строгий режим выбора из списка:

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

Способ 3. Программное заполнение списка выбора

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


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

Способ 4. Явная установка значения через обработчик «ОбработкаВыбора»

Если требуется полный контроль над процессом подстановки данных, переопределим стандартную обработку в событии ОбработкаВыбора табличного поля:


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

Важный момент: при копировании табличных частей и элементов форм между документами конфигуратор может сохранять скрытые настройки привязок и типов элементов управления. Всегда проверяйте соответствие свойства ЭлементУправления в свойствах перенесенной колонки табличного поля.

← На главную