Как передать параметры из документа в обработку подбора и вернуть результат в обычных формах 1С?

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

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

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

Проанализируем распространенную ошибку: попытку передать в обработку только ссылку на документ через свойство Ссылка. Если документ еще не записан в базу данных, метод ЭтоНовый() вернет значение Истина, а свойство Ссылка будет содержать пустую ссылку. В результате попытка прочитать данные документа по ссылке внутри обработки приведет к получению пустых значений.

По этой причине передавать в обработку необходимо не ссылку на объект, а конкретные значения реквизитов (например, организацию, дату, подразделение или список условий отбора) через параметры, экспортные переменные или реквизиты формы.

Способ 1. Передача данных через экспортную переменную формы обработки

Рассмотрим классический механизм взаимодействия форм в обычном интерфейсе с использованием экспортных переменных модуля формы обработки.

Разберем по шагам реализацию данного способа:

  1. В модуле формы обработки подбора в самом верху (до описания процедур и функций) объявляем переменную с ключевым словом Экспорт:

Перем ПараметрыОтбора Экспорт;

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

Процедура ДействияФормыЗаполнитьФорму(Кнопка)
    
    // Формируем структуру параметров с необходимыми данными документа
    ПараметрыДляПередачи = Новый Структура;
    ПараметрыДляПередачи.Вставить("Организация", ЭтотОбъект.Организация);
    ПараметрыДляПередачи.Вставить("ДатаДокумента", ЭтотОбъект.Дата);
    ПараметрыДляПередачи.Вставить("Подразделение", ЭтотОбъект.Подразделение);
    
    // Получаем форму обработки
    ФормаПодбора = ПолучитьФорму("Обработка.ПодборСотрудников.Форма.ОсновнаяФорма", ЭтаФорма);
    
    // Передаем данные в экспортную переменную формы
    ФормаПодбора.ПараметрыОтбора = ПараметрыДляПередачи;
    
    // Открываем форму обработки
    ФормаПодбора.Открыть();
    
КонецПроцедуры
  1. В модуле формы обработки считываем переданные параметры в обработчике ПередОткрытием или ПриОткрытии:

Процедура ПриОткрытии()
    
    Если ЗначениеЗаполнено(ПараметрыОтбора) Тогда
        // Используем переданные параметры для фильтрации данных
        ОрганизацияОтбора = ПараметрыОтбора.Организация;
        // Заполняем список или таблицу в соответствии с условиями
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Использование реквизитов формы обработки

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

После создания реквизита к нему можно обращаться напрямую как к свойству формы:


Процедура КнопкаПодборНажатие(Элемент)
    
    ФормаПодбора = ПолучитьФорму("Обработка.ПодборСотрудников.Форма", ЭтаФорма);
    ФормаПодбора.Организация = ЭтотОбъект.Организация;
    ФормаПодбора.Период = ЭтотОбъект.Дата;
    ФормаПодбора.Открыть();
    
КонецПроцедуры

Способ 3. Модальное открытие и прямой возврат результата

Если логика требует приостановить выполнение кода в документе до момента, пока пользователь не сделает выбор в обработке, применим метод ОткрытьМодально().

В форме документа код выглядит следующим образом:


Процедура ЗаполнитьПоКритериямНажатие(Элемент)
    
    ФормаПодбора = ПолучитьФорму("Обработка.ПодборСотрудников.Форма.ОсновнаяФорма");
    ФормаПодбора.ПараметрыОтбора = Новый Структура("Организация, Дата", Организация, Дата);
    
    // Модальный вызов блокирует интерфейс и ожидает закрытия формы
    РезультатВыбора = ФормаПодбора.ОткрытьМодально();
    
    // Проверяем, вернулись ли данные (например, ТаблицаЗначений)
    Если ТипЗнч(РезультатВыбора) = Тип("ТаблицаЗначений") Тогда
        Для Каждого Стр Из РезультатВыбора Цикл
            НоваяСтрока = ТабличнаяЧасть1.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

В модуле формы обработки подбора по кнопке ОК или Перенести в документ вызываем закрытие формы с передачей сформированного результата:


Процедура КнопкаОКНажатие(Элемент)
    
    // Закрываем форму и возвращаем сформированную таблицу значений
    Закрыть(ТаблицаПодобранныхСотрудников);
    
КонецПроцедуры

Способ 4. Немодальный возврат через механизм ОповеститьОВыборе

Разберем стандартный платформенный механизм подбора без блокировки интерфейса пользователя. Этот подход предпочтителен с точки зрения стандартов разработки 1С.

  1. При получении формы обработки в качестве владельца указываем текущую форму документа (ЭтаФорма):

ФормаПодбора = ПолучитьФорму("Обработка.ПодборСотрудников.Форма.ОсновнаяФорма", ЭтаФорма);
ФормаПодбора.ПараметрыОтбора = СтруктураПараметров;
ФормаПодбора.Открыть();
  1. В форме обработки по кнопке завершения подбора вызываем метод ОповеститьОВыборе():

Процедура ДействияФормыПеренестиВДокумент(Кнопка)
    
    // Оповещаем владельца формы о выполненном выборе
    ОповеститьОВыборе(ТаблицаПодобранныхСотрудников);
    Закрыть();
    
КонецПроцедуры
  1. В модуле формы документа описываем предопределенную процедуру ОбработкаВыбора:

Процедура ОбработкаВыбора(ЗначениеВыбора, ИсточникВыбора)
    
    Если ТипЗнч(ЗначениеВыбора) = Тип("ТаблицаЗначений") Тогда
        Для Каждого Стр Из ЗначениеВыбора Цикл
            НоваяСтрока = ЭтотОбъект.СоставСотрудников.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Рекомендации по выбору решения

Подведем итоги и выделим главные правила:

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