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