Решение проблемы длительных операций и интерактивного отображения статуса выполняемой операции в PHP. Некоторые особенности реализации веб-сервисов Разбиение операции на шаги

Web-сервис - это средство интеграции, обеспечивающее концепцию сервисной архитектуры. То есть, система 1С может быть представлена как набор независимых сервисов для сторонних систем, и в свою очередь может выступать потребителем таких сервисов. Схема архитектуры:

Менеджер web-сервиса, представленный на схеме, закрывает следующие задачи:

  • управляет пулом соединений с информационными базами
  • поддерживает описание сервиса в формате WSDL (Web Services Description Language, язык описания веб-сервисов, основанный на XML)
  • реализует протокол SOAP (Simple Object Access Protocol - простой протокол доступа к объектам), обеспечивает сериализацию сообщений, вызов нужных web-сервисов

В конфигурации web-сервисы реализованы как общие объекты:

Для web-серивиса, специфицируется набор операций, каждая из которых может характеризоваться определенными параметрами для передачи данных:

Web-сервис работает с помощью XML, соответственно ему необходимо указать схему разметки; для этого web-сервис ссылается на пакет XDTO :

Вопрос 08.42 экзамена 1С:Профессионал по платформе. Менеджер WEB сервисов решает задачу:

  1. управление пулом соединений с информационными базами
  2. поддержка WSDL описания сервиса, реализация протокола SOAP
  3. поддержка работы WEB приложения
  4. верны ответы 1,2
  5. верны ответы 2,3
  6. верны ответы 1,2,3

Правильный ответ четвертый, работу web-приложения web-сервис не обеспечивает (см. выше его функции).

Вопрос 08.43 экзамена 1С:Профессионал по платформе. Объект конфигурации "WEB сервис" используется для:

  1. организации обращения к web-сервисам по статической ссылке
  2. экспорта функциональности данной информационной базы

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

Вопрос 08.44 экзамена 1С:Профессионал по платформе. Объект конфигурации "WSСсылка" используется для:

  1. организации динамического обращения к web-сервисам
  2. организации обращения к web-сервисам по статической ссылке
  3. экспорта функциональности данной информационной базы

Правильный ответ второй. WS-ссылка - это общий объект конфигурации, предназнасенный для доступа к сторонним веб-сервисам по статической ссылке. Ссылка состоит из модели данных, по сути пакета XDTO, и web-сервиса, с которого опубликована ссылка:

Вопрос 08.45 экзамена 1С:Профессионал по платформе. В случае если функция, реализующая операцию WEB сервиса, возвращает какое-либо значение. То такое значение определяется (при настройке соответствующего объекта конфигурации) как имеющее тип:

  1. Строка
  2. Число
  3. Булево
  4. элемент XML
  5. объект или значение XDTO
  6. верны ответы 1,2,3

Правильный ответ пятый.

Вопрос 08.48 экзамена 1С:Профессионал по платформе. В случае если функция, реализующая операцию WEB сервиса, принимает какое-либо значение в качестве параметра. То такое значение определяется (при настройке соответствующего объекта конфигурации) как имеющее тип:

  1. Строка
  2. Число
  3. Булево
  4. элемент XML
  5. объект или значение XDTO
  6. верны ответы 1,2,3

Правильный ответ аналогично пятый.

Вопрос 08.46 экзамена 1С:Профессионал по платформе. При обращении к WEB сервису по статической ссылке последовательность действий следующая:

  1. получение wsdl описания, настройка подключения (создание прокси), обращение к операции сервиса
  2. настройка подключения (создание прокси), обращение к операции сервиса
  3. обращение к операции сервиса

Правильный ответ второй - в случае статической ссылки, каждый раз получать wsdl описание не требуется.

Вопрос 08.47 экзамена 1С:Профессионал по платформе. При обращении к WEB сервису по динамической ссылке последовательность действий следующая:

  1. получение wsdl описания, настройка подключения (создание прокси), обращение к операции сервиса
  2. настройка подключения (создание прокси), обращение к операции сервиса
  3. обращение к операции сервиса

Правильный ответ первый.

i believe in learning on the job (с)

Некоторые выдержки:

1.1 Значение свойства «Серии кодов» объекта конфигурации «Справочник» можно установить: во всём справочнике, в пределах подчинения, в пределах подчинения владельцу.
1.2 Редактируемая пользователем информация содержится в объекте информационной базы.
1.3 В механизме полнотекстового поиска для поиска с учетом синонимов слова «алый» используется выражение «!алый».
1.4 Внешняя обработка используется на стадии отладки, для более быстрого внесения изменений в обработку.
1.5 «Объект» - «тип файла»: внешняя обработка – «epf», внешний отчет – «erf», конфигурация – «cf».

7.1 При настройке ограничения доступа к данным допускается установка нескольких (по числу полей) ограничений для права «Чтение».
7.2 При настройке ограничения доступа к данным в качестве значений, по которым производится ограничение доступа к данным, могут использоваться значения параметров сеанса и данные из таблиц (запросов).

8.1 С точки зрения XML сериализации значение типа «ДокументСсылка.ИмяДокумента» относится к простым типам.
8.2 Одновременно с файлом формата dbf может быть открыто не более одного индексного файла.
8.3 При обращении к базе данных 1С: Предприятие 8 через OLE выполняется процедура – обработчик события «ПриНачалеРаботыСистемы» определенный в модуле приложения.
8.4 Рисунок
8.5 При записи значения с использованием средств XML сериализации в XML документ используются методы, относящиеся к средствам XML сериализации и объект «ЗаписьXML».
8.6 При обращении к базе данных 1С: Предприятие 8 через COM выоплняется процедура – обработчик события «ПриНачалеРаботыСистемы», определенный в модуле внешнего соединения.
8.7 Рисунок
8.8 Событие «ПриПолученииДанныхОтПодчиненного», определенное в модуле плана обмена, возникает при получении данных от подчиненного узла при отмеченном у данного плана обмена флаге «Распределенная база данных».
8.9 При последовательном чтении из текстового файла возможно как построчное, так и посимвольное чтение.
8.10 В процедуре, которая будет вызываться при подключении к базе данных через COM, нельзя использовать «Форма.Открыть()».
8.11 При использовании механизма распределенных баз данных изменения в конфигурации включаются в стандартные сообщения обмена.
8.12 При использовании механизма распределенных информационных баз в соответствующем объекте «План обмена» отдельно взятой информационной базы (входящей в распределенную) определяется главная (но она может и отсутствовать) и подчиненные базы.
8.13 Для создания объекта, с использованием которого из одной базы 1С: Предприятие 8 будет производиться обращение через OLE к другой информационной базе 1С: Предприятие 8, используется конструктор Новый COMОбъект.
8.14 К простым с точки зрения XML сериализации относятся все типы, которые представляются в виде элементов XML только с текстовым содержимым.
8.15 Экземпляр объекта XBase позволяет одновременно организовать работу только с одним файлом формата dbf.
8.16 Для получения почты напрямую с почтового сервера (без использования установленного почтового клиента) используется объект «ИнтернетПочта».
8.17 Элементы управления ActiveX могут использоваться в диалоге формы без ограничения.
8.18 К сложным, с точки зрения XML сериализации, относятся типы, значения которых представляются в виде элементов XML, содержащих вложенные элементы.
8.19 У плана обмена может быть только один предопределённый узел (который нельзя удалить или пометить на удаление).
8.20 С точки зрения XML сериализации, значение типа «ХранилищеЗначения» относится к простым типам.
8.21 Для обращения к свойствам элементов управления ActiveX из модуля формы используется свойство «ЭлементыФормы».
8.22 При использовании универсальных механизмов обмена (в свою очередь использующих планы обмена) таблица регистрации изменений для объектов, изменение которых отправлено в сформированном сообщении очищается в порядке, определенном программистом (после отправки сообщения/после получения квитанции о приеме отправленного сообщения и т.д.).
8.23 При использовании механизма распределенных информационных баз данных таблица регистрации изменений для объектов, изменение которых отправлено в сформированном сообщении очищается после получения квитанции о приеме отправленного сообщения.
8.24 С точки зрения XML сериализации, значение типа «КонстантаМенеджерЗначения.Имя константы» относится к сложным типам.
8.25 При работе с объектом «ИнтернетПочта» можно произвести только выборку всех писем (либо заголовков), находящихся на сервере.
8.26 ActiveX элемент управления нельзя использовать в качестве макета. А вот документ HTML, Active документ, файл программы Microsoft Word, макет оформления компоновки данных – можно.
8.27 При использовании возможности организации универсального обмена данными процесс разрешения коллизий не определяется платформой по умолчанию.
8.28 При работе с внешней компонентой: после программной загрузки объекты внешней компоненты подключаются к «1С: Предприятию 8».
8.29 При использовании планов обмена, состав узлов, для которых идет регистрация изменений объектов, может корректироваться при работе с объектом.
8.30 Объект «ПреобразованиеXSL» предназначен для преобразования XML документа в другой документ допустимого формата.
8.31 С помощью средств XML сериализации в XML документ можно сохранить значения, имеющие тип: Хранилище значений, картинка, строка неограниченной длины.
8.32 Элемент управления «Поле HTML документа» позволяет просматривать html документы, как в локальной сети, так и в сети Интернет (полученные любым способом?).
8.33 Для отслеживания момента полной загрузки HTML документа в элементе управления «Поле HTML документа» можно использовать обработчик события «Документ сформирован» данного элемента управления, в котором при этом производится проверка свойства URL на равенство заданному адресу ресурса.
8.34 Для получения почты посредством установленного на пользовательском компьютере почтового клиента используется объект «Почта».
8.35 При программном создании фабрики XDTO, типы в ней определенные не могут расширяться, они определяются в полном объеме при создании.
8.36 Типы, определенные в глобальной фабрике XDTO могут расширяться за счет создания пакетов XDTO, изменения состава объектов конфигурации.
8.37 Фабрика XDTO – набор схем XML.
8.38 Пакет XDTO – схема XML документа.
8.39 В рамках создаваемого пакета XDTO (без использования директивы импорта) можно использовать типы, определенные только в данном пакете и типы стандартные для XML.
8.40 В рамках модели XDTO понятие «Фасет» относится к типу значения XDTO.
8.41 При определении типа свойства объекта XDTO информация о типе включает имя типа и имя пространства имен.
8.42 Менеджер WEB сервисов решает задачу управления пулом соединений с информационными базами и поддержки WSDL описания сервиса, реализации протокола SOAP.
8.43 Объект конфигурации «WEB сервис» используется для экспорта функциональности данной информационной базы.
8.44 Объект конфигурации «WSСсылка» используется для организации обращения к web-серверам по статической ссылке.
8.45 В случае, если функция, реализующая операцию WEB сервиса, возвращает какое-либо значение, то такое значение определяется (при настройке соответствующего объекта конфигурации) как имеющее тип: объект или значение XDTO.

9.1 Не имеет значения, что устанавливать первый: конфигурацию или платформу.
9.5 При обновлении технологической платформы при административной установке 1С: Предприятия администратору достаточно обновить платформу только в месте административной установки, обновление платформы на локальных компьютерах смогут произвести сами пользователи.
9.6 При обычной установке 1С: Предприятия в клиент-серверном варианте, работа клиентского и серверного приложений разных релизов технологической платформы не допускается, необходимо выполнять обновление как сервисного приложения, так и клиентских приложений.
9.7 Использование режима пакетного запуска позволяет: в автоматическом режиме производить выгрузку/загрузку, тестирование и исправление информационной базы; запускать оба режима программ без интерактивного вмешательства; выполнять синтаксический контроль и проверку конфигурации.
9.8 Параметры запуска из командной строки 1С: Предприятие определяют информационную базу, пользователя, его пароль, режим запуска, правила выполнения указанных операций во внешнем файле/указанных в командной строке.
9.9 Использование командной строки позволяет запустить программу в режиме 1С: Предприятие или Конфигуратора, указав параметрами каталог информационной базы, пользователя, пароль и проч. А вот блокировать действия указанного в параметре пользователя в режиме 1С: Предприятие нельзя.
9.10 Пакетный режим конфигуратора позволяет запустить конфигуратор и автоматически выполнить указанные в отдельном файле или командной строке процедуры по сохранению конфигурации в файл, тестированию информационной базы и проч.
9.11 Шаблоны конфигураций служат прототипами создаваемых информационных баз и устанавливаются в каталог шаблонов, указываемых пользователем.
9.12 Для создания новой информационной базы при файловом варианте работы системы нужно: в окне запуска «1С: Предприятие» выбрать «Добавить» - «Создание новой информационной базы» - выбрать из шаблонов или пустую – указать имя базы – указать каталог информационной базы.
9.13 Для добавления существующей информационной базы при клиент-серверном варианте работы системы нужно: в меню запуска 1С: Предприятие выбрать «Добавить» - «Добавление в список существующей информационной базы» - указать имя базы - указать «На сервере 1С: Предприятие» - указать имя базы на сервере и имя сервера.
9.14 Список информационных баз содержит ссылки на зарегистрированные информационные базы и может корректироваться вручную или программно.

10.1. В Платформе 8.3 возможность использования обычных и управляемых форм зависит от настроек конфигурации и клиентского приложения.
10.2. Использование обычных форм возможно только в толстом клиенте.
10. 3. Использование управляемых форм зависит от настроек конфигуратора: в толстом клиенте в режиме обычного приложения; в толстом клиенте в режиме управляемого приложения; в тонком клиенте; в web-клиенте.
10.4. Автопреобразование обычных форм в управляемые и обратно не поддерживается.
10.5. Основной реквизит формы определяет как источник данных для формы в целом, так и стандартные возможности платформы для работы формы с данными типа, заданного у основного реквизита.
10.6. Реквизиты формы нужны для описания состава данных, которые отображаются, редактируются или хранятся в форме.
10.7. Чтобы произвольной управляемой форме назначить основной реквизит, нужно в свойствах реквизита формы установить флажок "Основной реквизит".
10.8. Чтобы произвольной основной форме назначить основной реквизит, нужно заполнить свойство "Данные" формы, выбрав нужный реквизит формы.
10.9. У формы может быть только один основной реквизит.
10.10. Назначение основных форм прикладных объектов - они вызываются взамен автоматически генерируемых по умолчанию при соответствующем обращении к объекту.
10.11. Возможность назначить обычную или управляемую форму в качестве основной зависит от настроек конфигуратора.
10.12. Рабочая область начальной страницы набирается из списка управляемых форм.
10.13. Разместить формы в области рабочего стола можно: по горизонтали - не более двух, по вертикали - в любом количестве.
10.14. Начальную страницу можно отобразить только в основном окне.
10.15. Управляемые формы списков можно отобразить в основном и во вспомогательном окне.
10.16. Настройка формы в режиме исполнения позволяет изменить видимость существующих на форме элементов управления, изменять формат, ширину, высоту, текст заголовка и др. свойства элементов управления, существующих на форме. Но удалять и добавлять на форму элементы управления таким образом нельзя.
10.17. Настройка списка в режиме исполнения позволяет изменить порядок, состав, иерархическое представление и условное оформление записей.
10.18. Порядок обхода элементов в управляемой форме зависит от ролей пользователей и функциональных опций, но может изменяться программно и интерактивно самим пользователем в рамках доступных элементов.
10.19. Панель навигации может существовать в основном окне и вспомогательных окнах.
10.20. Параметры формы предназначены для организации функциональной связи между формами и управления функциональностью формы при открытии.
10.21. При наличии одного ключевого параметра можно добавить еще один посредством назначения соответствующего значения свойства параметра формы.
10.22. Обычный параметр существует только при создании формы, ключевой – всегда.
10.23. Для добавления команды в виде кнопки на управляемой форме можно добавить в форму элемент управления «Кнопка», назначить команду из списка команд формы и определить алгоритм команды в модуле. Или перетащить команду в дерево элементов.
10.24. ----
10.25. Для добавления команды в виде кнопки на обычной форме можно разместить на форме элемент управления «Кнопка», назначить обработчик события «Нажатие» и определить алгоритм команды в модуле формы.
10.26. С помощью элемента управления «Индикатор» можно отобразить текущее состояние реквизита формы числового типа, и только его.
10.27. Рисунок
10.28. Поведение элементов управления стандартно, но имеет место специфическое поведение, определяемое расширениями формы, расширения элементов управления и расширениями, связанными с отображаемыми данными.
10.29. С помощью элемента управления «Переключатель» можно выбрать одно значение из нескольких заранее определенных вариантов.
10.30. Возможность системы создания «налету» форм по умолчанию в режиме «1С: Предприятие» следует использовать во всех случаях, когда не требуется выполнение программных действий в форме, и нет особых требований по отношению внешнего вида формы объекта со стороны пользователя.
10.31 Сводная диаграмма - элемент управления, предназначенный для интерактивного анализа многомерных данных в графическом виде.
10.32 Для хранения значения элемента управления "Переключатель" можно использовать реквизит формы, создаваемый конструктором при добавлении переключателя в форму или существовавший ранее реквизит формы.
10.33 При использовании свойства диаграммы "МаксимумСерийКоличество", если количество серий превышает максимальное значение, выводятся серии, выбираемы по алгоритму: по каждой серии ищется максимальное точечное значение, эти значения сортируются и из полученного списка выбирается для показа (МаксимумСерийКоличество – 1) серий. Значения остальных серий суммируются и выводятся в серии "Сводная".
10.34 Для обеспечения управления поведением границ элементов управления при изменении размеров обычной формы используются привязки.
10.35 При расположении в панели обычной формы элементов управления их можно привязать к границам других элементов управления, расположенных в панели, и к границам панели.
10.36 При создании элемента управления «Флажок» с помощью кнопки панели инструментов «Элементы управления» будет создан реквизит формы с типом значения «Булево».
10.37 Значение типа «ЗначениеДиаграммы» позволяет получить значение диаграммы и значение расшифровки в определенной точке и серии.
10.38 Чтобы включить возможность интерактивной перенастройки порядка обхода элементов управления обычной формы, нужно снять флажок «Автопорядок обхода» в свойствах формы.
10.39 Элемент управления «Надпись» предназначен для расположения в форме поясняющей информации, гиперссылок, бегущей строки, картинок с поясняющей информацией.
10.40 Свойство диаграммы «БазовоеЗначение» содержит начальное значение координат. Используется в случае, когда изменения параметра, отображаемого в диаграмме, несоизмеримо малы по сравнению с его минимальным значением.
10.41 При размещении элементов управления в форме нельзя разместить один и тот же элемент на двух страницах.
10.42 Если для элемента управления «Надпись» в качестве источника данных указан реквизит справочника, то выводимая надписью информация будет определятся значением реквизита, указанного в свойстве «Данные» элемента управления «Надпись».
10.43 Колисчество форм, подчинённых справочнику «Номенклатура», произвольно.
10.44 Элемент управления «Поле HTML-документа» предназначен для просмотра или редактирования HTML-документов.
10.45 Редактировать HTML-документ, отображаемый в элементе управления «Поле HTML-документа», можно в режиме 1С: Предприятие.

Итак. Код метода каждой ws-операции находится в модуле веб-сервиса, к которому принадлежит эта ws-операция.Модуль веб-сервиса исполняется только на Сервере.

Замечание 1 : нет смысла писать директивы компиляции &НаСервере, &НаКлиенте и другие.

На каждый вызов веб-операции создается отдельный сеанс с информационной базой, поэтому при каждом вызове веб-операции происходит инициализация параметров сеанса. Инициализация параметров сеанса происходит в модуле сеанса в процедуре "УстановкаПараметровСеанса".

Замечание 2 : не нагружайте эту процедуру лишними действиями.

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

Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)

//суть изменений - получить сразу только важные параметры, а если нужны еще параметры воспользоваться подсистемой БСП

Если ИменаПараметровСеанса=Неопределено Тогда

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

|ИЗ

|Справочник.Пользователи КАК Пользователи

|ГДЕ

|Пользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ";

ИдентификаторПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;

Запрос.Параметры.Вставить("ИдентификаторПользователяИБ ", ИдентификаторПользователяИБ);

РезультатПользователи = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ПараметрыСеанса.ТекущийПользователь = ВыборкаДетальныеЗаписи.Ссылка;

КонецЦикла;

ПараметрыСеанса.ТекущийКонтрагент = ПараметрыСеанса.ТекущийПользователь.Контрагент;

Иначе

СтандартныеПодсистемыСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса);

КонецЕсли;

КонецПроцедуры


Если вы читали статью 1С:Предприятие 8. Веб-сервисы. Реализация собственного веб-сервиса , то заметили что в дереве метаданных параметр ws-операции называется "Param", а в реализующем его методе называется "Параметр". Дело в том что наименование операндом в методе ws-операции не имеет значение, 1С подставляет операнды в том порядке в котором они указаны в дереве метаданных ws-операции. Например у нас есть операция Example1, в конфигураторе мы указали что операция имеет два параметра "param1" и "param2" и создали процедуру которая выводит "param2".

Если мы вызовем ws-операцию Example1 и передадим в качестве параметров param1=1, param2=2, то в результат получим 2.

Но если мы поменяем порядок операндов в конфигураторе:

То тот же самый вызов вернет 1.

Замечание 3 : после смены порядка параметров ws-операции, не забудьте поменять их порядок в заголовке функции, реализующей эту операцию.

Замечание 4 : в качестве операндов ws-операции можете использовать отличные от заданных в конфигураторе имена.

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

$a=$client->Plus2();


Эта строка вызовет ошибку " Неизвестная ошибка. Недостаточно параметров операции". То есть сам параметр надо передать, указав значение null:

$zz=array("Param"=>null);

$a=$client-> Plus2 ($zz);

Но тогда возникает вопрос, а как этот пустой параметр будет передан в 1С. Логично что программисту 1С захочется сделать в методе веб-операции следующее:

Функция Plus2(Параметр=0)

Возврат Параметр+2;

КонецФункции

То есть указать значение операнда в случае его отсутствия.

Теперь надо вызвать наш веб-операцию с пустым. Приведу пример xml сообщения soap с передачей значение null.


xsi:nil="true" - указывает, что данный параметр не имеет значение. Для того что бы можно было указать null дополнительно надо связать префикс xsi с пространством имен: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" .


Но если он сделает вызов такой ws-операции с пустым значением то получит сообщение об ошибке:

Soap:Client

Неизвестная ошибка.

по причине:

{WebСервис.WebService.Модуль(2)}: Преобразование значения к типу Число не может быть выполнено

по причине:

{WebСервис.WebService.Модуль(2)}: Преобразование значения к типу Число не может быть выполнено


Все потому, что переданное значение null преобразуется в значение 1с - "Неопределено". В этом можно убедиться если переписать процедуру так.

Функция Plus2(Параметр=0)

Если Параметр = Неопределено Тогда

Результат = 1;

Иначе

Результат = 2;

КонецЕсли;

Возврат Результат;

КонецФункции


Результатом будет - 1.

Замечание 5: нет смысла писать значение операнда ws-операции по умолчанию(Функция Plus2(Параметр=0) ). Для операндов, которые могут принимать пустое значение надо добавить проверку на равенство "Неопределено".


Замечание 6: При передачи в веб-операцию параметра строкового типа, строка из одного или нескольких пробелов обрезается до пустой строки.

Замечание 7: При передаче в веб-операцию параметра типа дата (datetime) с использованием формата с указанием на часовой пояс, время приводится к часовому поясу в котором находится платформа 1с. Например если операция имеет параметр "Дата" типа datetime, ПК на котором располагается 1с находится в часовом поясе +6, то при передаче в этот параметр значения "2012-09-14T00:00:00.000+02:00" в коде веб-операции данный параметр будет иметь значение "14.09.2012 4:00:00". Следовательно "+02:00" указывает на то, в каком поясе находится отправитель. Это позволит вам не задумываться о переводе времени при работе в нескольких часовых поясах.

Еще немного провеб-сервисы, их реализацию, тестирование и прочее можно прочесть тут.

Раздел 08. Механизмы интеграции и обмена данными

С точки зрения XML сериализации значение типа "ДокументСсылка.ИмяДокумента" относится:
1. К простым типам

Одновременно с файлом формата dbf может быть открыто...

4. не более одного индексного файла

При обращении к базе данных 1С:Предприятие 8 через OLE выполняется процедура - обработчик события ПриНачалеРаботыСистемы" определенный...
1. в модуле приложения

Данную топологию обмена между информационны (имеющими одинаковую конфигурацию) можно

2. Только при использовании возможностей универсального обмена

При записи значения с использованием средств XML сериализации в XML документ:
3. Используются методы, относящиеся к средствам XML сериализации и объект "ЗаписьХМL"

При обращении к базе данных 1С:Предприятие 8 через СОМ выполняется процедура - обработчик события "ПриНачалеРаботыСистемы" определенный...

2. в модуле внешнего соединения

Данную топологию обмена между информационными базами (имеющими одинаковую конфигурацию) можно реализовать:

3. Как средствами универсального обмена, так и распределением информационной базы

Событие "ПриПолученииДанныхОтПодчиненного", определенное в модуле плана обмена, возникает при получении данных от подчиненного узла:
1. При отмеченном у данного плана обмена флаге "Распределенная база данных"

При последовательном чтении из текстового файла невозможно:

3. Возможно как построчное, так и посимвольное чтение

В процедуре, которая будет вызываться при подключении к базе данных через СОМ, нельзя использовать:

2. Форма.Открыть()

При использовании механизма распределенных баз данных изменения в конфигурации:

3. Изменения включаются в стандартные сообщения обмена

При использовании механизма распределенных информационных баз в соответствующем объекте "План обмена" отдельно взятой информационной базы (входящей в распределенную) определяется:

2. Главная (но она может и отсутствовать) и подчиненные базы

Для создания объекта, с использованием которого из одной базы 1С:Предприятие 8 будет производиться обращение через OLE к другой информационной базе 1С:Предприятие 8, используется конструктор:
3. Новый СОМОбъект

К простым с точки зрения XML сериализации относятся типы:

4. Которые представляются в виде элементов XML только с текстовым содержимым

Экземпляр объекта XBase позволяет одновременно организовать работу:
1. Только с одним файлом формата dbf

Для получения почты напрямую с почтового сервера (без использования установленного почтового клиента) использует объект:

2. Объект "ИнтернетПочта"

Элементы управления ActiveX могут использоваться в диалоге формы:
1. Без ограничения

К сложным, с точки зрения XML сериализации, относятся типы:

4. Типы, значения которых представляются в виде элементов XML, содержащих вложенные элементы

У плана обмена может быть следующее количество предопределенных узлов (которые нельзя удалить или пометить на удаление):

2. Всегда один

С точки зрения XML сериализации, значение типа "ХранилищеЗначения" относится:
1. К простым типам

Для обращения к свойствам элементов управления ActiveX из модуля формы используется:

2. Свойство "ЭлементыФормы"

При использовании универсальных механизмов обмена (в свою очередь использующих планы обмена) таблица регистрации изменений для объектов, изменение которых отправлено в сформированном сообщении:

3. Порядок определяется программистом

При использовании механизма распределенных баз данных таблица регистрации изменений для объектов, изменение которых отправлено в сформированном сообщении:
2. Очищается после приема квитанции о приеме отправленного сообщения

С точки зрения XML сериализации, значение типа "КонстантаМенеджерЗначения.Имя константы" относится:
2. К сложным типам

При работе с объектом "ИнтернетПочта" можно произвести выборку писем (либо заголовков):

5. Только все письма, находящиеся на сервере

В качестве макета нельзя использовать:

2. ActiveX элемент управления

При использовании возможности организации универсального обмена данными процесс разрешения коллизий:
1. По умолчанию платформой не определяется

При работе с внешней компонентой (выберите наиболее правильное утверждение):

3. После программной загрузки объекты внешней компоненты подключаются к "1С:Предприятию 8"

При использовании планов обмена, управлять составом узлов, для которых производится регистрация изменений объектов:
3. Состав узлов, для которых идет регистрация изменений, может корректироваться при работе с объектом

Объект "ПреобразованиеХSL" предназначен...
3. для преобразования XML документа в другой документ допустимого формата

С помощью средств XML сериализации нельзя в XML документ сохранить значения, имеющие тип:
6. Можно сохранить значения всех вышеуказанных типов

Выберите правильное утверждение, касающееся элемента управления "поле HTML документа"
4. Позволяет просматривать html документы, как в локальной сети, так и в сети Интернет

Для отслеживания момента полной загрузки HTML документа в элементе управления "Поле HTML документа" можно использовать:

2. Обработчик события "Документ сформирован" данного элемента управления, в котором при этом производится проверка свойства URL на равенство заданному адресу ресурса

Для получения почты посредством установленного на пользовательском компьютере почтового клиента используется объект:
1. Почта

При программном создании фабрики XDTO, типы в ней определенные:
3. не могут расширяться, определяются в полном объеме при создании

Типы определенные в глобальной фабрике XDTO:

4. могут расширяться за счет создания пакетов XDTO, изменения состава объектов конфигурации

Понятию "Фабрика XDTO" больше всего соответствует такое понятие XML как:
1. набор схем XML.

Понятию "Пакет XDTO" больше всего соответствует такое понятие XML как:
2. схема XML документа

В рамках создаваемого пакета XDTO (без использования директивы импорта) можно использовать типы:
2. определенные только в данном пакете и типы стандартные для XML..

В рамках модели XDTO понятие "Фасет" относится к:
2. тип значения XDTO.

При определении типа свойства объекта XDTO информация о типе включает:

2. имя типа и имя пространства имен

Менеджер WEB сервисов решает задачу:
1. управление пулом соединений с информационными базами.
2. поддержка WSDL описания сервиса, реализация протокола SOAP.
4. верны ответы 1,2.

Объект конфигурации "WEB сервис" используется для:

3. экспорта функциональности данной информационной базы

В случае если функция, реализующая операцию WEB сервиса, возвращает какое-либо значение. То такое значение определяется (при настройке соответствующего объекта конфигурации) как имеющее тип:

5. объект или значение XDTO

При обращении к WEB сервису по статической ссылке последовательность действий следующая:
1. получение wsdl описания, настройка подключения (создание прокси), обращение к операции сервиса.

При обращении к WEB сервису по динамической ссылке последовательность действий следующая:
1. получение wsdl описания, настройка подключения (создание прокси), обращение к операции сервиса

В случае если функция, реализующая операцию WEB сервиса, принимает какое-либо значение в качестве параметра. То такое значение определяется (при настройке соответствующего объекта конфигурации) как имеющее тип:
5. объект или значение XDTO

Каким образом можно определить в каких планах обмена для конкретного прикладного объекта указана авторегистрация?
1. В окне редактирования объекта, раздел "Обмен данными"
3. Посредством вызова окна "Дополнительно" для данного объекта (закладка "Планы обмена")

5. Верны ответы 1 и 3

Для прикладных объектов в окне редактирования объекта конфигурации на закладке "Обмен данными" указываются...

4. планы обмена, в которых будут учитываться изменения в данном объекте

Редактирование OLE-объектов осуществляется:

3. Приложением, связанным с OLE-объектом

Внешние файлы табличных документов:

2. Имеют расширение MXL

Automation-сервер "1С:Предприятие 8"...
1. предоставляет доступ ко всем свойствам и методам своего глобального контекста
2. предоставляет доступ к дополнительным свойствам и методам для выполнения действий, специфичных для работы в режиме Automation
3. позволяет управлять приложением системы "1С:Предприятие 8" из других приложений, а также выполнять действия, аналогичные интерактивным
4. верны все указанные ответы

Создание информационной системы с использованием нескольких информационных баз в системе 1С:Предприятие 8...
3. реализуется с помощью объекта конфигурации "Планы обмена"

Алексей Багрянцев Октябрь 3, 2012

В процессе работы мы не раз сталкивались с проблемой выбора решения для той или иной задачи. Порой можно, не особо мучаясь, взяться за самый очевидный и распространенный метод как говориться, “решать в лоб”. В большинстве случаев такой подход так или иначе даст результат, но он может затребовать от вас серьезных умственных и временных затрат.

Поэтому в ситуации, когда перед вами стоит нестандартная задача, возможно, стоит отойти от привычных методов, а попробовать рассмотреть несколько вариантов, пусть даже они поначалу кажутся не слишком удачными или к ним просто неохота прибегать, потому что “обычно мы так не делаем”. Тут главное не бояться экспериментировать, потестировать каждый из методов, и наконец, выбрать наиболее подходящий, отвечающий всем вашим запросам и обеспечивающий требуемый результат.

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

Предыстория

На одном из PHP проектов среднего размера возникли проблемы, связанные с выполнением тяжеловесных операций и интерактивном отображении статуса исполняемой операции. Кроме блокировки исполнения других запросов и перехода по другим ссылкам портала пользователь пребывал в неведении и не догадывался, что же происходит в данный момент времени, когда же закончится операция, возможно, произошла ошибка и т.д. Проект изначально носил статус экспериментального, требования к выполняемым фазам часто менялись на лету, изменялись приоритеты и вектор развития системы. Для формирования большего представления хотелось бы описать стек используемых технологий на проекте:

  • MVC Framework CakePHP 2.1 (PHP5.3);
  • MySQL;
  • jQuery, jQuery UI, jQuery plugins;
  • Selenium server, Snoopy server side browser simulator;
  • IMAP Server, etc.

В качестве операционной системы была выбрана: CentOS

Выбор фреймворка был обусловлен опытом его использования командой разработчиков, выбор же реляционной СУБД MySQL в качестве data storage является довольно стандартным решением и обусловлено стабильностью и распространенностью использования этой СУБД в качестве “движка” хранения данных.

На этапе проектирования системы сразу было трудно предугадать, что в системе появятся очень “тяжелые” операции, процесс выполнения которых придется пересматривать, реализовывать дополнительные компоненты и в общем перерабатывать архитектуру приложения. К тому же система была неким прототипом, где требования часто менялись, как и то, куда будет расти система в дальнейшем.

На одном из этапов был реализован ряд операций, которые оказались довольно “тяжеловесными” (highweighted operations) и мало того, что они блокировали выполнение других операций в рамках той же сессии, но и вообще процесс перехода по ссылкам системы становился невозможным до тех пор, пока “тяжелая” операция не была завершена. При рассмотрении проблемы на более низком уровне оказалось, что любой запрос блокировал файл сессии при его открытии, соответственно, пока операция не выполниться полностью и процесс не сбросит (flush) сессионные данные в файл сессии и не освободит его, сняв блокировку, другие запросы будут терпеливо ждать в очереди. Действительно, по умолчанию в PHP в качестве механизма хранения сессий используется файл. При открытии сессии срабатывает функция, наподобие fopen(), которая и блокирует файл на чтение и запись для других процессов. Сразу напрашивается решение о смене session storage для снятия блокировки, но поговорим об этом попозже.

Подходы

  1. Разбиение операции на шаги
  2. Ajax Polling
  3. Long Polling
  4. Forever lframe
  5. Streaming
  6. Comet-server
  7. Web-sockets

Коротко рассмотрим каждый из этих подходов для решения задачи выполнения тяжеловесных операций и интерактивного оповещения пользователя о прогрессе выполнения .

Разбиение операции на шаги

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

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

Ajax Polling

Следующее решение, которое напрашивается, заключается в запуске операции на сервере и постоянном опросе сервера о статусе выполняемой операции путем посылки серии ajax-запросов через определенные интервалы времени. На клиенте же можно проанализировать такой ответ сервера (например, это может быть JSON, содержащий “message”, “percentage”, “error” и “redirect”) и отрисовать progress-bar, отображающий статус выполнения текущей операции.

Была попытка использования Polling подхода на проекте с двумя разными способами хранения результата выполнения операции:

    Хранение результатов выполнения в файле – +.txt

    Хранение результатов в БД, в соответствующей таблице – high_weight_operations

Пользователь инициировал выполнение операции с помощью ajax-запроса, после этого клиентский скрипт периодически опрашивал сервер и получал статус и прогресс текущей операции – /operations/get_status/ .

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

Первое решение возникшей проблемы заключалась в освобождении файла сессии. Для этого в PHP предусмотрена функция – session_write_close() , с помощью которой можно закрыть сессию на запись. Действительно, можно запустить операцию, прочесть данные сессии, сделать в них изменения и закрыть сессию на запись.

Но в реалиях проекта, с учетом устоявшейся архитектуры, данное решение применить не удалось. Требовалась запись сессии во многих местах длительной операции. К тому же такое решение нельзя назвать “чистым”, т.к. пользователю, возможно, понадобиться ”попутешествовать” по сайту или запустить еще одну тяжелую операцию параллельно. Поэтому нужна была альтернатива.

Решение заключалось в смене Session Storage, что обеспечивало работу с сессией без блокировки при ее открытии. В качестве нового хранилища сессии можно выбрать один из следующих вариантов:

  • MySQL Database;
  • MongoDB;
  • Memcached;

Для того, чтобы сменить Session Storage в PHP предусмотрена функция – session.save_handler() , которая устанавливает пользовательские функции хранения сессии. Они используются для хранения и получения данных, ассоциированных с сессией. В сети можно найти множество примеров её использования, существуют уже реализованные классы, служащие для переноса сессии в БД или memcached.

Примечание : Для работы функции необходимо установить опцию session.save_handler в значение user в вашем файле конфигурации php.ini .

На проекте в качестве эксперимента было использовано хранение сессий в mysql и mongodb.

Примечание : Если понадобится, чтобы только что записанный в сессию параметр был доступен для других запросов, то сессию необходимо “сбосить (flush)” в mysql или mongodb, чтобы отработала функция записи сессии. Для этого необходимо закрыть её на запись и переоткрыть снова:

Public function session_flush() { session_write_close(); session_start(); }

После реализации соответствующих компонент, сессия перестала блокироваться и позволила обрабатываться нескольким запросам, ассоциируемых с одной и той же сессией, одновременно. Теперь она не “лочится” (lock ), как это было с файлами, при открытии файла функцией fopen , плюс ко всему скорость работы сессии значительно возросла.

Примечание : Для использования mongodb в PHP необходимо установить mongodb как сервис, а также драйвер работы на PHP.

Пример установки на CentOS :

  1. Создать репозиторий

/etc/yum.repos.d/10gen.repo

  1. Заполнить содержимым (в зависимости от разрядности ОС)

name=10genRepository

baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64

  1. Вызвать
  1. Далее

yum install mongo-10gen mongo-10gen-server

  1. Запустить “демон”

service mongod start

  1. Установить драйвер

yum -y install php-devel

sudo pecl install mongo

extension=mongo.so

После этого можно спокойно пользоваться mongodb .

В качестве примера прилагаю листинг компоненты CakePHP для переноса Session Storage и MongoDB

Mongo = new Mongo($connection_string); /* indexes */ $this->mongo->{self::MONGO_DATABASE}->{self::MONGO_COLLECTION}->ensureIndex("id", array("id" => 1)); $this->mongo->{self::MONGO_DATABASE}->{self::MONGO_COLLECTION}->ensureIndex("id", array("id" => 1, "expires" => 1)); // Register this object as the session handler if ($this->forceSaveHandler) { session_set_save_handler(array($this, "open"), array($this, "close"), array($this, "read"), array($this, "write"), array($this, "destroy"), array($this, "gc")); } $this->_timeout = Configure::read("Session.timeout") * 60; } public function __destruct() { try { $this->mongo->close(); session_write_close(); } catch (Exception $e) { } } public function open() { return true; } public function close() { $probability = mt_rand(1, 150); if ($probability <= 3) { $this->gc(); } return true; } public function read($id) { $cursor = $this->mongo->{self::MONGO_DATABASE}->{self::MONGO_COLLECTION}->find(array("id" => $id)); if ($cursor->count() == 1) { $cursor->next(); } else { return false; } $result = $cursor->current(); if (!empty($result) && isset($result["data"])) { return $result["data"]; } } public function write($id, $data) { if (!$id) { return false; } $expires = time() + $this->_timeout; $session = array("id" => $id, "data" => $data, "expires" => $expires); $filter = array("id" => $id); $options = array("safe" => true, "fsync" => true,); $collection = $this->mongo->{self::MONGO_DATABASE}->{self::MONGO_COLLECTION}; if ($collection->findOne($filter) == null) { return $collection->insert(am(array("_id" => new MongoId($id)), $session), $options); } else { return $collection->update($filter, array("$set" => $session), am($options, array("upsert" => false))); } } public function destroy($id) { return $this->mongo->{self::MONGO_DATABASE}->{self::MONGO_COLLECTION}->remove(array("id" => $id), true); } public function gc($time = null) { if (empty($time)) { $time = time(); } return $this->mongo->{self::MONGO_DATABASE}->{self::MONGO_COLLECTION}->remove(array("expires" => array("$lt" => $time)), true); } }

Реализация компоненты для переноса сессий в MySQL аналогична и отличается лишь в реализации функций gc(), destroy(), open(), write(), read(), close()

Примечание : Не забудьте изменить конфигурационный файл core.php проекта.

Configure::write("Session", array("defaults" => "database", "handler" => array("engine" => "MongoSession")));

Также можно добавить защиту на количество одновременных запросов в рамках одной сессии. На нашем проекте этим занималась отдельная компонента, отвечающая за тяжеловесные операции в целом – HighWeightedOperationsComponent.php, которая отслеживала количество операций, запущенный в рамках одной сессии и в зависимости от настроек разрешала запускать строго определенное количество операций.

Итог:

    Сменен Session Storage. Блокировок сессии больше нет.

    На клиенте инициируется ajax-запрос на старт операции.

    Реализована серия Polling-запросов на обновление статуса и progress-bar.

    Создана компонента управления “тяжелыми операциями”.

Long polling

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

Принцип: клиентский скрипт обращается к серверу и говорит: "Eсли у тебя появятся данные, я их готов сразу забрать, а потом снова подключусь". В некоторых реализациях сервера существует буферизация, когда сервер не сразу отдает данные, а ждет: вдруг сейчас появится что-то еще, тогда отправлю все сразу. Но такая буферизация вредна, так как вносит задержки, а мы хотим достичь максимальной скорости! После получения данных браузер должен снова открыть новое соединение. Длительность такого соединения может измеряться часами, но это в теории. Обычно время намного меньше и максимум достигает 5 минут, после которых просто создается новое соединение. Делается это потому, что серверы не любят такие долгоживущие сессии, да и сам протокол HTTP не очень приспособлен к такому использованию.

На проекте такой подход использован не был, но обсуждения были.

Forever IFrame

Коротко: На странице создается скрытый iFrame, который инкрементально рендерит информацию о прогрессе операции или выполняет java-скрипты. Но для этого HTTP-сервер и PHP должны быть настроены так, чтобы умели отдавать данные кусочно в процессе выполнения операции. Об этом рассказано подробно в следующем пункте.

Итак, мы инициируем выполнение операции через скрытый на странице элемент iFrame. На сервере операция отдает данные вызов кусочно и тут-же отсылает клиенту ответ, IFrame пытается выполнить присланный ответ:

Streaming

Подход экспериментально был использован на проекте.

Возникла идея, а что если попробовать инициировать выполнение операции ajax-вызовом, на сервере кусочно отдавать (стримать) данные клиенты. Тогда, возможно, на клиенте каждый раз при получении очередной порции данных, будет срабатывать какое-то событие, по которому мы сможем обновить соответствующий блок и отобразить статус выполнения.

Сначала нам нужно было найти и применить соответствующие настройки для Apache-сервера и PHP, что привело к поиску информации в сети и серии тестов. В итоге настройки выглядят следующим образом:

Public function prepare() { // Turn off output buffering ini_set("output_buffering", "off"); // Turn off PHP output compression ini_set("zlib.output_compression", false); // Implicitly flush the buffer(s) ini_set("implicit_flush", true); ob_implicit_flush(true); // Clear, and turn off output buffering while (ob_get_level() > 0) { // Get the curent level $level = ob_get_level(); // End the buffering ob_end_clean(); // If the current level has not changed, abort if (ob_get_level() == $level) break; } // Disable apache output buffering/compression if (function_exists("apache_setenv")) { apache_setenv("no-gzip", "1"); apache_setenv("dont-vary", "1"); } }

Была написана компонента полностью реализующий данный подход. Но после более глубокого анализа оказалось, что данный подход не применим, т.к. на клиенте отсутствуют события, сигнализирующие о том, что очередная порция данных пришла от посланного ранее ajax-запроса. По событию onSuccess приходят данные полностью целиком.

Comet-сервер

Согласно “Wikipedia”, Comet - любая модель работы web-приложения, при которой постоянное HTTP-соединение позволяет веб-серверу отправлять данные браузеру без дополнительного запроса со стороны браузера.

Общая черта таких моделей состоит в том, что все они основаны на технологиях, непосредственно поддерживаемых браузером (например, JavaScript), а не на проприетарных плагинах.

На данном проекте была попытка использования реализации Comet-сервера Dklab Realplexor .

Dklab Realplexor - это Comet-сервер, позволяющий держать одновремено сотни тысяч долгоживущих открытых HTTP-соединений с браузерами пользователей. JavaScript-код, запущенный в браузере, подписывается на один или несколько каналов Realplexor-а и вешает обработчик на поступление данных. Сервер может в любой момент записать сообщение в один из таких каналов, и оно будет моментально передано всем подписчикам (хоть одному, хоть тысяче), в режиме реального времени и с минимальной нагрузкой для сервера.

Web-sockets

Также обсуждалась возможность использования WebSockets. Но от этого подхода мы отказались по причине “не поддержки” старых браузеров.

WebSocket - протокол полнодуплексной связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени.

Итог:

В результате задача была реализована Polling-подходом, с переносом сессий в MongoDB. Но последующие обсуждения, увеличение количество “тяжеловесных” задач и их сложности привели к применению более стандартного и надежного решения – реализации очереди выполняемых задач с использованием CRON-планировщика. Действительно, после проверки всех прав на исполняемую операцию мы можем сохранить ее контекст в базу (таблица cron_taks), предварительно сериализовав его. На сервере по определенным интервалам времени будет запускаться CRON shell, который будет брать очередную задачу из очереди, менять ее статус на IN_PROGRESS и передавать ее соответствующему обработчику (TaskDispatcherComponent). Обработчик будет принимать десериализованный контекст запланированной задачи и исполнять ее в отдельном процессе. Ему доступны все модели и компоненты системы. Для определения статуса исполняемой задачи можно воспользоваться подходами Polling и LongPolling, а также организовать просмотр очереди своих задач отдельным отображением. Такой подход оказался более надежным и понятным, хоть и требует определенных архитектурных изменений в системе.

Статьи по теме: