Рассмотрим такую задачу. Есть сложная форма, с большим количеством реквизитов. Для многих из них в конфигураторе установлено свойство Заполнять из данных заполнения . В результате при открытии этой формы для нового объекта ее реквизиты могут быть заполнены различными начальными значениями. Это зависит и от точки навигации, в которой расположена команда создания нового объекта, и от программного алгоритма, описанного в модуле самого объекта.
Теперь предположим, что в процессе выполнения некоторого программного кода требуется открыть эту форму. Но не «пустую», а так, чтобы ее реквизиты были заполнены теми значениями, которые должны получиться в результате работы всех алгоритмов, заложенных в форму.
Можно было бы получить программный объект формы и затем напрямую установить значения ее реквизитов. Но тогда в этом месте программного кода пришлось бы дублировать весь тот алгоритм, который отвечает за начальное заполнение формы. Это может быть трудоемко, и поддерживать такое решение сложно, т. к. при изменении этого алгоритма его придется менять не в одном месте, в модуле объекта, а синхронно еще в нескольких местах конфигурации. Нет никакой гарантии, что что-то не будет пропущено и что все такие изменения будут работать правильно.
Поэтому существует другой, более удобный и простой способ решения такой задачи.
Открывая форму программно, можно передать ей набор данных заполнения, который она получила бы, если бы открывалась интерактивной командой.
Например, программно нужно открыть форму новой накладной точно так, как если бы она открывалась интерактивной командой из списка накладных, отобранного по поставщику и складу. Предположим, что в переменных СсылкаНаПоставщика и СсылкаНаСклад у нас имеются необходимые ссылки. Тогда можно использовать следующий код:
Данные заполнения можно передать в открываемую форму с помощью параметра ЗначенияЗаполнения . В этот параметр нужно передать те данные, которые передала бы туда платформа, если бы выполнялось аналогичное интерактивное действие.
В нашем случае платформа передала бы в данные заполнения ссылку на поставщика и ссылку на склад, по которым отобран список накладных. Поэтому мы в данные заполнения передаем структуру, содержащую два элемента: для реквизита Поставщик — ссылку на поставщика, а для реквизита Склад — ссылку на склад.
Может встретиться и более сложная ситуация, когда в программном коде необходимо полностью сымитировать интерактивные действия пользователя по созданию нового объекта, не открывая форму этого объекта. В этом случае можно создать программно объект, а затем вызвать его метод Заполнить() . В этом случае платформа выполнит все те же действия и вызовет все те же события, которые она бы вызвала в случае интерактивного создания нового объекта. В метод Заполнить() в качестве параметра метода Заполнить() точно так же можно передать структуру, содержащую данные заполнения:
Продолжаю небольшую серию статей про открытие обычных и управляемых форм различными способами, предыдущая статья была посвящена реализации подбора в управляемом приложении, а сегодня на очереди открытие формы с заполнением.
Открытие формы с заполнением (передача в параметре открываемой формы и реализация метода «ОбработкаЗаполнения()») выполняется одинаково в управляемом и обычном приложении (проверял на платформе 8.3.5.1146 — управляемое приложение и на платформе 8.2.18.102 — обычное приложение).
В том месте кода, откуда нужно сделать открытие и заполнение формы нужно добавить приблизительно такой код:
В структуру «ПараметрыЗаполнения» записываются все нужные для заполнения данные, затем эта структура вставляется в другую структуру под названием «ПараметрыФормы».
Причем ключ, под которым структура «ПараметрыЗаполнения» вставляется в структуру «ПараметрыФормы», должен называться именно «ЗначенияЗаполнения» иначе, ничего не работать не будет.
Далее нужно реализовать событие модуля формы заполняемого объекта — «ОбработкаЗаполнения()». Я для этого использую следующую конструкцию, которая, на мой взгляд, изящно выглядит и позволяет избежать всех возможных ошибок (поправьте, если я ошибаюсь):
Напомню, что метод структуры «Свойство()» проверяет наличие в структуре элементы с именем, указанным в первом параметре и записывает найденное значение во второй параметр — в данном случае это реквизит заполняемого объекта (если элемент с указанным именем в структуре не найден, то во второй параметр записывается «Неопределено»).
На этом все, надеюсь данная статья Вам помогла.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Как при программном открытии заполнять нужные мне реквизиты формы. Форма управляемая.
На клиенте.
ФормаДокумента = ПолучитьФорму(«Документ.Задача.Форма.ФормаДокументаУправляемая»);
ФормаДокумента.Открыть();
- 5
- 4
- 3
- 2
- 1
(0 голосов, в среднем: 0 из 5)
Поддержите нас, расскажите друзьям!
СПРОСИТЕ в комментариях!
У каждой формы есть событие «При открытии», в в этой процедуре и пиши код для заполнения реквизитов формы.
А можно еще передать параметры в открываемую форму:
П = Новый Структура(«ИмяПараметра», ЗначениеПараметра);
ФормаДокумента = ПолучитьФорму(“Документ.Задача.Форма.ФормаДокументаУправляемая”, П);
ФормаДокумента.Открыть();
А на сервере как это сделать не подскажите? Определяю процедуру на сервере, программно создаю документ, записываю его и делаю рекурсию обратно на клиент и там открывают форму… как заполнять не понятно….
При использовании данного сайта, вы подтверждаете свое согласие на использование файлов cookie в соответствии с настоящим уведомлением в отношении данного типа файлов. Если вы не согласны с тем, чтобы мы использовали данный тип файлов, то вы должны соответствующим образом установить настройки вашего браузера или не использовать сайт.
Отправляя любую форму на сайте, вы соглашаетесь с политикой конфиденциальности данного сайта.