Как правильно получить данные из регистра сведений при нажатии на кнопку в управляемой форме 1С?

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

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

Разделение контекстов: Клиент и Сервер

Первое и самое важное правило, которое необходимо усвоить — это строгое разделение выполнения кода. В управляемом приложении:

Если вы пытаетесь создать Запрос в процедуре &НаКлиенте, система выдаст ошибку, так как клиент не имеет прямого доступа к таблицам базы данных. Правильный подход — вызвать серверную процедуру из клиентской.

Реализация получения данных с помощью запроса

Рассмотрим, как правильно организовать код. Предположим, у нас есть документ РасходнаяНакладная с реквизитом Машина и нам нужно заполнить его данными из регистра сведений Машины, где измерением является Контрагент.

Сначала создадим клиентскую процедуру, которая будет являться точкой входа при нажатии на кнопку:


&НаКлиенте
Процедура ПолучитьМашину(Команда)
    ПолучитьМашинуНаСервере();
КонецПроцедуры

Теперь перейдем к серверной процедуре. Здесь мы будем использовать объект Запрос для получения данных из виртуальной таблицы СрезПоследних. Использование СрезПоследних позволяет нам автоматически получить актуальное значение ресурса на определенную дату.


&НаСервере
Процедура ПолучитьМашинуНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    МашиныСрезПоследних.Машины КАК Машины
        |ИЗ
        |    РегистрСведений.Машины.СрезПоследних(&ДатаДокумента, Контрагент = &Контрагент) КАК МашиныСрезПоследних";

    Запрос.УстановитьПараметр("ДатаДокумента", Объект.Дата);
    Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);

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

    Если Выборка.Следующий() Тогда
        Объект.Машина = Выборка.Машины;
    КонецЕсли;
КонецПроцедуры

Анализ ключевых моментов решения

  1. Использование параметров: Мы передаем Объект.Дата и Объект.Контрагент в параметры запроса. Это гарантирует, что мы получим именно ту машину, которая была закреплена за контрагентом на момент создания документа.
  2. Выборка данных: Мы используем Выборка.Следующий(). Если запрос вернул хотя бы одну строку, мы присваиваем значение ресурса Машины нашему реквизиту формы Объект.Машина.
  3. Оптимизация запроса: Важно выбирать только те поля, которые действительно нужны. Нет необходимости соединять таблицы, если все данные можно получить напрямую из регистра, отфильтровав его по конкретному контрагенту.
  4. Левое соединение: Если задача требует получения данных из документа и регистра одновременно, используйте ЛЕВОЕ СОЕДИНЕНИЕ. Однако следите за тем, чтобы не выбирать лишние данные, которые не будут использоваться в дальнейшем.

Советы по отладке

Если код не срабатывает, рекомендуем выполнить следующие действия:

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

← На главную