19 апреля, 2024

Из формы на сервер и обратно

naklienteКазалось-бы, простая задача – в строке документа есть несколько реквизитов: Артикул, Вес, Размер, при изменении которых они должны сохраняться в реквизитах справочника, элемент которого выбран в этой-же строке. Т.е. получается, что пользователь не редактирует элемент справочника, а система это делает за него. Всё было-бы просто, если бы речь не шла об 1С версии 8.2, и вот почему – в 8.2 операции записи элементов могут выполняться только на сервере и не могут выполняться в форме, открытой на клиенте.

Вызов сервера я разделил на два этапа: сначала вызывается серверная процедура, описанная непосредственно в модуле формы, затем в ней вызывается процедура общего модуля для которого установлен признак исполнения на сервере. При передаче управления в модуль на сервере данные формы нельзя просто вставить в переменную и отправить в процедуру, если речь идет про объект, т.е. к примеру контекст текущего документа. Напомню, что сама форма исполняется не в контексте документа, его реквизиты доступны через реквизит формы “Объект”, теперь, если этот контекст нужно передать на сервер его нужно сделать прикладным объектом с помощью функции РеквизитФормыВЗначение(). После обработки этого объекта на сервере его можно вернуть с помощью функции ЗначениеВРеквизитФормы(). Всё это выглядит примерно так:

zapolnitsvoistvatovara

Это текст процедуры в модуле формы документа, ФормированиеТоваров – имя общего модуля с установленным признаком “Сервер”. В процедуре СформироватьТоварВПриходе() производятся изменения и запись в элемент справочника Товары, измененный элемент помещается в строку документа.

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