Как реализовать автоподстановку типа помощи из регистра сведений при выборе заявления в документе 1С:Предприятие?

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

При разработке на платформе 1С:Предприятие часто возникает необходимость автоматического заполнения полей формы документа на основе данных из других объектов системы, таких как регистры сведений. Рассмотрим типичную задачу, когда при выборе определенного элемента, например, Заявления, нам нужно подтянуть связанный с ним Тип помощи из регистра сведений и отобразить его в текущем документе. Это функциональность значительно упрощает работу пользователя и предотвращает ошибки ручного ввода. Давайте разберем по шагам, как правильно реализовать подобную автоподстановку.

Понимание задачи и архитектуры 1С:Предприятие

Прежде чем погружаться в код, мы должны четко понимать, как работает платформа 1С:Предприятие в части взаимодействия клиента и сервера. Формы документов работают на стороне клиента, а данные в базе хранятся на сервере. Непосредственный доступ к регистрам сведений из клиентского кода невозможен. Поэтому для получения данных из регистра нам всегда потребуется обращаться к серверу.

Основными компонентами для решения нашей задачи будут:

  1. Событие формы «ПриИзменении»: Это событие срабатывает, когда пользователь изменяет значение какого-либо элемента формы. В нашем случае это будет поле выбора Заявления.
  2. Клиент-серверное взаимодействие: Из обработчика события на клиенте мы будем вызывать серверную процедуру или функцию, которая уже сможет обратиться к базе данных.
  3. Запрос к базе данных: На сервере мы используем объект Запрос для извлечения необходимых данных из регистра сведений.
  4. Заполнение реквизита: Полученные данные мы вернем обратно на клиент и присвоим соответствующему реквизиту формы.

Шаг 1: Создание обработчика события «ПриИзменении» для поля «Заявление»

Первым делом нам необходимо отреагировать на выбор или изменение Заявления пользователем. Для этого мы используем событие ПриИзменении для элемента формы, связанного с реквизитом Заявление. Давайте посмотрим, как это сделать:

  1. Откройте конфигуратор и перейдите в форму вашего документа (того, где назначается исполнитель и куда нужно подставить Тип помощи).
  2. Найдите элемент формы, который связан с реквизитом Заявление (это может быть поле ввода, поле выбора и т.д.).
  3. В палитре свойств этого элемента перейдите на вкладку "События".
  4. Найдите событие ПриИзменении и создайте для него новый обработчик, если его еще нет.

В этом обработчике мы должны проверить, выбрано ли Заявление, и если да, вызвать серверную процедуру для получения Типа помощи. Также важно предусмотреть случай, когда Заявление очищается – тогда и Тип помощи должен быть очищен.

Пример клиентского кода в модуле формы:


&НаКлиенте
Процедура ЗаявлениеПриИзменении(Элемент)
    // Проверяем, пустое ли Заявление
    Если Объект.Заявление = Неопределено ИЛИ Объект.Заявление.Пустая() Тогда
        // Если Заявление пустое, очищаем поле ТипПомощи
        Объект.ТипПомощи = Неопределено;
        Возврат;
    КонецЕсли;

    // Вызываем серверную функцию для получения ТипаПомощи
    // и присваиваем результат реквизиту формы
    Объект.ТипПомощи = ПолучитьТипПомощиНаСервере(Объект.Заявление);
КонецПроцедуры

Здесь Объект.Заявление – это реквизит текущего документа, в который пользователь выбирает Заявление. Объект.ТипПомощи – это реквизит, куда мы будем подставлять Тип помощи. Обратите внимание, что мы передаем ссылку на выбранное Заявление в серверную функцию.

Шаг 2: Реализация серверной процедуры для получения данных из регистра сведений

Теперь мы переходим к самой важной части – получению данных из регистра сведений. Это будет происходить в серверной функции, которую мы вызвали из клиентского обработчика. Серверная функция имеет доступ к базе данных и может выполнять запросы.

Наиболее эффективным и гибким способом получения данных из регистра сведений является использование объекта Запрос. Он позволяет нам точно указать, какие данные мы хотим получить и по каким условиям.

  1. Создайте новую серверную функцию в модуле формы. Она должна быть помечена директивой &НаСервере.
  2. Эта функция будет принимать в качестве параметра ссылку на Заявление, которую мы передали с клиента.
  3. Внутри функции создайте новый объект Запрос.
  4. Сформируйте текст запроса, который будет выбирать необходимый нам ресурс (ТипПомощи) из нужного регистра сведений по измерению (Заявление).
  5. Установите параметр запроса, используя ссылку на Заявление.
  6. Выполните запрос и обработайте результат.

Давайте посмотрим на пример серверной функции:


&НаСервере
Функция ПолучитьТипПомощиНаСервере(ЗаявлениеСсылка)

    // Если ЗаявлениеСсылка не определена или пуста, возвращаем Неопределено
    Если ЗаявлениеСсылка = Неопределено ИЛИ ЗаявлениеСсылка.Пустая() Тогда
        Возврат Неопределено;
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |   СостоянияЗаявлений.ТипПомощи
    |ИЗ
    |   РегистрСведений.СостоянияЗаявлений КАК СостоянияЗаявлений
    |ГДЕ
    |   СостоянияЗаявлений.Заявление = &Заявление";

    // Устанавливаем параметр запроса, передавая ссылку на Заявление
    Запрос.УстановитьПараметр("Заявление", ЗаявлениеСсылка);

    РезультатЗапроса = Запрос.Выполнить();

    Выборка = РезультатЗапроса.Выбрать();

    // Если в выборке есть данные, возвращаем ТипПомощи
    Если Выборка.Следующий() Тогда
        Возврат Выборка.ТипПомощи;
    Иначе
        // Если данные не найдены, возвращаем Неопределено
        Возврат Неопределено;
    КонецЕсли;

КонецФункции

В этом примере РегистрСведений.СостоянияЗаявлений – это имя вашего регистра сведений, где хранится информация о Заявлениях и их Типах помощи. Предполагается, что Заявление является измерением регистра, а ТипПомощи – ресурсом.

Альтернативный способ: Менеджер записи регистра сведений

В некоторых случаях, если нам точно известны все значения измерений записи регистра, мы можем использовать менеджер записи для чтения данных. Однако для нашей задачи, где нужно найти запись по одному измерению (Заявление), а других измерений может быть много или они неизвестны, запрос будет более предпочтительным.

Пример использования менеджера записи (менее универсальный для данной задачи):


&НаСервере
Функция ПолучитьТипПомощиЧерезМенеджерЗаписи(ЗаявлениеСсылка)
    Если ЗаявлениеСсылка = Неопределено ИЛИ ЗаявлениеСсылка.Пустая() Тогда
        Возврат Неопределено;
    КонецЕсли;

    // Создаем ключ записи для чтения из регистра
    КлючЗаписи = Новый (РегистрыСведений.СостоянияЗаявлений.КлючЗаписи);
    // Предполагаем, что Заявление является измерением регистра
    КлючЗаписи.Заявление = ЗаявлениеСсылка; 
    // Если есть другие измерения, их также нужно заполнить в КлючЗаписи

    // Читаем запись регистра по ключу
    ЗаписьРегистра = РегистрыСведений.СостоянияЗаявлений.Прочитать(КлючЗаписи);

    // Если запись найдена, возвращаем значение ресурса ТипПомощи
    Если ЗаписьРегистра.Найдена Тогда
        Возврат ЗаписьРегистра.ТипПомощи; 
    Иначе
        Возврат Неопределено;
    КонецЕсли;
КонецФункции

Как мы видим, этот метод требует точного знания всех измерений записи, что делает его менее гибким, чем запрос, если мы ищем по части измерений или хотим получить последнюю запись из периодического регистра.

Шаг 3: Заполнение реквизита формы и обработка результата

После того как серверная функция ПолучитьТипПомощиНаСервере возвращает нам значение ТипПомощи (или Неопределено, если ничего не найдено), мы присваиваем это значение соответствующему реквизиту формы на клиенте. Этот шаг уже реализован в нашем клиентском обработчике события.

Важно помнить о возможных сценариях:

  1. Данные найдены: Объект.ТипПомощи получает значение из регистра.
  2. Данные не найдены: ПолучитьТипПомощиНаСервере возвращает Неопределено, и Объект.ТипПомощи будет очищен.
  3. Пользователь очистил поле Заявление: В этом случае наш клиентский код также очистит Объект.ТипПомощи, что обеспечивает консистентность данных.

Таким образом, комбинируя клиентские события и серверные запросы, мы создаем полноценную и надежную автоподстановку данных.

Резюмируем шаги реализации

Для успешной реализации автоподстановки Типа помощи при выборе Заявления, выполните следующие действия:

  1. В форме документа, где происходит выбор Заявления, создайте обработчик события ПриИзменении для поля, связанного с реквизитом Заявление.
  2. В этом клиентском обработчике проверьте, не пустое ли выбранное Заявление. Если оно пустое, очистите реквизит ТипПомощи. В противном случае, вызовите серверную функцию (например, ПолучитьТипПомощиНаСервере), передав ей ссылку на выбранное Заявление. Результат этой функции присвойте реквизиту ТипПомощи.
  3. В модуле формы создайте серверную функцию (с директивой &НаСервере), которая принимает ссылку на Заявление.
  4. Внутри серверной функции сформируйте объект Запрос, выберите из него ТипПомощи из вашего регистра сведений (например, РегистрСведений.СостоянияЗаявлений), используя Заявление как условие отбора (измерение).
  5. Установите параметр запроса, равный переданной ссылке на Заявление, и выполните запрос.
  6. Обработайте результат запроса: если запись найдена, верните значение ТипПомощи. В противном случае, верните Неопределено.

Следуя этим шагам, вы сможете корректно настроить автоподстановку данных из регистра сведений, обеспечивая удобство для пользователей и целостность информации в вашей системе 1С:Предприятие.

← На главную