Как автоматически заполнить реквизит Основной поставщик при выборе номенклатуры в табличной части

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

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

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

Метод 1. Использование события ПриИзменении на стороне клиента и сервера

Проанализируем самый надежный и гибкий способ — программную обработку события ПриИзменении. Этот метод позволяет не только получить данные из справочника, но и выполнить с ними любые дополнительные проверки или преобразования перед записью в строку табличной части.

Рассмотрим алгоритм реализации:

  1. Создадим обработчик события ПриИзменении для элемента формы, связанного с колонкой Материал.
  2. Внутри обработчика получим текущую строку табличной части.
  3. Если материал выбран, вызовем серверную функцию для получения значения реквизита ОсновнойПоставщик.
  4. Запишем полученное значение в соответствующий реквизит текущей строки.

Посмотрим на пример кода, который реализует эту логику:


&НаКлиенте
Процедура МатериалыМатериалПриИзменении(Элемент)
    
    // Получаем данные строки, в которой произошло изменение
    ТекущаяСтрока = Элементы.Материалы.ТекущиеДанные;
    
    // Проверяем, что строка существует и материал заполнен
    Если ТекущаяСтрока <> Неопределено И ЗначениеЗаполнено(ТекущаяСтрока.Материал) Тогда
        
        // Вызываем серверную функцию для получения данных из базы
        ТекущаяСтрока.ОсновнойПоставщик = ПолучитьОсновногоПоставщика(ТекущаяСтрока.Материал);
        
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция ПолучитьОсновногоПоставщика(НоменклатураСсылка)
    
    // Прямое обращение к реквизиту ссылки на сервере
    Возврат НоменклатураСсылка.ОсновнойПоставщик;
    
КонецФункции

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

Метод 2. Использование пути к данным (визуальное отображение)

Существует более простой способ, не требующий написания серверного кода, если ваша задача заключается только в отображении информации без её физического хранения в документе. Рассмотрим настройку пути к данным для элемента формы.

Выясним причину, почему это иногда удобнее: если «Основной поставщик» может часто меняться в справочнике номенклатуры, и вы хотите, чтобы в старых документах всегда отображался актуальный на текущий момент поставщик, данные не нужно дублировать в табличную часть документа.

Для реализации выполните следующие действия:

  1. Добавьте в таблицу формы новый элемент (Поле ввода).
  2. В свойстве ПутьКДанным укажите путь через основную колонку: Объект.Материалы.Материал.ОсновнойПоставщик.

Внимание: У этого способа есть существенное ограничение. Такое поле будет доступно только для чтения. Платформа 1С не позволит редактировать основной реквизит справочника напрямую из табличной части документа через такой путь к данным, так как это нарушает логику прав доступа и объектную модель.

Метод 3. Перехват выбора через событие ОбработкаВыбора

Разберем ситуацию, когда вам нужно получить данные в момент закрытия формы выбора. Событие ОбработкаВыбора срабатывает на форме документа, когда пользователь нажал «Выбрать» в форме справочника.

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


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

КонецПроцедуры

Чтобы этот код заработал, форма выбора справочника должна возвращать структуру. Это реализуется в модуле формы выбора справочника Номенклатура через процедуру ОповеститьОВыборе.

Метод 4. Связи параметров выбора (ChoiceParameterLinks)

Иногда проблема пользователя «вместо нужного реквизита получаю Наименование» связана с тем, что выбор происходит не в той колонке или список не отфильтрован. Проанализируем механизм Связи параметров выбора.

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

Настройка выполняется в конфигураторе:

Метод 5. Использование системной функции ПолучитьДанныеВыбора

Рассмотрим продвинутый способ кастомизации подбора. В модуле менеджера справочника Номенклатура можно переопределить функцию ОбработкаПолученияДанныхВыбора. Это позволит изменить представление объекта в выпадающем списке, который видит пользователь при вводе текста с клавиатуры.

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

Подведем итог: выбор конкретного метода зависит от архитектуры вашей базы данных. Если данные поставщика должны быть «заморожены» в документе на момент его создания — используйте Метод 1 (программное заполнение в ПриИзменении). Если вам нужно просто показывать справочную информацию — используйте Метод 2 (путь к данным). Для сложной логики подбора лучше всего подойдут ОбработкаВыбора и Связи параметров выбора.

← На главную