6. Объектная модель прикладного решения
#62

Готовишься к экзамену?

Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.

Перейти в бота

При доработке автоматического заполнения документа «Ведомость в кассу» (кнопка «Заполнить») в модуле управляемой формы: как в 1С определяется, где будет выполняться код процедур и функций (на клиенте или на сервере)?

Код модуля управляемой формы всегда выполняется только на компьютере пользователя (клиент)
Неправильно: в модуле управляемой формы могут быть как клиентские, так и серверные процедуры/функции; это нужно, потому что часть логики относится к интерфейсу, а получение данных для заполнения ведомости обычно требует обращения к базе.
Код модуля управляемой формы всегда выполняется только на сервере
Неправильно: обработчики действий пользователя (например, нажатие кнопок формы) относятся к клиентскому контексту, а сервер используется для работы с данными; модуль формы не «целиком серверный».
Место выполнения задаётся одной общей настройкой для всего модуля формы
Неправильно: у модуля управляемой формы нет единственного режима выполнения «для всего текста»; разные методы одного и того же модуля могут исполняться в разных контекстах.
Место выполнения задаётся отдельно для каждой процедуры и функции с помощью директив перед их описанием
Правильно: в модуле управляемой формы контекст выполнения определяется на уровне каждой процедуры/функции директивами (например, клиент/сервер/сервер без контекста), которые указываются непосредственно перед описанием метода.
Зависит от того, какие объекты встроенного языка используются в алгоритме
Неправильно: используемые объекты действительно накладывают ограничения (например, прямой доступ к данным обычно требует серверного выполнения), но «где выполняться» метод будет определяет именно директива у процедуры/функции; если директива не соответствует используемым объектам, это приводит к ошибкам разработки/выполнения, а не к автоматическому выбору места исполнения.

Пояснение

Как это применять к автоматическому заполнению «Ведомости в кассу» 1) Почему важно разделять клиент и сервер Автозаполнение ведомости почти всегда связано с чтением данных из информационной базы (суммы к выплате, список сотрудников, отборы по периоду/виду выплаты/организации). Такие операции логично выполнять на сервере, чтобы не перегружать клиент и не таскать лишние данные туда-сюда. 2) Как обычно устроен механизм «Заполнить» в управляемой форме • На клиенте: срабатывает обработчик нажатия команды «Заполнить» (это реакция интерфейса). • На сервере: выполняется основная часть расчёта/подбора данных для строк ведомости (запросы, анализ остатков/начислений, подготовка набора строк). • Возврат на клиент: форма получает подготовленные данные и отражает их в табличной части. 3) Чем отличаются серверные режимы и когда они уместны • Серверный метод «с контекстом формы» удобен, когда нужно работать с данными формы/объекта документа (например, брать реквизиты текущей ведомости и сразу наполнять её табличную часть). • Серверный метод «без контекста формы» полезен, когда можно передать на сервер только нужные параметры (организация, период, вид выплаты) и получить обратно уже готовый результат. Это снижает объём передаваемых данных и обычно ускоряет заполнение. 4) Практические признаки правильного разбиения • Всё, что связано с интерфейсом (сообщения пользователю, реакции на события формы, включение/выключение элементов) - размещают в клиентских процедурах. • Всё, что связано с получением данных и подготовкой строк «Ведомости в кассу» (запросы, расчёт сумм к выплате, отбор по способу выплаты сотрудника, подготовка таблицы строк) - уводят в серверные процедуры/функции. 5) Типовая причина ошибок у новичков Если попытаться выполнять подбор сотрудников и сумм «как есть» в клиентской процедуре, часто возникают проблемы, потому что доступ к данным и тяжёлые операции должны выполняться на серверной стороне. Правильный подход - оставить на клиенте только запуск команды, а наполнение табличной части (или формирование набора строк) выполнять серверным методом, выбранным через директиву перед процедурой/функцией. Итог: чтобы корректно и производительно реализовать автозаполнение «Ведомости в кассу», место исполнения нужно задавать не «в целом для модуля», а точечно - перед каждой процедурой и функцией, разделяя интерфейсные действия и работу с данными.