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