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