1с как задать вопрос пользователю на сервере

Обновлено: 07.07.2024

Хочу в ПослеЗаписи элемента справочника, который выполняется на сервере, задать вопрос пользователю. такой код не фурычит Как его можно задать?

Никак. С сервера низя ничего сделать с клиентом, даже вызвать клиентскую функцию из серверной. Клиент запрашивает - сервер отвечает. Клиент показывает, задает вопросы - сервер вычисляет, делает выборки, движения. И никак иначе. Тогда уж ИЗ серверной :-d

Спросить, создавать-ли договор для этого контрагента

т.е, проверить, есть ли договор, если нет, то спросить? а ты до спроси "нет договора, не угодно ли создать" и передай рез на сервер.

Или разместить вопрос в форме элемента перед записью

Величайшей ошибкой 1с было объединение парадигм тонкого и веб-клиента..

ИМХО, вы переписываете свою нетленку с 8.1 на 8.2? Придётся полностью переделать архитектуру согласно . Сам с этим сталкивался, поправимо.

автоматически создается с директивой НаСервере не понял, строить архитектуру так чтобы пользователю вопросы не задавать после записи элемента?

Вы перепутали: Расширение управляемой формы для объектов (Managed form extension for objects) ПослеЗаписи (AfterWrite) c Расширение формы элемента справочника (Catalog item form extension) ПослеЗаписи (AfterWrite)

Умейте читать, что пишут собеседники. « » х + Спросить, создавать-ли договор для этого контрагента>>

Пез разницы. Позже - даже правильнее. Сам контрагент мог и не записаться.

Я так думаю, что перед тем как начать, ты должен знать что собираешься сделать.

Помоему, ты в суть задачи не въехал. Можешь ее пересказать?

Думаю ты не въехал, ну ответит пользователь - нет, у него останется пустой договор? Ты еще после проведения скажи "Получились отрицательные остатки! Отменить проведение?"

Идет редактирование / создание контрагента. После записи контрагента пользователю еще предлагают "А не хотите еще и договор завести.". Пользователь отвечает - "Нафиг, нафиг, задрали спамеры". Договор не создается. Все счастливы.

Зачем после записи, если он и без него создасться? В другом месте.

Если ситуация такая трудная, что надо спросить пользователя, то почему пользователь должен отвечать только "да". Напоминает известный вопрос для представительниц женской половины человечества, когда правильный ответ "да", но зачем-то надо спросить, а если нет то "не знаю что тогда".

Смотря где он создается. Зачем в ПослеЗаписи? Записал, потом спрашивай.

Зачем каждый раз откуда бы контрагент не создавался задавать вопрос?

Это ты не у меня, это ты у автора спроси. Ему так надо. И - не каждый раз - а только, когда интерактивно, в форме создается. И - не только создается, но и изменяется.

У вас - плохо с коммутацией. Мне - трудно с вами общаться. Попрошу вас - более подробно расписывать ход ваших мыслей.

Потому что, Обычно, в НЕ интерактивном режиме, никаких вопросов - не Задают. За это по рукам табуреткой бьют. Ибо на каждый "неинтерактивный" вопрос есть своя "Групповая обработка справочников и документов"

Помнишь анекдот про прапорщика? Тов. прапорщик я ж вам сразу так и сказал.

С появлением управляемых форм в модулях форм 1С 8.3 стали активно использоваться директивы компиляции в модулях форм и объектов:

Дальше речь пойдет о том, как правильно ими пользоваться и как с их помощью можно оптимизировать работу системы.

Архитектура управляемого приложения 1С 8


Необходимо понимать, как работают управляемые формы в тонком режиме, проще всего представить эту модель в виде веб-сайта: сервер отдельно, клиент отдельно. В момент обращения к форме клиент делает обращение к серверу, и вся работа выполняется на сервере. Клиент (Ваша машина) лишь получает результат работы сервера.

Обратите внимание! Если директива не указана, то по умолчанию она выполняется на сервере.

Особенности компиляции этих директив управляемого приложения

&НаКлиенте

На клиенте есть доступ к следующим объектам:

  • методы глобального контекста, у которых есть доступ на клиент (доступные директивы можно увидеть в синтаксис-помощнике); , которые скомпилированы на сервере;
  • локальный контекст модуля;
  • свойства и методы расширения формы, определяемого основным реквизитом;
  • свойства и методы объекта встроенного языка УправляемаяФорма;
  • реквизиты формы.

&НаСервере

Выполняется на сервере, переменные существуют только на время серверного вызова. С сервера допустим вызов практически любых процедур, кроме клиентских. Если работа происходит в режиме тонкого клиента, вся работа происходит на сервере, а клиент получает лишь результат выполнения.

&НаСервереБезКонтекста

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

Это процедура выполняется на сервере, вне контекста формы. Т.е. процедура не имеет доступа к реквизитам формы, выполняется на сервере и возвращает желаемый результат. Хорошо подходит для получения статичных данных. Крайне рекомендуется к использованию для оптимизации клиент-серверного взаимодействия.

&НаКлиентеНаСервереБезКонтекста

Используется, когда к процедуре нужно обращаться и с клиента, и с сервера. В остальном аналог &НаСервереБезКонтекста.

Оптимизация клиент-серверного взаимодействия

При разработке функционала необходимо учитывать следующие нехитрые правила:

  • в первую очередь минимизировать количество северных вызовов 1С с клиента;
  • производить все объемные вычисления на сервере;
  • там, где можно, использовать НаСервереБезКонтекста вместо НаСервере.

На клиенте на сервере

Немного теории о стороне выполнения кода. При работе 1С в режиме клиент-сервера, запускается несколько процессов. На компьютере пользователя запускается 1cv8.exe, на сервере 1С запускается rphost.exe, rmngr.exe и ragent.exe.

ragent.exe

Приложение ragent.exe это по сути и есть наша служба агента 1С, которую мы можем посмотреть в списке служб Windows. Данное приложение отвечает за запуск всех остальных приложений и за распределение нагрузки между рабочими rphost.

rphost.exe

Рабочих процессов может быть несколько. В версии платформы 8.2 их можно было создавать вручную. В версии 8.3 на их количество можно повлиять косвенно, увеличив количество сеансов или информационных баз на один рабочий процесс в свойствах рабочего сервера.

Количество ИБ на процесс rphost

rmngr.exe

В общем случае данное приложение отвечает за выполнение регламентных заданий.

Сторона выполнения кода

После того, как мы в общих чертах описали приложения, выполняющиеся на сервере, перейдем к описанию директив препроцессора, т.е. тех самых &НаКлиенте, &НаСервере. В зависимости от того, на какой стороне выполняется код, мы имеем доступ к файлам либо пользовательского компьютера, либо к файлам на сервере. При этом очень важно понимать, что код &НаКлиенте выполняется с правами пользователя, запустившего 1С. Код &НаСервере выполняется с правами пользователя, под которым запущена служба агента 1С. Как правило, это пользователь USR1CV8, если никто этого не поменял.

&НаКлиенте

Код выполняется на том компьютере, за которым сидит пользователь и под теми правами, которые есть у пользователя. Файлы, созданные в процедурах &НаКлиенте будут созданы на пользовательском компьютере. Есть множество ограничений выполнения кода &НаКлиенте, например, здесь нельзя обращаться к СУБД. Это значит нельзя использовать как прямое создание запроса, так и косвенный запрос при обращении к ссылке через точку. Компьютер клиента может быть медленнее сервера, это следует учитывать при написании кода.

&НаСервере

Код выполняется на сервере 1С, в процессе rphost. Файлы, созданные в процедурах &НаСервере, будут сохранены на сервере и смогут быть записаны только в те папки, на которые у пользователя службы агента 1С есть доступ на запись. &НаСервере уже можно свободно писать запросы, обращаться к предопределенным данным и к реквизитам ссылки через точку.

&НаСервереБезКонтекста

Это самый интересный вариант, разберемся для начала, что такое контекст формы. Управляемая форма представляется на уровне платформы в виде XML файла описания расположения элементов и значения реквизитов формы. Соответственно, чем больше элементов на форме и чем больше данных хранится в реквизитах формы, тем больше будет контекст.

При вызове процедуры без контекста, процедура не видит реквизитов формы и не может к ним обращаться ни для чтения, ни для изменения.

И вот здесь нам как раз может помочь директива &НаСервереБезКонтекста.

В данном примере произойдет следующее: описание формы, таблица значений с 100000 строк и реквизит1 будут преобразованы в XML, отправлены на сервер. На сервере будет выполнен небольшой неявный запрос к СУБД, в значение реквизит1 будет записан результат этого запроса, все данные опять преобразуются в XML и отправятся на сервер. Учитывая, что таблица значений очень большая, то получится, что мы большой объем данных дважды в холостую передали между клиентом и сервером. Это не оптимально.

Во втором примере мы не стали передавать контекст формы, в итоге произошла только передача ссылки на элемент перечисления с сервера на клиент.

Важно понимать, сколько данных будет передано в холостую, а сколько полезно. Например, если нам нужно заполнить нашу таблицу значения, то есть самый тяжелый элемент формы, то целесообразней будет не усложнять код обходом передачи контекста, а просто передать контекст через &НаСервере.

Пример 3, предположим, у нас есть название для перечисления, которое хранится в реквизите Реквизит2, мы можем его передать в качестве параметра функции:

Ну и напоследок еще один пример, как делать не надо:

Если мы в качестве параметра передаем ЭтаФорма, то по факту мы внеконтекстный вызов превращаем в контекстный. Если без этого не обойтись, то стоит делать контекстный вызов.

Читайте также: