При разработке и доработке документов на обычных формах (в таких конфигурациях, как «Управление торговлей 10.3», «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1») разработчики нередко сталкиваются с ситуацией: в колонке табличной части с составным типом данных при выборе элемента из выпадающего списка в реквизит попадает не ссылка на справочник (СправочникСсылка.Организации или СправочникСсылка.Контрагенты), а строковое представление выбранного объекта. Проанализируем, почему возникает такое поведение платформы 1С и как его исправить.
Разберем механизм работы элементов управления табличного поля при работе с составными типами:
СправочникСсылка.Организации, СправочникСсылка.Контрагенты, Строка), и в качестве элемента управления колонки выбрано ПолеВвода, платформа по умолчанию пытается распарсить введенное или выбранное значение. Если свойство РежимВыбораИзСписка отключено (значение Ложь), платформа берет текстовое представление выбранного пункта и пытается сопоставить его с допустимыми типами. Так как Строка входит в состав доступных типов данных реквизита, платформа отдает приоритет строке и сохраняет обычный текст вместо ссылки на объект.ПолеВыбора (классический выпадающий список) напрямую привязывает выбранный элемент (свойство Значение) к значению ячейки и реквизиту строки. В свою очередь, ПолеВвода ориентировано на свободный ввод текста и выбор через модальные или стандартные формы выбора.Добавить() передается только строковое значение либо не разделяются значение ссылки и его представление, в реквизит также запишется строка.Рассмотрим самое простое и надежное решение, если в колонке табличного поля не требуется ручной ввод произвольного текста с клавиатуры:
ОтКого или Кому).ПолеВыбора вместо ПолеВвода.Элемент ПолеВыбора гарантирует прямую запись объекта из свойства Значение элемента списка в реквизит строки табличной части без промежуточного текстового преобразования.
Если необходимо оставить именно ПолеВвода, настроим его свойства таким образом, чтобы запретить свободный ввод текста и включить строгий режим выбора из списка:
ПолеВвода.Истина.Истина. Это заставит поле ввода вести себя аналогично выпадающему списку и предотвратит автоматическое приведение значения к типу Строка.Посмотрим, как правильно формировать список выбора программно в обработчике события ПриНачалеВыбораИзСписка или при изменении связанных колонок. При добавлении элементов первым параметром передаем саму ссылку, а вторым — ее строковое представление:
Процедура ТабличнаяЧастьОтКогоНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Список = Элемент.СписокВыбора;
Список.Очистить();
// Заполняем список значениями нужного справочника
Выборка = Справочники.Организации.Выбрать();
Пока Выборка.Следующий() Цикл
Список.Добавить(Выборка.Ссылка, Выборка.Наименование);
КонецЦикла;
КонецПроцедуры
Если требуется полный контроль над процессом подстановки данных, переопределим стандартную обработку в событии ОбработкаВыбора табличного поля:
Процедура ТабличнаяЧастьОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
ТекущаяСтрока = ЭлементыФормы.ТабличнаяЧасть.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
Если Элемент.ТекущаяКолонка.Имя = "ОтКого" Тогда
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ВыбранноеЗначение) = Тип("ЭлементСпискаЗначений") Тогда
ТекущаяСтрока.ОтКого = ВыбранноеЗначение.Значение;
Иначе
ТекущаяСтрока.ОтКого = ВыбранноеЗначение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный момент: при копировании табличных частей и элементов форм между документами конфигуратор может сохранять скрытые настройки привязок и типов элементов управления. Всегда проверяйте соответствие свойства ЭлементУправления в свойствах перенесенной колонки табличного поля.