Как передать на сервер форму клиентского приложения
Общие модули содержат общие алгоритмы, которые могут вызываться из других модулей.
Опции Общего модуля
Вызов метода общего модуля
Вызов методов общего модуля из других модулей возможен, если они были определены экспортными и область компиляции метода соответствует вызывающему методу. Пример непосредственного вызова метода общего модуля:
Пример косвенного вызова метода общего модуля:
- присутствует у Справочников, Документов, Отчетов, Обработок, ПВХ
- отсутствует у Констант, Перечислений, Журналов, Внешних источников данных
- у Регистров аналогичную роль выполняет Модуль Записи
- переменные объявленные как Экспорт доступны у объекта как реквизиты <объект>.<Переменная>, но в отличие от реквизита она не сохраняется при записи
- процедуры и функции описанные как Экспорт доступны у объекта как методы <объект>.<Процедура>(<параметры>)
- по неизвестной причине доступ к переменным и методам у Обработок не действует
Примеры
Пример описания переменной, конструктора объекта, экспортной функции и пример вызова:
ДанныеИсточника = ИсточникОбъект . ЭкспортнаяФункция ( ) ;Модуль предназначен для описания общих статических процедур и функций применимых к прикладному типу без контекста отдельного элемента семейства. Модуль менеджера похож на Общий модуль, но инкапсулирован в своем прикладном типе.
- присутствует у Справочников, Документов, Журналов, Перечислений, Отчетов, Обработок, ПВХ, Регистров, Бизнес-процессов, Задач
- отсутствует у Внешних источников данных
- доступность обеспечивается только из модулей на Сервере
- могут при необходимости получить объект или ссылку в параметре вызова
Примеры
Пример описания статической экспортной функции и ее вызов из другого модуля , где эти типы доступны (на Сервере). :
ДанныеИсточника = Справочники . Источник . ЭкспортнаяФункция ( ) ;Очень похож на Общий модуль, но инкапсулирован в форму, поэтому ему доступны реквизиты данных, реквизиты формы, элементы формы и статические переменные.
- компиляция по умолчанию выполняется на Сервере, но отдельные фрагменты модуля могут устанавливать другую область компиляции директивами компиляции
- НаКлиенте
- реквизиты объекта формы доступны через Объект.<Реквизит>
- реквизиты формы доступны непосредственно по имени <Реквизит>
- элементы формы доступны через Элементы.<Элемент>
- статические переменные существуют только на время обработки события формы, а затем удаляются
- реквизиты объекта формы доступны через Объект.<Реквизит>
- реквизиты формы доступны непосредственно по имени <Реквизит>
- элементы формы на Сервере недоступны
- статические переменные существуют только на время вызова метода на Сервере, а затем удаляются
- данные реквизитов при каждом вызове НаКлиенте->НаСервере и возврате НаСервере->НаКлиенте все (целиком в полном объеме) проходят через XDTO сериализацию
- доступные методы реквизитов на Клиенте и на Сервере отличаются
Временный динамический модуль создается платформой при использовании оператора Выполнить() :
Пять директив определяют область исполнения функций и процедур. Их следует применять только в коде модулей управляемых форм и в коде модулей команд, в остальных модулях рекомендуется применять инструкции препроцессора.
- директива должна предшествовать каждому определению в модуле
- по умолчанию действует директива &НаСервере
- директива &НаСервереБезКонтекста имеет смысл только в формах (чей контекст директива подразумевает)
- определение в общем модуле с директивой &НаСервере в общем модуле имеет
- директива &НаСервереНаКлиенте применяется только в коде модулей команд
- приведенный в таблице порядок директив соответствует иерархии доступности, так функции и процедуры определенные с некоторой директивой имеют доступ к процедурам и функциям определенным с той же директивой, либо с любой директивой следующей ниже, но не имеют доступа к определенным с предшествующей директивой
- определениям с директивой &НаКлиенте доступны все определения на Клиенте и все определения на Сервере, для которых предусмотрен серверный вызов
- определениям с директивой &НаКлиентеНаСервереБезКонтекста доступны определения только с такой же директивой
Инструкции препроцессора управляют включением и исключением фрагментов модуля прежде чем он будет скомпилирован для выполнения, все инструкции препроцессора и исключенные ими фрагменты кода отсутствуют в коде передаваемом компилятору модуля.
Предусмотрены четыре инструкции
- <Логическое выражение> = [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора> [<Булева операция> [НЕ] <Символ препроцессора>]…]
- <Символ препроцессора> =
<Булева операция> =
Области
Области дают возможность выделять произвольные области кода, группировать и сворачивать их в окне редактора модуля и служат только для облегчения работы разработчика над исходным кодом большого объема. Инструкции определения Области относятся к препроцессору, хотя они не влияют ни на работу препроцессора, ни на дальнейшую компиляцию модуля, поскольку перед компиляцией они полностью исключаются из кода.
Области выделяются с помощью двух инструкций препроцессора:
- <имя области> должно соответствовать общим требованиям к именам переменных (не может начинаться с цифры, содержать пробелы, знаки и символы и т.п.).
- области могут быть вложены друг в друга или в другие группируемые конструкции языка.
- 1С не рекомендует разрывать отдельные грамматические конструкции, выражения, а также объявления и места вызова процедур и функций.
Конфигурации применяют следующие области:
Три аннотации позволяют определить перехват порядка вызова типовых методов новыми методами.
На клиенте нужно создать документ и заполнить его.
Проблема в том что заполнением занимается серверная процедура в которую передается форма этого документа.Т.е. с клиента вызываю серверную процедуру которая создает документ, далее если там же попытаться получить форму чтобы её передать в другую процедуру получаю ошибку "Интерактивные операции недоступны".
Пошел по другому пути, возвращаю с сервера ссылку на клиент, пытаюсь по ней ПолучитьФорму выходит ошибка "метод объекта не обнаружен".Как правильно сделать?
(1) Sergey_SP, создаешь документ, потом открываешь форму, методы открытия в УФ смотри в справке.(2) Xershi, мне не нужно открывать форму, создал документ, заполнил, записал и забыл.
Можно поподробнее что и где делать?P.S. платформу да, обновил до 1933.
(4) Sergey_SP, а зачем Вам форма на сервере ? Работайте с объектом и передавайте Объект . Посмотрите как реализовано в типовых конфигурациях (5) vadim1011985, я с типовой и работаю. заполняю типовой документ. поэтому и не хочется лезть и менять типовой код. заполнением занимается серверная процедура в которую передается форма \Вот эту процедуру переделываешь на получение не формы, а ссылки на документ. Дальше элементарно.(6) sssss_aaaaa_2011, для начала вам нужно построить атомный реактор, а потом элементарно включаете вилку в розетку :-)
Ну а если без шуток, то процедура довольно сложная, вызывается из формы документа, переделать-то конечно можно всё, но хочется малой кровью.
(7) Sergey_SP, и вы хотите сказать, что переданная форма используется в этой процедуре по всему ее тексту? Не верю. Наверняка в самом начала таки получается из формы ссылка на документ и заполняется таки документ, а не форма.(9) sssss_aaaaa_2011, типовая ЗУП 3.1, заполнение табеля.
Можно переделать, не спорю, можно, но блин - типовая, был бы мой кусок, не вопрос переделал бы.Сейчас просто мне важно понять или я не правильно что-то делаю и не могу получить что мне надо, или же это принципиально не возможно и надо искать другое решение.
(11) Sergey_SP, (11) Sergey_SP, Создать форму на сервере принципиально невозможно.
передать данные формы на сервер - можно.
к примеру:
ЗаполнитьНаСервере(ЭтотОбъект); Сейчас просто мне важно понять или я не правильно что-то делаю и не могу получить что мне надо, или же это принципиально не возможно и надо искать другое решение.
Предлагаю найти соседнюю тему где этот вопрос решался (поиск делайте с начала прошлой недели).
Тут на днях эска обновилась, Модуль НачалоРаботы, заменился на клиентский. Спасибо 1с за непередоваемые эмоции
Заполнить форму на сервере можно, открыть невозможно (1) Sergey_SP, "заполнением занимается серверная процедура в которую передается форма этого документа. " скопируйте кусок кода, где это происходит серверная процедура в которую передается форма этого документа
Что еще за ересь?) Сервер не работает с формами. Вас сразу необходимо отослать к учебнику тов.Радченко "Пособие для разработчиков", ибо вы совсем не понимаете, что такое клиент, что такое сервер и с чем они оперируют. Основной механизм: собрать данные для заполнения (например, в структуру), поместить во временное хранилище, на сервере получить структуру из временного хранилища и уже там заполняйте, что хотите по данным структуры (16) RocKeR_13, зачем человека путаете?
всё, что можно сериализовать платформа прекрасно передает между клиентом и сервером.
сама форма не может быть создана или открыта или передана на сервер. а вот её данные - могут передаваться (если конечно не содержат несериализуемых значений). (17) ЧерныйКот, в названии темы черным по белому стоит вопрос "Как передать форму на сервер". (16) RocKeR_13, контекст формы бывает не только клиентский, но и серверный. Форма изначально создается на сервере, сериализуется и передается на клиент. Равно как и обратный процесс при сервером вызове.
Вот как раз серверный контекст формы можно передавать и обрабатывать на сервере. Большинство последних типовых так и делает.
Не помню, есть ли это у Радченко. Давно его читал. Но должно быть.
Но не в том виде и не так как хочет ТС. (18) spacecraft, ДанныеФормыКоллекция вроде не сериализуется и во временное хранилище все равно не удастся их поместить. Основную работу с формой все же клиент выполняет, сервер только заполняет данные формы из объектов и наоборот, если необходима запись. А данные при необходимости через ВХ обычно передают (22) RocKeR_13, не знаю причем тут ДанныеФормыКоллекция. я про нее ни слова не говорил. Но да ладно.
Если она не сериализуется, то как попадает с сервера на клиент и обратно? Или это на клиенте происходит обработка табличных частей?
Сериализуется она конечно.
Основную работу с формой выполняет таки сервер. Именно на сервере форма создается, заполняется и передается на клиента. Часть операций с формой не доступна на клиенте, или не оптимальна.
Как и недоступна часть операций с формой на сервере. Это в основном интерактивные действия.
Главное понимать, что бывает два вида контекста формы. Серверный и клиентский. И уметь с ними работать и применять по назначению.
И посмотрите код последних типовых. Таких как БП3, Розница2, УТ11.
Большая часть работы с данными на форме происходит в общих модулях. (23) spacecraft, опять-таки, на сервере ведется обработка данных, а интерактивная работа ведется на клиенте. Собственно, смысл формы и есть в ее интерактивности. Может я криво просто мысль доношу) З.Ы. попробовал ДанныеФормыКоллекция в ВХ засунуть - хрен там) А общие модули-то не смотрели, какие?) Обычно клиентские, которые при необходимости вызывают серверные модули (24) RocKeR_13, кажется вам нужно перечитать упомянутую книгу Радченко.
ЗЫ, Очень стыдно, но я её не читал.Знания и опыт быстрее приходят на практике. (24) RocKeR_13, ВХ не показатель. Там много ограничений. Да и принцып другой при передачи формы.
По поводу модулей.
Самый часто используемый прием, это вызов серверных общих модулей из обработчика формы ПриСозданииНаСервере.
Но и просто в не стандартных обработчиках вызываются именно серверные модули.
Чтоб не быть голословным, специально открыл бемо базу Розница 2.
Открываем первый попавшийся документ. К примеру "ЗаказПоставщику". Смотрим модуль формы документа. Там полно таких вызовов. Вот один из них:
Надеюсь не надо объяснять, что такое ЭтотОбъект в контексте модуля формы УФ? (26) spacecraft, каюсь, бесом был видимо одержим. Сейчас перечитал все написанное выше - стыдно стало. (
(1) Собственно, по теме: вы когда создали документ, зачем пытаетесь передать его форму? Передавайте ссылку на документ, тем более вы на клиент не возвращаетесь А заполняешь реквизиты которые на форме? или в объекте? Если объект тогда заполняй себе спокойно на сервере без получения формы Хм, похоже ТС таки обнаружил различие смыслов переменной ЭтотОбъект в модулях формы и объекта и просто не хочет нам в этом признаваться. Судя по его отсутствию он таки понял, что в серверную процедуру передается таки не форма. :)В общем касаемо моей задачи. Вижу тут много без меня копий поломали :)
Я приводил конкретный документ который мне необходимо заполнять, приводил название типовой конфигурации, если на самом деле кому интересен код можете глянуть, его не так уж и много. не моя как говорится идея делать такое заполнение документа, пользуюсь тем что есть.
Вот как выглядит вызов из формы документа УчетРабочегоВремениРасширенныйФормы.ТабельЗаполнитьСотрудникамиОрганизации(ЭтаФорма);
ну и далее в общем модуле ТабельЗаполнитьСтрокиПоСотруднику()На самом деле можно изменить часть процедур(ы), по тексту видно что через форму идет обращение непосредственно к объекту (Форма.Объект), но есть и обращение к реквизитам формы, которых нет у объекта.
Резюме. Писать новую свою процедуру заполнения (с выкидыванием заполнения реквизитов формы) на основании типовой я посчитал нецелесообразным, поэтому решение задачи в таком виде прекратил.
НачатьПомещениеФайла (< ОписаниеОповещенияОЗавершении >, < Адрес >, < ПомещаемыйФайл >, < Интерактивно >, < УникальныйИдентификаторФормы >, < ОписаниеОповещенияПередНачаломПомещенияФайла >)
Метод работает в асинхронном режиме. Возможны два варианта выбора файла для передачи на сервер:
- интерактивной режим, при котором пользователю будет выдан диалог выбора файла;
- неинтерактивный режим, при котором уже известен путь к требуемому файлу на компьютере клиента. Такое возможно, например, когда пользователь в отдельном поле ввода выбрал путь к обрабатываемому файлу. Такой сценарий описан в этой статье.
Параметр ОписаниеОповещенияОЗавершении содержит описание процедуры (тип ОписаниеОповещения), которая будет вызвана после завершения помещения файла во временное хранилище. Эта процедура должна иметь ключевое слово Экспорт и 4 параметра:
Следует обратить внимание на параметр УникальныйИдентификаторФормы. В него рекомендуется передавать идентификатор текущей формы для сохранения данных во временном хранилище между несколькими серверными вызовами. При закрытии формы данные из временного хранилища будут автоматически удалены.
Неинтерактивная передача файла на сервер
Рассмотрим пример неинтерактивной передачи файла на сервер, без вызова окна выбора файла:
При интерактивном выборе файла дополнительно необходимо предусмотреть два момента:
- указать настройки диалога выбора файла (если требуется);
- проверять, что пользователь действительно выбрал файл.
Интерактивная передача файла на сервер
Рассмотрим, пример интерактивной передачи файла на сервер:
// Файл выбран
ВыполнитьЗагрузкуНаСервере ( Адрес );Процедура ВыполнитьЗагрузкуНаСервере при интерактивном и неинтерактивном режимах одинаковая.
Передача файла на сервер средствами БСП
В конфигурациях со встроенной Библиотекой стандартных подсистем для передачи файлов с клиента на сервер можно использовать процедуры
общего модуля ФайловаяСистемаКлиент или
ВыбратьИПередатьФайлНаСервер ( ОповещениеЗавершения , Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт
общего модуля ОбменДаннымиКлиент.
Пример интерактивной загрузки файла на сервер средствами БСП:
Остались вопросы?
Спросите в комментариях к статье.В этой статье рассматривается, что происходит, когда пользователь отправляет форму - куда передаются данные и как мы их обрабатываем, когда они туда попадают? Мы также рассмотрим некоторые проблемы безопасности, связанные с отправкой данных формы.
Предварительные знания: Базовая компьютерная грамотность, понимание HTML и базовые знания по HTTP и программированию на стороне сервера. Задача: Понять, что происходит при отправке данных формы, в том числе получить представление о том, как данные обрабатываются на стороне сервера. Куда отправляются данные?
Здесь мы обсудим, что происходит с данными при отправке формы.
О клиентской/серверной архитектуре
Примечание: Для получения более полного представления о том, как работают клиент-серверные архитектуры, ознакомьтесь с модулем «Первые шаги в программировании на стороне сервера».
На стороне клиента: определение способа отправки данных
Элемент <form> определяет способ отправки данных. Все его атрибуты предназначены для того, чтобы вы могли настроить запрос на отправку, когда пользователь нажимает кнопку отправки. Двумя наиболее важными атрибутами являются action и method .
Атрибут action
Этот атрибут определяет, куда отправляются данные. Его значение должно быть действительным URL. Если этот атрибут не указан, данные будут отправлены на URL-адрес страницы, содержащей форму.
Здесь мы используем относительный URL - данные отправляются на другой URL на сервере:
Если атрибуты не указаны, как показано ниже, данные из формы <form> отправляются на ту же страницу, на которой размещается данная форма:
Многие старые страницы используют следующий синтаксис, чтобы указать, что данные должны быть отправлены на ту же страницу, которая содержит форму; это было необходимо, потому что до появления HTML5 атрибут action был обязательным. Это больше не нужно.
Атрибут method
Метод GET
Рассмотрим следующую форму:
Данные добавляются в URL как последовательность пар имя / значение. После того, как URL веб-адрес закончился, мы добавляем знак вопроса ( ? ), за которым следуют пары имя / значение, каждая из которых разделена амперсандом ( & ). В этом случае мы передаём две части данных на сервер:
- say , со значением Hi
- to , со значением Mom
Примечание: вы можете найти этот пример на GitHub — смотрите get-method.html (see it live also).
Метод POST
Давайте рассмотрим пример — это та же самая форма, которую мы рассматривали в разделе GET выше, но с атрибутом method , установленным в post .
Заголовок Content-Length указывает размер тела, а заголовок Content-Type указывает тип данных, отправляемых на сервер. Мы обсудим эти заголовки позже.
Примечание: вы можете найти этот пример на GitHub — смотрите post-method.html (see it live also).
- Нажмите F12
- Выберите Network
- Выберите "All"
- Выберите "foo.com" во вкладке "Name"
- Выберите "Headers"
Затем вы можете получить данные формы, как показано на рисунке ниже.
Единственное, что отображается пользователю — вызываемый URL. Как упоминалось раннее, запрос с методом GET позволит пользователю увидеть информацию из запроса в URL, а запрос с методом POST не позволит. Две причины, почему это может быть важно:
На стороне сервера: получение данных
Пример: Чистый PHP
Пример: Python
Этот пример показывает, как вы можете использовать Python для решения той же задачи — отобразить отправленные данные на странице. В этом примере используется Flask framework для визуализации шаблонов, поддерживающих форму отправки данных (смотри python-example.py).
Два шаблона из коде выше взаимодействуют так:
-
: Та же форма, что и выше The POST method , только с использованием action к > . (Это Jinja2 шаблон, который изначально HTML, но может содержать вызовы Python кода в фигурных скобках, которые запустятся веб-сервером. url_for('hello') буквально говорит: после отправки данных переадресуй их в /hello .) : Этот шаблон просто содержит строку, которая отображает два бита данных, переданных ему при отображении. Это сделано с помощью функции hello() , указанной выше, которая выполняется, когда запрос направляется в /hello URL.
Примечание: Опять же, этот код не будет работать, если вы просто попробуете загрузить его прямо в браузер. Python работает немного иначе, чем PHP — чтобы запустить этот код, нужно установить Python/PIP, потом установить Flask используя команду: pip3 install flask . После этого, вы сможете запустить файл из примера, используя команду: python3 python-example.py , потом открыть localhost:5000 в своём браузере.
Другие языки и фреймворки
-
для Python (немного тяжеловеснее, чем Flask, но больше инструментов и опций) для Node.js для PHP для Ruby для Elixir
Стоит отметить, что использование фреймворков и работа с формами - это не всегда легко. Но это намного легче, чем пытаться написать аналогичную функциональность с нуля, и это определённо сэкономит время.
Примечание: Обучению фреймворкам и работе с серверами не входит в рамки этой статьи. Если хотите узнать больше, ссылки ниже помогут в этом.
Особый случай: отправка файлов
Атрибут enctype
Этот атрибут позволяет конкретизировать значение в Content-Type HTTP заголовок, включённый в запрос, при генерировании отправки формы. Этот заголовок очень важен, потому что указывает серверу, какой тип данных отправляется. По умолчанию это: application/x-www-form-urlencoded . На человеческом это значит: "Это форма с данными, которые были закодированы в URL параметры."
- Указать method атрибут POST , поскольку содержимое файла, как и сам файл, не могут быть отображены в URL параметрах.
- Установить в enctype значение multipart/form-data , потому что данные будут разбиты на несколько частей: одна часть на файл (две части на два файла), и одна часть на текстовые данные (при условии, если форма содержит поле для получения тестовых данных).
- Подключите один или более File picker виджетов, чтобы позволить своим пользователям выбрать, какие и сколько файлов будут загружены.
Примечание: Некоторые браузеры поддерживают multiple атрибут элемента <input> , который позволяет выбрать больше одного файла для загрузки, при использовании одного элемента <input> . То, как сервер работает с этими файлами, напрямую зависит от технологий, используемых на сервере. Как упоминалось ранее, использование фреймворков сделает вашу жизнь намного легче.
Предупреждение: Многие сервера имеют заданные ограничения на размер загружаемых файлов и запросы от пользователей, чтобы защититься от возможных злоупотреблений. Важно проверять эти ограничения у администратора сервера, прежде чем загружать файлы.
Проблемы безопасности
Каждый раз, когда вы отправляете данные на сервер, вы должны учитывать безопасность. HTML-формы являются наиболее распространёнными векторами атак на серверы(места, где могут происходить атаки). Проблемы вытекают не из самих форм HTML, а из-за того, как сервер обрабатывает данные из этих форм.
В зависимости от того, что вы делаете, вы можете столкнуться с некоторыми очень известными проблемами безопасности:
XSS "Межсайтовый скриптинг" и CSRF "Подделка межсайтовых запросов"
Межсайтовый скриптинг (XSS "Cross Site Request Forgery") и подделка межсайтовых запросов (CSRF "Cross-Site Scripting") - это распространённые типы атак, которые происходят при отображении данных после ответа сервера или другого пользователя.
Межсайтовый скриптинг (XSS "Cross Site Request Forgery") позволяет злоумышленникам внедрить клиентский скрипт в веб-страницы, просматриваемые другими пользователями. Подделка межсайтовых запросов (CSRF "Cross-Site Scripting") может использоваться злоумышленниками для обхода средств контроля доступа, таких как одна и та же политика происхождения. Последствие от этих атак может варьироваться от мелких неудобств до значительного риска безопасности.
CSRF-атаки аналогичны XSS-атакам в том, что они начинаются одинаково - с внедрения клиентского скрипта в веб-страницы - но их конечные цели разные. Злоумышленники CSRF пытаются назначить права пользователям с более высоким уровнем прав доступа(например, администратору сайта), чтобы выполнить действие, которое они не должны выполнять (например, отправка данных ненадёжному пользователю). Атаки XSS используют доверие пользователя к веб-сайту, в то время как атаки CSRF используют доверие веб-сайта к пользователю.
Чтобы предотвратить эти атаки, вы всегда должны проверять данные, которые пользователь отправляет на ваш сервер, и (если вам нужно отобразить их) стараться не отображать HTML-контент, предоставленный пользователем. Вместо этого вы должны обработать предоставленные пользователем данные, чтобы не отображать их слово в слово. Сегодня почти все платформы на рынке реализуют минимальный "фильтр", который удаляет элементы HTML <script> , <iframe> (en-US) и <object> (en-US) полученных от любого пользователя. Это помогает снизить риск, но не исключает его полностью.
SQL - вброс
SQL -вброс представляет собой тип атак, при которых осуществляется попытка выполнения действия с базой данных, используемой целевым веб-сайтом. В этих случаях обычно осуществляется отправка SQL-запроса в надежде, что сервер выполнит этот запрос (обычно при попытке сервера приложения сохранить данные, отправляемые пользователем). Данный вид атак является одним из самых направленных атак на веб-сайты.
Последствия могут быть ужасающими, начиная от потери данных и заканчивая утратой контроля над всей инфраструктурой веб-сайта за счёт повышения привилегий. Это очень серьёзная угроза, поэтому никогда не сохраняйте данные, отправляемые пользователем, без выполнения фильтрации данных (например, с помощью mysqli_real_escape_string() .
Такие атаки являются самыми незаметными, но при этом могут превратить ваш сервер в зомби.
Будьте параноиком: никогда не доверяйте вашим пользователям
Как вы боретесь с такими угрозами? Этот вопрос выходит далеко за рамки данной статьи, но есть несколько общих правил, которые следует всегда соблюдать. Самое важное из них - никогда не доверяйте вашим пользователям, в том числе себе; даже проверенный пользователь может быть атакован.
Все данные, поступающие на ваш сервер, необходимо проверять и санитизировать. Все и всегда. Без исключений.
- Избегайте потенциально опасных символов. Конкретные символы, с которыми следует соблюдать осторожность, зависят от контекста, в котором используются данные, а также от используемой платформы. Однако, все языки на стороне сервера имеют соответствующие функции для обеспечения такой защиты.
- Ограничьте входящий объем данных для поступления только реально необходимых данных.
- Помещайте загруженные файлы в песочницу (храните их на другом сервере и предоставляйте доступ к фалам только через отдельный поддомен или даже через совершенно другое доменное имя).
Соблюдая эти три правила, вы сможете избежать многих/большинства проблем. При этом следует помнить, что периодически необходимо проводить анализ защищённости, желательно квалифицированной сторонней организацией. Не считайте, что вы уже сталкивались со всеми возможными угрозами.
Примечание: В статье Безопасность веб-сайта нашего раздела серверного обучения приведено подробное обсуждение упомянутых угроз и возможных способов их устранения.
Заключение
Как мы увидели, отправлять формы просто, однако защитить приложение может быть довольно трудно. Просто помните, что фронтенд разработчики не должны задавать модель безопасности для приложения. Да, как мы увидим далее, мы можем проверить данные на стороне клиента, однако сервер не может доверять этой проверке, потому что он никогда не может по-настоящему узнать что происходит на стороне клиента.
Смотрите также
Если вы хотите узнать больше об обеспечении безопасности веб-приложений, вы можете использовать следующие источники информации:
Метод работает в асинхронном режиме. Возможны два варианта выбора файла для передачи на сервер:
- интерактивной режим, при котором пользователю будет выдан диалог выбора файла;
- неинтерактивный режим, при котором уже известен путь к требуемому файлу на компьютере клиента. Такое возможно, например, когда пользователь в отдельном поле ввода выбрал путь к обрабатываемому файлу. Такой сценарий описан в этой статье.
Параметр ОписаниеОповещенияОЗавершении содержит описание процедуры (тип ОписаниеОповещения), которая будет вызвана после завершения помещения файла во временное хранилище. Эта процедура должна иметь ключевое слово Экспорт и 4 параметра:
- Результат — для интерактивного режима возвращает результат работы пользователя с окном выбора файла. Истина — пользователь выбрал файл; Ложь — пользователь отказался от выбора;
- Адрес — адрес временного хранилища;
- ПомещаемыйФайл — путь к файлу;
- ДополнительныеПараметры — значение, указанное при создании объекта ОписаниеОповещения.
Следует обратить внимание на параметр УникальныйИдентификаторФормы. В него рекомендуется передавать идентификатор текущей формы для сохранения данных во временном хранилище между несколькими серверными вызовами. При закрытии формы данные из временного хранилища будут автоматически удалены.
Неинтерактивная передача файла на сервер
Рассмотрим пример неинтерактивной передачи файла на сервер, без вызова окна выбора файла:
&НаКлиенте
Процедура ЗагрузитьФайл ( Команда )ИмяФайлаДляОбработки = «C:ДанныеДляЗагрузки.xml» ;
// Описание процедуры, которая будет вызвана помещения файла во временное хранилище
ОписаниеОповещения = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
// Начало помещение файла из файловой системы во временное хранилище
НачатьПомещениеФайла ( ОписаниеОповещения , , ИмяФайлаДляОбработки , Ложь, УникальныйИдентификатор );&НаКлиенте
Процедура ЗагрузитьФайлЗавершение ( Результат , Адрес , ВыбранноеИмяФайла , ДополнительныеПараметры ) Экспорт&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере ( Адрес )// Получение данных из временного хранилища
Данные = ПолучитьИзВременногоХранилища ( Адрес );
// Получение имени временного файла
ИмяВременногоФайла = ПолучитьИмяВременногоФайла ( «xml» );
// Сохранение данных во временный файл
Данные.Записать ( ИмяВременногоФайла );// Хорошим тоном будет удалить временный файл
ПопыткаПри интерактивном выборе файла дополнительно необходимо предусмотреть два момента:
- указать настройки диалога выбора файла (если требуется);
- проверять, что пользователь действительно выбрал файл.
Интерактивная передача файла на сервер
Рассмотрим, пример интерактивной передачи файла на сервер:
&НаКлиенте
Процедура ЗагрузитьФайлИнтерактивно ( Команда )&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры ) Экспорт// Файл выбран
ВыполнитьЗагрузкуНаСервере ( Адрес );// Пользователь отказался от выбора файла
Сообщить ( «Файл не был выбран» );Процедура ВыполнитьЗагрузкуНаСервере при интерактивном и неинтерактивном режимах одинаковая.
Передача файла на сервер средствами БСП
В конфигурациях со встроенной Библиотекой стандартных подсистем для передачи файлов с клиента на сервер можно использовать процедуры
ЗагрузитьФайл ( ОбработчикЗавершения , ПараметрыЗагрузки = Неопределено, ИмяФайла = «» , АдресВоВременномХранилище = «» ) Экспорт
ЗагрузитьФайлы ( ОбработчикЗавершения , ПараметрыЗагрузки = Неопределено, ЗагружаемыеФайлы = Неопределено) Экспорт
общего модуля ФайловаяСистемаКлиент или
ВыбратьИПередатьФайлНаСервер ( ОповещениеЗавершения , Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт
общего модуля ОбменДаннымиКлиент.
Пример интерактивной загрузки файла на сервер средствами БСП:
&НаКлиенте
Процедура ЗагрузитьФайлИнтерактивно ( Команда )Оповещение = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
ОбменДаннымиКлиент . ВыбратьИПередатьФайлНаСервер ( Оповещение , ПараметрыДиалога , УникальныйИдентификатор );&НаКлиенте
Процедура ЗагрузитьФайлЗавершение (Знач РезультатПомещенияФайлов , Знач ДополнительныеПараметры ) ЭкспортАдрес = РезультатПомещенияФайлов . Хранение ;
ТекстОшибки = РезультатПомещенияФайлов . ОписаниеОшибки ;
ИмяВыбранногоФайла = РезультатПомещенияФайлов . Имя ;Если ПустаяСтрока ( ТекстОшибки ) И ПустаяСтрока ( Адрес ) Тогда
Если НЕ ПустаяСтрока ( ТекстОшибки ) Тогда
ОбщегоНазначенияКлиентСервер . СообщитьПользователю ( ТекстОшибки );
Возврат;Остались вопросы?
Спросите в комментариях к статье.Была задача суть которой перенести из всех документов табличные части в один документ. Писать и говорить буду языком понятным программистам начинающим по крайней мере, и не буду вдаваться в подробности, мало времени на такую писанину. Итак как передать параметры с сервера на клиент.
1. Из документа я вызываю форму обработки кодом:
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.Реализовано в версии 8.3.11.2867.
Во время длительной серверной операции пользователь всегда хочет видеть на клиенте ход её выполнения. Для того чтобы оценить, сколько времени осталось до её завершения, или насколько быстро она выполняется. Чтобы это реализовать, необходимо каким-то образом передавать информацию с сервера на клиента. Но и раньше, и сейчас взаимодействие между клиентской и серверной частью 1С:Предприятия происходит только по инициативе клиента. Сервер 1С:Предприятия сам, по своему желанию, не может вызвать какое-либо клиентское приложение и передать ему информацию.
Основные возможности и сценарии
В клиентское приложение вы можете передавать данные, имеющие XDTO-сериализацию. Естественно типы передаваемых данных должны быть доступны на клиенте. Вы можете использовать передачу информации с сервера в клиентское приложение в самых разных сценариях. Например:
- Для отображения прогресса длительной серверной операции;
- Для уведомления пользователей о перезагрузке сервера и принудительного завершения клиентских приложений;
- Для уведомления пользователя о входящем SIP-звонке;
- Для поддержки прохождения бизнес-процессов;
- Для реализации «напоминалок», уведомлений и пр.
Пример использования
Проще всего объяснить новый механизм на конкретном примере, когда длительная операция, выполняемая на сервере, состоит из нескольких этапов. По мере выполнения очередного этапа вы хотите извещать клиентское приложение об этом. Чтобы клиентское приложение некоторым образом показывало пользователю ход выполнения этой операции.
Но если ваша задача состоит в том, чтобы информацию с сервера передавать именно тому приложению, которое инициировало длительную серверную операцию, то в этом случае лучше создать несколько служебных обсуждений, для каждого пользователя своё.
Если же в обсуждении участвует один пользователь, то будет задействовано одно соединение с его клиентским приложением.
Правды ради нужно сказать, что от имени одного пользователя может быть запущено несколько приложений. Но сути дела это не меняет. Если информацию с сервера нужно передать в то приложение, которое инициировало серверную операцию, эффективнее использовать отдельные служебные обсуждения для каждого пользователя, чем «пулять» по всем клиентам в одном общем служебном обсуждении. В этом случае ресурсы сервера взаимодействия будут использоваться бережнее, а нагрузка на него будет меньше.
Итак, для каждого пользователя нужно создать своё служебное обсуждение. Это можно представить следующей схемой:
Приятным моментом является то, что сделать это нужно всего лишь один раз. Удобнее всего это делать в том месте прикладного решения, в котором создаются новые пользователи. Для идентификации обсуждения можно использовать новое свойство Ключ.
Ещё одно новое свойство обсуждения будет вам полезно – Отображаемое. Для служебных обсуждений его лучше устанавливать в Ложь, тогда они не будут показаны в пользовательском интерфейсе.
В настоящее время в Библиотеке стандартных подсистем (БСП) реализован механизм выполнения длительных операций на сервере, который использует фоновые задания. Это позволяет распараллелить исполнение прикладного кода на сервере и освободить пользовательский сеанс.
В этом примере необходимо использовать ту же самую механику.
Запуск фонового задания может выглядеть таким образом:
А длительная операция, выполняемая на сервере, может выглядеть так:
Сначала вы определяете, «ваше» ли это фоновое задание (его идентификатор сохранён в глобальном массиве), затем смотрите, как нужно обработать переданное значение. В одном случае, для примера, вы передвигаете индикатор, а в другом удаляете идентификатор из массива отслеживаемых заданий, потому что задание завершилось.
Заключение
Как вы видите механизм довольно гибкий. И это позволяет использовать его для самых разных задач. Приведённый пример это лишь один из сценариев, как говорится, «в лоб».
Существуют и другие, более изощрённые сценарии. Например, когда длительная операция (загрузка данных) инициируется одним из пользователей, а известить о ходе её выполнения нужно группу пользователей, которые с этими данными работают.
Другая область задач связана с тем, что информация не просто доставляется в клиентское приложение, а сервер некоторым образом «отдаёт команды» приложениям, заставляя их выполнить те или иные действия. Например, обновить итоговые данные, отображаемые в отдельном окне, или схему выполнения некоторого глобального прикладного процесса. Или корректно завершить работу клиентского приложения, если администратору системы нужно перезагрузить сервер, а пользователя нет на рабочем месте.
Поэтому после выпуска этого функционала мы с интересом познакомимся с примерами его реального использования и будем готовы рассматривать и обсуждать ваши пожелания и замечания к этому механизму.
Читайте также: