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