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

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

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

Шаг 1. Передача данных из основной формы в подчиненную

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

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


&НаКлиенте
Процедура КомандаРедактировать(Команда)
    
    ТекущиеДанные = Элементы.ТаблицаКонфигураций.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("Поставщик", ТекущиеДанные.Поставщик);
    
    // Передаем описание оповещения для получения результата при закрытии
    ОписаниеОповещения = Новый ОписаниеОповещенияОЗакрытии("ОбработатьЗакрытиеФормы", ЭтаФорма);
    
    ОткрытьФорму("Обработка.МояВнешняяОбработка.Форма.ФормаРедактирования", 
                 ПараметрыОткрытия, 
                 ЭтаФорма, 
                 ,,, 
                 ОписаниеОповещения);

КонецПроцедуры

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("Поставщик") Тогда
        Поставщик = Параметры.Поставщик;
    КонецЕсли;

КонецПроцедуры

Шаг 2. Возврат введенных данных из подчиненной формы в основную

Для передачи данных обратно в главную форму при нажатии кнопки Записать и закрыть вызовем метод Закрыть, передав в него структуру с заполненными реквизитами. Это наиболее безопасный способ, исключающий жесткую привязку дочерней формы к родительской:


&НаКлиенте
Процедура ЗаписатьИЗакрытьExecute(Команда)
    
    РезультатСтруктура = Новый Структура;
    РезультатСтруктура.Вставить("Поставщик", Поставщик);
    
    // Закрываем форму с возвратом значения в описание оповещения
    Закрыть(РезультатСтруктура);

КонецПроцедуры

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


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

КонецПроцедуры

Шаг 3. Сохранение и восстановление таблицы значений при закрытии формы

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

Разберем рабочий способ с использованием объекта ХранилищеНастроекДанныхФорм. Для корректной работы включим в свойствах формы флаг АвтоматическоеСохранениеДанныхВНастройках и пропишем процедуры сохранения и загрузки:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    СохранитьНастройкиНаСервере();
КонецПроцедуры

&НаСервере
Процедура СохранитьНастройкиНаСервере()
    
    ТаблицаДляСохранения = ТаблицаКонфигураций.Выгрузить();
    
    НастройкиСохранения = Новый Структура;
    НастройкиСохранения.Вставить("ТаблицаКонфигураций", ЗначениеВСтрокуВнутр(ТаблицаДляСохранения));
    
    ХранилищеНастроекДанныхФорм.Сохранить("МояВнешняяОбработка", "НастройкиТаблицы", НастройкиСохранения);

КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЗагрузитьНастройкиНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНастройкиНаСервере()
    
    НастройкиВосстановления = ХранилищеНастроекДанныхФорм.Загрузить("МояВнешняяОбработка", "НастройкиТаблицы");
    
    Если ТипЗнч(НастройкиВосстановления) = Тип("Структура") И НастройкиВосстановления.Свойство("ТаблицаКонфигураций") Тогда
        Попытка
            ТЗ = ЗначениеИзСтрокиВнутр(НастройкиВосстановления.ТаблицаКонфигураций);
            ТаблицаКонфигураций.Загрузить(ТЗ);
        Исключение
            // Обработка ошибки при изменении состава колонок
        КонецПопытки;
    КонецЕсли;

КонецПроцедуры

Проанализируем основные рекомендации по организации работы с подчиненными формами:

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