Fontes de dados externas 1c 8.3 excel. Fontes de dados externas

Release 8.2.14.533 - finalmente uma versão mais ou menos estável da 14ª versão da plataforma. Finalmente, houve a chance de experimentar uma oportunidade maravilhosa - "fontes de dados externas".

Por que essa oportunidade desperta tanto interesse? Qualquer pessoa que tenha programado em 1C está bastante familiarizada com SQL e, pelo menos em termos gerais, familiarizada com a arquitetura e os princípios de desenvolvimento de outras plataformas tecnológicas para aplicativos de negócios, dirá com certeza o que mais gosta em 1C. É claro que o construtor de consultas é o mecanismo mais conveniente e inteligente para escrever consultas para obter dados de estruturas relacionais que eu já conheci pessoalmente. E agora o 1C nos deu uma oportunidade maravilhosa de usá-lo não apenas com o 1C, mas também com qualquer outra mesa. Aqui estão apenas um monte de "mosca na pomada" derramado neste "barril de mel". Tudo em ordem:

1) Configurando e usando - sem "dançar com um pandeiro" não funcionará

A) Adicionar fonte externa dados - como nada complicado
b) marque a caixa "Selecionar na lista" - é necessário - isso é necessário para verificar o desempenho no início e evitar problemas desnecessários
v)
(IMG:http://pics.livejournal.com/comol/pic/0000cr1r.png)
- certifique-se de pressionar "..." - a conexão é ODBC. Não OLEDB como todos estamos acostumados, mas um nível abaixo

E estar aqui MUITO ATENTO.

Este é um driver ODBC - se você usar a versão cliente-servidor, ele deve estar no servidor. Se você estiver desenvolvendo em um sistema e trabalhando em outro (como geralmente é o caso), certifique-se de não ter surpresas. Uma recomendação estranha, mas escolha o driver mais antigo ou mais comum se você não estiver particularmente preocupado com a velocidade e não pretende ir além dos limites do padrão SQL92. Isso lhe dará a melhor compatibilidade. Por exemplo, para SQL Server 2008 o melhor motorista haverá o SQL Server Native Client 11, mas recomendo escolher apenas o SQL Server, caso contrário esse cliente nativo terá que ser instalado no servidor ou em todas as máquinas clientes (se estiver usando versão do arquivo), e o payoff é especial para tarefas simples ele não vai.

E) Diálogos de seleção de servidor padrão

G) Escolha uma tabela e detalhes ... uma grande oportunidade - você pode renomeá-la imediatamente como quiser (e detalhes também), enquanto nas propriedades você verá os nomes dos campos da fonte de dados

H) E agora você executa, abre o designer de consulta - você seleciona estupidamente todos os registros da tabela e do OPA - um erro. O que fazer? Se você tiver uma interface gerenciada, procure no menu de serviço e se tiver uma normal...
Eu pessoalmente usei este código:

Parâmetros = ExternalDataSources.DAX.GetCommonConnectionParameters();
Parameters.AuthenticationStandard = true;
Parameters.UserName = "sa";
Parameters.Password = "pas";
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=banco de dados";
Parameters.DBMS = "MSSQLServer";

ExternalDataSources.DAX.SetCommonConnectionParameters(Parameters);
ExternalDataSources.DAX.SetUserConnectionParameters(UserName(), Parâmetros);
ExternalDataSources.DAX.SetSessionConnectionParameters(Parameters);

ExternalDataSources.DAX.SetConnection();

Talvez algumas peças não sejam necessárias, mas funciona. Precisa executar o código UMA VEZ. Depois disso, ele se conectará normalmente ... misticismo é claro - por que foi necessário não está claro ...

2) Fontes de dados somente leitura
Sim, milagres não acontecem... mas às vezes você quer....

3) NÃO OS USE JUNTO COM FONTES DE DADOS INTERNAS
Pessoalmente, esse fato me matou na hora.

Como é .... o que estávamos esperando e já imaginamos e lambemos como agora em um pedido vamos combinar nossos dados com 1C, desligá-lo - agrupá-lo, inseri-lo no relatório, mas não foi lá ...

Mas é claro que isso não impede as pessoas experientes... que pensamento veio à mente? Isso mesmo - tabelas temporárias:

4) NÃO OS USE JUNTO COM AS TABELAS TEMPORÁRIAS

Mas isso já não se parece com dificuldades tecnológicas, mas se parece muito com o que eles querem que façamos "para que a vida não pareça um paraíso" (IMG :) .

5) Só pode ser usado em conexões SKD

Para quem não sabe, está no ACS na aba "Dataset Links". Com que frequência você os usa? Convenientemente? Aparentemente eles querem nos forçar a usá-los com mais frequência. Mas há uma coluna "Condição de link" e "Parâmetro de link". Não encontrei um exemplo de seu uso em nenhuma configuração típica, na documentação e em Khrustaleva também, de alguma forma, tudo não é transparente. Alguém pode me explicar como funciona a "condição do link". Se você escrever SourceAttribute = ReceiverRevision lá, não funcionará. Claro, a condição pode ser escrita no campo "Expressão" - na maioria dos casos isso é suficiente ... mas de alguma forma não é muito fácil.

No total, esse problema foi resolvido anteriormente em algum lugar assim:

Função InitializeDataSource()

DateStart = BuilderSettings.Settings.DataParameters.Items.Value;
DateCon = BuilderSettings.Settings.DataParameters.Items.Value;
Se DateCon > "20100101" Então
DateCon = "20100101";
Fim se;

QN = NewQualifiersNumber(15,2);
cs = NewStringQualifiers(255);

NúmeroMatriz = Nova Matriz();
ArrayNumber.Add(Type("Numero"));

MatrizString = Nova Matriz();
ArrayString.Add(Type("String"));

MatrizData = Nova Matriz();
ArrayDate.Add(Type("Data"));

//Vamos preencher o custo contábil na tabela
TypeNumber = NewTypeDescription(ArrayNumber,KN);
StringType = NewTypeDescription(ArrayString, CS);
TypeDate = NewTypeDescription(ArrayDate);

//tabela para carregar dados do SQL
TK = Nova Tabela de Valores();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Qnty", TypeNumber);
TK.Columns.Add("Período", TypeDate);

TK.Indices.Add("Período");

//Conecta-se ao SQL
ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Encryption for Data=False;Tag com agrupamento de colunas quando possível=False;Catálogo inicial=Relatórios";
Conexão = New COMObject("ADODB.Connection");
Comando = New COMObject("ADODB.Command");
RecordSet = New COMObject("ADODB.RecordSet");
Data = "";
Tentar
Connection.Open(ShortLP(ConnectionString));
Command.ActiveConnection = Conexão;
Command.CommandText = "Selecione * de PH onde period >= "" + String(Format(DateStart, "DF=yyyyMMdd")) + "" e period RecordSet = Command.Execute();
RecordSet.MoveFirst();
Uma exceção
Retorno de TK;
Fim da tentativa;

Enquanto RecordSet.EOF = Falso Loop
String = TK.Add();
String.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
String.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Nome).Value;
String.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
FimCiclo;

Pedido = Novo Pedido();
TabelaVr = NewTempTableManager();
Query.SetParameter("vDataTable", TK);
Query.SetParameter("DataInício",DataInício);
Query.SetParameter("DateCon", DateCon);
Query.Text = "SELECT
| vrDataTable.NomenclatureCode,
| vrDataTable.Qnty,
| vrDataTable.Período
|PUT DataTable
| DE
| &vrDataTable AS vrDataTable
|ONDE
| vrDataTable.Period >= &DateStart
| E vrDataTable.Period Query.Execute();
TK = Indefinido;

Solicitação = Nova Solicitação;
Query.TempTableManager = VrTable;
Query.Text = "Aqui está uma consulta envolvendo uma tabela temporária";

Resultado = Request.Run();
Retornar Resultado;

EndFunctions

OuterSet = InitializeDataSource();
DataSet = Nova Estrutura();
DataSet.Insert("Tabela SQL", ExternalSet);
GenericReports.Generate GenericReport(ThisObject, Result, Decryption Data, OutputToReportForm,DataSet);

Na verdade, não há muitas linhas de código e elas são bastante padrão... neste caso, você pode usar toda a funcionalidade do construtor de consultas, e dar apenas a função DATA COMPOSITION no ACS

Mas, claro, parece um pouco não tão bonito ... e fazendo o upload para a tabela de valores toda vez que você precisar escrever código e verificar se cometeu um erro no nome dos detalhes ... caso contrário, o que nos foi dado em 1C parece meio sem entusiasmo. Ainda não decidi qual é mais conveniente de usar. Você decide e escreve sobre suas decisões e o que o levou a tomá-las.

[você precisa se registrar para ver o link]

A partir da versão 8.3.5, a plataforma implementa a capacidade de gravar dados em tabelas de fontes de dados externas. O artigo considera essa funcionalidade, que amplia as possibilidades existentes de integração da configuração com sistemas de terceiros.

Aplicabilidade

O artigo discute a plataforma 1C 8.3.5. O material também é relevante para os lançamentos atuais da plataforma.

Gravando em fontes de dados externas em 1C:Enterprise 8

Na plataforma 8.2.14, a árvore de metadados foi adicionada novo objeto– fontes de dados externas. O objetivo deste mecanismo é obter dados de bancos de dados externos em relação ao 1C.

Com o lançamento de novos lançamentos da plataforma, as fontes de dados externas evoluíram, por exemplo, tornou-se possível colocá-los em tabelas temporárias, realizar junções com tabelas regulares.

Neste artigo, veremos quais ferramentas um desenvolvedor tem para gravar em fontes de dados externas.

Todas as ações foram executadas no SGBD Microsoft SQL Server 2008 R2.

Na plataforma 8.3.4, foi implementada a capacidade de utilização das funções descritas em fontes de dados externas.

Esse recurso permite que você execute procedimentos armazenados no lado do SQL Server e, com a ajuda deles, acesse dados de fontes externas, inclusive para gravação.

Vamos dar um exemplo. Vamos criar um novo banco de dados com o nome kursy_test usando o SQL Management Studio. Todos os outros experimentos serão realizados nele.

Neste banco de dados, criaremos uma tabela de nomenklatura, para isso escreveremos um script com o seguinte conteúdo:

USE [kursy_test]
VAI
CRIAR TABELA [dbo]. [nomenklatura](
[ id ] [ int ] NÃO NULO ,
[ descrição ] [ nvarchar ](150 ) NOT NULL ,
[ preço ] [ numérico ](15 , 2 ) NULL ,
CONSTRAINT [ PK_id ] PRIMARY KEY ([ id ])
VAI

Como resultado da execução, será criada uma tabela com a seguinte estrutura:

Agora precisamos criar dois procedimentos armazenados que serão usados ​​para modificar os dados.

Vamos chamar o primeiro procedimento insert_nomenklatura. Ele será projetado para adicionar nova linha para a mesa. O script para criá-lo ficará assim:

USE [kursy_test]
VAI
CRIAR PROCEDIMENTO insert_nomenklatura
@eu não fiz ,
@descrição nvarchar(150),
@pricenumeric (15, 2)
COMO
COMEÇAR
INSERT INTO [kursy_test].dbo. [ nomenklatura ] ([ id ], [ descrição ] , [ preço ])
VALUES (@id , @description , @price )
FIM
VAI

O segundo procedimento, denominado update_nomenklatura, atualizará um registro que já existe na tabela. Para criá-lo, foi executado o seguinte script:

No Pesquisador de Objetos, a tabela gerada e dois procedimentos armazenados são assim:

Concluímos todas as etapas preparatórias no lado do Microsoft SQL Server, agora vamos para o configurador 1C:Enterprise 8.

Criamos uma nova fonte de dados externa chamada Nomenklatura. Ao criar uma nova tabela nesta fonte de dados, especificamos os seguintes parâmetros para conexão com a fonte de dados:

A string de conexão é a seguinte:

Driver = (SQL Server); Servidor =(local); Banco de dados = cursy_test ; ID do usuário = sa; senha=;

Se o usuário sa tiver uma senha, ela deverá ser especificada no parâmetro Password da string de conexão.

Se todos os parâmetros de conexão estiverem especificados corretamente, ao clicar em OK, será aberta uma janela contendo as tabelas disponíveis na fonte de dados:

Marcamos os campos de interesse para nós na tabela. Quando você aperta um botão Preparar a tabela dbo_nomenklatura será criada na fonte de dados externa Nomenklatura:

Agora mudamos para a guia “Funções” da nossa fonte de dados.

Usando um assistente semelhante, adicionamos dois procedimentos armazenados:

Recebemos o próximo aparência abas “Funções”:

Agora vamos programar interface de usuário para trabalhar com uma fonte de dados externa.

Na forma de lista no painel de comandos, coloque o botão “Adicionar” com o seguinte manipulador:

&AtCliente
Procedimento Add()
alerta = novo DescriçãoAlertas(“OpenTableFinish”, EsteObjeto);
AbrirFormulário (
“ExternalDataSource.Nomenklatura.Table.dbo_nomenklatura.ObjectForm”
, , , , , ,
Alerta, FormWindowOpenModeForm.LockAllInterface);
Fim do procedimento

&AtCliente
Procedimento Salvar (Comando)
Salvar no servidor();
EndProcedure &OnServer
Procedimento Salvar no servidor()
Se Objeto.Referência.Vazio() Então
ExternalDataSources.Nomenklatura.dbo_insert_nomenklatura
De outra forma
ExternalDataSources.Nomenklatura.dbo_update_nomenklatura
(Object.id , Object.description , Object.price );
Fim se ;
Fim do procedimento

No modo corporativo, o formulário de lista se parece com isso:

A forma do objeto é mostrada abaixo:

Clique na imagem para ampliar.

Assim, usando procedimentos armazenados, implementamos a gravação em fontes de dados externas.

Na plataforma 8.3.5, um novo recurso apareceu - gravar diretamente em fontes de dados externas, ignorando o mecanismo de procedimentos armazenados discutidos acima.

Os dados podem ser editados de forma programática e interativa. E para o nosso exemplo, você não precisa recorrer à configuração.

Nas barras de comando e no menu "Mais", você pode ver os botões padrão, como "Criar", "Copiar", "Editar", etc.

Clique na imagem para ampliar.

E na forma do objeto, apareceram os botões “Salvar” e “Salvar e fechar”:

Como você pode ver, agora trabalhar com fontes externas é semelhante a trabalhar com diretórios, documentos, etc.

Considere quais alterações foram feitas no nível de metadados para possibilitar a gravação em fontes de dados externas.

Uma nova propriedade foi adicionada à tabela de dados Somente leitura(tipo - booleano).

Se esta propriedade estiver configurada para True, não é possível gravar dados nesta tabela por meio da plataforma.

O campo da tabela de dados agora tem as seguintes propriedades:

  • Somente leitura(tipo - booleano) – é possível alterar os dados deste campo;
  • AllowNull(tipo - boolean) - se é possível armazenar o valor NULL neste campo.

Propriedade Somente leitura deve ser definido para Verdadeiro para campos de banco de dados com mudança automática, campos-chave gerados automaticamente, campos calculados etc.

Você pode adicionar, modificar e excluir dados em fontes externas usando a linguagem integrada.

Para isso, os objetos ExternalDataSourceTableRecordSet e ExternalDataSourceTableObject novos métodos foram implementados Escrever() e Excluir().

Considere um exemplo de adição programática de um novo registro para a fonte de dados externa discutida acima.

&AtCliente
Procedimento Criar programaticamente(Equipe )
Criar programaticamente no servidor();
EndProcedure &OnServer

Procedimento Criar programaticamente no servidor()
Objeto gravável=
ExternalDataSources.Nomenklatura.Tables.dbo_nomenklatura.CreateObject();
WritableObject.id= 5 ;
WritableObject.description= “Armário” ;
gravávelObject.price= 5000 ;
WritableObject.Write();
Fim do procedimento

No módulo de objeto de tabela de uma fonte de dados externa, agora você pode definir manipuladores de eventos de gravação, como AntesEscrever(), OnRecord() etc.:

Neste artigo, duas opções para gravar dados em fontes de dados externas foram consideradas - usando procedimentos armazenados e usando os novos mecanismos da plataforma 8.3.5.

Assim, a plataforma agora implementa mecanismos para integração total com aplicativos externos.

Na versão 8.3.6, a funcionalidade descrita acima foi estendida com novos métodos especiais GetChangableFields() e SetChangableFields(). Com a ajuda deles, é possível realizar uma operação de escrita naqueles campos da tabela VIEW que estão marcados no configurador como somente leitura. Graças a isso, tornou-se possível implementar um cenário em que a escrita em campos individuais da tabela VID só é possível nos casos em que é necessário de acordo com a lógica de negócios da aplicação.

Na versão 8.3.7, foi aprimorado um mecanismo que determina quais campos específicos das tabelas VIEW podem conter valores NULL. Até este ponto, todas as tabelas VIEW poderiam ter este valor. Essa mudança se deve a um aumento na velocidade de classificação em listas dinâmicas nesses campos.

Na liberação 8.3.8, finalmente é possível determinar se uma fonte de dados externa está em um estado transacional. Esta funcionalidade é fornecida pelo novo método ExternalDataSourceManager.TransactionActive()

Em conclusão, observamos que para as fontes de dados externas, conforme mostrado acima, são descritas tabelas de dados do modelo relacional clássico. A plataforma utiliza um paradigma diferente para trabalhar com dados, oferecendo ao desenvolvedor um determinado conjunto de tipos de objetos de aplicação (livros de referência, documentos, registros, etc.). É por isso que o sistema, ao trabalhar com tabelas de fontes de dados externas, não suporta a maioria das funcionalidades inerentes aos seus objetos “nativos”. Portanto, recomenda-se abster-se de desenvolver algum tipo de lógica de negócios, levando em consideração o uso de tabelas VID, caso isso não esteja relacionado a tarefas de integração com sistemas existentes. Ou, em termos simples, você deve tentar evitar armazenar dados que são usados ​​ativamente em seu aplicativo em alguma outra tabela. sistema externo se não forem utilizados por este sistema.

No próximo artigo, consideraremos a continuação lógica do uso da tecnologia de fontes de dados externas no sistema 1C:Enterprise.

Trabalhe com eles em listas no modo 1C Enterprise.

No entanto, no trabalho, muitas vezes surge uma situação quando parte dos dados é armazenada em outro lugar.

  • Loja online (geralmente armazena dados em um banco de dados MySQL/SQL externo)
  • Outra base.

Para trabalhar com esses dados armazenados em outros bancos de dados, você precisa desenvolver mecanismos especiais.

Na versão 1C 8.2.14, surgiu uma nova chamada 1C External Data Sources, que facilita muito o trabalho do programador, pois:

  • agora não há necessidade de criar mecanismos especiais para obter dados
  • esses dados podem ser acessados
  • esses dados podem ser visualizados em listas 1C.
    • Fonte de dados externa 1C - base externa SQL

      Digamos que temos um banco de dados SQL que armazena os dados de que precisamos. Vamos tentar ler os dados dele usando o mecanismo 1C External Data Source.

      Vamos adicionar uma fonte de dados externa 1C. Você precisa ir ao configurador, as fontes de dados externas estão localizadas na janela de configuração, na parte inferior da árvore.

      1. Conexão

      Vamos adicionar uma nova fonte de dados externa 1C, vamos chamá-la arbitrariamente.

      O banco de dados é composto por tabelas. Precisamos adicioná-los dentro da fonte de dados externa adicionada. Clique com o botão direito do mouse e selecione Adicionar tabela.

      Na primeira vez, ele solicitará que você forneça uma string de conexão. Ele pode ser inserido manualmente ou formado, para o qual você precisa clicar no botão “…”.

      Como driver em nosso caso particular, selecionaremos "SQL Server"

      Vamos preencher os parâmetros básicos para conectar ao SQL. O nome do servidor pode ser inserido ou selecionado na lista.

      1C se conectará ao SQL e solicitará que você selecione um banco de dados específico da lista.

      Depois disso, 1C exibirá uma lista de tabelas neste banco de dados e suas colunas. Você precisa selecionar as tabelas necessárias com caixas de seleção.

      Tabelas e colunas serão adicionadas. Os nomes serão como estão definidos no banco de dados remoto. Em 1C você pode renomeá-los (em propriedades).

      Aqui está um exemplo de uma tabela adicionada:

      Aqui está um exemplo de uma coluna adicionada:

      Para que a plataforma 1C funcione com uma tabela externa da mesma forma que com os diretórios 1C, parâmetros adicionais podem ser especificados na tabela:

      • Na propriedade Campo-chave, especifique uma das colunas que fornecerá identificação exclusiva da linha; se várias strings fornecerem exclusividade, então Por aqui não funciona (análogo do campo Código)
      • Na propriedade do campo Exibir, especifique uma das colunas que fornecerá uma breve representação da string (análogo do campo Nome)
      • Na propriedade Tipo de dados Tabela, especifique Dados do objeto.

      2. Visualizar

      A conexão com o banco de dados remoto não é feita automaticamente. Para conectar, você precisa selecionar um menu típico.

      Na filial Standard está localizado equipe especial Gerenciamento de fontes de dados externas, que permite especificar os parâmetros de conexão (próprios para o modo 1C Enterprise) e conectar.

      Primeiro você precisa especificar os parâmetros para se conectar ao banco de dados.

      Quando você fez a configuração no configurador, ele mostrou a string de conexão como resultado. Você pode vê-lo novamente clicando novamente em Adicionar tabela no configurador.

      Copie a string de conexão e especifique-a no modo 1C Enterprise.

      Depois disso, você precisa fazer a conexão real.

      Após a conexão, é possível trabalhar com listas.

      3. Use na linguagem 1C

      A conexão também pode ser feita a partir do código do programa na linguagem 1C.

      Os parâmetros de conexão são especificados da seguinte forma:
      ConnectionParameters = ExternalDataSources.SourceNameConfigurator.GetCommonConnectionParameters();

      ConnectionParameters.AuthenticationStandard = true;
      ConnectionParameters.UserName = "sa";
      ConnectionParameters.Password = "password";
      ConnectionParameters.ConnectionString = "string de conexão do configurador";
      ConnectionParameters.DBMS = "MSSQLServer";

      ExternalDataSources.SourceNameConfigurator.SetCommonConnectionParameters(ConnectionParameters);
      ExternalDataSources.SourceNameConfigurator.SetUserConnectionParameters(UserName(), Parâmetros);
      ExternalDataSources.SourceNameConfigurator.SetSessionConnectionParameters(Parameters);
      ExternalDataSources.SourceNameConfigurator.SetConnection();

      Você pode consultar dados do banco de dados usando o arquivo . Um exemplo de um texto de consulta para uma fonte externa OurExternalSource e tablesExternalSourceTable:

      SELECIONAR
      Tabela de Origem Externa.FieldName
      A PARTIR DE
      ExternalDataSource.OurExternalSource.Table.ExternalSourceTable"

      Fonte de dados externa 1C - trabalhando com um arquivo do Excel

      Vamos tentar outra opção - trabalhar com um arquivo do Excel por meio de uma fonte de dados 1C externa.

      Vamos criar um arquivo simples do Excel.

      Vamos adicionar uma fonte externa, nomeie-a arbitrariamente como FileExcel. Adicione a tabela "Planilha1 $" a ela. Como você pode ver, este é o nome da planilha no Excel com a adição do símbolo “$”.

      Como no caso do SQL, vamos adicionar colunas. Eles podem ser adicionados manualmente. É importante garantir que os tipos das colunas adicionadas correspondam, caso contrário, você poderá receber um erro como "Incompatibilidade de tipo de dados" posteriormente.

      Para a coluna, você precisa especificar o nome em 1C e o nome na fonte de dados.

      Para o Excel, há um recurso (um erro como "Muito poucos parâmetros. Requer 3"):

      • Se a primeira linha Tabelas do Excel nomes das colunas estão localizados, então você só precisa especificar o nome desta coluna, por exemplo, “Código”.
      • Caso contrário, você precisa especificar o nome completo com o nome da tabela “Sheet1$.Code”, mas adicionar “HDR=NO;” nos parâmetros.

      Os parâmetros de conexão para um arquivo do Excel são assim:

      • Arquivos XLSX (Office versão 2007 e posterior)
        Motorista=( Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb));DBQ=D:\FileExcel.xlsx;
      • Arquivos XLS (anteriormente)
        Driver=(Driver do Microsoft Excel (*.xls)); DriverID=790; DBQ=D:\ArquivoExcel.xls;
        Você deve especificar seu próprio nome e caminho para o arquivo.

Na versão 8 do programa 1C, os desenvolvedores adicionaram à funcionalidade a capacidade de conectar bancos de dados de terceiros e obter informações deles diretamente do configurador, sem usar conexões COM e objetos OLE. Este recurso é implementado usando um novo objeto - "Fontes de dados externas"

As fontes de dados externas em 1C podem ser usadas da mesma forma que o restante das tabelas do sistema:

  1. Ao criar relatórios e cálculos usando um sistema de composição de dados (ACS);
  2. Para obter links para informações armazenadas em fontes de terceiros;
  3. Para alterar os dados armazenados nas tabelas;
  4. Ao fazer pedidos.

É importante saber que esse mecanismo não foi projetado para funcionar com outros bancos de dados 1C, pois o próprio modelo de operação 1C.Enterprise não implica em interferência nos dados no nível das tabelas físicas.

Criando uma nova fonte

A adição de uma nova fonte externa ao programa ocorre no modo "Configurador". Existe um ramo correspondente na árvore de configuração (Fig. 1)

Você terá que suar ao criar uma nova fonte, apesar de o formulário do novo objeto ter apenas quatro guias:

  1. Básico;
  2. Dados;
  3. Funções;
  4. Direitos.

A primeira guia tem apenas um parâmetro interessante - o modo de controle de bloqueio. Se você não fizer perguntas sobre bloqueio de dados em transações, sobre os meandros de paralelizar fluxos de informações, você pode deixar esse parâmetro no modo de bloqueio automático. No entanto, essa abordagem pode levar a restrições excessivas (por exemplo, quando em vez de um único registro, o programa bloqueia toda a tabela física, privando outros usuários da capacidade de trabalhar com ela).

Bloqueios Gerenciados, ao contrário dos automáticos, eles usam o mecanismo de transação embutido no próprio programa, e não no SGBD, o que permite transferir capturas de tabelas para muito mais nível baixo.

Ao definir este parâmetro como "Automático e Gerenciado", damos ao sistema a capacidade de determinar qual modo usar referindo-se diretamente à propriedade correspondente de cada tabela específica.

Aba de dados do formulário de propriedades de fonte externa

A forma da aba “Dados” é mostrada na Fig. 2

Arroz. 2

Aqui podemos adicionar tabelas e cubos de origem externa. Existem duas maneiras de adicionar uma tabela:

  1. Manualmente, então veremos o formulário para adicionar uma tabela (Fig. 3);

Arroz. 3

  1. Ou selecione na lista de tabelas de origem física (Fig. 4), neste caso um construtor especial é aberto diante de nós.

Arroz. 4

Vamos dar uma olhada no formulário para adicionar uma tabela. A propriedade "Nome" é usada para identificar exclusivamente um objeto na configuração.

A comparação do objeto de metadados e da tabela física final ocorre através da propriedade "Nome na fonte de dados" localizada na aba "Avançado" (Fig. 5)

Arroz. 5

Em seguida, devemos determinar o tipo da tabela, ou melhor, sua objetividade. Se os dados armazenados na estrutura puderem ser identificados exclusivamente por meio de qualquer campo, a tabela poderá ser uma tabela de objetos. Se a identidade do registro for determinada por um conjunto de campos-chave, a tabela deverá ter um tipo não-objeto.

Comparando essas tabelas com outros objetos de metadados, podemos fazer a seguinte analogia:

  • As tabelas de objetos são livros de referência;
  • Não-objetivos são registros de informações.

O conjunto de campos-chave é definido no próximo parâmetro do formulário ("Campos-chave"). Este campo é obrigatório, deixá-lo em branco resultará em um erro ao salvar a configuração.

Como você pode ver na Fig.5, alguns campos e botões de formulário não estão disponíveis para edição:

  • Expressão na fonte de dados;
  • Tipo de dados da tabela;
  • Campo de visualização;
  • Exibir manipuladores.

Eles podem ser usados ​​somente após preenchermos os campos da tabela, definindo seu tipo e definindo seus identificadores (Fig. 6)

Arroz. 6

Aqui você deve prestar atenção na opção "Permitir Nulo", se esta caixa estiver marcada, não é desejável usar tal campo como chave.

Construtor de tabela

Talvez o ponto mais importante e interessante no trabalho com fontes externas seja a criação de uma string de conexão. Seu construtor é aberto quando você clica no botão com três pontos ao lado do parâmetro "String de conexão".

Em primeiro lugar, será solicitado que decidamos o driver que será usado para conectar (Fig. 7)

Arroz. 7

A definição incorreta deste parâmetro não permitirá que você se conecte a um terceiro base de informações. Também deve ser entendido que nem todos os drivers especificados na lista suspensa podem ser usados ​​para gerar automaticamente uma string de conexão. Se a plataforma deu um erro (Fig. 8), então a string de conexão terá que ser escrita manualmente.

Fig.8

Arroz. 9

A linha em si é uma construção estritamente regulamentada.

Exemplo de string de conexão

Considere um banco de dados de terceiros criado em Microsoft Access e localizado na raiz do disco D. Para conectar esta base, devemos usar o driver apropriado, mas escolhê-lo no construtor de linha leva a um erro Fig.8.

Nós mesmos escreveremos os parâmetros de conexão.

Driver=(Microsoft Access Driver (*.mdb)) - esta é a aparência da primeira parte da linha. V chaves definimos o driver.

Por Arquivos do Excel será semelhante a (Microsoft Excel Driver (*.xls)), para arquivos Excel criados no escritório anteriores a 2003, a linha de driver será semelhante a (Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, * .xlsb)).

Separando este parâmetro do próximo com um ponto e vírgula, devemos escrever o endereço do nosso armazenamento (no nosso caso, DBQ=D:\Database1.mdb).

Adicionando estes dois parâmetros, obtemos Driver=(Microsoft Access Driver (*.mdb));DBQ=D:\Database1.mdb, escrevendo este parâmetro, temos acesso às estruturas internas deste banco de dados.

Para o objeto "Fonte externa", não basta criá-lo na configuração, ele também deve estar conectado no modo "Empresas". Isso pode ser feito no menu "Todas as funções"->Fontes externas. Quando entramos em nossa tabela pela primeira vez, precisamos escrever a mesma string de conexão já no modo "Enterprise".

Por que essa oportunidade é de tanto interesse? Qualquer pessoa que tenha programado em 1C está bastante familiarizada com SQL e, pelo menos em termos gerais, familiarizada com a arquitetura e os princípios de desenvolvimento de outras plataformas tecnológicas para aplicativos de negócios, dirá com certeza o que mais gosta em 1C. É claro que o construtor de consultas é o mecanismo mais conveniente e inteligente para escrever consultas para obter dados de estruturas relacionais que eu já conheci pessoalmente. E agora o 1C nos deu uma oportunidade maravilhosa de usá-lo não apenas com o 1C, mas também com qualquer outra mesa. Aqui estão apenas um monte de "mosca na pomada" derramado neste "barril de mel". Tudo em ordem:

1) Configuração e uso- sem "dançar com um pandeiro" não vai funcionar
a) Adicione uma fonte de dados externa - não parece nada complicado
b) marque a caixa "Selecionar na lista" - é necessário - isso é necessário para verificar o desempenho no início e evitar problemas desnecessários
c) - certifique-se de pressionar "..." - a conexão é ODBC. Não OLEDB como todos estamos acostumados, mas um nível abaixo

D) Tenha muito cuidado aqui.

Este é um driver ODBC - se você usar a versão cliente-servidor, ele deve estar no servidor. Se você estiver desenvolvendo em um sistema e trabalhando em outro (como geralmente é o caso), certifique-se de não ter surpresas. Uma recomendação estranha, mas escolha o driver mais antigo ou mais comum se você não estiver particularmente preocupado com a velocidade e não pretende ir além dos limites do padrão SQL92. Isso lhe dará a melhor compatibilidade. Por exemplo, para o SQL Server 2008, o melhor driver seria o SQL Server Native Client 11, mas recomendo escolher apenas o SQL Server, caso contrário esse cliente muito nativo terá que ser instalado no servidor ou em todas as máquinas clientes (no caso de usar a versão do arquivo), e o ganho é especial para simples ele não vai te dar um emprego.
e) Diálogos de seleção de servidor padrão

E) Recomendo responder “sim” à pergunta de salvar a senha, caso contrário não funcionará para iniciar este negócio.
g) Escolha uma tabela e detalhes... uma ótima oportunidade - você pode renomeá-la imediatamente como quiser (e os detalhes também), enquanto nas propriedades você verá os nomes dos campos da fonte de dados

H) E agora você executa, abre o designer de consulta - você seleciona estupidamente todos os registros da tabela e do OPA - um erro. O que fazer? Se você tiver uma interface gerenciada, procure no menu de serviço e se tiver uma normal...
Eu pessoalmente usei este código:
Código 1C v 8.x Parâmetros = ExternalDataSources.DAX.GetCommonConnectionParameters();
Parameters.AuthenticationStandard = true;
Parameters.UserName = "sa";
Parameters.Password = "pas";
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=banco de dados";
Parameters.DBMS = "MSSQLServer";

ExternalDataSources.DAX.SetCommonConnectionParameters(Parameters);
ExternalDataSources.DAX.SetUserConnectionParameters(UserName(), Parâmetros);
ExternalDataSources.DAX.SetSessionConnectionParameters(Parameters);

ExternalDataSources.DAX.SetConnection();
Talvez algumas peças não sejam necessárias, mas funciona.
Você precisa executar o código UMA VEZ. Depois disso, ele se conectará normalmente ... misticismo é claro - por que foi necessário não está claro ...

2) Fontes de dados somente leitura- Sim, milagres não acontecem... mas às vezes você quer....

3) NÃO OS USE JUNTO COM FONTES DE DADOS INTERNAS
Pessoalmente, esse fato me matou na hora.

Como é .... o que estávamos esperando e já imaginamos e lambemos como agora em um pedido vamos combinar nossos dados com 1C, desligá-lo - agrupá-lo, inseri-lo no relatório, mas não foi lá ...
Mas é claro que isso não impede as pessoas experientes... que pensamento veio à mente? Isso mesmo - tabelas temporárias:

4) NÃO OS USE JUNTO COM AS TABELAS TEMPORÁRIAS

Mas isso já não se parece com dificuldades tecnológicas, mas se parece muito com o que eles querem que façamos "para que a vida não pareça um paraíso" :).

5) Só pode ser usado em conexões SKD
Para quem não sabe, está no ACS na aba "Dataset Links". Com que frequência você os usa? Convenientemente? Aparentemente eles querem nos forçar a usá-los com mais frequência. Mas há uma coluna "Condição de link" e "Parâmetro de link". Não encontrei um exemplo de seu uso em nenhuma configuração típica, na documentação e em Khrustaleva também, de alguma forma, tudo não é transparente. Alguém pode me explicar como funciona a "condição do link". Se você escrever SourceAttribute = ReceiverRevision lá, não funcionará. Claro, a condição pode ser escrita no campo "Expressão" - na maioria dos casos isso é suficiente ... mas de alguma forma não é muito fácil.

No total, esse problema foi resolvido anteriormente em algum lugar assim:
Código 1C v 8.x Função InitializeDataSource()

DateStart = BuilderSettings.Settings.DataParameters.Items.Value;
DateCon = BuilderSettings.Settings.DataParameters.Items.Value;
Se DateCon > "20100101" Então
DateCon = "20100101";
Fim se;

QN = NewQualifiersNumber(15,2);
cs = NewStringQualifiers(255);

NúmeroMatriz = Nova Matriz();
ArrayNumber.Add(Type("Numero"));

MatrizString = Nova Matriz();
ArrayString.Add(Type("String"));

MatrizData = Nova Matriz();
ArrayDate.Add(Type("Data"));

//Vamos preencher o custo contábil na tabela
TypeNumber = NewTypeDescription(ArrayNumber,KN);
StringType = NewTypeDescription(ArrayString, CS);
TypeDate = NewTypeDescription(ArrayDate);

//tabela para carregar dados do SQL
TK = Nova Tabela de Valores();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Qnty", TypeNumber);
TK.Columns.Add("Período", TypeDate);

TK.Indices.Add("Período");

//Conecta-se ao SQL
ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Encryption for Data=False;Tag com agrupamento de colunas quando possível=False;Catálogo inicial=Relatórios";
Conexão = New COMObject("ADODB.Connection");
Comando = New COMObject("ADODB.Command");
RecordSet = New COMObject("ADODB.RecordSet");
Data = "";
Tentar
Connection.Open(ShortLP(ConnectionString));
Command.ActiveConnection = Conexão;
Command.CommandText = "S_elect * de PH onde period >= "" + String(Format(DateStart, "DF=yyyyMMdd")) + "" e period<= "" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + """;
RecordSet = Command.Execute();
RecordSet.MoveFirst();
Uma exceção
Retorno de TK;
Fim da tentativa;

Enquanto RecordSet.EOF = Falso Loop
String = TK.Add();
String.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
String.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Nome).Value;
String.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
FimCiclo;

Pedido = Novo Pedido();
TabelaVr = NewTempTableManager();
Query.SetParameter("vDataTable", TK);
Query.SetParameter("DataInício",DataInício);
Query.SetParameter("DateCon", DateCon);
Query.Text = "SELECT
| vrDataTable.NomenclatureCode,
| vrDataTable.Qnty,
| vrDataTable.Período
|PUT DataTable
| DE
| &vrDataTable AS vrDataTable
|ONDE
| vrDataTable.Period >= &DateStart
| E vrDataTable.Period<= &ДатаКон";
Request.Execute();
TK = Indefinido;

Solicitação = Nova Solicitação;
Query.TempTableManager = VrTable;
Query.Text = "Aqui está uma consulta envolvendo uma tabela temporária";

Resultado = Request.Run();
Retornar Resultado;

EndFunctions

OuterSet = InitializeDataSource();
DataSet = Nova Estrutura();
DataSet.Insert("Tabela SQL", ExternalSet);
GenericReports.Generate GenericReport(ThisObject, Result, Decryption Data, OutputToReportForm,DataSet);

Na verdade, não há muitas linhas de código e elas são bastante padrão... neste caso, você pode usar toda a funcionalidade do construtor de consultas, e dar apenas a função DATA COMPOSITION no ACS

Mas, claro, parece um pouco não tão bonito ... e fazendo o upload para a tabela de valores toda vez que você precisar escrever código e verificar se cometeu um erro no nome dos detalhes ... caso contrário, o que nos foi dado em 1C parece meio sem entusiasmo. Ainda não decidi qual é mais conveniente de usar. Você decide e escreve sobre suas decisões e o que o levou a tomá-las.

Informações retiradas do site