Вызов n-го количества немодальных окон из одной процедуры и передача параметров в процедуру печати

25.03.18

Разработка - Механизмы платформы 1С

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

ВСТУПЛЕНИЕ

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

Вся логика была видна внутри одной процедуры.

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

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

Однажды, мне поставили задачу, где требовалось задать пару вопросов пользователю, получить ответы и передать их в процедуру создания печатной формы в модуле менеджера документа. Конфигурация типовая, используется БСП.

Кроме того, такая задача ставилась не для одной, а для 6-ти печатных форм.

Для меня это означало, что надо в условиях БСП:

  • организовать вызов двух форм (для различных печатных форм, набор форм с вопросами отличался),

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

Мне не хотелось делать "грубую лепнину", по этому, поразмышляв, какое-то время, ко мне пришло интересное решение, которое будет рассмотрено в этой статье.

 

РЕШЕНИЕ

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

Шаг 1

Сначала, необходимо внести изменения в типовом функционале БСП, а именно, в модуле формы документа внести изменения в процедуре "Подключаемый_ВыполнитьКоманду(Команда)".

Внимание! В различных версиях БСП, название подключаемой процедуры может отличаться.

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

     &НаКлиенте
     Процедура Подключаемый_ВыполнитьКоманду(Команда)

        //ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, Команда, Объект);
        ДополнительныеПараметры = Новый Структура("Команда,Очередь" , Команда, 0);
        Подключаемый_ВыполнитьКоманду_Дополнительно(Неопределено, ДополнительныеПараметры);

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

Шаг 2

Далее, в модуле формы добавляется новая процедура "Подключаемый_ВыполнитьКоманду_Дополнительно",

в этой процедуре, добавляется вызов процедуры, которая была закомментирована ранее:

     &НаКлиенте
     Процедура Подключаемый_ВыполнитьКоманду_Дополнительно(Результат, ДополнительныеПараметры)

          ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, ДополнительныеПараметры.Команда, Объект);

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

 

Шаг 3

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

Сразу добавляется строка увеличения значение номера "очереди".

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду_Дополнительно(Результат, ДополнительныеПараметры)

          Если ДополнительныеПараметры.Команда.Имя = "ПодменюПечатьОбычное_ТабельОсновной" Тогда

               ДополнительныеПараметры.Очередь = ДополнительныеПараметры.Очередь + 1;

          КонецЕсли;

ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, ДополнительныеПараметры.Команда, Объект);

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

Шаг 4

Делаем вызов первой формы, обратите внимание, что в создаваемом "Оповещение" будет указана процедура, в которой это оповещение будет создано.

После того, как пользователь укажет ответ в открывшейся форме и закроет её, будет повторно вызвана процедура "Подключаемый_ВыполнитьКоманду_Дополнительно",  где у свойства "ДополнительныеПараметры.Очередь" увеличится значение и выполнение кода перейдёт в соответствующую часть кода, где ДополнительныеПараметры.Очередь = 2.

В этой части кода будет выполнена проверка значения и в случае заполненности значения, оно будет сохранено в хранилище.

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду_Дополнительно(Результат, ДополнительныеПараметры)

Если ДополнительныеПараметры.Команда.Имя = "ПодменюПечатьОбычное_ТабельОсновной" Тогда

ДополнительныеПараметры.Очередь = ДополнительныеПараметры.Очередь + 1;

               Если ДополнительныеПараметры.Очередь = 1 Тогда

                    Оповещение = Новый ОписаниеОповещения("Подключаемый_ВыполнитьКоманду_Дополнительно", ЭтаФорма, ПараметрыОповещения);

                    ПараметрыФормыВопроса = Новый Структура;

                    ОткрытьФорму("Документ.ПР_ТабельУчетаРабочегоВремени.Форма.ФормаВыбораГруппСотрудников", ПараметрыФормыВопроса, ЭтаФорма, , , , Оповещение);

                    Возврат;

               ИначеЕсли ДополнительныеПараметры.Очередь = 2 Тогда

                    Если  Результат = Неопределено Тогда

                         Возврат;

                    КонецЕсли;

                    СохранитьНастройкуПользователяВХранилище("ПР_ПерсональныеНастройки", "ПечатьГруппыСотрудников" , Результат);

               КонецЕсли; 

КонецЕсли;

ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, ДополнительныеПараметры.Команда, Объект);

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

Шаг 5

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

Добавляем следующую "Очередь" для сохранения полученного ответа, после чего, управление перейдёт в процедуру БСП "ПодключаемыеКомандыКлиент.ВыполнитьКоманду":

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду_Дополнительно(Результат, ДополнительныеПараметры)

Если ДополнительныеПараметры.Команда.Имя = "ПодменюПечатьОбычное_ТабельОсновной" Тогда

ДополнительныеПараметры.Очередь = ДополнительныеПараметры.Очередь + 1;

Если ДополнительныеПараметры.Очередь = 1 Тогда

Оповещение = Новый ОписаниеОповещения("Подключаемый_ВыполнитьКоманду_Дополнительно", ЭтаФорма, ПараметрыОповещения);

ПараметрыФормыВопроса = Новый Структура;

ОткрытьФорму("Документ.ПР_ТабельУчетаРабочегоВремени.Форма.ФормаВыбораГруппСотрудников", ПараметрыФормыВопроса, ЭтаФорма, , , , Оповещение);

Возврат;

ИначеЕсли ДополнительныеПараметры.Очередь = 2 Тогда

Если  Результат = Неопределено Тогда

Возврат;

КонецЕсли;

СохранитьНастройкуПользователяВХранилище("ПР_ПерсональныеНастройки", "ПечатьГруппыСотрудников" , Результат);

                    Оповещение = Новый ОписаниеОповещения("Подключаемый_ВыполнитьКоманду_Дополнительно", ЭтаФорма, ПараметрыОповещения);

                    ПараметрыФормыВопроса = Новый Структура;

                    ОткрытьФорму("Документ.ПР_ТабельУчетаРабочегоВремени.Форма.ФормаВыборПериода", ПараметрыФормыВопроса, ЭтаФорма, , , , Оповещение);

                    Возврат;

               ИначеЕсли ПараметрыОповещения.Очередь = 3 Тогда

                    Если  Результат = Неопределено Тогда

                         Возврат;

                    КонецЕсли;

                    СохранитьНастройкуПользователяВХранилище("ПР_ПерсональныеНастройки", "ПечатьПериодТабеляС" , Результат.ПериодС );

                    СохранитьНастройкуПользователяВХранилище("ПР_ПерсональныеНастройки", "ПечатьПериодТабеляПо", Результат.ПериодПо);

КонецЕсли;

КонецЕсли;

ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтаФорма, ДополнительныеПараметры.Команда, Объект);

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

Шаг 6

Теперь, в процедуре формирования печатной формы, остаётся получить значения из хранилища с помощью следующего кода:

     ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ПР_ПерсональныеНастройки", "ПечатьГруппыСотрудников" , ПараметрыСеанса.ТекущийПользователь);
     ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ПР_ПерсональныеНастройки", "ПечатьПериодТабеляС"     , ПараметрыСеанса.ТекущийПользователь);
     ОбщегоНазначения.ХранилищеОбщихНастроекУдалить("ПР_ПерсональныеНастройки", "ПечатьПериодТабеляПо"    , ПараметрыСеанса.ТекущийПользователь);

ЗАКЛЮЧЕНИЕ

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

Пользуйтесь. Заходите в гости на страницы с другими моими статьями. До следующих встреч!

Немодальный режим немодальные окна немодальный диалог передача параметров в печать

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    2563    dsdred    16    

59

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5907    dsdred    53    

83

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5861    YA_418728146    25    

68

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6967    dsdred    36    

113

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    19067    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12774    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9393    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6528    sebekerga    54    

95
Оставьте свое сообщение