При разработке конфигураций на платформе 1С часто возникает задача автоматического заполнения строки табличной части документа на основании данных, выбранных в первой колонке. Например, вы выбираете номенклатуру, и система должна сама подставить цену, единицу измерения или ставку НДС. Давайте разберем, как реализовать этот функционал правильно и эффективно.
Первым делом нам необходимо отловить момент, когда пользователь выбрал значение в ячейке. Для этого мы будем использовать событие ПриИзменении для нужного элемента управления табличной части формы.
ПриИзменении.Важно помнить, что логику работы с базой данных необходимо выносить на сервер. Поэтому в процедуре ПриИзменении мы будем вызывать серверный метод.
После того как мы получили ссылку на элемент, нам нужно считать его данные. Рассмотрим два основных способа, как это сделать.
Запрос позволяет гибко выбрать именно те поля, которые нам нужны, и минимизировать объем передаваемых данных. Разберем пример реализации:
&НаСервере
Функция ПолучитьДанныеДляЗаполнения(ВыбраннаяСсылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Цена КАК Цена,
| Спр.ЕдиницаИзмерения КАК ЕдИзм
|ИЗ
| Справочник.Номенклатура КАК Спр
|ГДЕ
| Спр.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ВыбраннаяСсылка);
Результат = Запрос.Выполнить();
Возврат Результат.Выбрать();
КонецФункции
Этот подход позволяет нам получить актуальные значения, даже если справочник содержит огромное количество реквизитов, мы обращаемся только к необходимым.
Если названия колонок в вашей табличной части совпадают с именами реквизитов справочника, вы можете значительно упростить код, применив метод ЗаполнитьЗначенияСвойств. Это позволяет избежать ручного присваивания каждого реквизита.
&НаСервере
Процедура ЗаполнитьСтрокуСервер(ТекущаяСтрокаДанных, ВыбраннаяСсылка)
// Получаем объект или структуру данных
ДанныеИсточника = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВыбраннаяСсылка, "Цена, ЕдиницаИзмерения");
// Заполняем данные текущей строки табличной части
ЗаполнитьЗначенияСвойств(ТекущаяСтрокаДанных, ДанныеИсточника);
КонецПроцедуры
При работе с автозаполнением важно учитывать несколько критических аспектов, которые помогут сделать вашу разработку стабильной:
1. Обработка очистки поля
Всегда предусматривайте ситуацию, когда пользователь удаляет выбранное значение из колонки. Если ВыбраннаяСсылка стала пустой, обязательно очистите остальные колонки, чтобы данные не «зависли» от предыдущего выбора. Для этого добавьте проверку:
Если НЕ ЗначениеЗаполнено(ВыбраннаяСсылка) Тогда
ТекущаяСтрока.Цена = 0;
ТекущаяСтрока.ЕдИзм = "";
Возврат;
КонецЕсли;
2. Производительность
Старайтесь избегать вызовов сервера в циклах. Если вы заполняете одну строку — вызов серверной процедуры вполне допустим. Если же логика предполагает заполнение сразу большого массива строк, лучше подготовить все данные одним запросом за пределами цикла.
3. Права доступа
Когда вы обращаетесь к данным другого объекта на сервере, 1С автоматически проверяет права текущего пользователя на чтение этого объекта. Если прав недостаточно, система не вернет данные, что защищает от несанкционированного доступа к информации.
4. Контекстный вызов сервера
Для новичков самым удобным способом является создание &НаСервере процедур, которые получают доступ к объекту формы напрямую. Это позволяет изменять данные табличной части без необходимости возвращать структуру данных обратно на клиент.
Подводя итог, можно сказать, что связка события ПриИзменении на клиенте и серверной функции — это классический и наиболее надежный способ реализации автозаполнения в 1С. Используйте ЗаполнитьЗначенияСвойств там, где это возможно, чтобы сделать код более лаконичным и легким для чтения.