Стоит задача создать (модифицировать) из внешней обработки запись (объект) приходного ордера (пример). Не хочу повторять логику работы документа (его бизнес логику). У формы приходного ордера уже есть свои обработчики формы и обработчики полей формы.
Как их запускать в 1С из внешней обработки?
Работал на другой платформе - там поступали просто:
1. Создавали экземпляр формы
2. В объект экземпляра формы записывали данные (последовательно по полям)
3. На поля запускали обработчики прямо из экземпляра класса формы - (экземпляр формы).обработчик
Это позволяло глубоко не лезть в бизнес логику и не отслеживать изменение кода обработчиков событий этой формы.
(1) Насколько я знаю, можно. Кстати, здесь (на инфостарте) попадалась статья, как использовать экземпляр формы. Тут только один нюанс: форма документа работает с объектом, который не связан с объектом данных. Т.е. здесь надо копировать данные формы.
(3) Для разрешения коллизии объект формы-объект данных существует специальная обработка ПриСчитыванииНаСервере (не помню ее точное название). Сужу по аналогии с тем с чем имел дело (не 1С) - там для бланка редактора записи есть обработчик события ПриСчитывании, который фактически в экземпляр формы переносит объект записи и заполняет все элементы формы... А в составе свойств экземпляра формы записывается свойство Record, содержащее ссылку на объект записи
1с и ООП это противоположные концы Вселенной. Никаких шансов. Все эти обработчики переписываешь в свою обработку, плюс все глобальные обработчики туда же, заменяя в них форму-параметр данными...
Тут есть важный нюанс, речь об обычных формах или управляемых?
1. Обычные формы. Без проблем создаете объект, заполняете поля, вызываете обработчики изменения данных (как правило они в экспортном виде либо самом объекте/менеджере, либо в общих модулях)
2. Управляемые формы. Внешняя обработка исполняется на клиенте. С танцем бубном и кузькиной матью все решаемо.
3. Управляемые формы. Внешняя обработка исполняется на сервере. Без шансов. Для сервера не существует кода помеченного как исполняемый на клиенте.
Проблема, думается, вовсе не в копировании данных формы – это не сложно, просто открываем форму, указывая в параметрах ключ (ссылку на объект) и после открытия нам доступен объект формы на клиенте. То есть работаем с объектом открытой формы только на клиенте (попутно, конечно можем получать необходимые данные для заполнения с сервера). Проблема в вызове обработчиков полей ввода и таблиц. Есть древняя тема https://infostart.ru/1c/articles/16985/ посвященная этой задаче. Но с тех пор много воды утекло. Вроде бы для того, чтобы обработчики вызывались, форма должна быть обязательно открыта, а не только получена. Гарантии, что это будет работать должным образом, нет.
По идее форма должна быть создана только в виде экземпляра из класса формы, открывать (я так понимаю что подразумевается открыть на экране) совершенно для этого не нужно. Есть ли в 1С возможность создать форму, но не открыть, и при обращении экземплярФормы.МетодОбработки исполнить этот метод с объектными данными экземпляра формы... Да, этот подход будет не быстр, но на небольших объемах корректировок базы позволил бы проводить корректировки без глубокого анализа бизнес логики данных...
Есть ли в 1С возможность создать форму, но не открыть, и при обращении экземплярФормы.МетодОбработки исполнить этот метод с объектными данными экземпляра формы
Да, при условии, что процедура обработчика будет клиентской и экспортной. Но на практике такое встречается крайне редко.
В 1С на клиенте есть 2 глобальных метода ОткрытьФорму и ПолучитьФорму. Первый получает и открывает форму "на экране", второй – только получает. Между ними нет особой разницы и в быстродействии вы не сильно потеряете, если откроете форму.
Да, при условии, что процедура обработчика будет клиентской и экспортной.
Не понимаю - это ограничение 1С? Если я получил экземпляр формы с загруженными в нее объектными данными, то обращаясь к методу этого экземпляра формы как ЭкзеплярФоры.Метод я же не обращаюсь к методу извне - я же исполняю метод ВНУТРИ экземпляра формы. Зачем мне Экспорт на данном методе? Или 1С так не умеет?
(10) Если честно, я не знаю почему так. Контекст формы объекта является внешним по отношению к контексту формы обработки, если можно так сказать, поэтому для вызова ее процедур, нужно чтобы они были экспортными. До какой-то версии платформы, кстати, можно было вызывать серверные неэкспортные процедуры произвольной формы. Наверно это такая концепция безопасности – только сама форма решает, что из ее методов можно запускать извне.
Теория и то как работает в иной системе в которой был опыт работы. У нас есть контекст (экземпляр) формы документа и контекст формы обработки. Понятно что обмен между ними не возможен если свойства или методы данного экземпляра формы документа не описаны как внешние (как экспорт). Обмен в данном варианте (нет внешних ) возможен только путем модификации объекта записи который создает форма в своем описании (запись базы данных) - считали объект записи в обработку и засунули его назад в базу. Далее обработка просто передает управление объекту формы документа и уже форма документа сама внутри себя обрабатывает свои методы использую данные объекта записи и свои внутренние свойства.
Ладно, в принципе пока оставлю все это... Думал будет проще...