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

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

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

Проанализируем ситуацию, описанную на форуме, и разберем по шагам все возможные способы решения — от простого написания программного кода до использования встроенных механизмов платформы, не требующих программирования.

Способ 1. Программный обработчик события «ПриИзменении»

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

Разберем алгоритм действий по шагам:

  1. Откройте форму документа в конфигураторе.
  2. Выберите в дереве элементов формы нужную колонку табличной части (например, НаименованиеДетали).
  3. В окне свойств перейдите на закладку «События» и нажмите на лупу рядом с событием ПриИзменении. Платформа создаст заготовку процедуры в модуле формы с директивой &НаКлиенте.

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


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

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

Способ 2. Оптимизированное заполнение через сервер

Если нам нужно заполнить сразу несколько полей (например, Чертеж, Вес, Материал и Стоимость), проанализируем более профессиональный подход. Мы передадим ссылку на выбранную деталь на сервер, получим все данные одним пакетом и вернем их на клиент.


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

&НаСервереБезКонтекста
Функция ПолучитьДанныеДеталиССервера(СсылкаНаДеталь)
    
    Результат = Новый Структура;
    Результат.Вставить("Чертеж", СсылкаНаДеталь.Чертеж);
    Результат.Вставить("Вес", СсылкаНаДеталь.Вес);
    
    Возврат Результат;
    
КонецФункции

Использование метода ЗаполнитьЗначенияСвойств значительно сокращает объем кода, автоматически сопоставляя имена ключей в структуре с именами реквизитов в табличной части.

Способ 3. Отображение данных без хранения (ПутьКДанным)

Посмотрим на ситуацию под другим углом. Если реквизит «Чертеж» в документе нужен только для справки и он всегда совпадает с тем, что указано в справочнике «Детали», нам вообще не нужно создавать отдельный реквизит в документе и писать код. Мы можем просто отобразить поле из справочника прямо в таблице.

Рассмотрим, как это сделать в конфигураторе:

  1. В окне редактирования формы перейдите на закладку «Реквизиты».
  2. Найдите объект Объект, разверните его, найдите вашу табличную часть.
  3. Найдите реквизит НаименованиеДетали и нажмите на «плюсик» рядом с ним. Вы увидите все поля справочника-владельца.
  4. Найдите там Чертеж и просто перетащите его мышкой в левую часть окна — в дерево элементов формы, внутрь таблицы.

Система автоматически установит ПутьКДанным для новой колонки как Объект.Заявка.НаименованиеДетали.Чертеж. Теперь при выборе детали чертеж будет появляться мгновенно, без единой строчки кода и без лишней нагрузки на базу данных.

Способ 4. Использование связей параметров выбора

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

Проанализируем настройку этого механизма:

  1. В конфигураторе откройте свойства реквизита табличной части Чертеж.
  2. Найдите свойство Связи параметров выбора.
  3. Нажмите кнопку выбора и укажите связь: Отбор.Владелец(НаименованиеДетали).

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

Почему не срабатывает точка останова?

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

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

← На главную