Trabalho do Report Builder e do Query Builder com uma fonte de dados arbitrária. Trabalho do criador de relatórios e do criador de consultas com uma fonte de dados arbitrária Seleção do criador de consultas 1c 8.2

A oitava versão da plataforma 1C oferece uma série de novos objetos de configuração, cada um com seus próprios métodos e propriedades que permitem simplificar o processo de desenvolvimento de aplicativos e otimizar o desempenho. Um deles é o Report Builder.

Sobre o que é um criador de relatórios 1c, quais funções ele executa e qual aplicativo ele encontrou na programação, e eu gostaria de falar neste artigo.

Construtor de relatórios 1C - o que é?

É um objeto de configuração que permite a saída de dados para um documento de planilha ou gráfico. A fonte de dados pode ser:

  1. O resultado da execução da consulta;
  2. Área de células de um documento de planilha;
  3. Seção tabular de um documento ou livro de referência;
  4. Um conjunto de entradas de registro.

Além disso, o criador de relatórios em 1C possui o atributo "Texto", para o qual o texto da consulta pode ser enviado, cujo resultado deve ser visualizado.

A Figura 1 mostra um trecho de código que permite exibir uma tabela arbitrária de valores usando o "Construtor de Relatórios"

Portanto, o caso de uso óbvio para o construtor é projetar relatórios. Não é uma direção explícita de usar o construtor é seu uso para personalizar vários elementos de consulta (agrupamentos, seleções, etc.) pelo usuário.

A propósito, o resultado da execução do código mostrado na Fig. 1 pode ser visto na Fig. 2

Figura 2

Configuração do construtor

O criador de relatórios, de certa forma, se assemelha a um sistema de composição de dados e pode ser usado nos casos em que o ACS não está disponível por um motivo ou outro, ou existe a possibilidade de que funcione incorretamente.

Como o ACS, o construtor inclui:

  • Agrupamentos (níveis de hierarquia na exibição de informações);
  • Indicadores (valores para os quais deseja obter um total);
  • Campos calculados adicionais (atributos de elementos, resultados de ações com valores);
  • Filtros (seleções);
  • Ordenação.

As configurações de layout de aparência do construtor assumem diferentes níveis e precisão de detalhes.

Algoritmo para usar o construtor

Naturalmente, dependendo da situação, o código do programa para usar o criador de relatórios pode variar significativamente. O algoritmo de uso básico não muda:

  1. Declaramos a criação de um novo objeto do tipo ReportBuild;
  2. Neste estágio, você pode usar o QueryBuilder para criar o texto de seleção ou, usando o objeto DataSource Description, usar uma seleção existente;
  3. As configurações do construtor de relatório podem ser definidas usando o método de objeto construtor FillSettings ();
  4. Você pode se recusar a usar o layout de design padrão criado pelo método de geração automática, definindo a propriedade do objeto Layout no construtor;
  5. Se DataSourceDescription não for utilizado, nesta etapa é necessário executar a solicitação, utilizar o método Execute ();
  6. A última etapa é executar o método Output (), a saída pode ser feita em um documento de planilha ou no elemento de formulário correspondente.

Usando descriptografia no construtor

A terceira linha na Fig. 1 inclui a decodificação das células no resultado da execução do construtor.

Para fazer isso, usamos a propriedade FillDecoding. O tipo desta propriedade é RepOrtInterFillType, pode assumir um dos três valores:

  1. Valores de Agrupamento - ao ativar uma célula, será utilizado o valor do agrupamento nela especificado;
  2. Do not fill - o valor padrão, o que significa que nenhuma descriptografia será usada para o resultado final;
  3. Descriptografia - a estrutura da descriptografia será preenchida com os valores de todos os agrupamentos da amostra original.

Além disso, o usuário pode definir a descriptografia por conta própria usando o método ConfigureDecryption (). O trecho de código que executa este método é mostrado na Fig. 3

Fig. 3

Um exemplo de uso do construtor para incluir seleções em um relatório

Um pouco da parte prática. Às vezes, há uma situação em que é necessário criar um relatório com algumas seleções. Você pode resolver esse problema usando o ACS ou pode usar o construtor:

  1. Vamos começar criando relatório externo e adicionar a ela uma variável com um nome arbitrário e digitar Report Builder (Fig. 4);

Fig. 4

  1. Crie um formulário de relatório e coloque nele o objeto da interface TableField, digite-o como Selection e associe-o à propriedade Selection do atributo criado Fig. 5

Fig. 5

  1. Criamos um procedimento OnOpen () associado ao evento correspondente de nosso formulário;

Fig. 6

  1. O código escrito nele deve conter necessariamente uma consulta para o construtor de relatórios, um exemplo do código é mostrado na Fig. 6, para criar um texto de construtor, você pode usar o construtor de consulta, no construtor as condições do construtor e suas configurações adicionais são indicados na guia correspondente da Fig. 7;

Fig. 7

  1. As condições de seleção especificadas entre colchetes () do texto da consulta serão executadas apenas se a seleção correspondente for ativada e usada pelo usuário;

  2. O procedimento que exibe o resultado do construtor é mostrado na Fig. 8 e está associado ao pressionar o botão Gerar;

Fig. 8

  1. Salvamos nosso relatório.

A aparência do relatório que criamos e seu resultado são mostrados na Fig. 9

Fig. 9

Claro, é bastante difícil demonstrar todas as capacidades de um novo objeto dentro de um artigo, mas nos parece que é possível ter uma ideia sobre ele e começar a usá-lo levando em consideração o conhecimento adquirido.

1. O que é um Report Builder?

O criador de relatórios é um objeto que permite obter o resultado com base no texto e nas configurações da consulta especificada e exibi-lo em uma planilha ou gráfico.

As configurações do Report Builder incluem:

  • agrupamentos (exemplo: “Nomenclatura”, “Contraparte” ...),
  • indicadores (exemplo: “Quantidade”, “Quantidade” ...),
  • campos adicionais (exemplo: “Nomenclature.Service”, “Counterparty.code” ...),
  • filtro (exemplo: para um item específico, para um grupo de contrapartes ...) e
  • classificação (exemplo: “Nomenclature.Code”, “Contraparte.Nome” ...)

As configurações do construtor possuem ferramentas de visualização que permitem ao programador fornecer ao usuário uma interface para sua instalação com o mínimo de esforço.

Antes de enviar, você pode definir o estilo do layout do criador de relatórios usando o layout de layout.

A saída do resultado da execução da consulta do construtor de relatórios é realizada por um comando.

2. Onde você pode usar o Report Builder?

Com a ajuda do criador de relatórios, você pode projetar a maior parte dos relatórios (exemplo: “Saldos de estoque”, “Vendas do período” ...). Ao mesmo tempo, o tempo para seu desenvolvimento e código do programa será significativamente reduzido, e a qualidade do design e da funcionalidade aumentará.

Além disso, o criador de relatórios pode ser usado nos casos em que a saída do resultado não é necessária, mas o usuário precisa personalizar os elementos de consulta, por exemplo, agrupamentos ou um filtro (por exemplo: descarregar um item em um arquivo xml ou processamento de documentos lançados por um filtro especificado).

Como o criador de relatórios não está disponível no servidor 1C: Enterprise e não é usado no módulo de conexão externa, nesses casos é necessário usar construtor de consulta, que é semelhante ao construtor de relatório, mas não possui propriedades e métodos visuais ("Layout", "OutputReportHeader", "Output ()", "CheckoutLayout ()" ...).

3. Um pouco sobre conceitos

Em comparação com a versão 7.7, a versão 8.0 passou por uma ligeira mudança de conceito, portanto, vale a pena nos determos um pouco nisso.

Conceito

Descrição

Medidas de linha A lista de agrupamentos pelos quais a saída será realizada por linhas (exemplo: “Nomenclatura”, “Contraparte” ...)
Medidas de coluna Lista de agrupamentos pelos quais se realizará a saída por colunas (exemplo: “Armazém”, “Mês” ...).
Seleção Um conjunto de filtros diferentes (exemplo: por um grupo de contratantes, por uma determinada organização ...).
Pedido Um conjunto de campos de classificação (exemplo: "Nomenclature.Code", "DocumentSales.Responsible" ...).
Campo Um dos campos de seleção da consulta (exemplo: “Nomenclatura”, “Contraparte.code”, “Quantidade”, “Valor” ...).
Campos selecionados A lista de campos selecionados inclui indicadores (exemplo: “Quantidade”, “Montante” ...) e campos adicionais (detalhes de agrupamento) (exemplo: “Nomenclatura.Grupo”, “Contraparte.código” ...).
Campos disponíveis Lista de campos disponíveis para adicionar aos campos de agrupamento, filtragem, classificação e selecionados. É preenchido, via de regra, com uma lista de campos de seleção de consulta, mas pode ser editado programaticamente (você pode adicionar, alterar e excluir os campos disponíveis).

É importante entender que o agrupamento, filtro, ordenação e campos selecionados não estão diretamente relacionados aos campos disponíveis, são objetos diferentes.

A principal diferença é que o campo disponível não possui a propriedade “Data Path” (por exemplo: “Nomenclature.Code”, “Quantity”), pois se trata apenas de uma espécie de descrição do campo, pela qual será feita uma tentativa feito para encontrar uma correspondência entre os campos de seleção de consulta no momento, adicionando-o à lista de agrupamentos, filtro, classificação ou campos selecionados.

Ao mesmo tempo, não é possível adicionar programaticamente um dos campos disponíveis a nenhuma das listas acima, pois, por um lado, o campo disponível não possui métodos como “AddWelected ()” ou “AddInSelectedFields ()” , mas, por outro lado, ao adicionar um novo elemento a qualquer uma das listas acima, é necessário especificar a propriedade “Caminho dos dados”, que nem sempre coincide com o nome do campo (por exemplo: o “Nomenclature.Parent” e os campos “Nomenclature.Parent.Parent” têm o mesmo nome “Parent”).

4. Caso de uso típico do criador de relatórios

Em geral, a sequência de ações ao trabalhar com o criador de relatórios é a seguinte:

  1. Crie um novo objeto “Report Builder”;
  2. Atribua o texto da solicitação à propriedade “Texto”;
  3. Se as configurações do criador de relatórios não foram especificadas no texto da consulta, execute o método “FillSettings ()”;
  4. Fornece ao usuário a capacidade de alterar as configurações do criador de relatórios;
  5. Se necessário, você pode se recusar a gerar automaticamente o layout pelo criador de relatórios e atribuir um layout fixo à propriedade Layout;
  6. Se necessário, você pode atribuir um layout padrão ou seu próprio à propriedade "Layout" e, se o layout gerado automaticamente do criador de relatórios tiver sido substituído por um fixo, execute o método "Check-out Layout ()";
  7. Chame o método "Run ()";
  8. Chame o método "Output ()".
Builder = Novo "Report Builder"; Postroitel.Tekst = "Selecione a resolução | DenezhnyeSredstvaKompaniiOstatki.StrukturnayaEdinitsa, | Amount (DenezhnyeSredstvaKompaniiOstatki.SummaOstatok) como a soma de | | FROM | RegistrayaKompaniiOstatki.StrukturnayaEdinitsa | RESULTADOS TOTAIS (Valor) POR | GERAL, | Unidade Estrutural "; Builder.FillSettings (); // Aqui você pode dar ao usuário a oportunidade // de alterar as configurações do criador de relatórios Builder.Layout = GetLayout ("CustomLayout");
Builder.Layout.Layout = GetLayoutLayout (StandardLayout.Classic);
Builder.CheckLayout ();
Builder.Run ();
Builder.Display ();

5. Descrição de algumas propriedades do construtor de relatório

Propriedade

Descrição

Texto Contém o texto da consulta do criador de relatórios. Se o texto da consulta do criador de relatórios não contiver os itens de configuração “(…)”, você pode usar o método FillSettings () para preencher automaticamente as configurações com base no texto da consulta.
TextHeader O texto que aparecerá no título do relatório (exemplo: “Saldos de estoque em 01.01.2004”, “Vendas de janeiro de 2004” ...).
OutputReport Title
DisplayHatTable
ShowGeneralResults
DisplayBasementTables
DisplayFooterReport
Essas propriedades determinam se o título do relatório, cabeçalho da tabela, totais gerais, rodapé da tabela e rodapé do relatório são exibidos, respectivamente.
OutputDetailedRecords A propriedade é responsável pela exibição forçada ou proibição da exibição de registros detalhados.
Entradas com detalhes automáticos Se a propriedade “AutoDetailed Records” estiver configurada para True, então cada registro detalhado será exibido apenas se for diferente do grupo.
Campos Disponíveis Contém uma lista de campos disponíveis para adicionar aos agrupamentos, filtro, campos selecionados e classificação.
MeasurementsStrings
Colunas de Medidas
Contém uma lista de agrupamentos, respectivamente, por linha e por coluna.
Seleção Contém uma lista de filtros definidos pelo construtor de relatórios.
SelectedFields contém uma lista de indicadores selecionados e atributos de agrupamento.
Pedido contém uma lista de campos de classificação.
Opções Contém uma lista de parâmetros do construtor (declarados no texto da consulta do construtor usando o símbolo “&”).
Resultado Contém o resultado da execução de uma consulta do construtor de relatórios (um objeto do tipo QueryResult).

6. Processamento de transcrições usando o Report Builder

A propriedade "FillDecryption" contém uma das três opções para preencher a descriptografia na saída:

1ª opção: não preencher (não usar descriptografia).

2ª opção: agrupar valores (ao descriptografar uma célula, o valor de agrupamento exibido nela será aberto).

3ª opção: descriptografia (a descriptografia será preenchida com uma estrutura contendo os valores de todos os agrupamentos). Neste caso, é necessário processar o evento da planilha “Processamento de descriptografia”, onde é necessário analisar a estrutura transmitida e realizar determinadas ações.

Um ponto importante é que na terceira opção é impossível a saída para o documento de planilha gerado, pois então é impossível processar a descriptografia, cujo evento é processado no módulo do formulário no qual o campo do documento de planilha está localizado.

Se você usar a terceira opção para preencher a descriptografia, poderá usar o método "ConfigureDecryption ()" projetado para executar e exibir um relatório levando em consideração a descriptografia realizada pelo usuário.

O criador de relatórios pode ser o mesmo ou um novo. Quando você personaliza a descriptografia, todos os filtros do criador de relatórios personalizados são removidos e todos filtros instalados o criador de consultas original mais filtros nos valores de agrupamento da descriptografia.

7. Relatórios

A propriedade “Layout” contém o layout que é usado ao enviar o resultado para um documento de planilha. Se for Indefinido, o layout será gerado automaticamente.

As propriedades "ReportHeader Layout", "TableHeader Layout", "DetailRecords Layout", "GeneralTotals Layout", "TableFootboard Layout" e "ReportFootboard Layout" contêm o nome da área no layout do criador de relatório ou layouts individuais usados ​​na saída, respectivamente, de uma tabela, um título de um relatório detalhado, um total geral do cabeçalho, rodapé da tabela e rodapé do relatório em um documento de planilha. Se os nomes das áreas corresponderem aos nomes no layout do construtor de relatório, não será necessário preencher as propriedades.

A propriedade "Layout de Aparência" contém o layout usado para definir o estilo do layout do construtor de relatório. A decoração das células no layout de aparência será aplicada às células no layout do criador de relatórios.

Para obter uma das opções de design padrão, você pode usar o método de contexto global “GetDesignLayout ()”.

Se um layout fixo foi atribuído à propriedade "Layout" do criador de relatórios, para projetá-lo, você precisa executar o método "Check-out Layout ()".

A propriedade “PlacementDimensionsInstrings” define uma das três opções para exibir agrupamentos por linhas.
1ª opção: juntos (em uma coluna).
Exemplo:

2ª opção: separadamente (em colunas diferentes).
Exemplo:


Exemplo:

A propriedade "PlacementDimensionsInColumns" define uma das três opções para exibir agrupamentos por colunas.
1ª opção: juntos (em uma linha).
Exemplo:

2ª opção: separadamente (em linhas diferentes).
Exemplo:

3ª opção: separadamente e apenas em totais.
Exemplo:

A propriedade "PlacementTotalsInLows" define uma das quatro maneiras de exibir totais em linhas.
1ª opção: no título (apenas acima dos agrupamentos subsequentes e entradas detalhadas).

2ª opção: no cabeçalho e rodapé (acima e abaixo dos agrupamentos subsequentes e entradas de detalhes).

3ª opção: no porão (abaixo dos agrupamentos subsequentes e registros detalhados, acima deles apenas a descrição do agrupamento é exibida).

4ª opção: somente no subsolo (somente abaixo dos agrupamentos subsequentes e registros detalhados).

Propriedade " Colocação de resultados em colunas”Define uma das quatro maneiras de exibir os totais em colunas.

1ª opção: no título (apenas à esquerda dos agrupamentos subsequentes e entradas detalhadas).

2ª opção: no cabeçalho e rodapé (à esquerda e à direita dos agrupamentos subsequentes e entradas detalhadas).

3ª opção: no porão (à direita dos agrupamentos subsequentes e registros detalhados, à esquerda deles apenas a descrição do agrupamento é exibida).

4ª opção: apenas na cave (apenas à direita dos agrupamentos subsequentes e registos detalhados).

Propriedade " Posicionamento de atributos de dimensão em linhas”Define uma das três opções para exibir os atributos de agrupamento por linhas.

1ª opção: juntos (em uma coluna adicional).
Exemplo:

2ª opção: junto com as medidas (em colunas com agrupamentos).
Exemplo:

3ª opção: separadamente (em diferentes colunas adicionais).
Exemplo:

Propriedade " PlacingDimensionAttributesInColumns”Define uma das três opções para exibir detalhes de agrupamento por colunas.

1ª opção: juntos (em uma linha adicional).
Exemplo:

2ª opção: junto com medidas (em filas com agrupamentos).
Exemplo:

3ª opção: separadamente (em diferentes linhas adicionais).
Exemplo:

8. Saída do criador de relatório

O método “Run ()” executa a consulta do construtor de relatórios e preenche a propriedade “Result”.
Usando o método GetRequest (), você pode obter uma consulta do construtor de relatório que é executada quando o método Run () é chamado.

O método "Output ()" produz o resultado em uma planilha ou gráfico. Se você não especificar o objeto para o qual deseja gerar a saída, um novo documento de planilha será criado.

Um exemplo de saída para um novo documento de planilha:
Builder.Display ();

Um exemplo de saída para um documento de planilha existente:
Builder.Output (FormElements.ResultTable);

Exemplo de saída para o diagrama:
Builder.Output (FormElements.ResultDiagram, "Quantity");

Se você precisar exibir o resultado do construtor de relatório em uma tabela dinâmica ou gráfico dinâmico, não deverá usar o método “Output ()”, mas preencher a propriedade “Fonte de dados” da tabela dinâmica ou gráfico dinâmico. A origem pode ser o resultado do construtor de relatório ou o próprio construtor de relatório. O resultado do construtor de relatório não requer uma saturação da consulta, mas o construtor de relatório permite que você altere a composição dos agrupamentos.

9. Salvar e restaurar as configurações do construtor

O método “GetSettings ()” permite que você obtenha as configurações atuais do criador de relatórios com a capacidade de especificar quais (exemplo: apenas filtrar, filtrar e classificar ...).

O método “SetSettings ()” permite carregar as configurações do construtor de relatórios com a possibilidade de especificar quais (exemplo: apenas filtrar, filtrar e ordenar ...).

10. Agrupamentos e campos do criador de relatórios

Uma dimensão do criador de relatórios é agrupada por linha ou coluna.

Os principais detalhes do agrupamento são

  • “Nome” (identificador de variável) (exemplo: “Nomenclatura”, “Contraparte” ...),
  • "Apresentação" (apresentação na saída) (exemplo: "Documento de vendas", "Unidade de medida" ...),
  • "DataPath" (caminho para o campo de seleção da solicitação) (exemplo: "Nomenclature", "DocumentSales.Organization" ...)

e, se o agrupamento for construído de acordo com o livro de referência, então também

  • “DimensionType” (uma das opções para filtrar por valores de campo: hierarquia (membros e grupos), somente hierarquia (somente grupos) ou membros (somente membros)).

Além disso, existem várias propriedades que permitem atribuir layouts ao agrupamento, que serão usados ​​na saída para um documento de planilha.

  • “Layout” é o nome da área no layout do criador de relatórios ou um layout separado usado ao exibir um agrupamento.
  • “LayoutHierarchy” é o nome da área no layout do Report Builder ou um layout separado usado ao exibir a hierarquia de agrupamento.
  • “FooterLayout” é o nome da área no layout do construtor ou um layout separado usado ao exibir o rodapé de agrupamento.
  • “HierarchyFooterLayout” é o nome da área no layout do construtor ou um layout separado usado ao exibir o rodapé da hierarquia de agrupamento.
  • “BasementLevels Layouts” - uma variedade de layouts de porão para diferentes níveis de agrupamento.
  • “Layouts de nível” - uma variedade de layouts para diferentes níveis de agrupamento.

O campo do construtor de relatório é um dos campos selecionados. Os principais detalhes do campo são

  • “Nome” (identificador de campo) (exemplo: “Quantidade”, “Código de nomenclatura”, “Período” ...),
  • "Apresentação" (apresentação na saída) (exemplo: "Qtd", "Código", "Período" ...) e
  • “Caminho de dados” (caminho para o campo de seleção da consulta) (exemplo: “Quantidade”, “Nomenclatura. Código”, “Período” ...).

Existem várias coisas que você pode fazer com uma lista de agrupamentos ou campos.

  • "Insert ()" - adiciona um agrupamento / campo à posição especificada.
  • “Adicionar ()“ - adiciona um agrupamento / campo ao final da lista.
  • “Index ()“ - obtém o índice do agrupamento / campo na lista.
  • “Número ()“ - obtém o número de agrupamentos / campos na lista.
  • “Find ()“ - encontre um agrupamento / campo na lista por nome.
  • “Limpar ()“ - limpa a lista de agrupamentos / campos.
  • “Get ()“ - obtém agrupamento / campo por índice.
  • "Mover ()" - move o agrupamento / campo pelo número especificado de posições.
  • “Remover ()“ - remove um agrupamento / campo da lista.

11. Linguagem do Builder

O criador de relatórios tem sua própria linguagem. É uma linguagem de consulta comum, complementada com as construções “(…)”. Usando essas construções, você pode cancelar o método FillSettings () e personalizar o criador de relatórios no corpo da consulta.
Assim, você pode customizar os itens "SELECT", "WHERE", "ORDER BY", "RESULTS BY", e também fazer outras coisas interessantes. Neste caso, o texto principal da consulta do construtor serão as configurações padrão, enquanto as construções (…) descreverão as configurações disponíveis.

Se o campo de seleção permite que você obtenha algo por meio de um ponto, então você pode especificar “. *” Depois do campo, o usuário poderá selecionar os detalhes do campo. Por exemplo, “Nomenclature. *” Permite classificar por “Nomenclature.Code” ou filtrar por “Nomenclature.Service”. Mas “Quantidade. *” Não faz sentido, já que o campo “Quantidade” não contém detalhes, o que significa que basta indicar “Quantidade”.

Os campos especificados na construção SELECT limitam a lista de campos disponíveis para o usuário.
Os campos especificados na construção “WHERE” limitam a lista de campos que podem ser usados ​​no filtro.
Os campos especificados na construção “ORDER BY” limitam a lista de campos a serem classificados.
Os campos especificados na construção "POR TOTAL" limitam a lista de campos para agrupar totais.

E agora as coisas interessantes.

Inicialmente, no texto principal da solicitação, você também pode usar as construções (...) nos parâmetros das fontes. Por exemplo, se em vez de
| DE
| Registro de acumulação. Saldos de commodities da empresa.Remas (e data de término)
apontar
| DE
| Registro de acumulação. Saldos de commodities da empresa.Remas ((e data de término))
então neste caso será possível definir um filtro pelo campo "EndDate".

Ao mesmo tempo, no primeiro caso é necessário definir o parâmetro do construtor de relatórios “Data Final”, no segundo caso não é necessário, aliás, se a seleção pelo campo “Data Final” não for especificada, então este parâmetro da tabela “Registro de Acumulação. não será contado.

Em segundo lugar, as fontes no texto da consulta podem ser marcadas como opcionais, colocando-as na construção “(…)”. Por exemplo, se você escrever um texto de solicitação como este

| ESCOLHER


| LotProductsCompaniesBalances.QuantityBalance AS QuantityBy
| (SELECIONE
| Saldos de Commodities da Empresa Saldos. Nomenclature AS Nomenclature,
| Balanço de Commodities do Balanço da Empresa. Balanço de Quantidade AS Quantidade,
| Lotes de mercadoriasEmpresasBalanças.QuantidadeBalança AS QuantidadePor lotes)
| DE
| Registro de acumulação. Saldos de commodities da empresa.Remas AS Saldos de commodities Saldos da empresa
| (À ESQUERDA JUNTE-SE AO REGISTRO DE ACUMULAÇÃO. LOTES DA EMPRESA DE MERCADORIAS. SALDOS COMO MUITOS SALDOS DA EMPRESA DE MERCADORIAS
| Por Saldos de Mercadorias Saldos da Empresa.Nomenclature = Lotes de Produtos Saldos da Empresa.Nomenclatura)
| TOTALS SUM (Quantity), SUM (QuantityByLots) BY
| EM GERAL,
| Nomenclatura

então a junção à esquerda pelo registro do lote será realizada apenas se o campo “QuantityByBatch” estiver presente na lista de campos selecionados.

Em terceiro lugar, nos parâmetros das fontes, pode-se especificar que no caso de definir filtros, se possível, eles devem ser aplicados não ao resultado da execução de uma consulta usando o elemento “WHERE”, mas à própria fonte. Assim, em vez de
| Acumulação Register.Goods BalancesCompany.Remains ()

faz sentido escrever

| Registro de acumulação. Saldos de commodities da empresa.Remas (, (Nomenclature. *, Company Warehouse. *, Order. *, Retail Price, Nomenclature Characteristic. *))

Nós vamos, em quarto lugar, o mais delicioso, na minha opinião. Se o parâmetro “Frequência” for especificado na fonte (para tabelas que permitem a obtenção de rotações), também pode ser definido como “(…)”, e como resultado de uma pequena manipulação com o texto da consulta do construtor, podemos use agrupamentos por períodos.

Exemplo: | SELECIONE PERMITIDO | PartyGoodsCompanyObotory.Nomenclature, | AMOUNT (Lots of GoodsCompaniesTurnover.CostArrival) AS CostInvestment, | AMOUNT (Lotes de GoodsCompaniesTurnover.CostExpense) AS CostExpense | | FROM | Acumulação Register.PartyCompany.Turnover | CARREGAR POR | PartyGoodsCompaniesObototy.Nomenclature | | TOTALS SUM (CostPrihod), SUM (CostExpenditure) ON | GERAL, | Nomenclatura | | (SELECIONE | Lote de commoditiesCompanyTurnovers.Nomenclature. *, | Registrar. *, | BeginningPeriod (Period, Day) AS PeriodDay, | BeginningPeriod (Period, Week) AS PeriodWeek, | BeginningPeriod (Period, Decade) AS PeriodDecade, | BeginningPeriod Mês ) AS Período Mês, | Início do período (Período, Trimestre) AS PeríodoTrimestre, | Início do período (Período, Semianual) AS Período Semestral, | Início do período (Período, Ano) AS Período Ano, | SUM (Muito CommoditiesCompaniesCusto dos insumos. CostExpense) AS CostExpense) | | (ORDER BY | Batch of GoodsCompanyObototy.Nomenclature. *, | Registrar. *, | CostPrihod, | CostExpenditure) | | (WHERE | Lotes of GoodsCompanyTurnooms.Nomenclature. *, | Registrar. *, | SUM (Lots ofGoodsCompanyTurnovers.CostIncoming) AS CostIncome, | SUM (Lots ofGoodsCompanyTurnovers.CostExpense) AS CostExpense) | | (TOTALS POR | Nomenclatura. *, | Registrador. *, | Início do período (período, dia) AS PeríodoDia, | Início do período (período, semana) AS Período Semana, | Início do período (período, década) AS PeríodoDécada, | Início do período (Período, Mês) AS Período Mês, | Início do período (Período, Trimestre) AS PeríodoTrimestre, | Início do período (Período, Meio Ano) AS Período Meio Ano, | Início do período (Período, Ano) AS Período Ano)

Existe uma nuance, para que o agrupamento por períodos funcione, é necessário adicionar um filtro pelo parâmetro “Frequência”. Para não fazer isso manualmente, por conveniência, você pode adicioná-lo programaticamente antes de executar o criador de relatórios e excluí-lo após a execução para que não o incomode, uma vez que é impossível entender tal filtro do ponto de vista de senso comum. Isso é feito algo assim

IfReportBuilder.AvailableFields.Find ("Frequência")<>Indefinido então Periodicidade = Indefinido; IfReportBuilder.DimensionsStrings.Find ("PeriodYear")<>Undefined OR Report Builder.DimensionsColumns.Find ("PeriodYear")<>Indefinido então periodicidade = 9; Fim se; IfReportBuilder.DimensionsRows.Find ("PeriodSemi-Year")<>Undefined OR Report Builder.DimensionsColumns.Find ("PeriodHalf Year")<>Indefinido então periodicidade = 8; Fim se; IfReportBuilder.DimensionsRows.Find ("PeriodQuarter")<>Undefined OR Report Builder.DimensionsColumns.Find ("PeriodQuarter")<>Indefinido então periodicidade = 7; Fim se; IfReportBuilder.DimensionsRows.Find ("PeriodMonth")<>Undefined OR Report Builder.DimensionsColumns.Find ("PeriodMonth")<>Indefinido então Periodicidade = 6; Fim se; IfReportBuilder.DimensionsRows.Find ("PeriodDecade")<>Undefined OR Report Builder.DimensionsColumns.Find ("PeriodDecade")<>Indefinido então periodicidade = 5; Fim se; IfReportBuilder.DimensionsRows.Find ("PeriodWeek")<>Undefined OR Report Builder.DimensionsColumns.Find ("PeriodWeek")<>Indefinido então periodicidade = 4; Fim se; IfReportBuilder.DimensionsRows.Find ("PeriodDay")<>Undefined OR Report Builder.DimensionsColumns.Find ("PeriodDay")<>Indefinido então Periodicidade = 3; Fim se; IfReportBuilder.DimensionsStrings.Find ("Registrar")<>Undefined OR Report Builder.DimensionsColumns.Find ("Logger")<>Undefined OR Report Builder.SelectedFields.Find ("Logger")<>Indefinido então periodicidade = 2; Fim se; Se a frequência<>Undefined Then SelectionFieldBy Periodic = ReportBuilder.Selection.Add ("Frequency"); SelectionFieldBy Periodicity.Value = Periodicidade; SelectionFieldByFrequency.Usage = True; Fim se; Fim se; Builder.Run (); Campo de seleção por frequência<>Undefined ThenReportBuilder.Select.Remove (ReportBuilder.Selection.Index (SelectionFieldBy Periodic)); Fim se;

12. Customizando o construtor

Para dar ao usuário a oportunidade de alterar a lista de agrupamentos, filtro, campos selecionados ou ordenação, basta criar o atributo "Builder" do relatório e colocar um campo de tabela no formulário do relatório e especificá-lo como um dado fonte "Builder.DimensionsRows", "Builder.DimensionsColumns", “Builder.Choose”, “Builder.ChosenFields” ou “Builder.Order”.

Além disso, você também pode especificar "Builder.AvailableFields" como fonte de dados e, assim, em primeiro lugar, você pode ver a lista de campos disponíveis e, em segundo lugar, usando menu contextual adicionar campos a agrupamentos, seleção, campos selecionados ou filtro.

A linguagem de consulta em 1C 8 é um análogo simplificado da conhecida "linguagem de programação estruturada" (como é freqüentemente chamada de SQL). Mas em 1C, ele é usado apenas para ler dados, o modelo de dados do objeto é usado para alterar os dados.

Outra diferença interessante é a sintaxe russa. Embora, na verdade, você possa usar construções em inglês.

Solicitação de exemplo:

SELECIONE
Bancos.
Banks.CorrAccount
A PARTIR DE
Diretório. Bancos AS Banks

Esta solicitação nos permitirá ver informações sobre o nome e conta de correspondente de todos os bancos existentes na base de dados.

A linguagem de consulta é a mais simples e método eficaz obtenção de informações. Como você pode ver no exemplo acima, na linguagem de consulta você precisa apelar com os nomes dos metadados (esta é uma lista de objetos do sistema que compõem a configuração, ou seja, diretórios, documentos, registros, etc.).

Descrição das construções de linguagem de consulta

Estrutura de consulta

Para obter os dados, basta usar as construções "SELECT" (selecionar) e "FROM" (de). O pedido mais simples do seguinte modo:

SELECT * FROM Directories.Nomenclature

Onde "*" significa a seleção de todos os campos da tabela e Referências. Nomenclatura é o nome da tabela no banco de dados.

Vejamos um exemplo mais complexo e geral:

SELECIONE
<ИмяПоля1>COMO AS<ПредставлениеПоля1>,
Soma(<ИмяПоля2>) COMO AS<ПредставлениеПоля2>
A PARTIR DE
<ИмяТаблицы1>COMO AS<ПредставлениеТаблицы1>
<ТипСоединения>COMPOSTO<ИмяТаблицы2>COMO AS<ПредставлениеТаблицы2>
SOBRE<УсловиеСоединениеТаблиц>

ONDE
<УсловиеОтбораДанных>

CARREGAR POR
<ИмяПоля1>

ORDENAR POR
<ИмяПоля1>

RESULTADOS
<ИмяПоля2>
SOBRE
<ИмяПоля1>

V Esse pedido selecionamos os dados dos campos “FieldName1” e “FieldName1” das tabelas “TableName1” e “TableName”, atribuímos sinônimos aos campos usando o operador “AS”, conectamos-os por uma determinada condição “TableCondition”.

Dos dados recebidos, selecionamos apenas os dados que atendem à condição de "WHERE" "DataFeedback Condition". A seguir, agrupamos a solicitação pelo campo "FieldName1", ao somar "FieldName2". Criamos totais para o "FieldNameField1" campo e o campo final "FieldName2".

A última etapa é classificar a solicitação usando a construção ORDER BY.

Construções gerais

Vamos considerar as construções gerais da linguagem de consulta 1C 8.2.

PRIMEIROn

Usando esta operadora você pode obter n o número dos primeiros registros. A ordem das entradas é determinada pela ordem na solicitação.

SELECIONE OS PRIMEIROS 100
Bancos.
Bancos. Código AS BIC
A PARTIR DE
Diretório. Bancos AS Banks
ORDENAR POR
Bancos.

A solicitação receberá as 100 primeiras entradas do diretório "Bancos", classificadas em ordem alfabética.

PERMITIDO

Este projeto é relevante para trabalhar com um mecanismo. A essência do mecanismo é restringir a leitura (e outras ações) aos usuários para registros específicos na tabela do banco de dados, e não na tabela como um todo.

Se um usuário tentar ler registros inacessíveis para ele com uma solicitação, ele receberá uma mensagem de erro. Para evitar isso, deve-se utilizar a construção "PERMITIDO", ou seja, a solicitação lerá apenas os registros permitidos para ela.

SELECIONE PERMITIDO
Armazenamento de informações adicionais.Link
A PARTIR DE
Referência.Armazenamento de Informações Adicionais

VÁRIOS

Usar "DIFERENTE" permitirá que você exclua strings duplicadas de inserir o resultado da consulta 1C. Duplicação significa que todos os campos da solicitação correspondem.

SELECIONE OS PRIMEIROS 100
Bancos.
Bancos. Código AS BIC
A PARTIR DE
Diretório. Bancos AS Banks

EmptyTable

Essa construção raramente é usada para combinar consultas. Ao ingressar, pode ser necessário especificar uma tabela aninhada vazia em uma das tabelas. O operador "EmptyTable" é adequado apenas para isso.

Exemplo da ajuda 1C 8:

SELECIONE Referência.Número, TABELA EM BRANCO. (Nom, Tov, Qty) AS Composição
FROM Document.Expense
COMBINAR TUDO
SELECIONE Reference.Number, Composition. (LineNumber, Item, Quantity)
FROM Document.Invoice Document.Invoice.Content. *

É NULO

Um recurso muito útil que evita muitos erros. YesNULL () permite que você substitua o valor NULL pelo valor desejado. É muito utilizado em testes de presença de um valor em tabelas anexas, por exemplo:

SELECIONE
NomenclatureRef.Ref.
Há NULL (Saldo de item. Saldo de quantidade, 0) Saldo de quantidade de AS
A PARTIR DE


Você pode usá-lo de outra maneira. Por exemplo, se para cada linha não for conhecido em qual tabela o valor existe:

IS NULL (InvoiceInvoiceDate, InvoiceDate)

AS é um operador que nos permite atribuir um nome (sinônimo) a uma tabela ou campo. Vimos um exemplo de uso acima.

Essas construções são muito semelhantes - elas permitem que você obtenha uma representação de string Valor desejado... A única diferença é que REPRESENTATION converte quaisquer valores em um tipo de string e REFERENCE REPRESENTATION converte apenas valores de referência. A REPRESENTAÇÃO DE REFERÊNCIA é recomendada para ser usada em consultas do sistema de composição de dados para otimização, a menos, é claro, que o campo de dados de referência seja planejado para ser usado nos filtros.

SELECIONE
Visualizar (link), // linha, por exemplo "Relatório prévio nº 123 datado de 10/10/2015
Representação (Marca de Exclusão) Texto da Marca de Exclusão do AS, // string, "Sim" ou "Não"
Visualização de referência (marca de exclusão) Marca de exclusão AS Boolean // Boolean, True ou False
A PARTIR DE
Document.Advance Report

EXPRESSAR

O Express permite que você converta valores de campo no tipo de dados desejado. Você pode converter um valor em um tipo primitivo ou em um tipo de referência.

Express para tipo de referência é usado para restringir os tipos de dados solicitados em campos de um tipo complexo, frequentemente usado para otimizar o desempenho do sistema. Exemplo:

EXPRESS (Cost.Subconto1 Table AS A Reference.Cost Articles) .ActivityTypeFor Tax Cost Accounting

Para tipos primitivos, esta função é freqüentemente usada para limitar o número de caracteres em campos de comprimento ilimitado (tais campos não podem ser comparados). Para evitar o erro “ Parâmetros inválidos na operação de comparação. Não consigo comparar os campos
comprimento ilimitado e campos de tipos incompatíveis
", É necessário expressar tais campos da seguinte forma:

EXPRESS (linha do comentário AS (150))

DIFERENÇA

Obtenha 267 tutoriais em vídeo 1C gratuitamente:

Um exemplo de uso de IS NULL em uma solicitação 1C:

ESCOLHER DE
Spr
LEFT JOIN Accumulation Register.ProductsIn Warehouses.Remains AS GoodsLeft
Software NomenclatureRef.Ref = ImplementedCommentsComponentsRemains.Nomenclature
ONDE ESTÁ O EQUILÍBRIO DOS PRODUTOS. Quantidade O saldo É NULO

Você pode definir o tipo de dados em uma consulta da seguinte maneira: usando as funções TYPE () e TYPE () ou usando operador lógico LIGAÇÃO. As duas funções são semelhantes.

Valores Predefinidos

Além de usar os parâmetros passados ​​em solicitações na linguagem de consulta 1C, você pode usar valores predefinidos ou. Por exemplo, enumerações, diretórios predefinidos, planos de contas e assim por diante.Para isso, a construção "Value ()" é usada.

Exemplo de uso:

WHERE Nomenclature.NomenclatureType = Value (Directory.NomenclatureTypes.Product)

WHERE Counterparties.Contact Information Type = Value (Enumeration.Contact Information.Type.Phone)

ONDE Saldos da conta.Account = Valor (Plano de contas. Auto-sustentável.Loss de lucro)

Conexões

Existem 4 tipos de conexões: DEIXOU, DIREITO, COMPLETO, INTERNO.

LEFT e RIGHT JOIN

As junções são usadas para vincular duas tabelas de acordo com uma condição específica. Recurso em JUNTA ESQUERDA em que pegamos a primeira tabela especificada por completo e vinculamos a segunda tabela por condição. Os campos da segunda tabela que não puderam ser limitados pela condição são preenchidos com o valor NULO.

Por exemplo:

Retornará toda a tabela de Contrapartes e preencherá o campo “Banco” somente nos locais onde a condição “Contrapartes.Nome = Bancos.Nome” for atendida. Se a condição não for atendida, o campo Banco será definido NULO.

RIGHT JOINT no idioma 1C absolutamente o mesmo Conexão ESQUERDA, com exceção de uma diferença - em CONEXÃO DIREITA A tabela “principal” é a segunda, não a primeira.

CONEXÃO COMPLETA

CONEXÃO COMPLETA difere da esquerda e da direita por exibir todos os registros de duas tabelas, unindo apenas aqueles que pode unir por condição.

Por exemplo:

A PARTIR DE

CONEXÃO COMPLETA
Diretório. Bancos AS Banks

SOBRE

A linguagem de consulta retornará ambas as tabelas na íntegra apenas se a condição de junção de registros for satisfeita. Ao contrário da junção esquerda / direita, é possível que NULLs apareçam em dois campos.

CONEXÃO INTERNA

CONEXÃO INTERNA difere do completo porque exibe apenas os registros que podem ser conectados pela condição especificada.

Por exemplo:

A PARTIR DE
Diretório. Contratantes Clientes AS

CONEXÃO INTERNA
Diretório. Bancos AS Banks

SOBRE
Clients.Name = Banks.Name

Essa solicitação retornará apenas linhas em que o banco e a contraparte tenham o mesmo nome.

Associações

A construção COMBINE e COMBINE ALL combina dois resultados em um. Aqueles. o resultado da execução de dois será "mesclado" em um, comum.

Ou seja, o sistema funciona da mesma forma que de costume, apenas para uma mesa temporária.

Como usar o INDEX SOFTWARE

No entanto, há um ponto a ser lembrado. A construção de um índice em uma tabela temporária também leva tempo para ser concluída. Portanto, é aconselhável usar a construção "" somente se for conhecido com certeza que não haverá 1-2 registros na tabela temporária. Caso contrário, o efeito pode ser o oposto - o desempenho dos campos indexados não compensa o tempo de construção do índice.

SELECIONE
Currency RatesSliceLast.Currency AS Currency,
Taxas de moedaSliceLast.Course
POST Taxas de câmbio
A PARTIR DE
Registro de informações.Taxas de moeda.SliceLast (& Period,) AS Currency RatesSliceLast
ÍNDICE POR
Moeda
;
SELECIONE
Preços
PreçosNomenclaturas. Preço,
PreçosNomenclature.Currency,
Taxas de câmbio.
A PARTIR DE
Information Register.PricesNomenclature.SliceLast (& Period,
Nomenclature B (& Nomenclature) AND PriceType = & PriceType) AS Preços
LEFT UNION Taxas de câmbio AS Taxas de câmbio
BY RatesNomenclature.Currency = RatesCurrency.Currency

Agrupamento

A linguagem de consulta 1C permite que você use funções de agregação especiais ao agrupar os resultados da consulta. O agrupamento também pode ser usado sem funções de agregação para "eliminar" duplicatas.

As seguintes funções estão disponíveis:

Quantidade, número, número de diferentes, máximo, mínimo, médio.

Exemplo 1:

SELECIONE
Venda de bens, serviços, bens, nomenclatura,
AMOUNT (Venda de Bens, Serviços, Bens.Quantidade) AS Quantidade,
AMOUNT (Sale of GoodsServicesGoods.Amount) AS Amount
A PARTIR DE

CARREGAR POR
Realização de GoodsServicesGoods.Nomenclature

A solicitação recebe todas as linhas com mercadorias e as resume por quantidade e valores no contexto do item.

Exemplo No. 2

SELECIONE
Bancos. Código,
QUANTIDADE (bancos DIFERENTES.Link) AS QuantityDoubles
A PARTIR DE
Diretório. Bancos AS Banks
CARREGAR POR
Código de Bancos

Este exemplo exibirá uma lista de BICs no diretório "Bancos" e mostrará quantas duplicatas existem para cada um deles.

Resultados

Os totais são uma forma de obter dados de um sistema hierárquico. Para campos de resumo, funções agregadas podem ser usadas, assim como para agrupamentos.

Uma das formas mais populares de usar os totais na prática são as baixas de mercadorias em lote.

SELECIONE




A PARTIR DE
Document.Realization ofGoodsServices.Goods AS Sale ofGoodsServicesGoods
ORDENAR POR

RESULTADOS
SUM (quantidade),
SUM (quantidade)
SOBRE
Nomenclatura

O resultado da consulta será o seguinte hierárquico:

Resumo geral

Se você deseja obter totais para todos os "totais", use o operador "GERAL".

SELECIONE
Realization of GoodsServicesGoods. Nomenclature AS Nomenclature,
Realização de GoodsServicesGoods.Link AS Document,
Realização de bens, serviços, bens. Quantidade AS Quantidade,
Venda de GoodsServicesGoods.Amount AS Amount
A PARTIR DE
Document.Realization ofGoodsServices.Goods AS Sale ofGoodsServicesGoods
ORDENAR POR
Implementação de GoodsServicesGoods.Link.Date
RESULTADOS
SUM (quantidade),
SUM (quantidade)
SOBRE
EM GERAL,
Nomenclatura

Como resultado da execução da consulta, obtemos o seguinte resultado:

Em que o 1º nível de agrupamento é a agregação de todos os campos obrigatórios.

Encomenda

O operador ORDER BY é usado para classificar o resultado da consulta.

A classificação de tipos primitivos (string, número, booleano) segue as regras usuais. Para campos de tipos de referência, a classificação ocorre pela representação interna do link (identificador único), não por código ou pela representação do link.

SELECIONE

A PARTIR DE
Reference.Nomenclature AS Nomenclature
ORDENAR POR
Nome

A consulta exibirá uma lista dos nomes do livro de referência de nomenclatura, classificados em ordem alfabética.

Auto-ordenação

O resultado de uma consulta sem classificação é um conjunto de linhas apresentado de forma caótica. Os desenvolvedores da plataforma 1C não garantem a saída de strings na mesma sequência ao executar as mesmas consultas.

Se você precisar exibir os registros da tabela em uma ordem consistente, deverá usar a construção "Autoordenar".

SELECIONE
Nomenclature Name Nome AS
A PARTIR DE
Reference.Nomenclature AS Nomenclature
ENCOMENDA AUTOMÁTICA

Mesas virtuais

As tabelas virtuais em 1C são um recurso exclusivo da linguagem de consulta 1C, que não é encontrada em outras sintaxes semelhantes. Mesa virtual - Atalho obtenção de informações de perfil de registros.

Cada um dos tipos de registro possui seu próprio conjunto de tabelas virtuais, que podem diferir dependendo das configurações do registro.

  • fatia do primeiro;
  • um corte deste último.
  • sobras;
  • revoluções;
  • saldos e volumes de negócios.
  • movimentos do subconto;
  • revoluções;
  • RPM Dt Kt;
  • sobras;
  • saldos e giros
  • subconto.
  • base;
  • dados gráficos;
  • o período real de validade.

Para um desenvolvedor de soluções, os dados são retirados de uma tabela (virtual), mas, na verdade, a plataforma 1C obtém de várias tabelas, transformando-as na forma desejada.

SELECIONE
Produtos Em Armazéns Saldos e Receitas. Nomenclatura,
Produtos Em ArmazénsBalancesAndTurnover.Quantidade; Saldo inicial,
Bens em armazéns Saldos e rotatividade. Quantidade rotatividade,
GoodsIn WarehousesBalancesAndTurnovers.QuantityIncome,
Bens em armazéns Saldos e rotatividade. Quantidade
Produtos em armazénsBalancesAndTurnovers.QuantityFinal Balance
A PARTIR DE
Registro de acumulação. Mercadorias em armazéns. Saldos e movimentações AS Mercadorias em armazéns Saldos e movimentações

Esse pedido permite que você receba rapidamente um grande número de dados.

Parâmetros de mesa virtual

Altamente aspecto importante trabalhando com tabelas virtuais - usando parâmetros. Parâmetros da tabela virtual - parâmetros especializados para seleção e ajuste.

Para tais tabelas, é considerado incorreto usar a seleção na construção "WHERE". Além de a solicitação não ser ideal, é possível receber dados incorretos.

Um exemplo de uso de tais parâmetros:

Acumulação Register.ProductsIn Warehouses.RemainsAndTurnovers (& PeriodBeginning, & PeriodEnd, Month, Movements and PeriodBorders, Nomenclature = & DesiredNomenclature)

Algoritmo de tabelas virtuais

Por exemplo, a mesa virtual mais comumente usada do tipo "Residuais" armazena dados de duas tabelas físicas - saldos e movimentos.

Ao usar uma mesa virtual, o sistema realiza as seguintes manipulações:

  1. Obtemos o valor calculado mais próximo em termos de data e medidas na tabela de totais.
  2. “Some” o valor da tabela de movimentação ao valor da tabela de totais.


Essas ações simples podem melhorar significativamente o desempenho do sistema como um todo.

Usando o Query Builder

Construtor de consulta- uma ferramenta incorporada ao sistema corporativo 1C, que facilita muito o desenvolvimento de consultas ao banco de dados.

O construtor de consulta tem uma forma bastante simples e intuitiva interface clara... No entanto, vamos examinar mais de perto o uso do construtor de consulta.

O construtor de texto de consulta é iniciado pelo menu de contexto (com o botão direito do mouse) no lugar certo no código do programa.

Descrição do construtor de consulta 1C

Vamos dar uma olhada mais de perto em cada guia de design. A exceção é a guia Builder, que é um tópico para outra discussão.

Tabelas e campos de guia

Esta guia especifica a fonte de dados e os campos que você deseja exibir no relatório. Na verdade, as construções SELECT .. FROM.

A fonte pode ser uma tabela de banco de dados física, tabela de registro virtual, tabelas temporárias, consultas aninhadas, etc.

No menu de contexto das tabelas virtuais, você pode definir os parâmetros da tabela virtual:

Aba de links

A guia é usada para descrever conexões de várias tabelas, cria construções com a palavra CONEXÃO.

Guia de agrupamento

Nesta aba, o sistema permite agrupar e resumir os campos obrigatórios do resultado da tabela. Descreve o uso das construções GROUP BY, SUM, MINIMUM, AVERAGE, MAXIMUM, QUANTITY, NUMBER OF DIFFERENT.

Aba de condições

Responsável por tudo o que vai no texto da solicitação após a construção do WHERE, ou seja, por todas as condições impostas aos dados recebidos.

Aba Avançado

Aba Além disso está repleto de todos os tipos de parâmetros que são muito importantes. Vamos considerar cada uma das propriedades.

Agrupamento Buscando registros:

  • Primeiro n- um parâmetro que retorna apenas N registros para a consulta (operador FIRST)
  • Não repetitivo- garante a unicidade dos registros recebidos (operador DIFFERENT)
  • Permitido- permite que você selecione apenas aqueles registros que o sistema permite que você selecione levando em consideração (construção PERMITIDA)

Agrupamento Tipo de solicitação determina que tipo de consulta será: buscando dados, criando uma tabela temporária ou destruindo uma tabela temporária.

Abaixo há uma bandeira Bloquear dados recebidos para alteração posterior... Ele permite que você habilite a capacidade de definir um bloqueio de dados, o que garante a segurança dos dados desde o momento em que são lidos até que sejam alterados (relevante apenas para Modo automático fechaduras, design PARA MUDANÇA).

Guia Sindicatos / Aliases

Nesta guia do designer de consulta, você pode definir a capacidade de combinar diferentes tabelas e apelidos (construção de HOW). As tabelas são indicadas à esquerda. Se você definir os sinalizadores ao lado da tabela, a construção UNION será usada, caso contrário - UNION ALL (os dois métodos são diferentes). No lado direito, as correspondências dos campos em tabelas diferentes se nenhuma correspondência for especificada, a consulta retornará NULL.

Guia de pedido

Aqui você especifica a ordem de classificação dos valores (ORDER BY) - decrescente (DESCENT) ou crescente (RETURN).

Há também uma bandeira interessante - Auto-ordenação(na solicitação - PEDIDO AUTOMÁTICO). Por padrão, o sistema 1C exibe os dados em uma ordem “caótica”. Se você marcar esta caixa de seleção, o sistema classificará os dados por dados internos.

Guia Query Package

Na guia do designer de consulta, você pode criar novos, e também usá-lo como uma navegação. No texto do pedido, os pacotes são separados por “;” (ponto e vírgula).

Botão de consulta no Construtor de consulta

No canto inferior esquerdo do construtor de consulta, há um botão Consulta, com o qual você pode visualizar o texto da consulta a qualquer momento:

Nesta janela, você pode fazer ajustes na solicitação e executá-la.


Usando o console de consulta

O Query Console é uma maneira fácil e conveniente de depurar consultas complexas e obter informações rapidamente. Neste artigo, tentarei descrever como usar o Query Console e fornecer um link para fazer o download do Query Console.

Vamos dar uma olhada mais de perto nesta ferramenta.

Baixe 1C Query Console

Em primeiro lugar, para começar a usar o Query Console, você precisa baixá-lo de algum lugar. Os processos são geralmente divididos em dois tipos - formulários controlados e regulares (ou, às vezes, são chamados em 8.1 e 8.2 / 8.3).

Tentei combinar esses dois tipos em um processamento - no modo de operação desejado, o formulário necessário é aberto (em modo controlado o console só funciona em negrito).

Descrição do console de consulta 1C

Vamos começar a olhar para o console de consulta com uma descrição do painel de processamento principal:

No cabeçalho do console de consulta, você pode ver o tempo de execução da última consulta com precisão de milissegundos, o que permite comparar diferentes construções em termos de desempenho.

O primeiro grupo de botões na barra de comando é responsável por salvar as solicitações atuais em um arquivo externo. Isso é muito conveniente, você sempre pode voltar a escrever uma consulta complexa. Ou, por exemplo, mantenha uma lista de exemplos típicos de certas construções.

À esquerda, no campo Consulta, você pode criar novas consultas e salvá-las em uma estrutura de árvore. O segundo grupo de botões é responsável apenas por gerenciar a lista de solicitações. Com ele, você pode criar, copiar, excluir, mover uma solicitação.

  • Executarinvestigação- execução simples e obtenção do resultado
  • Executar pacote- permite que você visualize todas as solicitações intermediárias no lote de solicitações
  • Visualizando tabelas temporárias- permite que você veja os resultados que são retornados por consultas temporárias na tabela

Parâmetros de solicitação:

Permite definir os parâmetros atuais da solicitação.

Na janela de parâmetros de consulta, o seguinte é interessante:

  • Botão Obtenha a partir do pedido encontra automaticamente todos os parâmetros na solicitação para a conveniência do desenvolvedor.
  • Bandeira Parâmetros uniformes para todas as solicitações- quando instalado, seu processamento não limpa os parâmetros ao passar de um pedido para outro em lista geral solicitações de.

Defina o parâmetro como uma lista de valoresé muito simples, ao selecionar um valor de parâmetro, pressione o botão para limpar o valor (cruz), o sistema se oferecerá para selecionar um tipo de dado, onde você precisa selecionar “Lista de valores”:

também em Painel superior há praticamente um botão para chamar as configurações do console de consulta:

Aqui você pode especificar opções para consultas de salvamento automático e opções para executar a consulta.

O texto da consulta é inserido no campo de consulta do console. Isso pode ser feito com um conjunto de teste de consulta simples ou chamando uma ferramenta especial - o designer de consulta.

O construtor de consulta 1C 8 é chamado a partir do menu de contexto (botão direito do mouse) quando você clica no campo de entrada:

Também neste menu existem tais funções úteis como limpar ou adicionar caracteres de quebra de linha (“|”) à solicitação, ou obter o código da solicitação em uma forma conveniente:

Pedido = Novo Pedido;
Request.Text = "
| ESCOLHER
| Currencies.Link
| DE
| Diretório. Moedas AS Moedas ”;
QueryResult = Query.Run ();

No campo inferior do console de consulta, é exibido o campo de resultado da consulta, para o qual este processamento foi criado:



Além disso, o console de consulta, além da lista, pode exibir dados na forma de uma árvore - para consultas que contêm totais.

Otimizando consultas

Um de Pontos críticos no aumento da produtividade da empresa 1C 8.3 é otimizaçãosolicitações de... Este ponto também é muito importante quando passando na certificação... A seguir, falaremos sobre as razões típicas para o trabalho subótimo de consultas e métodos de otimização.

Seleções na mesa virtual usando a construção WHERE

É necessário aplicar filtros aos detalhes da mesa virtual apenas por meio dos parâmetros BT. Em nenhum caso você deve usar a construção WHERE para seleção em uma mesa virtual, este é um erro grosseiro do ponto de vista de otimização. No caso de seleção por WHERE, na verdade, o sistema receberá TODOS os registros e só então selecionará os necessários.

DIREITO:

SELECIONE

A PARTIR DE
Registro de acumulação. Liquidações mútuas com DeponentsOrganizations.Remains (
,
Organização = & Organização
E Individual = & Individual) COMO Liquidações mútuas com organizações de depoentes

NÃO ESTÁ CERTO:

SELECIONE
Liquidações mútuasWithDeponentsOrganizationsBalances.AmountBalance
A PARTIR DE
Registro de acumulação. Liquidações mútuas com DeponentsOrganizations.Balances (,) AS Liquidações mútuas com DeponentsOrganizationsBalances
ONDE
SettlementsWith DeponentsOrganizationsBalances.Organization = & Organization
E acordos mútuos com DeponentsOrganizationsBalances.Personal = & Individual

Obtendo o valor de um campo de tipo complexo por meio de um ponto

Ao receber dados de um tipo composto em uma consulta por meio de um ponto, o sistema une com uma junção à esquerda exatamente tantas tabelas quanto os tipos possíveis no campo do tipo composto.

Por exemplo, é altamente indesejável para otimização referir-se ao campo de registro de registro - o registrador. O registrador tem um tipo de dados composto, incluindo todos os tipos possíveis de documentos que podem gravar dados no registrador.

NÃO ESTÁ CERTO:

SELECIONE
Record Set.Recorder.Date,
Conjunto de registros.Número
A PARTIR DE
Acumulação Register.ProductsOrganizations AS SetRecords

Ou seja, de fato, tal solicitação se referirá não a uma tabela, mas a 22 tabelas do banco de dados (este registro tem 21 tipos de registradores).

DIREITO:

SELECIONE
ESCOLHA
WHEN GoodsOrg.Registrar LINK Document.Realization of GoodsServices
ENTÃO EXPRESS (GoodsOrg.Registrar AS Document.Realization of GoodsServices) .Data
WHEN GoodsOrg.Registrar LINK Document.Arrival of GoodsServices
THEN EXPRESS (GoodsOrg.Registrar AS Document.Chegada de GoodsServices) .Data
END AS Date,
ProductsOrg.Quantity
A PARTIR DE
Acumulação Register.ProductsOrg

Ou a segunda opção é adicionar essas informações aos adereços, por exemplo, no nosso caso, adicionar uma data.

DIREITO:

SELECIONE
ProductsOrganizations.Date,
ProductsOrganizations.Number
A PARTIR DE
Registro de Acumulação. Mercadorias de Organizações AS Mercadorias de Organizações

Subconsultas em uma condição de junção

Para otimização, é inaceitável usar subconsultas em condições de junção, isso torna a consulta significativamente mais lenta. É aconselhável usar VT nesses casos. Para se conectar, é necessário utilizar apenas metadados e objetos BT, tendo-os indexado previamente pelos campos de conexão.

NÃO ESTÁ CERTO:

SELECIONE ...

JUNTA ESQUERDA (
SELECIONE DO REGISTRO DE INFORMAÇÕES.Limites
ONDE …
CARREGAR POR ...
) SOBRE …

DIREITO:

SELECIONE ...
Limites de POST
FROM Information Register.Limits
ONDE …
CARREGAR POR ...
ÍNDICE POR…;

SELECIONE ...
FROM Document.Realization of GoodsServices
Limites de LEFT JOIN
SOBRE …;

Juntando registros com tabelas virtuais

Existem situações em que o sistema não tem um desempenho ideal ao juntar uma mesa virtual a outras pessoas. Neste caso, para otimizar o desempenho da consulta, pode-se tentar colocar a tabela virtual na tabela temporária, lembrando de indexar os campos unidos na consulta da tabela temporária. Isso se deve ao fato de que os VTs muitas vezes estão contidos em várias tabelas físicas do SGBD, como resultado, é feita uma subconsulta para selecioná-los, e o problema é semelhante ao ponto anterior.

Usando filtros em campos não indexados

Um dos erros mais comuns ao escrever consultas é usar condições em campos não indexados, isso contradiz regras de otimização de consulta. O SGBD não pode executar a consulta de maneira ideal se a filtragem por campos não indexados for imposta na consulta. Se uma tabela temporária for obtida, também é necessário indexar os campos de junção.

Deve haver um índice adequado para cada condição. Um índice que atenda aos seguintes requisitos é adequado:

  1. O índice contém todos os campos listados na condição.
  2. Esses campos estão no início do índice.
  3. Essas seleções estão em uma linha, ou seja, os valores que não estão envolvidos na condição de consulta não são "encaixados" entre eles.

Se o DBMS não encontrar os índices corretos, toda a tabela será verificada - isso terá um impacto muito negativo no desempenho e pode levar ao bloqueio prolongado de todo o conjunto de registros.

Usando OR lógico em condições

Isso é tudo, este artigo cobriu os fundamentos dos aspectos de otimização de consulta que todo especialista 1C deve saber.

Um curso de vídeo gratuito muito útil sobre desenvolvimento e otimização de consultas, altamente recomendado para iniciantes e não só!

Ao desenvolver relatórios, às vezes torna-se necessário exibir um relatório cujos dados não podem ser obtidos usando a linguagem de consulta. Tal situação pode surgir, por exemplo, se um determinado algoritmo complexo é usado para calcular os dados, ou os dados para a saída do relatório não são obtidos de base de informação, e, por exemplo, de arquivo externo... O criador de relatórios oferece a capacidade de gerar um relatório de uma fonte de dados arbitrária.
O seguinte pode ser usado como fonte de dados para gerar um relatório:

  • Tabela de Valores,
  • Resultado da Solicitação,
  • Escopo das células de documento de planilha,
  • Parte tabular,
  • Accumulation RegisterRecordSet,
  • DatasheetRecordSet,
  • Accounting RegisterRecordSet,
  • Cálculo RegisterRecordSet.
Para que o construtor de relatório exiba um relatório para uma fonte de dados arbitrária, é suficiente definir a descrição da fonte de dados para a propriedade do construtor DataSource. A propriedade do construtor de relatório DataSource pode conter um valor do tipo DataSource Description. O objeto DataSourceDescription contém a própria fonte de dados e também a descrição das colunas da fonte de dados. Cada descrição da coluna da fonte de dados contém:
  • Nome - contém o nome da coluna na fonte de dados,
  • PathData - contém uma descrição da dependência das colunas umas das outras. Uma coluna cujo caminho de dados é obtido por meio de um ponto do caminho de dados de outro campo é considerada um atributo de outra coluna. Se o campo contiver a palavra Representação separada por um ponto, então este campo é considerado uma representação para a coluna, a partir do caminho de dados do qual a representação é obtida. Exemplos. Se a coluna "Nomenclatura" possuir um caminho para os dados "Nomenclatura" e a coluna "Código" possuir um caminho para os dados "Nomenclatura.Código", então esta coluna será considerada um atributo da coluna "Nomenclatura". A coluna com o caminho para os dados "Nomenclatura. Representação" será considerada uma representação para a coluna "Nomenclatura",
  • Campo - um sinal de que esta coluna pode ser usada como um campo de relatório,
  • A ordem é um sinal de que a ordem é possível para uma determinada coluna,
  • A seleção é um sinal de que é possível impor a seleção a uma determinada coluna,
  • Dimensão - um sinal de que esta coluna pode ser usada como um agrupamento do relatório,
  • Total é uma string que contém uma expressão para calcular o total. Para o criador de relatórios, a expressão para esta string corresponde à expressão para calcular o total usado na linguagem de consulta,
Ao definir uma fonte de dados para o objeto DataSourceDescription, as descrições das colunas são criadas e preenchidas automaticamente.

O objeto DataSource Description possui um construtor, como parâmetro do qual pode ser passada uma fonte de dados para a qual uma descrição é criada, enquanto a propriedade DataSource será preenchida com a fonte de dados transferida, as descrições das colunas serão preenchidas com informações sobre as colunas da fonte de dados.

Um exemplo de configuração de uma fonte de dados para o criador de relatórios:

ReportBuilder.DataSource = NewDataSourceDescription (ValueTableResult);

O trabalho posterior com o criador de relatórios não difere de trabalhar com o criador de relatórios no modo de trabalhar com uma consulta: o criador de relatórios fornece sua funcionalidade completa, exceto para a saída de totais hierárquicos. Além disso, ao trabalhar com uma fonte de dados arbitrária, você não pode receber uma consulta do criador de relatórios que será usada para recuperar dados de uma infobase.

Trabalhar com uma fonte de dados customizada Query Builder é o mesmo que trabalhar com um Construtor de relatórios customizado.

A programação 1C consiste não apenas em escrever um programa. 1C é um lingote de ações e dados do usuário com os quais ele trabalha.

Os dados são armazenados em um banco de dados. As solicitações 1C são uma forma de obter dados do banco de dados para mostrá-los ao usuário no formulário ou processá-los.

A parte fundamental do relatório é uma solicitação 1C. No caso do relatório da ACS, esta é a maior parte do relatório.

Sentar-se. Respire. Vá com calma. Agora vou te contar as novidades.

Para programar em 1C, não basta conhecer a linguagem de programação 1C. Você também precisa saber o idioma das solicitações 1C.

A linguagem de consulta 1C é uma linguagem completamente separada que nos permite especificar quais dados precisamos obter do banco de dados.

Também é bilíngue - ou seja, você pode escrever em russo ou em inglês. É excepcionalmente semelhante à língua Consultas SQL e quem conhece pode relaxar.

Como as solicitações 1C são usadas

Quando um usuário inicia 1C no modo Enterprise, não há um único grama de dados no cliente iniciado. Portanto, quando você precisa abrir um diretório, 1C solicita dados do banco de dados, ou seja, faz uma solicitação 1C.

Os pedidos 1C são:

  • Solicitações automáticas 1C
    Eles são gerados automaticamente pelo sistema. Você criou um formulário de lista de documentos. Adicionada uma coluna. Isso significa que ao abrir este formulário no modo Enterprise, uma solicitação será feita e os dados para esta coluna serão solicitados.
  • Consultas 1C semiautomáticas
    Existem muitos métodos (funções) na linguagem 1C, ao acessar o qual há uma solicitação ao banco de dados. Por exemplo, GetObject ()
  • Solicitações manuais 1C (escritas pelo programador especificamente como uma solicitação)
    Você mesmo pode escrever uma solicitação 1C no código e executá-la.

Criação e execução de solicitações 1C

A solicitação 1C é o texto real da solicitação na linguagem de consulta 1C.
O texto pode ser escrito com canetas. Ou seja, pegue e escreva (se você conhece esse idioma).

Uma vez que 1C promove o conceito de programação visual, onde muito ou quase tudo pode ser feito sem escrever código com canetas, existe um objeto Construtor de Consulta especial que permite desenhar um texto de consulta sem conhecer a linguagem de consulta. Porém, milagres não acontecem - para isso você precisa saber trabalhar com o construtor.

Depois que o texto da solicitação 1C estiver pronto, ele deve ser executado. Para isso, existe um objeto no código 1C Request (). Aqui está um exemplo:

Pedido = Novo Pedido ();
Request.Text = "SELECT
| Nomenclature.Ref.
| DE
| Reference.Nomenclature AS Nomenclature
| ONDE
| Nomenclature.Service ";
Seleção = Consulta.Run (). Selecione ();

Relatório (Sample.Link);
Fim do ciclo;

Como você pode ver no exemplo - após executar a solicitação 1C, o resultado chega até nós e devemos processá-lo. O resultado é uma ou várias linhas da tabela (em um formato especial).

O resultado pode ser despejado em uma tabela regular:
Fetch = Query.Run (). Unload (); // O resultado é uma tabela de valores

Ou apenas contorne as linhas.
Seleção = Consulta.Run (). Selecione ();
While Fetch.Next () Loop
// Faça algo com os resultados da consulta
Fim do ciclo;

Trabalho com solicitações 1C

Princípios básicos de solicitações 1C

Os princípios básicos da construção de uma consulta 1C são -
SELECT ListFields FROM TABLE TABLE WHERE Condições

Um exemplo de construção de uma solicitação 1C:

SELECIONE
// lista de campos para selecionar
Ligação,
Nome,
Código
A PARTIR DE
// nome da tabela de onde selecionamos os dados
// lista de tabelas é uma lista de objetos na janela do configurador
Directory.Nomenclature
ONDE
// especifica a seleção
Tipo de produto = & Serviço // seleção por valor externo
Ou Serviço // Variável "Serviço" de tipo booleano, seleção por valor Verdadeiro
ORDENAR POR
//Ordenação
Nome

Lista das tabelas 1C

Você pode ver os nomes das tabelas na janela do configurador. Só é necessário escrever "Diretório" em vez de "Diretórios", por exemplo "Diretório.Nomenclatura" ou "Documento.Realização de Serviços de Mercadorias" ou "Registro de Acumulação.vendas".

Para os registros, existem tabelas adicionais (virtuais) que permitem obter os números totais.

Information Registry.RegisterName.Last Slice (& Date) - solicitação 1C do registro de informações, se for periódico, para uma data específica

Registro de acumulação. Nome do registro. Saldos (e data) - solicitação 1C do registro de saldo para uma data específica

Acumulação Register.RegisterName.Turnovers (& Start Date, & End Date) - solicitação 1C do registro de turnover para o período da data de início até a data de término.

Princípios adicionais

Quando solicitamos uma lista de alguns dados, os princípios básicos funcionam. Mas também podemos solicitar números e o pedido pode calculá-los para nós (adicionar por exemplo).

SELECIONE
// Quantidade (FieldName) - conta a quantidade
// Field AS OtherName - renomeia o campo
Número (link) AS Número de documentos publicados
A PARTIR DE

ONDE
Realizado

Esta solicitação 1C nos retornará o número total de documentos. Porém, todo documento possui um campo Organização. Digamos que desejamos calcular o número de documentos para cada organização usando uma consulta 1C.

SELECIONE
// apenas um campo de documento
Organização,
// conte a quantia
Quantidade (referência) Quantidade de AS por organização
A PARTIR DE
Document.Realization ofGoodsServices
ONDE
Realizado
CARREGAR POR

Organização

Esta solicitação 1C nos retornará o número de documentos para cada organização (eles também dizem "no contexto das organizações").

Além disso, calcularemos a soma desses documentos usando uma solicitação 1C:

SELECIONE
// apenas um campo de documento
Organização,
// conte a quantia

// calcule a quantia

A PARTIR DE
Document.Realization ofGoodsServices
ONDE
Realizado
CARREGAR POR
// deve ser usado se a lista de campos contém uma função de contagem () e um ou mais campos ao mesmo tempo - então você precisa agrupar por esses campos
Organização

Esta solicitação 1C também retornará a quantidade de documentos para nós.

SELECIONE
// apenas um campo de documento
Organização,
// conte a quantia
Quantidade (link) Quantidade de AS por organização,
// calcule a quantia
Quantia (Quantia do Documento) Quantia AS
A PARTIR DE
Document.Realization ofGoodsServices
ONDE
Realizado
CARREGAR POR
// deve ser usado se a lista de campos contém uma função de contagem () e um ou mais campos ao mesmo tempo - então você precisa agrupar por esses campos
Organização
RESULTADOS PARA Geral

A linguagem de consulta 1C é extensa e complexa e não consideraremos todos os seus recursos em uma lição - leia nossas próximas lições.

Resumidamente sobre características adicionais Linguagem de consulta 1C:

  • Junção de dados de várias tabelas
  • Consultas aninhadas
  • Solicitação em lote
  • Criação de suas próprias tabelas virtuais
  • Consulta de uma tabela de valores
  • Usando as funções integradas para obter um valor e manipular valores.

1C Query Designer

Para não escrever o texto do pedido à mão - existe um designer de consulta 1C. Basta clicar com o botão direito em qualquer lugar do módulo e selecionar 1C Query Builder.

Selecione a tabela desejada à esquerda no designer de consulta 1C e arraste-a para a direita.

Selecione os campos obrigatórios da tabela no designer de consulta 1C e arraste para a direita. Se você deseja não apenas selecionar um campo, mas aplicar uma função de soma a ele - após arrastar, clique duas vezes no campo com o mouse. Depois disso, na guia Agrupamento, você precisará selecionar (arrastar e soltar) os campos obrigatórios para agrupar.

Na guia Condições no designer de consulta 1C, você pode selecionar os filtros necessários da mesma maneira (arrastando os campos pelos quais fará a seleção). Não se esqueça de escolher a condição correta.

Na guia Ordem, a classificação é indicada. Na guia Totais - somando os totais.

Com a ajuda do designer de consulta 1C, você pode estudar qualquer consulta existente. Para fazer isso, clique com o botão direito do mouse no texto da solicitação existente e selecione também o designer de consulta 1C - e a solicitação será aberta no designer de consulta 1C.