Flutter и 1С синхронизация

Предисловие

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

Наша компания SoftOnIT также активно развивается. И мы ведем разработку для IOS/Android используя мобильную платформу 1С для конфигурации «Управление IT-Отделом 8», но при разработке и дальнейшей поддержки мобильного 1С приложения мы столкнулись с рядом следующих проблем:

  1. Очень сложно сделать красивый дизайн приложения (UI)
  2. Много ограничений, которые не дают сделать приложение удобным (UX)
  3. Недоработки платформы 1С для мобильных устройств.
  4. Отсутствие многопоточности.

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

Одним из главных преимуществ 1С - это скорость разработки, поскольку приложение можно сразу собрать для устройств на Android и iOS. Поэтому мы решили попробовать заменить мобильное приложение 1С на Flutter, так как Flutter является кроссплатформенным фреймворком для разработки приложений и в нашем коллективе уже были сотрудники, знакомых с этим фреймворком.

Простой пример синхронизации

Для наглядной демонстрации синхронизации мы будем использовать чистую конфигурацию, в которой создадим объект «Дела». Во Flutter мы также создадим чистый проект, при запуске которого на первом экране будет отображаться синхронизированный список наших дел.

Создание новой конфигурации

Для начала нужно создать новую конфигурацию 1С.

Создание новой конфигурации

В дереве метаданных создаем новый справочник «Дела» и добавляем реквизит «Выполнено» типом «Булево».

Создание справочника дела

После создания справочника открываем конфигурацию в режиме предприятия (F5). В открывшемся окне переходим в список дел и создаем задания.

Создание дел

Отлично! Для синхронизации с мобильным приложением мы будем использовать HTTP-сервис. Создаем его, назвав, например, «API» (название можно выбрать любое). Обязательно указываем корневой URL, к которому мы позже будем отправлять запросы.

Создание http-сервиса

В HTTP-сервисе создаем шаблон URL. а внутри него создаем метод GET, который будем использовать для получения данных. Если хотите узнать больше о HTTP-методах, можете найти информацию в интернете.

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

Добавление обработчика http

Сразу пропишем логику получения списка дел из базы данных 1С. Затем сформируем ответ в формате JSON, чтобы передать данные в мобильное приложение.

Функция V1GET(Запрос)                     

    // Получение списка дел.
    Запрос = Новый Запрос();
    Запрос.Текст =
        "ВЫБРАТЬ
        |	Дела.Наименование КАК Наименование,
        |	Дела.Выполнено КАК Выполнено
        |ИЗ
        |	Справочник.Дела КАК Дела";
    
    Дела = Запрос.Выполнить().Выгрузить();
    
    // Сериализация списка дел в JSON.  
    ОбъектыJSON = СериализацияДелВJSON(Дела);
                   
    // Возврат ответа.
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(ОбъектыJSON, КодировкаТекста.UTF8);
    Ответ.Заголовки.Вставить("Content-Type", "application/json");
    
    Возврат Ответ; 
    
КонецФункции

Функция СериализацияДелВJSON(Дела)
    
    ОбъектыJSON = "";
    
    Для Каждого	Дело Из Дела Цикл
        ЗаписьJSON = Новый ЗаписьJSON; 
        ЗаписьJSON.УстановитьСтроку();
        
        Структура = Новый Структура();
        Структура.Вставить("name", Дело.Наименование);
        Структура.Вставить("done", Дело.Выполнено);
        
        ЗаписатьJSON(ЗаписьJSON, Структура);
        ОбъектJSON = ЗаписьJSON.Закрыть();
        
        ОбъектыJSON = ?(ОбъектыJSON = "", ОбъектJSON, ОбъектыJSON + "," + Символы.ПС + ОбъектJSON);
    КонецЦикла;  
    
    Результат = "[" + Символы.ПС + ОбъектыJSON  + Символы.ПС + "]"; 
    
    Возврат Результат;
    
КонецФункции

Далее, чтобы HTTP-сервис заработал, необходимо опубликовать базу с помощью IIS или Apache. В нашем случае мы будем использовать IIS. Важно, при публикации убедитесь, что включен ранее созданный HTTP-сервис «API».

Проверка http сервиса

Проверка выполнения запроса GET

После реализации логики получения дел и публикации базы, можно проверить выполнение запроса с помощью программы Postman. Если вы ранее не использовали эту программу, скачайте её и в открывшемся окне введите адрес ранее опубликованной базы, добавив в конце <адрес>/hs/api/v1/.

Если адрес введен правильно, то в ответ Postman придет текст в формате JSON, содержащий список ваших дел.

Запрос в Postman

Создание проекта Flutter

Теперь, когда серверная сторона полностью реализована, можно перейти к клиентской части, а именно к мобильному приложению. Приложение будет отправлять запросы GET и получать список дел в виде задач.

Для начала установите Flutter, следуя инструкции в официальной документации.

После установки Flutter, создаем новый проект и запускаем его. Мы будем использовать Visual Studio Code (MacOS) для разработки.

Как создать проект Flutter

После создания проекта запускаем отладку на эмуляторе Android или IOS. Если Flutter был установлен правильно, откроется демонстрационное приложение «Счетчик», которое генерируется при создании нового проекта Flutter.

Демо проект Flutter

Сверстаем простой список задач. Для этого выполните следующие шаги:

  1. Откройте файл main.dart.
  2. Удалите лишние комментарии, чтобы код был более читаемым.
  3. Замените заголовок «Flutter Demo Home Page» на «Список дел».
  4. В классе состояния текущей страницы MyHomePageState удалите лишний код, оставив только метод build.
  5. Внутри виджета Scaffold в свойстве body удалите все дочерние виджеты и назначьте виджет списка ListView.
  6. В свойстве backgroundColor верхней панели AppBar изменим цвет. Мы будем использовать 1С-ый цвет :)
  7. Используйте конструктор ListView.builder, чтобы динамически создать карточки списка дел с помощью виджета ListTile.

Верстка списка дел

Вот пример того, как должен выглядеть код после изменений:

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.yellow,
        title: Text(widget.title),
      ),
      body: ListView.builder(
        itemCount: 10,
        itemBuilder: (context, index) {
          return ListTile(
            title: const Text('Починить принтер'),
            subtitle: const Text('В работе'),
            leading: Container(
              height: 10,
              width: 10,
              decoration: BoxDecoration(
                color: Colors.red,
                borderRadius: BorderRadius.circular(10),
              ),
            ),
          );
        },
      ),
    );
  }
}

Отлично! Осталось только реализовать запрос для заполнения списка реальными данными из опубликованной базы 1С.

Добавим библиотеку для работы с HTTP-запросами:

  1. Откройте файл pubspec.yaml.
  2. Найдите секцию dependencies.
  3. Добавьте библиотеку http версии 1.2.2.

Подключение библиотеки http

В терминале выполняем команду актуализации библиотек Flutter.

flutter pub get

В файле main.dart импортируем библиотеку.

import 'package:http/http.dart' as http;

Импорт библиотеки http

Теперь можно использовать библиотеку для выполнения запросов HTTP и получения списка дел с сервера. В классе состояния нашего экрана добавим новое состояние - список дел tasks, и переопределим метод initState() для выполнения HTTP-запроса при инициализации виджета.

class _MyHomePageState extends State<MyHomePage> {
  List<dynamic> tasks = [];

  @override
  void initState() {
    final jsonTasks = getJSON();
    jsonTasks.then(
      (json) {
        setState(() {
          tasks = jsonDecode(json) as List<dynamic>;
        });
      },
    );

    super.initState();
  }

  Future<String> getJSON() async {
    final url = Uri.parse('https://<адрес>/flutter/hs/api/v1/');
    final response = await http.get(url);

    if (response.statusCode == 200) {
      final decodedBody = utf8.decode(response.bodyBytes);
      return decodedBody;
    }

    return '';
  }

  // ...

Хорошо! Теперь при открытии экрана будет происходить запрос в базу данных и заполнять ранее созданный массив дел tasks. Но как теперь отобразить полученные данные в списке? Всё очень просто:

  1. В виджете списка заданий в свойстве itemCount заменяем значение «10» на количество элементов в массиве tasks.length. Теперь виджет списка будет отображать столько элементов, сколько хранится в нашем массиве.
  2. В свойстве itemBuilder создадим две переменные: name и done, которые будем получать из массива по индексу, и уже эти переменные мы устанавливаем в значения карточки списка.
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.yellow,
        title: Text(widget.title),
      ),
      body: ListView.builder(
        itemCount: tasks.length,
        itemBuilder: (context, index) {
          final String name = tasks[index]['name'];
          final bool done = tasks[index]['done'];

          return ListTile(
            title: Text(name),
            subtitle: done ? const Text('Выполнено') : const Text('В работе'),
            leading: Container(
              height: 10,
              width: 10,
              decoration: BoxDecoration(
                color: done ? Colors.green : Colors.red,
                borderRadius: BorderRadius.circular(10),
              ),
            ),
          );
        },
      ),
    );

В итоге у нас должен получиться следующий результат.

Результат списка дел

Заключение

Конечно, можно было бы сделать все намного структурированнее: внедрить чистую архитектуру, добавить авторизацию пользователей, использовать пагинацию при запросе списка дел и многое другое. Однако цель этой статьи - показать простую синхронизацию между Flutter и 1C. Если бы мы использовали все эти аспекты, демонстрация синхронизации стала бы значительно сложнее. Все эти подходы мы используем в нашей конфигурации «Управление IT-Отделом 8». Мы разработали собственный API и создаём новое мобильное приложение на Flutter. Вы всегда можете заказать демонстрационную версию нашего решения и проверить работу нашего API. На этом всё, удачи в разработке Flutter мобильных приложений для 1С!


Изображение автора статьи

Программист компании Софтонит

Загрузка...
Поделитесь статьей
Рекомендуем почитать
Статьи Решение проблемы "Обнаружено нарушение целостности системы 1С"

На сегодняшний день любой, пользующийся популярностью у пользователей программный продукт подвергается "пиратским" взломам и соответственно нелегальному использованию. Не исключением будут и программы от всеми известной в России фирмы 1С. Каждый разработчик старается бороться с подобным незаконным использованием своих продуктов по-разному. Так, например, разработчики 1С с 1-ого февраля 2021 года, массово запустили механизм, который определяет легальность использования программы 1С. В случае, если программа была взломана и используется незаконно конечные пользователи получают ошибку "Обнаружено нарушение целостности системы". Сегодня в публикации разберем причины появления данной ошибки, а также расскажем как решить возникшую проблему. 

Статьи Настройка Apache для работы 1С через HTTPS (SSL)

Безопасность для многих всегда идет на первом месте, многие интернет-гиганты, типа Google даже добавляют в свои браузеры предупреждения, что соединение не безопасно, если на сайте не используется SSL-сертификат.
1С:Предприятие тоже может работать по протоколу HTTPS.
Мы предлагаем статью-инструкцию, как настроить HTTPS в Apache таким образом, чтобы 1С:Предприятие работало без проблем через SSL.

Статьи Подключение терминала сбора данных к 1С

В этой статье мы подключим терминал сбора данных к 1с поэтапно и поработаем документом "Поступление". Данное решение поможет Вам значительно ускорить процесс пересчета товара, а что еще немаловажно при правильной работе избавить от ошибок. Прочитав данную статью, Вы поймете, что все не так сложно и доступно для каждого. Для реализации выбран ТСД фирмы Urovo и "1С:Розница"

Статьи Ошибка HTTP 500.0 - Internal Server Error после публикации базы 1С на веб-сервере IIS

Рассмотрим ошибку, которая может возникать при публикации информационной базы 1С на web-сервере IIS Windows.
Попытаемся ее решить. Ошибка HTTP 500.0 - Internal Server Error.

Статьи Как удалить данные по организации в базе 1С?

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

Статьи Быстро растет база MS SQL

Часто наши клиенты задают нам вопросы связанные с быстрым ростом размеров базы данных MS SQL.
1С:Предприятие использует БД MS SQL, а сервер на котором все это работает может столкнуться с тем, что банально для базы не хватит места.

0 / 0