Как автоматически заполнить поля табличной части при изменении одного реквизита в 1С?

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

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

В данной статье мы разберем по шагам, как реализовать этот механизм, используя современные стандарты разработки на управляемых формах. Мы проанализируем взаимодействие клиента и сервера, научимся работать с текущей строкой и оптимизируем код для обеспечения максимального быстродействия.

Шаг 1. Создание обработчика события на форме

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

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

Важно понимать, что мы вешаем обработчик не на всю таблицу, а именно на конкретное поле. Это позволяет системе точно знать, какое изменение инициировало процесс.

Шаг 2. Работа с текущей строкой на клиенте

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


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

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

Шаг 3. Получение данных с сервера

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

Для таких задач рекомендуется использовать директиву &НаСервереБезКонтекста. Это значительно экономит ресурсы, так как на сервер передается не вся форма целиком, а только необходимые параметры.


&НаСервереБезКонтекста
Функция ПолучитьПараметрыТехнологии(Знач СсылкаНаТехнологию)
    
    Результат = Новый Структура;
    Результат.Вставить("Цена", 0);
    Результат.Вставить("Описание", "");
    
    // Выполним запрос или обратимся к свойствам объекта
    // Для примера просто прочитаем реквизиты ссылки
    Если ЗначениеЗаполнено(СсылкаНаТехнологию) Тогда
        Результат.Цена = СсылкаНаТехнологию.Цена;
        Результат.Описание = СсылкаНаТехнологию.ПолноеОписание;
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

Обратите внимание, что мы возвращаем объект типа Структура. Это хороший тон программирования в 1С: так мы можем передать сразу пакет данных (несколько полей) за один вызов сервера, что критично для работы в облачных сервисах или при медленном интернет-соединении.

Шаг 4. Объединение логики и заполнение полей

Теперь объединим клиентскую часть и серверную функцию. Рассмотрим, как будет выглядеть итоговый процесс заполнения:


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

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

Шаг 5. Нюансы и оптимизация

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

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

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

Рассмотрим пример кода для очистки:


&НаКлиенте
Процедура ОчиститьСтрокуТаблицы(СтрокаТаблицы)
    СтрокаТаблицы.Цена = 0;
    СтрокаТаблицы.Описание = "";
    // Добавьте остальные поля, которые требуют очистки
КонецПроцедуры

Заключение

Мы разобрали стандартный и наиболее правильный подход к автоматизации заполнения табличных частей в 1С:Предприятие 8.3. Основные принципы, которые мы изучили:

  1. Использование события ПриИзменении конкретного элемента формы.
  2. Работа через ТекущиеДанные для быстрого доступа к строке.
  3. Вынос тяжелых операций получения данных в &НаСервереБезКонтекста.
  4. Использование объектов типа Структура и метода ЗаполнитьЗначенияСвойств для чистоты и лаконичности кода.

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

← На главную