A história de um aplicativo: mobile “1C: Gerenciando nossa empresa. Configurações iniciais do aplicativo móvel “1C-Rating: Garçom móvel Chamando uma operação de servidor web

  • Tutorial

Olá, queridos.

Neste artigo gostaria de apresentar o novo produto “FBA Toolkit”, que simplifica significativamente o processo de desenvolvimento de um aplicativo móvel corporativo em 1C + Android.
“Kit de ferramentas FBA” é:
- desenvolvimento de uma aplicação Android “nativa” numa IDE nativa em Java;
- 1C:Enterprise 8.1 (8.2) como fonte de dados, sistema de informação corporativa.

Em primeiro lugar, a estrutura será útil para programadores 1C que desejam desenvolver aplicativos de negócios para Android, mas têm dificuldade em dominar uma nova plataforma para eles. Para iniciar o desenvolvimento, bastará um conhecimento básico de Java. A seguir, mostrarei como criar um protótipo funcional de um aplicativo cliente-servidor em apenas algumas horas.

Preparando o local de trabalho Antes de iniciar o processo de desenvolvimento propriamente dito, é necessário preparar o local de trabalho do desenvolvedor. Obrigatório:

1. Instale e configure:
- SDK Java + Eclipse + SDK Android;
- Servidor Web (IIS ou Apache);
- 1C: Empresa 8.1 (8.2)

2. Para Eclipse, importe dois projetos de biblioteca: ActionBarSherlock e ru_profu1c_fba do repositório SVN.

3. Instale a distribuição de configuração “FBA” e combine-a com sua solução de aplicativo baseada em 1C.

Todo o processo de pré-configuração é descrito detalhadamente nos artigos:
Preparando o local de trabalho do desenvolvedor
Instalando a distribuição de configuração “FBA”
Combinar a configuração “FBA” com uma solução de aplicação e publicá-la em um servidor web

A configuração não deve demorar muito e, provavelmente, você já possui alguns dos softwares necessários instalados.

Descrição da aplicação Criaremos uma aplicação móvel “Relatório ao Gestor”, destinada a informar regularmente o gestor sobre a situação da empresa. A aplicação será composta por 3 telas:
  • “Login” - autorização do usuário ao iniciar o programa.
  • “Lista de relatórios” é a tela principal do nosso aplicativo. Uma lista de relatórios disponíveis é exibida com a capacidade de visualizar e atualizar dados do banco de dados 1C.
  • “Configurações do programa” - aqui o usuário define os parâmetros de autorização e o endereço do servidor 1C, configura o agendamento para troca automática com o servidor 1C.
  • O aplicativo implementará 2 opções para receber dados do servidor 1C:

  • Relatório “Mercadorias em armazéns”. Ele é gerado no servidor e compilado como um documento HTML; é simplesmente exibido no aplicativo móvel. A opção mais simples é que o formulário do relatório seja fixo e não possa ser alterado.
  • Relatório “Indicadores financeiros”. Aqui, os dados de origem do relatório são obtidos na forma de uma tabela, que é então utilizada para construir o relatório. As vantagens desta opção: uma forma gratuita de saída de relatório, incl. na forma de gráficos e diagramas; é possível instalar seleções e classificação.
  • Criando um modelo de aplicativo móvel em 1C O desenvolvimento de aplicativos móveis começa em 1C, o que não é surpreendente. Aqui você determina a composição dos metadados, configura o esquema de troca e regenera o modelo do seu futuro aplicativo móvel.

    Crie um novo elemento no diretório “Mobile Applications” com o nome “Report to the Manager” e o identificador SAMPLE_REPORT_HEAD.

    Selecione o grupo “Dados Externos” na lista “Metadados” e clique no botão “Adicionar” na barra de ferramentas. Preencha os parâmetros da nova tabela conforme mostrado na figura:

    “Indicador” - representação de teste do indicador do relatório, linha (250)
    “Valor” - o valor numérico do indicador, número (15,2)
    Os nomes das colunas e da própria tabela aqui, via de regra, são especificados em russo; eles serão usados ​​​​para preencher a tabela com dados usando a linguagem 1C integrada. Clique em OK, a tabela será adicionada à árvore de metadados, para o aplicativo móvel os nomes são traduzidos automaticamente para o latim.

    Assim, preparamos a estrutura da tabela de valores (em termos de 1C) na qual transferiremos os dados para o relatório “Indicadores Financeiros”. Para o segundo relatório “Mercadorias em armazéns”, os dados serão transferidos como um arquivo externo.

    Na aba “Exchange Scheme”, verifique se o sinalizador “Upload” está marcado. O sinalizador “Carregando” não é importante, porque Não iremos processar as alterações recebidas nesta tabela do aplicativo móvel em 1C.

    Salve suas alterações. Clique no botão “Modelo de aplicativo móvel” na barra de ferramentas, defina os parâmetros do seu aplicativo móvel

    “Diretório de modelos” - caminho para o diretório no qual os arquivos de modelo de aplicativo móvel gerados serão salvos.

    Na aba “Básico”, especifique o nome do pacote; este deve ser um identificador único. Se você possui um site, use-o para gerar o prefixo. Neste exemplo, especifiquei ru.profi1c.samples.report.head

    Na aba “Serviço Web”, o endereço IP é 10.0.2.2; por padrão, este é o endereço do seu computador quando acessado a partir de um emulador Android. Nos campos “Nome do serviço web” e “Subdiretório do aplicativo”, insira os dados que foram especificados na publicação do serviço web.

    Observe que para 1C 8.2, provavelmente você terá um subdiretório de aplicativo com um subdiretório /ws adicional, ou seja, demoFba/ws, consulte para mais detalhes.
    Clique em Criar, o modelo de projeto Android será gerado.

    Preparando dados de origem para relatórios em 1C Abra o módulo fba Event Subscription no configurador 1C e adicione o seguinte código ao procedimento Antes de enviar tabela externa:

    If AbbrLP(Mobile Application. Code) = "SAMPLE_REPORT_HEAD" Then If TableName = "Report to the Manager" Then // dados fictícios do relatório ListTemp = fbaTotal.FromLineWithSeparators("Caixa, Contas a pagar, Total de contas a receber, Saldos de mercadorias, Contas a pagar, Vendas por volume"); RNG = Novo Gerador de Números Aleatórios (123456789); Para cada ListElement de ListTemp Ciclo NewRow = ExternalTable.Add(); NewRow.Indicator = ListElement.Value; NovaRow.Value = RNG.RandomNumber(0,999999) + Sin(RNG.RandomNumber(0,999)); Fim do Ciclo; fim se; Fim se
    Neste exemplo, a tabela é preenchida com dados fictícios; em uma aplicação real, você pode passar aqui um número arbitrário de indicadores de relatório.
    Classificamos os dados do primeiro relatório, só falta prepará-los para o segundo. No mesmo módulo de assinatura fbaEvent, adicione o seguinte código ao procedimento Preparar dados binários para envio:

    DD = Indefinido; Se AbbrLP(MobileApp.Code) = "SAMPLE_REPORT_HEAD" Então se Identificador = "REPORT_PRODUCTS_IN_STOK" Então FileName = GetTemporaryFileName("html"); Relatório = Reports.ProductsInWarehouses.Create(); Se Report.SaveReportInHTML(FileName) Então DD = New BinaryData(FileName); DeleteFiles(NomeArquivo); fim se; fim se; fim se; Retornar DD;
    Vou comentar o código. Quando um aplicativo móvel solicita dados arbitrários (na forma de arquivo) com o identificador “REPORT_PRODUCTS_IN_STOK”, um relatório é executado em 1C e seu resultado é salvo em um arquivo temporário. Este arquivo temporário é então lido como dados binários e transferido para o aplicativo móvel. O arquivo temporário é excluído.

    A forma como o arquivo html é gerado neste caso não é importante para nós. Você pode usar o mecanismo 1C padrão para salvar um documento de planilha como HTML ou gerar HTML manualmente. Você pode ver um exemplo de saída na configuração “FBA demo”, relatório “Produtos em armazéns”.

    É isso com 1C, vamos prosseguir para o desenvolvimento de um aplicativo móvel no Android.

    Projetando um aplicativo Android Importamos o modelo de projeto Android criado em 1C para o espaço de trabalho Eclipse.

    Inicie o Eclipse e importe o projeto: Arquivo > Importar... No grupo Android, selecione o item “Exists Android Code Into Workspace”, clique em Next, especifique o caminho para o diretório do modelo de projeto Android e clique em Finish, o novo projeto será adicionado ao espaço de trabalho. Caso surja alguma dificuldade, veja, o processo está descrito em fotos.

    1. Crie um relatório “Indicadores Financeiros”, cuja fonte de dados é a tabela de valores recebida de 1C. Para fazer isso, adicione uma nova classe ToChiefReport.java, aqui está o código fonte completo:

    Mostrar

    /** * Um exemplo de construção de um relatório usando dados de um banco de dados sqlite local. A fonte de dados * é a tabela externa “Report to the Manager” * */ public class ToChiefReport extends SimpleMapHtmlReport ( @Override public int getResIdIcon() ( return R.drawable.report_01; ) @Override public int getResIdTitle() ( return R. string.report_name_to_chief; ) @Override public void build(Context context, IReportBuilderResult builderResult) ( try ( makeReport(context); ) catch (SQLException e) ( e.printStackTrace(); setHeader1("Opa, relatório não criado!"); ) super.build (context, builderResult); ) private void makeReport(Context context) throws SQLException ( DBHelper helper = new DBHelper(context); // Cabeçalho do relatório e tabela setHeader2("Indicadores financeiros"); setTableHeader("Nome ", "Amount, rub ."); // As linhas da tabela estarão na ordem em que foram adicionadas Map mapData = new LinkedHashMap(); // Selecionando dados de um banco de dados sqlite local, tabela externa // “Relatório ao gerente ”ExTableRaportRukovoditelyuDao dao = helper .getDao(ExTableRaportRukovoditelyu.class); Listar linhas = dao.select(); para (linha ExTableRaportRukovoditelyu: linhas) ( mapData.put(row.pokazatel, row.znachenie); ) setTableData(mapData); ) )
    Vou comentar o código. A classe abstrata SimpleMapHtmlReport, da qual é herdada, destina-se à construção de um relatório HTML simples com uma tabela de duas colunas.
    Os primeiros 2 métodos getResIdIcon() e getResIdTitle() retornam o ícone e o título do nosso relatório para serem exibidos na lista. No manipulador de eventos “build”, o método makeReport é chamado, que é nossa implementação de compilação de relatórios.
    Ao construir um relatório, o relatório e o título da tabela são primeiro definidos e, em seguida, todos os registros da tabela sqlite local são lidos como linhas da tabela do relatório. E finalmente, no método setTableData() definimos os dados para a tabela do relatório. Ugh, como é difícil comentar coisas óbvias.


    2.Crie um segundo relatório, tudo é ainda mais simples aqui:

    Mostrar

    /** * Um exemplo de relatório compilado, simplesmente gera um arquivo HTML. Neste exemplo * o arquivo de dados foi gerado em 1C e transferido para o cliente móvel durante a troca * */ public class ProductsInStokReport extends SimpleCompiledHtmlReport ( // O nome sob o qual o arquivo recebido de 1C é salvo (veja o procedimento de troca // MyExchangeTask ) public static final String REPORT_FILE_NAME = "products_in_stok.html"; public ProductsInStokReport(Arquivo file) ( super(file); ) @Override public int getResIdIcon() ( return R.drawable.report_02; ) @Override public int getResIdTitle() ( retornar R.string.report_name_products_in_stok ; ) )


    3. Vamos expandir o procedimento de troca predefinido com o servidor 1C, ou seja, Vamos adicionar mais uma etapa - obter dados para nosso segundo relatório na forma de um arquivo compilado. Vamos adicionar a classe MyExchangeTask, descendente de ExchangeTask:

    Mostrar

    /** * Procedimento de troca padrão complementado com regras personalizadas. * Além disso, é obtido um arquivo compilado - um relatório. * */ public class MyExchangeTask estende ExchangeTask ( // ID do relatório conforme definido em 1C private static final String ID_REPORT_PRODUCTS_IN_STOK = "REPORT_PRODUCTS_IN_STOK"; public MyExchangeTask(ExchangeVariant exchangeVariant, WSHelper wsrvHelper, DBOpenHelper dbOpenHelper) ( super(exchangeVariant, wsrvH elper, dbOpen) Ajudante); ) @Override protected boolean doExecute() throws Exception ( // Executa etapas de troca de acordo com regras predefinidas boolean success = super.doExecute(); if (success) ( // Recebe dados arbitrários - nosso segundo relatório onStepInfo("Recebendo relatórios.. . "); String fPath = appSettings.getCacheDir().getAbsolutePath() + "/" + ProductsInStokReport.REPORT_FILE_NAME; Arquivo f = wsHelper.getLargeData(ID_REPORT_PRODUCTS_IN_STOK, null, "", fPath); sucesso = (f != null) ; ) retorno sucesso; ) )
    Para obter os dados do relatório, é usado o método de serviço web getLargeData que, se for bem-sucedido, salva o resultado em um arquivo no caminho especificado. Preste atenção ao identificador ID_REPORT_PRODUCTS_IN_STOK, deve ser o mesmo que em 1C no método Preparar Dados Binários para Envio.


    4. Exiba uma lista de relatórios no formulário principal. Abra o arquivo res\activity_main.xml e adicione um listView que exibirá uma lista de relatórios:

    Em MainActtiviy.java adicionamos:

    A) uma variável local para a lista
    lista ListView privada;
    b) método de inicialização
    private void init() ( list = (ListView) findViewById(android.R.id.list); // Cria um adaptador para exibir uma lista de relatórios ReportListAdapter adapter = new ReportListAdapter(this,createReportList()); list.setAdapter( adaptador); list.setOnItemClickListener(new OnItemClickListener() ( @Override public void onItemClick(AdapterView parent, View view, int position, long id) ( // Mostra o relatório na caixa de diálogo quando você clica nele IReport report = (IReport) list.getItemAtPosition(posição) ; report.onShow(MainActivity.this); ) )); )
    e chamá-lo em onCreate() após definir o layout do formulário
    setContentView(R.layout.activity_main); iniciar();
    c) método para inicializar a lista de relatórios
    /* * Prepara uma lista de relatórios */ private List createReportList() ( List lst = new ArrayList(); // Cria o primeiro relatório, o diretório temporário onde o arquivo é salvo é retirado // Configurações do IReport report = new ProductsInStokReport (new File(getAppSettings() .getCacheDir(), ProductsInStokReport.REPORT_FILE_NAME)); lst.add(report); // Cria e adiciona outros relatórios à lista lst.add(new ToChiefReport()); )
    d) o procedimento para lançar uma bolsa de acordo com suas regras
    /* * Iniciando uma troca de acordo com minhas regras. Observe que no agendador * (se instalado) a troca permaneceu de acordo com as regras padrão */ private void startExchangeMyRules(ExchangeVariant variante,boolean cancelable) ( // auxiliar para chamar métodos de serviço da web WSHelper wsHelper = new WSHelper(getExchangeSettings()) ; tarefa MyExchangeTask = new MyExchangeTask(variant, wsHelper, getHelper()); startExchange(tarefa, cancelável); )
    E altere a chamada para o procedimento de troca startExchange(ExchangeVariant.FULL, true) no manipulador onOptionsItemSelected para startExchangeMyRules(ExchangeVariant.FULL, true).

    O aplicativo está pronto, os formulários de autorização e as configurações do programa serão criados automaticamente, não iremos alterá-los.
    Vamos testá-lo em um emulador. Se você não cometeu erros em nenhum lugar, o aplicativo será iniciado. Porém, ao invés da janela de autorização, a janela de configurações será exibida imediatamente, pois os dados de autorização (nome de usuário e senha) não são especificados.

    Por favor digite seu nome de usuário: ivanov
    E senha: 123456

    Inicie o banco de dados 1C e abra o diretório “Mobile Employees”. Como dispositivo móvel, especifique o elemento predefinido “Device Emulator”, adicione o aplicativo “Report to Manager” à seção tabular “Mobile Applications” e defina um nome de usuário e senha idênticos.

    Inicie o procedimento de troca no emulador (botão com seta “para cima” no painel direito)

    O resultado da troca é exibido na notificação:

    Clique nele para iniciar seu aplicativo (ou para ver os detalhes do erro se a troca não for bem-sucedida).

    Vamos verificar o que aconteceu. Clique no relatório na lista:

    Mostrar


    Ótimo! Os relatórios são exibidos, você pode alterar a escala usando um botão ou gestos.


    O aplicativo está pronto, revelou-se bastante funcional e facilmente expansível. Adicionar outros relatórios não será difícil.
    Você pode transferir documentos em vários formatos, como *.doc ou *.pdf, e usar aplicativos externos para visualizá-los. Veja o exemplo de código fonte, existem mais 3 relatórios:
    • gráfico usando as ferramentas de gráficos do Google
    • plotar usando o plugin jQuery Plot
    • saída de um relatório PDF por um aplicativo externo (PdfReport.java)
    Não vou descrevê-lo em detalhes e, portanto, o artigo acabou sendo longo. Se você tiver alguma dúvida, estou pronto para responder nos comentários. Aqui está a saída:

    Mostrar


    Você pode baixar o código de exemplo completo em https://xp-dev.com/svn/fba_toolkit_public/samples/fbaSample4ReportHead/

    Usar HTML para construir relatórios permite criar uma ampla variedade de relatórios, incl. e com elementos interativos. Por exemplo, em um de nossos projetos é utilizado o seguinte relatório:

    Mostrar

    • para o campo “Dívida”, é utilizado um esquema de cores condicional dependendo do valor;
    • a lista completa de faturas não pagas abre somente quando você clica no marcador “Todas”; por padrão, apenas as últimas 4 são exibidas.

    E claro, você não está limitado por nada, você pode usar bibliotecas de terceiros para exibir relatórios e gráficos, por exemplo, um artengine, ou criar seu próprio gráfico/diagrama (há muitos exemplos, incluindo aqueles no Android SDK).

    Só isso, você pode encontrar outros exemplos no site http://profi1c.ru.
    Num futuro próximo, está previsto adicionar aulas sobre elementos interativos e adaptadores da biblioteca FBA, bem como mostrar como trabalhar com mapas off-line do MapsForge.

    Fly in the unguento O produto FBA Toolkit está planejado para ser distribuído comercialmente; agora está no status de “versão demo”. Você é livre para usá-lo para testar e aprender.
    Restrições:
    • o programa para de funcionar depois que a licença de demonstração expira, ou seja, após 31/12/13;
    • Ao iniciar, uma notificação é exibida:

    Num futuro próximo (não mais de um mês) haverá uma versão comercial, informações sobre o custo e procedimento de licenciamento serão adicionadas ao nosso site.

    Obrigado por ler até o fim. Estou pronto para responder suas perguntas nos comentários sobre 1C e Android.

    Tags: Adicionar tags

    Usando o exemplo do aplicativo móvel “1C: Gerenciando Nossa Empresa” (abreviado UNF), quero mostrar a evolução de um aplicativo móvel de negócios desde suas origens e o lançamento da primeira versão até os dias atuais. O aplicativo possui atualmente mais de 220.000 downloads; O aplicativo é gratuito, mas possui opções pagas (implementadas por meio de compras no aplicativo).


    A primeira versão do UNF móvel foi feita em uma das primeiras versões da plataforma móvel 1C:Enterprise em 2012. Naquela época já existia uma configuração cliente-servidor “1C: Gestão de uma pequena empresa” (então o nome era esse), um programa para automatizar as atividades de uma pequena empresa - vendas, compras, base de clientes e fornecedores, armazém gestão, produção, etc.

    Como a maioria dos aplicativos móveis escritos na plataforma móvel multiplataforma 1C:Enterprise, o UNF móvel está disponível em iOS, Android e Windows.

    A tarefa foi colocada da seguinte forma: criar uma aplicação móvel que suporte parte dos cenários de trabalho do “grande” UNF. A aplicação deve ser capaz de funcionar de forma autônoma e sincronizar dados com o UNF “grande” (a seguir escreverei a palavra “grande” em relação à versão cliente-servidor do UNF sem aspas para não sobrecarregar o texto ). No caso de trabalhar com um grande CNF, os cenários de funcionários “móveis” – representante de vendas, engenheiro de serviço, vendedor – devem ser apoiados.

    A primeira versão foi criada em 1 homem-mês. Ao criar um aplicativo móvel, alguns objetos de metadados (diretórios, documentos) foram implementados com base em objetos do grande UNF. Mas algumas funcionalidades tiveram que ser programadas do zero, por exemplo, o processo de troca de dados com um grande UNF. É verdade que, em relação à troca de dados, tivemos que fazer um pouco de programação - usamos mecanismos de plataforma padrão (em particular, planos de troca), que reduzem a codificação ao mínimo.

    Além de simplificar o trabalho com sincronização de dados, a plataforma 1C facilita significativamente o trabalho de construção de um aplicativo móvel completo, proporcionando ao desenvolvedor componentes de interface como listas (tabulares e hierárquicas) com a capacidade de pesquisá-los, campos de entrada com pesquisa, tabelas para relatórios, ampla variedade de gráficos, capacidade de impressão em impressoras WiFi e Bluetooth, etc.

    Recursos da versão móvel Existem duas estratégias principais para escolher a funcionalidade de um aplicativo móvel. A primeira é “um aplicativo – uma função”. Por exemplo, um aplicativo móvel para recebimento de mercadorias em um armazém, que só consegue escanear o código de barras de um produto com uma câmera embutida e enviar informações sobre o produto recebido ao servidor. A segunda estratégia é criar um aplicativo móvel com ampla funcionalidade “tudo em um”. Ambas as abordagens são válidas; Ao escrever um UNF móvel, escolhemos a segunda abordagem - nosso aplicativo cobre muitas tarefas em sua área de assunto e pode funcionar de forma totalmente autônoma, atendendo às necessidades de uma pequena organização. Outra vantagem desta abordagem é que o usuário pode trabalhar com diversas funções inter-relacionadas a partir de uma aplicação.

    O Mobile UNF utiliza amplamente a funcionalidade de um dispositivo móvel, em particular:

    • A câmera embutida do aparelho pode ser usada para fotografar o produto no momento do preenchimento da ficha do produto, para leitura de códigos de barras e códigos QR
    • Uma fatura para pagamento pode ser enviada ao cliente por e-mail ou SMS
    • A contraparte pode ser selecionada no catálogo de endereços do dispositivo móvel
    • Se a contraparte tiver um número de telefone, você pode ligar para a contraparte ou enviar um SMS com um toque; se for especificado um e-mail, envie uma carta; se for especificado um endereço, mostre-o no mapa
    • Você pode imprimir documentos em impressoras via WiFi e Bluetooth
    Existe uma opção para fazer backup e restaurar o banco de dados UNF móvel para Yandex.Disk e enviar o banco de dados por correio.

    A configuração do UNF móvel parece bastante espartana (veja a imagem abaixo):

    • 8 livros de referência (na grande UNF existem 273 livros de referência)
    • 7 documentos (na grande UNF - 125)
    • 3 diários de documentos (no grande UNF - 24)
    • 3 registros de informações (na grande UNF - 357)
    • 4 registros de acumulação (na grande UNF - 64)

    Principais objetos do UNF móvel

    Mas, apesar de um número tão pequeno de objetos de aplicação, o produto revelou-se bastante funcional.

    Uma característica interessante do UNF móvel é que muitas vezes ele começa a ser usado por pessoas que nunca ouviram falar de 1C antes (sim, existem em nosso país), aquelas que precisam de um aplicativo móvel para manter registros de seus pequenos negócios ( por exemplo, artesanato doméstico). Eles simplesmente o encontraram pesquisando no Google Play ou na AppStore, leram os comentários e começaram a trabalhar.

    Operação offline Este cenário de trabalho é destinado a organizações muito pequenas, quando toda a contabilidade é realizada exclusivamente em um dispositivo móvel. Pode ser, por exemplo, um negócio “doméstico” - fazer joias em casa e vendê-las na página do VKontakte. Ou talvez até uma pequena loja - vi pessoalmente um caso em que uma loja de brinquedos especializada na venda de construtores de Lego mantinha registros exclusivamente na versão mobile do UNF. Considerando que o UNF móvel pode imprimir em impressoras WiFi e Bluetooth, ele pode ser usado para resolver um grande número de problemas. Mobile UNF suporta processamento de pedidos, inserção de faturas e faturas, contabilização de recebimentos e despesas de dinheiro Trabalhe no modo de sincronização com o servidor (primeiras versões) No modo de sincronização com o servidor no UNF móvel em versões anteriores, a funcionalidade de contabilidade ficou indisponível e funciona nele foi realizado principalmente com pedidos (recebimento e cumprimento de pedidos) e atividades relacionadas (manutenção de diretórios de contrapartes, bens e serviços, etc.).

    Diretórios de bens e serviços, prestadores de serviços e pedidos foram sincronizados com o grande UNF.


    Troca de dados entre UNF móvel e grande nas primeiras versões

    Os pedidos inseridos a partir de dispositivos móveis iam parar em um grande UNF e, quando sincronizados, iam parar nos dispositivos móveis dos responsáveis ​​pelos pedidos. Documentos como recebimentos de dinheiro, vendas de mercadorias, etc., inseridos em dispositivos móveis, iam para o grande UNF, mas não eram sincronizados entre os dispositivos móveis. Todo o trabalho na aplicação móvel em modo de sincronização foi realizado principalmente em torno de encomendas - sua aceitação e execução; a contabilização completa não foi realizada no dispositivo móvel; para isso foi necessário utilizar um grande CNF no computador.

    Foi o que aconteceu nas primeiras versões, mas depois mudamos a situação e ampliamos a lista de cenários de utilização do CNF móvel para tornar o trabalho com ele mais conveniente para os usuários.

    Um pouco sobre sincronização de dados A troca de dados entre UNF móvel e grande ocorre por meio de serviços web; o UNF móvel chama serviços web implantados no grande lado do UNF. As estruturas de dados em CNF grandes e móveis são diferentes; Ao projetar a arquitetura, consideramos 2 opções para troca de dados:
  • Crie uma estrutura de dados em um CNF grande que duplique a estrutura de dados de um CNF móvel e troque dados um a um com o CNF móvel. Ao alterar dados em um UNF grande, você precisa transferir os dados novos/alterados para esta estrutura duplicada e, após trocar dados com o UNF móvel, converter os dados que vieram do dispositivo móvel e localizados na estrutura duplicada no UNF grande formatar.
  • Troque dados diretamente com as estruturas de um grande UNF, convertendo dados “on the fly” de acordo com as regras de troca.
  • Decidimos optar pela segunda opção. A primeira opção, embora prometesse algumas vantagens associadas à simplicidade da própria troca de dados, não administrou bem a situação quando a estrutura de dados foi alterada (ampliada) na nova versão do UNF móvel; Para que a troca de dados um a um continue funcionando, seria necessário atualizar o servidor, o grande UNF. O que, por muitas razões, era inaceitável.

    Os mecanismos de troca de dados implementados na plataforma assumem a maior parte do trabalho de criação de pacotes para sincronização de dados, permitindo reduzir ao mínimo a codificação. Durante o processo de troca, é utilizado o mecanismo padrão da plataforma 1C:Enterprise - o mecanismo de troca de dados; para cada UNF móvel, um nó de troca de dados é criado no UNF grande; no UNF grande e móvel, um serviço de registro de alterações é usado para rastrear os dados alterados desde a última sincronização, etc.

    A aplicação móvel inicia a troca de dados, utilizando os mecanismos da plataforma, gera um pacote de troca (contendo o identificador da aplicação móvel e os dados atualizados no UNF móvel desde a última sincronização) e o envia para o UNF grande. Com base nas informações do pacote inicial, o CNF grande prepara para o CNF móvel os dados alterados no CNF grande desde a última sincronização e os empacota em pacotes. Pacotes no formato XDTO são objetos de metadados 1C serializados em XML; O tamanho de cada pacote não passa de 500 objetos.

    O Mobile UNF coleta esses dados pacote por pacote. Após baixar o último pacote, o UNF móvel começa a processar os dados recebidos - processar documentos, registrar diretórios, etc. No caso de interrupção da conexão, a retomada de pacotes é suportada; Nós mesmos escrevemos o mecanismo de retomada do CNF (ele não está na plataforma), mas como o CNF móvel é fornecido em código-fonte, os desenvolvedores podem observar a implementação do mecanismo e emprestá-lo para seus aplicativos.

    Durante a sincronização inicial de um CNF móvel com um CNF grande, você não pode trabalhar no CNF móvel - aparece uma janela modal mostrando o andamento do processo. Todas as sincronizações subsequentes são em segundo plano e não bloqueiam a operação do UNF móvel.

    Lista completa de objetos trocados entre UNF móvel e grande:

    • Diretórios:
      • Nomenclatura
      • Contrapartes
      • uma lista de usuários
    • Documentação:
      • Pedidos de clientes
      • Recibo no caixa
      • Despesa da caixa registradora
      • Nota fiscal de compra
      • Fatura de vendas
      • Produção
    • Cadastros (mas não todos os preços, mas apenas os principais):
      • PreçosFornecedores
      • Preços dos Produtos
    • Informações sobre a organização:
      • Nome
      • Informação de impostos
    Na grande UNF, os produtos possuem fotos - imagens dos produtos reais. Para minimizar o tráfego, não carregamos imagens no UNF móvel; elas são carregadas sob demanda - por exemplo, quando abrimos um cartão de produto no UNF móvel.


    Cartão do produto com imagem do produto

    Evolução do aplicativo - desenvolvimento de casos de uso Uma situação típica - um negócio está crescendo e a funcionalidade do CNF móvel em um dispositivo móvel não é mais suficiente. Outro funcionário (ou funcionários) aparece no negócio, e eles também precisam atender pedidos.

    Nas primeiras versões do UNF móvel, o cenário de movimentação era bastante simples - os dados inseridos no UNF móvel eram copiados para o banco de dados do grande UNF, e o usuário agora tinha que manter registros no computador. Neste caso, o UNF móvel funcionará na modalidade de trabalho com pedidos, não sendo mais possível manter registros (como na versão autônoma do UNF móvel).

    Isso, é claro, não era muito conveniente para o usuário final - ele já estava acostumado a manter registros de um dispositivo móvel, mas aqui foi forçado a sentar-se diante do teclado do computador. Nem todo mundo ficará feliz com isso.

    Portanto, ampliamos a lista de cenários para o funcionamento do UNF móvel. O surgimento do nosso serviço de nuvem http://1cfresh.com, baseado na tecnologia de nuvem 1cFresh, nos ajudou nisso. Agora é possível colocar grandes CNF na nuvem. Descrevemos três cenários para usar um aplicativo móvel à medida que o negócio do usuário cresce:

  • Um pequeno negócio. A contabilidade é realizada em um dispositivo móvel.
  • O negócio está crescendo - surgiram funcionários. Você pode instalar o UNF móvel nos dispositivos móveis dos funcionários. Ao mesmo tempo, você precisa poder trocar dados entre dispositivos móveis para sincronizar dados; Para isso, decidimos não utilizar a troca de arquivos, mas sim utilizar para sincronização (e ao mesmo tempo para backup) uma versão do grande UNF localizada na nuvem http://1cfresh.com. Ao habilitar este script, uma instância de um grande CNF é criada na nuvem http://1cfresh.com, cujo banco de dados será usado para sincronizar dados entre dispositivos móveis. O uso de um dispositivo móvel neste cenário é gratuito. Para cada dispositivo adicional cobramos 75 rublos/mês, você não pode usar mais do que três dispositivos neste cenário. Ao mesmo tempo, os usuários de dispositivos móveis podem receber funções predefinidas - representante de vendas, engenheiro de serviço, vendedor (também é possível configurar funções detalhadas); A funcionalidade do aplicativo móvel será limitada de acordo. Você também pode trabalhar por meio de um cliente web ou thin client com um grande CNF hospedado na nuvem, mas a funcionalidade do CNF na nuvem será reduzida à funcionalidade do CNF móvel. Mas não é necessário trabalhar diretamente na nuvem UNF - todo o trabalho só pode ser feito a partir de dispositivos móveis.
  • O negócio cresceu até o tamanho de uma empresa de médio porte. Nesse caso, faz sentido alugar uma versão completa de um grande UNF na nuvem para receber (por meio de um cliente web ou thin client) funcionalidade adicional - CRM (os planos incluem a inclusão de CRM no UNF móvel, mas para agora só está disponível na versão grande), gerenciamento de armazéns, formação ampliada de preços, capacidade de trabalhar com bancos e. Neste caso, o número de dispositivos móveis que funcionam com um grande CNF não é limitado (para cada dispositivo é cobrada uma taxa adicional de acordo com a tarifa, como para um local de trabalho; 1 licença para CNF em Fresh ou para um CNF “em caixa” dá o direito de uso gratuito de 1 aplicativo móvel).
  • Experiência de monetização de aplicativos O aplicativo móvel UNF, como já escrevi, é gratuito. Há algum tempo, decidimos monetizar nosso aplicativo (usando a funcionalidade de compra no aplicativo implementada na plataforma móvel 1C:Enterprise versão 8.3.8), vendendo funcionalidades adicionais - produção e a capacidade de sincronização com dispositivos móveis adicionais.


    A funcionalidade de produção é uma compra única e a capacidade de sincronização com dispositivos móveis adicionais é fornecida como uma assinatura que deve ser renovada todos os meses. Curiosamente, apenas 3 semanas após adicionar a funcionalidade de compras, o UNF móvel estava entre os 15 primeiros no Google Play em vendas de aplicativos de negócios.Conclusão O UNF móvel é um produto relativamente pequeno (em termos de volume de código-fonte), mas bastante popular. Esperamos que a história sobre sua evolução seja útil para os criadores de produtos móveis para o usuário final, tanto usando tecnologias 1C quanto outras ferramentas de desenvolvimento.

    Seria útil lembrar que na plataforma móvel 1C você pode criar aplicativos que interagem não apenas com o back-end do servidor 1C; os protocolos usados ​​​​para troca de dados em aplicativos móveis na plataforma 1C são independentes de plataforma (serviços web e HTTP, suporte para XML e JSON, etc.). Portanto, se você precisa desenvolver de forma rápida e dinâmica um cliente móvel multiplataforma (Android, iOS, Windows), com a capacidade de trabalhar offline sem uma conexão constante com a Internet para seu aplicativo de negócios, a plataforma móvel 1C pode muito bem ser a melhor escolha para você.

    Introdução

    A nova versão da plataforma 1C (8.3.5) possui muitas funcionalidades novas. A propósito, para quem não sabe, existe um recurso no qual os desenvolvedores 1C descrevem as inovações emergentes na plataforma. Um deles é o mecanismo. Isso me chamou a atenção e eu queria implementar algo para me divertir. Imediatamente me veio a ideia de fazer algo parecido com um site, mas essa ideia não teria sido entendida nem no infostart, então tirei isso da cabeça. Parecia que foi descartado, mas a ideia se transformou em algo não tão grande, algo que poderia encontrar aplicação real na vida - um aplicativo web móvel.
    Acredito que um aplicativo da web móvel simples e de baixa carga para um número limitado de usuários, por exemplo, funcionários, pode ser implementado em 1C usando serviços HTTP.

    Aplicativo web móvel "Contatos"

    Vou começar com o resultado. O aplicativo web móvel "Contatos" parece simples, e de fato é. No início, você vê apenas um campo para procurar um contato.

    Vamos procurar alguém (para que a busca comece é necessário inserir pelo menos 3 caracteres). Alguém foi encontrado.

    Vamos ligar para Alexei.

    Vamos escrever uma carta para Timofey.

    Isso é tudo que o aplicativo da web móvel é.

    Aliás, é muito fácil adaptá-lo a qualquer configuração.

    Um pouco sobre implementação

    Ferramentas usadas:
    - Mecanismo de serviços HTTP da plataforma 1C (a partir da versão 8.3.5)
    - Biblioteca JavaScript jQuery (http://jquery.com)
    - Biblioteca JavaScript jQuery mobile (http://jquerymobile.com)
    -1C:JSON()

    O serviço HTTP "ContactsMVP" aceita todas as solicitações e as transfere para o processamento "ContactsMVP". Toda a lógica da aplicação mobile web está concentrada no processamento do “ContactsMVP”.

    É assim que se parece o processamento de solicitações.

    Função ProcessRequest(Request) Exportar If MatchesResource(Request, "/index.html") Then Return GetResourceIndexHTML(); ElseIf MatchesResource(Request,"/application.js") Then Return GetResourceApplicationJS(); ElseIf MatchesResource(Request,"/contacts.json") Then Return GetResourceContactsJSON(Request); fim se; Função Final

    E é assim, por exemplo, que fica o retorno da página index.html.

    Função GetResourceIndexHTML() Resposta = Novo HTTPServiceResponse(200); Texto = GetLayout("IndexHTML").GetText(); Answer.SetBodyFromString(Texto); Response.Headers.Insert("Tipo de conteúdo", "texto/html"); Resposta de retorno; Função Final

    Nada complicado. Você pode estudar o mecanismo com mais detalhes baixando ContactsMVP.dt

    Características da publicação

    Houve algumas pequenas dificuldades na publicação do serviço HTTP, então para facilitar para você, vou esboçar algumas notas:
    - Existem descrições bastante detalhadas sobre a publicação - leia com mais atenção.
    - Não se esqueça de executar o configurador como administrador antes de publicar.
    - Foi possível iniciar o serviço HTTP apenas com a versão do arquivo; ocorreu algum erro com a versão cliente-servidor.
    - Para que a aplicação mobile web funcione sem solicitação de autorização, caso existam usuários cadastrados no banco de dados, após a publicação, no arquivo default.vrd, os parâmetros Usr e Pwd devem ser adicionados à string de conexão (ponto. iB).

    Conclusão

    Espero que o material do artigo seja útil para você.

    Obrigado pela sua atenção.

    Este protótipo foi criado usando Moqups– um serviço simples e conveniente para criação de layouts e conceitos. É bastante adequado para prototipagem rápida de pequenos aplicativos Android. Para prototipar projetos mais sérios, é melhor usar o Photoshop e o Android UI Design Kit!.

    Descrição do aplicativo

    O aplicativo consiste em 3 telas:

    “Tela principal do aplicativo” – ao ser iniciado, é exibida uma lista de tarefas (data de vencimento, nome da tarefa e indicação de sua conclusão). Assim que uma tarefa for concluída, ela será marcada como concluída na lista.

    Ao clicar no botão “Troca de Dados”, o funcionário pode iniciar imediatamente o procedimento de recebimento de novas tarefas do servidor. A troca de dados com o servidor também é realizada automaticamente uma vez ao dia, de acordo com o horário especificado nas configurações.

    “Configurações do programa” - aqui você define os parâmetros de autorização e o endereço do servidor 1C, além de exibir o número de identificação exclusivo deste dispositivo. Uma programação de troca automática também pode ser definida aqui.

    A estrutura dos dados trocados entre o cliente móvel e o servidor 1C

    O caminho será uma tabela de valores (em termos 1C), que contém 3 colunas:

    Criando um modelo de aplicativo móvel em 1C

    Inicie 1C e selecione o diretório “Aplicativos Móveis”, adicione um novo elemento, onde:

      No campo “Identificador”, especifique SAMPLE_APP_TASKS (ou pense em qualquer outro), este é um identificador exclusivo da aplicação dentro de sua configuração. Necessário para identificar exclusivamente o aplicativo durante o processo de troca, porque O mesmo funcionário pode usar vários aplicativos em um dispositivo móvel.

      No campo “Nome”, insira o nome do seu aplicativo móvel, por exemplo Tarefas.

    Anote o item do diretório usando o botão Escrever, crie uma nova versão e especifique-a como uma versão funcional para seu aplicativo.

    Selecione o grupo “Dados externos” na lista “Metadados” e clique no botão “Adicionar” na barra de ferramentas. Preencha os parâmetros da nova tabela conforme mostrado na figura:

    Os nomes das colunas e da própria tabela aqui, via de regra, são especificados em russo; eles serão usados ​​​​para preencher a tabela com dados usando a linguagem 1C integrada.

    Cada tabela de dados em uma aplicação móvel deve ter uma chave primária (PRIMARY KEY em termos de bancos de dados relacionais) do tipo string. Para todas as tabelas de objetos (diretórios e documentos), a chave é a representação textual do link (um identificador único) e é preenchida automaticamente.

    Para tabelas não-objetos, como um “registro de informações” ou uma “tabela externa”, o programa deve indicar como deve ser preenchido. Uma opção é definir o sinalizador “Índice” para uma ou mais colunas da tabela, que é o que foi feito em nosso exemplo para as colunas “Data de Vencimento” e “Tarefa”. Isto significa que a tabela não pode ter duas tarefas idênticas para a mesma data.

    Clique em OK, a tabela será adicionada à árvore de metadados, para o aplicativo móvel os nomes são traduzidos automaticamente para o latim.

    [Uma das regras da FBA: em 1C escrevemos o código-fonte em russo, em Java em latim. A ausência de letras russas em identificadores, nomes de variáveis ​​e classes evitará muitos problemas ao projetar um cliente móvel]

    Renomeie os nomes do latim para o inglês. Em princípio foi possível sair do alfabeto latino, mas já decidimos os nomes (acima na tabela).

    Salve as alterações e clique no botão “Modelo de aplicativo móvel” na barra de ferramentas.

    “Diretório de modelos” – especifique o caminho para o diretório no qual os arquivos de modelo de aplicativo móvel gerados serão salvos.

    Na aba “Básico”, especifique o nome do pacote; este deve ser um identificador único. Se você possui um site, use-o para gerar o prefixo. Em nosso exemplo, é ru.profi1c.samples.tasks

    Na aba “Serviço Web”, o endereço do servidor é indicado como 10.0.2.2; por padrão, este é o endereço do seu computador quando acessado a partir de um emulador Android.

    Nos campos “Nome do serviço web” e “Subdiretório do aplicativo”, insira os dados que foram especificados na publicação do serviço web.

    Na aba “Sobre o programa”, preencha os dados de contato e informações adicionais sobre sua aplicação; deixe as configurações da aba “Gerador de Tabelas” inalteradas.

    Clique em Criar, o modelo de projeto Android será gerado. Feche a janela do assistente de geração de modelo, salve as alterações e feche o item do diretório “Aplicativos móveis”