ВСТУПЛЕНИЕ
До отказа от модальности было удобно, что при открытии модального окна, в процедуре останавливалось выполнение кода до закрытия формы.
Вся логика была видна внутри одной процедуры.
С отказом от модальности пришлось делать рефакторинг, при котором приходилось создавать новую процедуру, указывать эту новую процедуру в описании оповещения чтобы вызвать её после закрытия диалогового окна.
Неудобно, каждый раз, когда появляется необходимость добавить очередной вызов формы, добавлять очередную процедуру, по крайней мере, мне, этого очень не хотелось.
Однажды, мне поставили задачу, где требовалось задать пару вопросов пользователю, получить ответы и передать их в процедуру создания печатной формы в модуле менеджера документа. Конфигурация типовая, используется БСП.
Кроме того, такая задача ставилась не для одной, а для 6-ти печатных форм.
Для меня это означало, что надо в условиях БСП:
-
организовать вызов двух форм (для различных печатных форм, набор форм с вопросами отличался),
-
передать возвращаемые результаты при закрытии этих форм в процедуру, в которой создаётся табличный документ для печати.
Мне не хотелось делать "грубую лепнину", по этому, поразмышляв, какое-то время, ко мне пришло интересное решение, которое будет рассмотрено в этой статье.
РЕШЕНИЕ
Для этого потребуется немного изменить подключаемую типовую процедуру БСП и добавить новую, что позволит вызывать любое количество окон для получения возвращаемых значений.
Шаг 1
Сначала, необходимо внести изменения в типовом функционале БСП, а именно, в модуле формы документа внести изменения в процедуре "Подключаемый_ВыполнитьКоманду(Команда)".
Внимание! В различных версиях БСП, название подключаемой процедуры может отличаться.
Комментируется типовая функция "ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, Команда, Объект);" и добавляются строки создания параметра и вызова функции как в примере:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
//ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, Команда, Объект);
ДополнительныеПараметры = Новый Структура("Команда,Очередь" , Команда, 0);
Подключаемый_ВыполнитьКоманду_Дополнительно(Неопределено, ДополнительныеПараметры);
КонецПроцедуры
Шаг 2
Далее, в модуле формы добавляется новая процедура "Подключаемый_ВыполнитьКоманду_Дополнительно",
в этой процедуре, добавляется вызов процедуры, которая была закомментирована ранее:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду_Дополнительно(Результат, ДополнительныеПараметры)
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, ДополнительныеПараметры.Команда, Объект);
КонецПроцедуры
Шаг 3
Добавляется код, который перехватывает необходимую команду, для которой необходимо получить настройки через диалог с пользователем.
Сразу добавляется строка увеличения значение номера "очереди".
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду_Дополнительно(Результат, ДополнительныеПараметры)
Если ДополнительныеПараметры.Команда.Имя = "ПодменюПечатьОбычное_ТабельОсновной" Тогда
ДополнительныеПараметры.Очередь = ДополнительныеПараметры.Очередь + 1;
КонецЕсли;
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, ДополнительныеПараметры.Команда, Объект);
КонецПроцедуры
Шаг 4
Делаем вызов первой формы, обратите внимание, что в создаваемом "Оповещение" будет указана процедура, в которой это оповещение будет создано.
После того, как пользователь укажет ответ в открывшейся форме и закроет её, будет повторно вызвана процедура "Подключаемый_ВыполнитьКоманду_Дополнительно", где у свойства "ДополнительныеПараметры.Очередь" увеличится значение и выполнение кода перейдёт в соответствующую часть кода, где ДополнительныеПараметры.Очередь = 2.
В этой части кода будет выполнена проверка значения и в случае заполненности значения, оно будет сохранено в хранилище.
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду_Дополнительно(Результат, ДополнительныеПараметры)
Если ДополнительныеПараметры.Команда.Имя = "ПодменюПечатьОбычное_ТабельОсновной" Тогда
ДополнительныеПараметры.Очередь = ДополнительныеПараметры.Очередь + 1;
Если ДополнительныеПараметры.Очередь = 1 Тогда
Оповещение = Новый ОписаниеОповещения("Подключаемый_ВыполнитьКоманду_Дополнительно", ЭтаФорма, ПараметрыОповещения);
ПараметрыФормыВопроса = Новый Структура;
ОткрытьФорму("Документ.ПР_ТабельУчетаРабочегоВремени.Форма.ФормаВыбораГруппСотрудников", ПараметрыФормыВопроса, ЭтаФорма, , , , Оповещение);
Возврат;
ИначеЕсли ДополнительныеПараметры.Очередь = 2 Тогда
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
СохранитьНастройкуПользователяВХранилище("ПР_ПерсональныеНастройки", "ПечатьГруппыСотрудников" , Результат);
КонецЕсли;
КонецЕсли;
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, ДополнительныеПараметры.Команда, Объект);
КонецПроцедуры
Шаг 5
Теперь, после сохранения полученного ответа, добавляется открытие второй формы, описание оповещения создаётся аналогично как и в первой очереди с указанием процедуры из которой это оповещение будет создано.
Добавляем следующую "Очередь" для сохранения полученного ответа, после чего, управление перейдёт в процедуру БСП "ПодключаемыеКомандыКлиент.ВыполнитьКоманду":
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду_Дополнительно(Результат, ДополнительныеПараметры)
Если ДополнительныеПараметры.Команда.Имя = "ПодменюПечатьОбычное_ТабельОсновной" Тогда
ДополнительныеПараметры.Очередь = ДополнительныеПараметры.Очередь + 1;
Если ДополнительныеПараметры.Очередь = 1 Тогда
Оповещение = Новый ОписаниеОповещения("Подключаемый_ВыполнитьКоманду_Дополнительно", ЭтаФорма, ПараметрыОповещения);
ПараметрыФормыВопроса = Новый Структура;
ОткрытьФорму("Документ.ПР_ТабельУчетаРабочегоВремени.Форма.ФормаВыбораГруппСотрудников", ПараметрыФормыВопроса, ЭтаФорма, , , , Оповещение);
Возврат;
ИначеЕсли ДополнительныеПараметры.Очередь = 2 Тогда
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
СохранитьНастройкуПользователяВХранилище("ПР_ПерсональныеНастройки", "ПечатьГруппыСотрудников" , Результат);
Оповещение = Новый ОписаниеОповещения("Подключаемый_ВыполнитьКоманду_Дополнительно", ЭтаФорма, ПараметрыОповещения);
ПараметрыФормыВопроса = Новый Структура;
ОткрытьФорму("Документ.ПР_ТабельУчетаРабочегоВремени.Форма.ФормаВыборПериода", ПараметрыФормыВопроса, ЭтаФорма, , , , Оповещение);
Возврат;
ИначеЕсли ПараметрыОповещения.Очередь = 3 Тогда
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
СохранитьНастройкуПользователяВХранилище("ПР_ПерсональныеНастройки", "ПечатьПериодТабеляС" , Результат.ПериодС );
СохранитьНастройкуПользователяВХранилище("ПР_ПерсональныеНастройки", "ПечатьПериодТабеляПо", Результат.ПериодПо);
КонецЕсли;
КонецЕсли;
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, ДополнительныеПараметры.Команда, Объект);
КонецПроцедуры
Шаг 6
Теперь, в процедуре формирования печатной формы, остаётся получить значения из хранилища с помощью следующего кода:
ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ПР_ПерсональныеНастройки", "ПечатьГруппыСотрудников" , ПараметрыСеанса.ТекущийПользователь);
ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ПР_ПерсональныеНастройки", "ПечатьПериодТабеляС" , ПараметрыСеанса.ТекущийПользователь);
ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ПР_ПерсональныеНастройки", "ПечатьПериодТабеляПо" , ПараметрыСеанса.ТекущийПользователь);
ЗАКЛЮЧЕНИЕ
На этом демонстрация решения завершена. Вот таким образом, для 6-ти печатных форм, для каждой печатной формы по два вызова форм настроек - удалось решить задачу с помощью всего одной дополнительной процедуры.
Пользуйтесь. Заходите в гости на страницы с другими моими статьями. До следующих встреч!