Редактирование обычной формы НаКлиенте НаСервере
(3) частичный перевод на УФ в данном случае не поможет. Эффект будет только в тонком клиенте, а он не работает с ОФ.
А в толстом клиенте даже УФ выполняются полностью на клиенте.
Но опять же, все зависит от операций, которые необходимо делать.
(2) Переписывать все на УФ никто не будет. Переход будет постепенный. А редактировать формы надо сейчас. Как вариант, выполнять не имеющие прямого обращения к форме и затратные по времени операции в общем модуле на сервере.
По поводу управляемых форм тоже не совсем понятно. Получить форму на сервере нельзя, передать тоже, какие-то изменения свойств требует обращения на сервер. Но сформировать/отредактировать управляемую форму на сервере так, чтобы на клиенте только результат (т.е. саму форму) показать не получится? Как правильно редактировать управляемые формы тогда, подскажите, пожалуйста?
(3) частичный перевод на УФ в данном случае не поможет. Эффект будет только в тонком клиенте, а он не работает с ОФ.
А в толстом клиенте даже УФ выполняются полностью на клиенте.
Но опять же, все зависит от операций, которые необходимо делать.
(6) на УФ существует два разных контекста формы. Серверный и клиентский. Сначала форма строится на сервере. Создание формы УФ это декларативный принцип. После создания серверного контекста формы выполняется серверная процедура модуля формы ПриСозданииНаСервере. В ней можно внести коррективы в созданную форму, в том числе перестроить программно.
Затем серверный контекст формы сериализуется и передается на клиента. Где строится клиентский контекст формы, который заполняется полученными данными с сервера. Серверный контекст формы в этот момент удаляется.
В последующем, при каждом серверном вызове в модуле формы с клиента, происходит сериализация клиентского контекста формы и создание серверного контекста формы, с последующем заполнением полученных данных. Поэтому и не рекомендуются частые контекстные серверные вызовы.
Все это работает полноценно на тонком клиенте. В толстом клиенте последовательность в основном та жа, но все выполняется на клиенте.
Как передать форму на сервер
На клиенте нужно создать документ и заполнить его.
Проблема в том что заполнением занимается серверная процедура в которую передается форма этого документа.
Т.е. с клиента вызываю серверную процедуру которая создает документ, далее если там же попытаться получить форму чтобы её передать в другую процедуру получаю ошибку «Интерактивные операции недоступны».
Пошел по другому пути, возвращаю с сервера ссылку на клиент, пытаюсь по ней ПолучитьФорму выходит ошибка «метод объекта не обнаружен».
Как правильно сделать?
(2) Xershi, мне не нужно открывать форму, создал документ, заполнил, записал и забыл.
Можно поподробнее что и где делать?
P.S. платформу да, обновил до 1933.
(6) sssss_aaaaa_2011, для начала вам нужно построить атомный реактор, а потом элементарно включаете вилку в розетку
Ну а если без шуток, то процедура довольно сложная, вызывается из формы документа, переделать-то конечно можно всё, но хочется малой кровью.
Сейчас просто мне важно понять или я не правильно что-то делаю и не могу получить что мне надо, или же это принципиально не возможно и надо искать другое решение.
В общем касаемо моей задачи. Вижу тут много без меня копий поломали
Я приводил конкретный документ который мне необходимо заполнять, приводил название типовой конфигурации, если на самом деле кому интересен код можете глянуть, его не так уж и много. не моя как говорится идея делать такое заполнение документа, пользуюсь тем что есть.
Вот как выглядит вызов из формы документа УчетРабочегоВремениРасширенныйФормы.ТабельЗаполнитьСотрудникамиОрганизации(ЭтаФорма);
ну и далее в общем модуле ТабельЗаполнитьСтрокиПоСотруднику()
На самом деле можно изменить часть процедур(ы), по тексту видно что через форму идет обращение непосредственно к объекту (Форма.Объект), но есть и обращение к реквизитам формы, которых нет у объекта.
Резюме. Писать новую свою процедуру заполнения (с выкидыванием заполнения реквизитов формы) на основании типовой я посчитал нецелесообразным, поэтому решение задачи в таком виде прекратил.
[ Наглядно о непонятном ] – Как работает серверный вызов в 1С
В этой статье мы покажем, как взаимодействуют клиентская и серверная части платформы и какие есть особенности в использовании директив компиляции.
Это будет полезно начинающим разработчикам и тем, у кого есть пробелы в области клиент-серверного взаимодействия – всё объясним «на пальцах»
Клиент-серверная архитектура заложена в платформе изначально – со времен «1С:Предприятие 8.0».
Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере.
Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере – другой. Клиент и сервер «общаются» между собой с помощью серверного вызова.
Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.
Немного базовой теории
Перед тем, как перейти к содержательной части, договоримся о некоторых ограничениях:
Далее, освежим в памяти немного теории.
Директивы, в имени которых упоминается «Клиент», устанавливают ограничение на обращение к базе данных.
Процедуры или функции, написанные под директивой «Без контекста», не имеют доступа к контексту (данным) формы. Исходя из этой информации, легко представить ограничения директив по доступу к данным в виде следующей таблицы:
Директива | Данные формы | База данных |
&НаКлиенте | + | – |
&НаСервере | + | + |
&НаСервереБезКонтекста | – | + |
&НаКлиентеНаСервереБезКонтекста | – | – |
Опережая вопрос «Для чего же директива с самым длинным названием, если она ограничивает и использование контекста форм, и обращения к базе данных?», напомню: любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.
Отсюда делаем вывод: у методов, описанных под директивой «&НаКлиентеНаСервереБезКонтекста», единственным источником данных являются эти самые переданные параметры.
Не стоит забывать и про доступность вызова одних процедур и функций из других. Для этого стоит запомнить, что можно вызывать только те процедуры и функции, которые находятся под одноимённой (с родительским методом) директивой или под директивой, находящейся ниже (чем у родительского метода) согласно списку:
То есть из метода, описанного под директивой «&НаКлиенте», можно вызывать процедуры и функции, описанные под любой директивой. А вот «из-под» директивы «&НаСервереБезКонтекста» можно вызывать только то, что описано под директивой «&НаСервереБезКонтекста» или «&НаКлиентеНаСервереБезКонтекста».
Теперь про серверный вызов
Серверный вызов – это передача какой-то информации с клиентской части «1С:Предприятие 8» на серверную часть с целью вернуть обратно некий набор данных.
Самый первый серверный вызов инициализируется в момент начала сеанса работы 1С. То есть когда пользователь выполняет вход в информационную базу:
«Оу! При чём тут Библиотека?!» – спросите Вы.
Обратите внимание, что доступ к базе данных есть только на серверной части, а соединение между клиентом и сервером имеет ограниченную пропускную способность. Это и неудивительно – ведь соединение между клиентской и серверной частью может быть установлено даже по нестабильному низкоскоростному каналу связи (например, посредством мобильного интернета).
Кроме этого, передача данных между клиентом и сервером возможна только посредством серверного вызова.
Но, для того чтобы перейти к основной теме данной статьи, необходимо сначала разобраться – где будет выполняться программный код, написанный под определенными директивами. То есть на какой части приложения «1С:Предприятие 8» будут доступны процедуры и функции, описанные под директивами «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста»:
Видим, что на стороне клиента у нас будут доступны процедуры и функции, написанные под двумя директивами из четырёх, а на стороне сервера – под тремя из четырёх.
Сразу возникают вопросы: «Зачем такое многообразие и чем оно полезно?», «Как метод, описанный под директивой «&НаКлиентеНаСервереБезКонтекста» может выполняться и на клиенте, и на сервере?».
Сейчас мы постараемся понять особенности работы системы при использовании директив и почему необходимо уметь правильно использовать каждую из существующих директив компиляции.
И в этом нам помогут наши новые друзья, знакомьтесь!
Итак, давайте рассмотрим несколько особенностей работы программного кода в «1С:Предприятие 8», написанного под разными директивами.
Действие 1. Открытие пользователем формы с данными.
Действие 2. Получение из открытой Пользователем формы дополнительных данных из Базы данных.
Получение этих данных может быть описано под двумя директивами – «&НаСервере» и «&НаСервереБезКонтекста». Рассмотрим оба случая.
Явление 1. Директива «&НаСервере»
После выполнения метода на сервере, весь этот «пакет» транспортируется обратно. Таким образом, форма со всеми элементами и данными дважды проходит через самое узкое место системы.
Явление 2. Директива «&НаСервереБезКонтекста»
Таким образом, серверный вызов не несёт лишней нагрузки, и для передачи данных между клиентом и сервером потребуется меньше ресурсов.
Из примеров видно, что далеко не всегда оправдано указание директивы компиляции «&НаСервере» с точки зрения использования контекста (данных) формы на сервере.
Если возможно решить возникшую задачу путём отправки на сервер только определённого набора данных, то надо эту возможность использовать и описывать метод под директивой «&НаСервереБезКонтекста». Это позволит уменьшить нагрузку на серверный вызов, а также не занимать сервер обработкой и хранением ненужной в текущий момент информации.
До этого момента при каждом изменении свойства «Видимость» происходил серверный вызов, как при использовании директивы «&НаСервере».
Но использование директивы «&НаСервереБезКонтекста» не является панацеей. Помимо нагрузки на серверный вызов, всегда необходимо задумываться ещё над одним параметром.
Действие 3. Обработка данных табличной части формы с получением дополнительной информации из Базы данных.
Явление 1. Построчная обработка табличной части на стороне клиента с организацией серверного вызова для получения дополнительной информации из базы данных.
Мы уже знаем – лучше использовать директиву «&НаСервереБезКонтекста».
Явление 2. Предварительная обработка табличной части на стороне клиента с целью подготовки требуемых к обработке на сервере данных и «упаковки» их в набор параметров. Затем передача этого набора на сервер для получения дополнительной информации из базы данных.
Используем всё ту же директиву «&НаСервереБезКонтекста».
Большое количество текущих серверных вызовов может свидетельствовать о неоптимальном программном коде.
Избегайте создания серверных вызовов внутри цикла. Подготовьте набор параметров и единожды выполните его передачу для обработки на сервер. Если предполагается сложная обработка большого количества данных формы – передайте её полностью на сервер (при помощи директивы «&НаСервере») и выполните все действия на стороне сервера.
С директивой «&НаСервереБезКонтекста» вроде бы разобрались. Она нужна для того, чтобы уменьшить объем информации, передаваемой в рамках одного серверного вызова. Дополнительно разобрались с количеством текущих серверных вызовов – необходимо стремиться к их минимизации.
Давайте теперь попробуем разобраться, для чего нужна директива «&НаКлиентеНаСервереБезКонтекста».
Действие 4. Выполнение обработки данных.
Когда предполагается выполнение одной и той же обработки данных из нескольких участков программного кода, разумно этот код поместить в самостоятельную процедуру или функцию. Остаётся только решить, под какой директивой её написать.
Та-дам!
Для копирования у нас есть ксерокс. Но куда его поставить? На сторону клиента или сервера? Под какой директивой его разместить?
Как было озвучено ранее – любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.
Давайте для начала попробуем разместить копировальный аппарат на стороне клиента. Для этого описываем процедуру или функцию «Ксерокс» под директивой «&НаКлиенте». Тогда процесс клиентской части в любой момент сможет без проблем обратиться к ней и все действия будут выполнены в соответствии с программным кодом.
Но что произойдёт, если потребность в копировании возникнет на стороне сервера? Например, для подготовки данных, передаваемых на сторону клиента, потребуется сделать копию? Напомню – процесс серверной части не имеет возможности самостоятельно инициировать клиентские вызовы.
Получается, что использовать директиву «&НаКлиенте» неправильно, а директиву «&НаСервере», как мы изучили ранее – нежелательно. Давайте посмотрим поведение системы при использовании директивы «&НаСервереБезКонтекста».
Вроде бы результат достигнут – и с сервера, и с клиента доступно копирование. Но для того, чтобы получить копию данных, используемых на клиенте, приходится делать серверный вызов. А это опять ведет к лишней нагрузке на соединение и временным затратам.
Избавиться от излишней передачи на сервер при сохранении возможности копирования на клиенте и на сервере можно при помощи директивы «&НаКлиентеНаСервереБезКонтекста».
Не углубляясь в детали, отметим, что метод, описанный под данной директивой управления, создаётся в двух копиях – и на стороне клиента, и на стороне сервера. Это позволяет выполнить необходимые действия там, где появилась потребность в них (клиент/сервер), без лишних серверных вызовов.
С точки зрения выполнения программы результат будет одинаков. Но объяснение «почему так не надо делать» – это уже совершенно другая тема…
Вместо заключения
В данной статье мы на наглядных примерах рассмотрели влияние различных директив компиляции на такое явление системы «1С:Предприятие 8», как серверный вызов. Как видно, основная причина для выбора правильной директивы – производительность транспортировки данных между клиентской и серверной частью.
Придерживайтесь при разработке следующих правил:
Учитывайте потребность в доступности тех или иных видов данных, обоснованность передачи управления и не стесняйтесь при необходимости дробить процедуры и функции. И будет Вашему серверному вызову всегда легко, а Вы от пользователей Вашей программы получите «молчаливую благодарность»!
Программист Иван при доработке 1С на своём предприятии сделал ошибку в выборе директивы компиляции. Из-за неё длительность одного из серверных вызовов была больше возможной на полсекунды.
Пользователей, применяющих этот функционал, – 25 человек, и каждый из них за рабочий день в среднем совершает 110 таких операций. Всего впустую за рабочий месяц потрачено 28875 секунд (21 рабочий день * 25 человек * 110 операций * 0,5 секунды) = 8,02 часов.
Иван, каково тебе осознавать, что за месяц ты задолжал своему предприятию целый рабочий день?
Об авторе
Автор статьи – Павел Ванин
Обычные и управляемые формы
Для примера давай возьмем конфигурацию, в которой разрешено использование управляемых форм в обычном приложении. В ней есть справочник, у которого все формы управляемые, и общая форма констант, которая обычная.
Какой сценарий приводит к состоянию «в обычных формах на сервере»?
(24) > мы оказались на сервере в обычных формах, через общий модуль
Еще раз. Что означает «оказались на сервере в обычных формах»?
Мы передали управление на сервер путем вызова метода модуля у которого установлены только галки «сервер» и «вызов сервера»? Ну все, нет никакого клиента и соответственно никакого различия в доступности.
Описание:
Используется для доступа к свойствам, методам и событиям формы в целом, а также к коллекции ее элементов управления. Доступ к свойствам, методам формы из ее собственного модуля осуществляется непосредственно, используя их имена (без ссылки на какой-либо объект).
Доступность:
Толстый клиент.
Описание:
Используется для доступа к свойствам, методам и событиям формы клиентского приложения в целом, а также к коллекции ее элементов управления. Доступ к свойствам, методам формы клиентского приложения из ее собственного модуля осуществляется непосредственно, используя их имена (без ссылки на какой-либо объект).
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, СЕРВЕР, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер).
(28) > СЕРВЕР
Вот, мякотка начинается.
Однако, согласно заданию от ТС, «мы оказались на сервере в обычных формах, через общий модуль или фоновое задание». Так что никакого контекстного вызова, извини, думай дальше.
«Задан конкретный вопрос, ты же бред какой-то несёшь», (С) JUST4LOL, Обычные и управляемые формы
Но вообще впечателение, что это и правда вопросы с собеседований. Или кто-то его, или он кого-то.
Перехожу на обычные формы
Перехожу на обычные формы. Точнее в работе буду использовать обычные формы. Но по ним инфы меньше, чем по управляемым. Поэтому разбираюсь с обычными.
Правильно, ли я понял, что в ОФ все, что напишу в модуле формы будет выполняться на клиентской машине(на компе пользователя, кто открывает форму)?
Таким образом, например, клиентская машина получает инфу из БД и работает с ней.
ПС. Просьба не писать, что в ОФ никто не работает, и закапывать. Я знаю
Код в Обычном приложении можно явно загнать на сервер при вызове:
— из фоновых заданий
— из общего модуля с признаком Привилегированный
(0) > в работе буду использовать обычные формы. Но по ним инфы меньше, чем по управляемым
По обычным формам есть курсы:
Занятие 1. Общие принципы работы с обычными формами
2. «Сравнение обычных и управляемых форм – Гилев» (68 уроков в видео). Могу дать содержание, но оно слишком большое.
(10) > Но где код выполняется. На сервере? На клиенте? Или гоняется тула сюда и хз где он)))
Вот неплохая статья и комментарии к ним: «[Наглядно о непонятном] – Как работает серверный вызов в 1С» ( https://курсы-по-1с.рф/news/2017-03-09-how-server-call-works/ )
(56) > Эх. Код от платформы раздобыть бы.
Дешевле написать самому (для аналога 1С77). Причем, сразу 64-битный вариант, с нормальным движком БД, типа SQLite, на интерфейсе от WTL / ATL (есть и другие фреймворки, но эти мне нравятся больше).
Можно не заморачиваться созданием скриптового языка, а использовать для этих целей С++. Вся бизнес-логика должна быть на плагинах (истинная модульность!), для которых должен быть опубликован соответствующий SDK.
Как для меня, то основное ограничение «семерки», это слабый движок БД и ограниченные по возможностям формы диалогов и обработок (отчетов). Ради дополнительных возможностей народ юзает Формекс, 1С++ и тому подобные компоненты.
Но можно сделать универсальные формы элементов на базе компонентов типа «PropertyGrid», «EmbeddedExcel» (причем не требующие наличия самого эксела) и, так называемые, ленточные формы (похожие на «телеграммные» диалоги). Тогда не придется тратить кучу времени на создание красивых формочек (вот почему встречаются, в основном, уродливые формы), сделал декларативное описание (по типу УФ, только явно) и вуа-ля! Дешево и сердито!
Систему печати взять опенсорсную. Ориентация работы на РИБ, Терминал-Сервер либо RDP. Это не претендует на замену УФ «восьмерки», но для малых предприятий самое оно. Будет почти бесплатно!
P.S. Это примерно то, над чем я сейчас работаю.
(69) > «Обычный и управляемый интерфейс – Комаров» Не нашел. Гилева думаю хватит на начало
Где на торрентах были ссылки на мегатонную документацию по 1С. Там и был этот курс. Заодно можно найти и курс Гилева на сотни часов по УПП и много чего еще. Сейчас точные линки не сохранились.
(72) > А вообще люди на УФ квартиру покупают дорогие и машины.
«Магазька» себе на обычных формах 1С82 заработал, по его словам, на квартиру и машину в Москве. Так что УФ не панацея. Тем более, что 1С как был ограниченным по возможностям в 1С77, так и остался таким же на 1С83, самой последней версии, хоть в УФ, хоть в ОФ.
Ничто не мешает расширять возможности 1С через внешние компоненты. Например, обычные формы можно сделать «красивее» управляемых, так как возможностей по их тюнингу больше, но делать это труднее, чем в управляемых формах. Поэтому и нет нигде красивой реализации обычного интерфейса в 1С. Даже у «Магазьки». Но он критику отвергает, мол, юзверям это не надо. Согласен, не надо. Но приятней поддерживать собственную конфигурацию на красивых формах, а не на убогих, типа общепринятых.
В связи с этим автор топика может поменять свое отношение к ОФ, со временем. Вряд ли ему будет по приколу возиться подолгу с каждой формой элемента либо обработки (отчета), чтобы они выглядели профессионально и симпатично. Скажем, в «зарплате», делать учет рабочего времени менее удобно, чем в Экселе, в силу недостатка выразительных средств. Но если создать свой компонент по типу «Embedded Excel» (по которому есть готовый опенсорс, не требующий самого Эксела), то из табличных форм можно делать «конфетки», чего никогда не достигнешь на УФ. А есть еще, как я уже писал, ленточные формы и «Property Grid», для которых тоже достаточно опенсорса, всего то нужно реализовать их в соответствующей ВК для 1С. Кстати, это будет работать не только в ОФ, но и УФ. Над этим я тоже работаю.