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