Для работы с WEB-сервисами часто надо передавать данные сложной формы, поэтому сделал не очень красивый механизм сохранения структуры данных в XML и обратное его преобразование.
Для того, чтобы данные однозначно распознались, надо создать тип XDTO, на основании которого будет создана структура, но так как для каждого отдельного случая нет желания создавать отдельный XDTO-пакет, то попытался сделать универсальный механизм.
При переводе структуры в XML в элементе Value передается тип в атрибуте "xsi:type". По нему определяем тип передаваемого элемента. Можно использовать элементарные типы, вложенные структуры и массивы. Для использования других типов надо дописать код.
Если в модуле формы объявить глобальную переменную с директивой &НаСервере,то её значение будет сохраняться только в рамках одного обращения к серверу. Если объявить переменную &НаКлиенте, то она будет сохранять свое значение на время открытия формы. Передавать её значение можно в качестве параметра серверных процедур.
Нельзя указывать экспортные переменные. Глобальный – процедуры будут доступны из вне напрямую, т.е. доступны в глобальном контексте (не пишем название модуля и через точку имя процедуры, а сразу имя процедуры). (-) чем больше глобальных модулей, тем медленнее загружается программа, так как глобальный модуль загружается при запуске программы. Если модуль не глобальный, то его загрузка происходит при первом обращении к процедурам модуля. Привилегированный модуль выполняется без учета прав пользователей. Это ускоряет работу, так как программа не тратит время на обработку прав. По этой причине привилегированные модули используют при массовых вычислениях. Привилегированные модули могут быть скомпилированы только на сервере. Их используют для того, чтобы временно добавить права пользователю, например у пользователя нет доступа к справочнику, но при проведении документа, реквизит содержащий этот справочник должен заполнятся, для этого процедуру проведения или часть выводим в привилегированный модуль, тем самым обходим ограничение на права пользователя.
В обычных общих модулях в свойствах надо указать в каком контексте будут скомпилированы процедуры. Если поставить несколько галок (Клиент, Сервер, Внешнее соединение), то при компиляции будут созданы одновременно несколько экземпляров модулей для каждого из контекста, которые не смогут обращаться друг к другу внутри модуля (т.е. нельзя будет из клиентского метода модуля вызвать серверный метод того же модуля), но из других модулей обращение к ним возможно. В таких модулях место компиляции процедур задаются директивами компилятора (&НаСервере, &НаКлиенте). Если их не указать, то процедуры будут скомпилированы одновременно на всех контекстах, которые указаны в свойствах общего модуля. В таком случае в тексте процедур надо рулить инструкциями препроцессора, чтобы разделить контекст. Контекст вызываемых процедур общего модуля без инструкций препроцессора будет определяться контекстом вызываемых их модулей.
Правилом хорошего тона не указывать директивы компиляции у процедур, а задавать их в свойствах модуля и указывать в имени модуля.
Если общий модуль скомпилирован на сервере, то его процедуры доступны только для вызова с сервера, но есть возможность сделать их доступными для вызова из клиентских модулей. Для этого ставиться свойство «Вызов сервера».
Свойство «Вызов сервера» работает только если указано, что модуль будет компилироваться только на сервере. Если поставить галки «Клиент», «Сервер» и при этом будет указана директива процедуры &НаСервере, то процедуры станет недоступной для клиентских модулей.
Свойство «Повторное использование возвращаемых значений».
Доступно только для не глобальных общих модулей и для процедур, которые вызываются с параметрами и не обращаются к базе данных. В этом случае, результат выполнения кэшируется, и при повторном вызове с такими же параметрами вернет запомненное значение.
Очистка кэша происходит через 20 мину после попадания в кэш. Так же время задается одним из следующих значений: «На время вызова» (Упрощенно действует до окончания процедуры) или «На время сеанса» (Упрощенно действует до завершения сеанса), но 20 минут ему к не переплюнуть.
Для работы с хранилищем настроек используется ХранилищеСистемныхНастроек.
Получить все настройки можно воспользоваться методом ХранилищеСистемныхНастроек.Выбрать(Отбор)
Отбор - это структура: "КлючОбъекта" ("ObjectKey"), "КлючНастроек" ("SettingsKey"), "Пользователь" ("User"). Все параметры имеют строковый тип.
Пользователь = имя пользователя ИБ (можно получить функцией ПользователиИнформационнойБазы.ТекущийПользователь().Имя)
КлючОбъекта = Строка типа "ВнешняяОбработка.ДокументыПоНедопускам.Форма.ФормаПараметров/НастройкиОкна". Для формы можно использовать ЭтаФОрма.ИмяФормы + "/НастройкиОкна"
Удалить данные хранилища для пользователя: ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, КлючНастроек, Пользователь)
средствами платформы ПолучитьСклоненияСтроки(). Функция возвращает массив, поэтому надо брать первый элемент.
Пример: Результат = ПолучитьСклоненияСтроки("Пушкин Александр Сергеевич", "Л=ru_RU;ПЛ=Мужской", "ПД=Родительный")[0].
Native API. Компоненту выполненную по технологии Native API регистрировать не нужно, ее необходимо поместить в общий макет (тип макета — «Внешняя компонента»)
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСклонений", "NameDecl" , ТипВнешнейКомпоненты.Native);
Объект = Новый("AddIn.NameDecl.CNameDecl");
Исключение
Сообщить("Не удалось подключить внешнюю компоненту по причине: " + ОписаниеОшибки());
КонецПопытки;
Сообщить(Объект.Просклонять("Иванов Иван Иванович", 2, 1)); //родительный, пол мужской
Сообщить(Объект.Просклонять("Иванова Анна Ивановна", 3, 2)); //дательный, пол женский
Сообщить(Объект.Просклонять("Иванов Иван Иванович", 4)); //винительный, пол авто
Сообщить(Объект.Просклонять("Иванов Иван Иванович", 5)); //творительный, пол авто
Сообщить(Объект.Просклонять("Иванов Иван Иванович", 6)); //предложный, пол авто