Статья продолжает серию статей про возможности доступа в базу 1С посредством протокола OData. Предыдущие работы: "Практика доступа в базу 1С через протокол oData. Чтение данных" и "Практика доступа в базу 1С через протокол oData. Изменение данных".
Но, если мы раньше больше занимались теорией, то сейчас пришло время погрузится в практику. В рамках статьи написана универсальная обработка, которая позволяет подключатся к неизвестным источникам данных, анализировать доступную структуру и позволит сделать произвольные выборки с использованием отборов и сортировок (можно даже не к базам 1С).
Зачем?
- Количество инструментов для анализа данных доступных в источнике OData ограничено, анализировать "глазами" километры служебной выдачи в формате XML слишком утомительно.
- Существующие инструменты по работе с OData не учитывают специфику данных из баз 1С (типы данных платформы, особенности наименований, предопределенные свойства)
- Есть желание создать удобный конструктор формирования URL для запроса данных с "предпросмотром" для быстрого анализа результатов.
Ограничения при разработке
- Базовая цель - написать единую обработку для использования в обычном и управляемом интерфейсе;
- Код должен работать под 8.2 и желательно в 8.1 - в коде не используются новые возможности языка, которые добавлены с версии 8.3.6;
- Независимость от БСП и прочих библиотек;
- Отсутствие дублирования кода - вся общая функциональность для обычных и управляемых интерфейсов перенесена в модуль обработки (не смотря на то, что это создает сложности при разработке УФ);
- Интерфейс форм полностью переведен на русский и украинский языки, что позволяет комфортно использовать обработку в 90% существующих конфигураций (для Казахстана, РБ и прочих стран предлагаю перезапускать базы в русском интерфейсе), но с другой стороны это не коммерческое решение и потому я позволил себе не тратить время на сообщения пользователям, которые вывожу только на русском языке без НСтр();
- Ограничение типов информации, с которыми допустима работа, до плоских таблиц - это позволяет облегчить алгоритм формирования запросов и упрощает методику вывод полученных данных, но при проектировании решения пришлось отказаться от виртуальных таблиц с параметрами, получения объектов с подчиненными табличными частями и от левых соединений со связанными таблицами (которые делаются с помощью $expand);
- Возможность по работе с отборами ограничил только до операций над примитивными типами и до работы с булевыми группировками; от функций по работе с датами, строками и привидением типов пришлось отказаться, чтобы иметь возможность применить штатный функционал платформы.
Обзор функционала
Подключение
Подключиться к источнику данных OData очень просто - нужно указать путь к публикации базы 1С, логин и пароль. Если это не база 1С, а произвольный источник, то нужно указать URL до части "/standard.odata/". На всякий случай добавил подсказку по формату ввода адреса и пример.
Допускается указание логина и пароля в тексте пути подключения к базе - после ввода значения происходит парсинг и логин с паролем автоматически будут перемещены в нужные поля.
Для удобства многоразовой работы с одним и тем же источником данных, реализовано сохранение пути, логина и пароля между сеансами (в УФ полностью автоматически, а в ОФ необходимо использовать штатные команды формы).
Чтобы проверить корректность параметров подключения, можно воспользоваться командой "Проверить подключение".
Просмотр модели данных
Выполнив настройки подключения, можно делать запрос структуры доступных данных. Получение данных происходит с помощью GET-запроса с параметром $metadata (подробнее тут).
Все полученные с сервера результаты группируются по типам и будут выведены в виде дерева в левой части формы. Если источником была база 1С, то информация будет показана с указанием привычных типов метаданных платформы.
После выбора в дереве типов строки с данными, в правой части формы будет показана таблица свойств с колонками:
- Название - привычное для пользователей представление;
- Имя - настоящее название свойства, по которому следует делать запросы;
- Тип - тип данных OData
В таблице свойств есть возможность ограничить свойства, которые в будущем попадут в выборку при анализе.
Отборы и сортировки
После выбора конкретного типа данных на закладке "Отбор и сортировка" становятся доступными настройки, как вы правильно догадались, для отборов и сортировок. Отборы будут преобразованы в параметр $filter (подробнее тут), а сортировка в параметр $orderby (подробнее тут).
Ввод отборов и сортировок реализован на базе объекта "Компоновщик настроек компоновки данных", который инициируется выбранными свойствами с учетом их типов. Реализована поддержка типов Число, Дата, Булево и Строка. Все остальные типы преобразовываются к Строка.
В отборах поддерживаются все три вида группировки - НЕ, И и ИЛИ с любым уровнем вложенности.
Среди операций поддерживаются только шесть:
- равно
- не равно
- больше
- больше или равно
- меньше
- меньше или равно
Если указать какую-то другую операцию, то она при формировании запроса будет преобразована к "Равно".
Строка запроса и просмотр результата
На закладке "Просмотр данных" можно посмотреть результаты предыдущих действий и заняться анализом данных полученных из источника OData.
Для анализа есть табличное поле для вывода результата запроса. Колонки таблицы формируются динамически в то время, когда мы выбираем интересующие данные в дереве типов и ставим галочки рядом с интересными для нас свойствами. Типы колонок соответствуют типам свойств данных. Поддерживаются Число, Дата, Булево или Строка. Все остальные типы приводятся к типу Строка.
Чтобы заполнить таблицу данными, необходимо использовать команду "Прочитать данные из источника". Чтение будет произведено согласно текущему содержимому поля "Строка запроса", которое формируется на основании ранее сделанных действий:
- выбор типа данных;
- выбор свойств для выборки;
- указание отборов;
- указание сортировки;
- дополнительные настройки.
Поле "Строка запроса" формируется автоматически, но пользователю дается право ручного редактирования. Хороший пример - это работа с Комментарием. В типовых конфигурациях у многих объектов поле "Комментарий" безграничной длинны и такие поля нельзя использовать в операциях сравнения в фильтрах. Можно выкрутиться, если воспользоваться строковыми функциями и сравнивать с образцом полученную подстроку. Но поскольку в данной обработке не реализованы формы для ввода формул OData, то ручное редактирование окажется полезным.
Если при редактировании поля "Строка запроса" мы хотим вернуться к первоначальному состоянию, то достаточно выполнить очистку поля и первоначальное значение вернется.
Если есть желание посмотреть на результат вне 1С, то в поле "Строка запроса" можно воспользоваться стандартной командой "Открыть", после чего для выполнения запроса будет открыт браузер.
Для удобства анализа данных добавлены дополнительные параметры:
- Вывод представления ссылок - позволяет для ссылочных типов выводить их текстовое представление вместо GUID (добавляет для выбранных ссылочных типов служебное свойство ____Presentation)
- Пропустить записей ___ - позволяет получить выборку не с первой, а после указанной строки. Так, если указываем 10, то в результате получим данные начиная с 11 записи (используется параметр $skip, тут подробнее)
- Размер выборки ___ - позволяет ограничить размер получаемого пакета указанным количеством записей. Так, если укажем 10, то в выводе получим 10 записей, даже если в базе их миллионы (используется параметр $top, тут подробнее)
Пример анализа данных.
Для закрепления давайте решим простую задачу:
Необходимо получить из внешней базы 1С последние 5 курсов для валюты "доллар".
Задача выполняется в три шага:
- Подключимся к базе 1С и получим дерево метаданных.
- Сделаем запрос к справочнику Валюты, чтобы узнать GUID для доллара.
- Настроим фильтр по регистру сведений "Курсы валют" для отбора только доллара, укажем обратную сортировку по Дате и укажем ограничение в 5 записей на результат.