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