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