O operador "na hierarquia" em uma consulta. Exemplos de consultas para trabalhar com diretórios hierárquicos Conta na consulta hierárquica 1c

20.11.2023

Atenção! Esta é uma versão introdutória da lição, cujos materiais podem estar incompletos.

Faça login no site como estudante

Faça login como aluno para acessar os materiais escolares

Linguagem de consulta 1C 8.3 para programadores iniciantes: operadores BETWEEN e IN

Operador lógico ENTRE

Operador ENTRE permite que você verifique o valor está incluído? expressão especificada à esquerda dela no intervalo especificado à direita ( junto com os limites do intervalo, isto é, inclusivo).

Então, em vez de

Se, pelo contrário, for necessário selecionar todos os alimentos cujo teor calórico não esteja incluído na faixa, então a seguinte forma de negação é adequada (apareceu uma partícula NÃO):

Operador ENTRE Pode ser aplicado a mais do que apenas intervalos numéricos. Também funciona bem com datas:

Operador lógico B

Verificando se há correspondência com um dos listados

Operador EM permite que você verifique o valor corresponde a expressão indicada à esquerda dela, com um dos valores descrito à direita.

Então, em vez de

você pode escrever algo mais conciso

E o resultado será o mesmo:

Se, pelo contrário, for necessário selecionar todos os alimentos cuja cor não coincide com nenhum valor da lista, então a seguinte forma de negação é adequada (apareceu uma partícula NÃO):

Verificando se um valor corresponde a um dos resultados da consulta

Suponha que precisemos selecionar no banco de dados apenas as cores que estão presentes na descrição do alimento. Assim, a lista selecionada não deverá conter, por exemplo, a cor preta, uma vez que não existe nenhum alimento preto em nossa base de dados. Você está lendo uma versão de teste da lição; lições completas estão disponíveis.

Uma maneira de fazer isso é usar o operador lógico EM, à direita da qual haverá uma subconsulta selecionando nomes de cores de todas as entradas do diretório Comida:

SELECIONE o nome do diretório. Cores ONDE Nome IN (SELECIONE Cor. Nome DO Diretório. Comida)

À parte, mencionarei que a partir de uma requisição interna é possível acessar os campos de uma requisição externa.

Novamente, para esta forma do operador EM, o uso de partículas também está disponível NÃO na frente dele.

Verificando a participação na hierarquia de diretórios

Para diretórios, a verificação também pode ser executada para associação hierárquica.

Primeiro, vejamos um exemplo de diretório hierárquico. Abra o diretório "Cidades" em nosso banco de dados:

Observe que seus elementos são diferentes de outros diretórios ( Comida, Cores, Sabores) presença de pastas amarelas. Esse grupos de diretórios.

Os grupos diferem dos elementos comuns porque podem incluir outros grupos e elementos. Assim como as pastas contêm outras pastas e arquivos.

Para visualizar o conteúdo de um grupo, clique duas vezes nele:

Para subir de nível, clique duas vezes no grupo novamente:

Assim, um diretório hierárquico pode conter tanto elementos comuns (por exemplo, Rio de Janeiro, Salvador) quanto grupos (por exemplo, Brasil, Índia). Você está lendo uma versão de teste da lição; lições completas estão disponíveis.

Cada elemento (seja um grupo ou um elemento comum) pode ter um pai. Por exemplo, o pai do elemento Rio de Janeiro é o grupo Brasil:

E isso é verdade porque o Rio de Janeiro faz parte do grupo Brasil na hierarquia de diretórios:

Agora vamos escrever uma consulta que solicitará o grupo de países selecionado e todos os elementos de cidade nele incluídos.

Observe que no texto da solicitação há um E comercial (&) antes do nome GroupCountry. Nomes com E comercial são automaticamente reconhecidos pelo sistema como parâmetros cujo valor deve ser definido antes da execução da consulta.

Depois de colarmos esta consulta no console e clicarmos no botão Executar para atualizar, poderemos definir este parâmetro:

Selecione o grupo "Rússia" como valor (botão Selecionar):

Se clicarmos agora no botão “Executar”, o resultado da consulta será o seguinte:

O resultado do pedido incluiu o próprio grupo (Rússia) e todos os elementos que dele fazem parte (Perm, Krasnoyarsk e Voronezh).

Se você selecionar “Brasil” em vez de Rússia, o resultado será assim:

Assim o resultado do operador NA HIERARQUIA será TRUE se o valor da expressão à esquerda for uma referência a um elemento do diretório e estiver incluído no conjunto de valores à direita (Brasil) ou pertencer hierarquicamente a algum grupo contido neste conjunto (São Paulo, Rio Janeiro, Salvador).

O conjunto de valores a serem verificados quanto à correspondência também pode incluir o resultado de uma consulta. Neste caso, à direita do operador EM você deve especificar uma descrição da solicitação:

Para o operador NA HIERARQUIA o uso de partículas também está disponível NÃO na frente dele.

Faça o teste

Iniciar teste

1. O operador lógico BETWEEN verifica o valor

2. Expressão booleana 1 ENTRE 1 E 1

3. Expressão lógica 1 NÃO ENTRE 2 E 2

4. Verificações do operador lógico B

5. O operador lógico B permite verificar

O design “IN HIERARCHY” nas consultas 1C:Enterprise 8.x permite obter elementos subordinados de um objeto de configuração hierárquica de acordo com uma determinada seleção. Hoje no artigo veremos um exemplo de sua utilização, bem como as ações da plataforma no lado do SGBD e seu impacto no desempenho.

Uso

Vejamos um exemplo simples de uso da construção "IN HIERARCHY". Ao executar a solicitação seguinte, serão obtidos os elementos subordinados do diretório hierárquico "Produtos" para o valor passado da variável "Link".

Query Text = " SELECIONE | Produtos . Link,| Bens |. Artigo DE | Diretório . Produtos COMO Produtos"

|ONDE |

Bens

. Link NA HIERARQUIA(& Link)

No banco de dados de teste, o diretório "Produtos" possui os seguintes dados de teste:

Obviamente, a imagem não mostra todas as entradas do diretório. A captura de tela mostra apenas a estrutura de armazenamento de dados no diretório hierárquico. A tabela de diretório armazena 10 grupos de nível superior, cada um contendo 5 grupos aninhados com 200 elementos cada. Voltemos à solicitação de teste. Vamos passar o link do grupo “Grupo - 1” para o parâmetro “&Link” (veja imagem acima). Então o resultado da consulta ficará assim: Como podemos ver, a solicitação retornou um link para o próprio grupo superior (passado como parâmetro), bem como grupos aninhados com os elementos neles contidos. Assim, a utilização da construção “IN HIERARCHY” permite obter convenientemente dados hierarquicamente subordinados. Sintaxe da linguagem de consulta 1C:Enterprise.

SQL clássico

muito semelhante em alguns aspectos. Mas para a expressão “IN HIERARCHY” não existe análogo na linguagem de consulta SQL como, por exemplo, para a expressão da linguagem de consulta da plataforma “B” existe um operador SQL semelhante “IN”. Portanto, é interessante que a plataforma funcione com um SGBD ao utilizar

  1. deste operador
  2. Nos bastidores

Então vamos começar. Por exemplo, usaremos a consulta escrita anteriormente para o diretório “Produtos”. Analisaremos as ações da plataforma para duas situações:

1. Passaremos o grupo de nível superior “Grupo 1” como o parâmetro “&Link” (como fizemos anteriormente).

2. No parâmetro passaremos um link para o grupo “Grupo 1 - 1”, aninhado no grupo de nível superior “Grupo 1”.

A captura de tela contém comentários detalhados sobre o texto da consulta SQL. Resumindo, a consulta permite selecionar elementos subordinados para grupos referenciados em uma tabela temporária. A questão permanece: “Por que a consulta é executada duas vezes?” A resposta aqui é simples: primeiro, a consulta obtém os elementos subordinados dos grupos de primeiro nível que já estão contidos na tabela temporária (ver ponto 1). A segunda consulta recupera os subelementos dos subgrupos de segundo nível. Como nenhum grupo de diretórios está presente no terceiro nível da hierarquia, esta consulta não é mais executada.

No nosso caso, a segunda consulta retornará um resultado vazio, pois não existem elementos subordinados para registros localizados no 3º nível da hierarquia (lá não há grupos).

3. Para obter o resultado final da consulta, a plataforma gera a seguinte consulta SQL:

O resultado desta solicitação específica pode ser processado posteriormente por algoritmos na linguagem integrada da plataforma. Assim, as entradas na tabela temporária "#tt1" são utilizadas para definir a condição de amostragem da tabela de referência "_Reference41".

4. Na última etapa, a plataforma 1C:Enterprise 8.x exclui a tabela temporária “#tt1”, pois ela não será mais utilizada no futuro.

Isso completa o processo de execução do operador “IN HIERARCHY”. Deixe-me lembrá-lo de que a sequência de ações considerada no servidor SQL foi executada quando passamos um link para o grupo de nível superior “Grupo - 1” para uma solicitação no lado da plataforma. Mas como a plataforma se comportará se passarmos um link para o grupo de segundo nível “Grupo - 1 - 1” como parâmetro “&Link”? Tudo acontecerá da mesma forma, exceto o seguinte ponto: acima, na segunda etapa de execução de consultas SQL pela plataforma, foi escrito que a consulta para obtenção de elementos subordinados foi executada duas vezes - no caso de obtenção de elementos subordinados para o grupo "Grupo - 1 - 1" não é assim. A solicitação será executada apenas uma vez.

O fato é que o número de solicitações para obtenção de elementos subordinados depende do número de grupos na hierarquia. Em outras palavras, se o nível de hierarquia do elemento contiver pelo menos um grupo, então o solicitação do ponto 2.

Impacto no desempenho

O uso incorreto de qualquer operador em uma consulta pode resultar em desempenho abaixo do ideal do sistema. O operador em consideração “IN HIERARCHY” não é exceção. Deve ser usado com cautela, pois complica muito o algoritmo de execução de consultas SQL ao banco de dados e, assim, aumenta a carga no servidor SGBD.

Deixe-me dar um exemplo de consulta abaixo do ideal que pode levar às tristes consequências mencionadas acima:

SELECIONE Produtos. Link DO diretório. Produtos COMO Produtos ONDE (Produtos. Link NA HIERARQUIA (& Link) OU Produtos. Link NA HIERARQUIA (& Link1) OU Produtos. Link NA HIERARQUIA (& Link2))

Como você pode imaginar, a solicitação levará à geração de muitas consultas SQL, o que resultará em uma diminuição no desempenho do sistema de informação.

Tire suas conclusões!

Cabe a você tirar conclusões. Deixe-me apenas dizer que o operador “IN HIERARCHY” é utilizado pela plataforma para o sistema de composição de dados quando as condições de seleção incluem “IN GROUP”, “IN GROUP FROM THE LIST” e outras. Acho que não há necessidade de explicar que, com manipulações incorretas, os usuários podem configurar seleções muito complexas e aumentar várias vezes a carga no servidor 1C e no SGBD. Vamos alterar as configurações apenas para usuários experientes.

E claro, ao escrever mecanismos próprios preste atenção ao operador "NA HIERARQUIA". Muito conveniente por um lado e perigoso por outro.

Esta seção mostra exemplos de solução de problemas típicos ao trabalhar com diretórios hierárquicos.

Obtenção de elementos de um diretório hierárquico subordinados a um determinado grupo

Para obter elementos subordinados de um diretório hierárquico, a linguagem de consulta fornece a construção IN HIERARCHY. Exemplo de uso NA HIERARQUIA:


ESCOLHER
Nomenclatura.Código,
Nomenclatura.PurchasePrice
DE

EM neste exemplo Serão obtidos todos os registros do diretório de Nomenclatura localizados no grupo &Grupo, incluindo ele próprio, seus grupos subordinados e elementos pertencentes a grupos subordinados.

Se estivermos interessados ​​apenas em elementos e grupos localizados diretamente em um determinado grupo, podemos obter tais elementos definindo uma condição no campo Pai. Exemplo:


ESCOLHER
Nomenclatura.Código,
Nomenclatura. Nome AS Nome,
Nomenclatura.PurchasePrice
DE
Diretório.Nomenclatura AS Nomenclatura

ONDE
Nomenclatura.Parent = &Grupo

Esta consulta selecionará grupos e elementos subordinados ao grupo com o link &Grupo.

Verificando a presença de elementos subordinados de um elemento de diretório

Para verificar a presença de registros subordinados de um elemento de diretório, pode-se utilizar uma consulta semelhante à apresentada:

Neste exemplo, a referência ao elemento para o qual você deseja verificar se há filhos é gravada no parâmetro de consulta Parent. Depois de executar essa consulta, você precisa verificar se há vazio no resultado. Se o resultado não estiver vazio, existem registros subordinados. Caso contrário - não. Exemplo:


Se Request.Execute().Empty() Então
Report("Sem entradas");
De outra forma
Report("Registros disponíveis");
fimSe;

Obtendo todos os pais de um elemento

A linguagem de consulta não fornece meios especiais para obter todos os pais de um elemento. Você pode usar totais hierárquicos para concluir a tarefa, mas a obtenção de totais hierárquicos é otimizada para construir totais para um grande número de registros e não é totalmente eficaz para obter os pais de um único elemento. Para obter com mais eficiência todos os registros pais de um elemento, é recomendado percorrer seus pais em pequenas porções. Exemplo:


ItemItemAtual = ItemItem;

Consulta = Nova Consulta("SELECT
| Nomenclatura. Pai,
| Nomenclatura.Parent.Parent,
| Nomenclatura.Parent.Parent.Parent,
| Nomenclatura.Parent.Parent.Parent.Parent,
| Nomenclatura.Parent.Parent.Parent.Parent.Parent
|DE
| Diretório.Nomenclatura AS Nomenclatura
|ONDE
| Nomenclatura.Link = &CurrentNomenclatureElement";

Enquanto o Ciclo da Verdade
Request.SetParameter("CurrentItemItem", CurrentItemItem);
Resultado = Consulta.Run();
Se Result.Empty() Então
Abortar;
fimSe;
Seleção = Resultado.Select();
Seleção.Próximo();
Para ColumnNumber = 0 Por Result.Columns.Quantity() - 1 Loop
ItemItemAtual = Seleção[NúmeroColuna];
Abortar;
De outra forma
Relatório(CurrentItemItem);
fimSe;
Fim do Ciclo;

Se CurrentItemItem = Directories.Nomenclature.EmptyLink() Então
Abortar;
fimSe;
Fim do Ciclo;

Neste exemplo, todos os pais do link registrado na variável ElementNomenclature são exibidos na janela de mensagem de serviço. No ciclo, 5 links pais são selecionados.

Se o número de níveis no diretório for limitado e pequeno, será possível obter todos os pais com uma solicitação sem loop.

Exibindo um diretório hierárquico em um relatório

Para exibir um diretório hierárquico em um relatório preservando a hierarquia, você deve usar uma consulta semelhante a esta:


ESCOLHER
Nomenclatura.Código,
Nomenclatura. Nome AS Nome,
Nomenclatura.PurchasePrice
DE
Diretório.Nomenclatura AS Nomenclatura
ENCOMENDAR POR
Nome HIERARQUIA

Esta consulta seleciona todos os registros do diretório e os organiza por hierarquia. O resultado será ordenado por nome, levando em consideração a hierarquia.

Para que os grupos de diretórios sejam colocados acima dos elementos, é necessário este pedido substitua a cláusula ORDER BY pelo seguinte:


ENCOMENDAR POR
Nomenclatura. Esta é a HIERARQUIA do Grupo,
Nome

O resultado ainda será ordenado hierarquicamente, mas os grupos aparecerão acima dos elementos.

Também é possível substituir a oferta ORDER BY pela opção AUTO ORDER. Neste caso, o resultado será ordenado de acordo com as configurações do diretório, ou seja, se o diretório indicar que os grupos devem estar localizados acima dos elementos, eles estarão localizados acima.

Também é possível obter a estrutura hierárquica do diretório através dos resultados.


ESCOLHER
Nomenclatura.Código,
Nomenclatura. Nome AS Nome,
Nomenclatura.PurchasePrice

DE Diretório.Nomenclatura AS Nomenclatura

ONDE
(Nomenclatura.ThisGroup = FALSO)

ORDENAR POR Nome

Obtendo totais por hierarquia

Para obter resultados por hierarquia em uma consulta, você deve especificar na frase SOFTWARE RESULTS palavra-chave HIERARQUIA após especificar o campo pelo qual os totais serão calculados. Um exemplo de relatório "Giro de itens" com obtenção de totais por hierarquia:


ESCOLHER

DE

HIERARQUIA DE NOMENCLATURA

Como resultado desta solicitação, serão calculados totais não só para cada item, mas também para os grupos aos quais este ou aquele item pertence.

No caso em que não precisamos de totais para elementos, mas apenas de totais para grupos, precisamos usar a construção HIERARCHY ONLY nos totais. Exemplo:


ESCOLHER
Contabilização da Nomenclatura Rotatividade.Nomenclatura AS Nomenclatura,
Contabilização de NomenclaturaTurnover.Nomenclature.Apresentação,
Contabilização de Nomenclatura Volume de negócios. Quantidade Volume de negócios AS Quantidade Volume de negócios
DE
Registro de acumulação.Contabilidade de nomenclatura.Futuro COMO Nomenclatura ContabilidadeFuturo
VALOR DOS RESULTADOS (Quantidade Faturamento) PO
SOMENTE HIERARQUIA DE NOMENCLATURA

O resultado desta consulta será o total de registros apenas para grupos de itens.

A linguagem de consulta em 1C 8 é um análogo simplificado da conhecida “linguagem de programação estruturada” (como é mais frequentemente chamada SQL). Mas em 1C ele é usado apenas para leitura de dados; um modelo de dados de objeto é usado para alterar dados.

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

Solicitação de exemplo:

ESCOLHER
Bancos.Nome,
Bancos.CorrAccount
DE
Directory.Banks COMO Bancos

Este pedido permitir-nos-á ver informação sobre o nome e conta de correspondente de todos os bancos existentes na base de dados.

A linguagem de consulta é a mais simples e maneira eficaz obtenção de informações. Como pode ser visto no exemplo acima, na linguagem de consulta você precisa usar nomes de 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 da linguagem de consulta

Estrutura de consulta

Para obter os dados, basta utilizar as construções “SELECT” e “FROM”. O pedido mais simples parece com isso:

SELECIONE * DE Diretórios.Nomenclatura

Onde “*” significa selecionar todos os campos da tabela, e Directories.Nomenclature – o nome da tabela no banco de dados.

Vejamos um exemplo mais complexo e geral:

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

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

Agrupar por
<ИмяПоля1>

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

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

Nesta consulta, selecionamos os dados dos campos “FieldName1” e “FieldName1” das tabelas “TableName1” e “TableName”, atribuímos sinônimos aos campos usando o operador “HOW” e os conectamos usando uma determinada condição “TableConnectionCondition ”.

A partir dos dados recebidos, selecionamos apenas os dados que atendem à condição “WHERE” “Condição de seleção de dados”. A seguir, agrupamos a solicitação pelo campo “Nome do campo1”, enquanto somamos o “Nome do campo2”. “Nome do Campo1” e o campo final “Nome do Campo2”.

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

Projetos gerais

Vejamos as estruturas gerais da linguagem de consulta 1C 8.2.

PRIMEIROn

Usando este operador, você pode obter o número n dos primeiros registros. A ordem dos registros é determinada pela ordem na consulta.

SELECIONE OS 100 PRIMEIROS
Bancos.Nome,
Bancos. Código AS BIC
DE
Directory.Banks COMO Bancos
ENCOMENDAR POR
Bancos.Nome

A solicitação receberá os 100 primeiros registros do diretório “Bancos”, ordenados em ordem alfabética.

PERMITIDO

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

Se um usuário tentar utilizar uma consulta para ler registros que não estão disponíveis para ele, ele receberá uma mensagem de erro. Para evitar isso, você deve utilizar a construção “ALLOWED”, ou seja, a requisição irá ler apenas os registros permitidos a ela.

SELECIONE PERMITIDO
Link do repositório de informações adicionais.
DE
Diretório.Repositório de informações adicionais

VÁRIOS

Usar “DIFERENTE” evitará que linhas duplicadas entrem no resultado da consulta 1C. Duplicação significa que todos os campos de solicitação correspondem.

SELECIONE OS 100 PRIMEIROS
Bancos.Nome,
Bancos. Código AS BIC
DE
Directory.Banks COMO Bancos

Tabela Vazia

Esta construção é usada muito raramente para combinar consultas. Ao ingressar, pode ser necessário especificar uma tabela aninhada vazia em uma das tabelas. O operador “EmptyTable” é ideal para isso.

Exemplo da ajuda 1C 8:

SELECIONE Link.Número, TABELA VAZIA.(Nº, Item, Quantidade) COMO Composição
DO Documento. Fatura de Despesas
COMBINE TUDO
SELECIONE Link.Number, Contents.(LineNumber, Produto, Quantidade)
DE Documento.Fatura Documento.Fatura.Composição.*

É NULO

Um recurso muito útil que permite evitar muitos erros. YesNULL() permite substituir o valor NULL pelo valor desejado. Muito utilizado para verificar a presença de um valor em tabelas unidas, por exemplo:

ESCOLHER
Referência de Nomenclatura,
IsNULL(Item Restante.QuantidadeRemanescente,0) AS QuantidadeRemanescente
DE


Pode ser usado de outras maneiras. Por exemplo, se para cada linha não se sabe em qual tabela o valor existe:

ISNULL(FaturaRecebida.Data, FaturaEmitida.Data)

COMO é 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 obter uma representação em string do valor desejado. A única diferença é que REPRESENTATION converte qualquer valor em um tipo string, enquanto REPRESENTATIONREF converte apenas valores de referência. REPRESENTAÇÃO DE REFERÊNCIA é recomendada para ser usada em consultas de 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 em seleções.

ESCOLHER
View(Link), //string, por exemplo “Relatório antecipado nº 123 datado de 10/10/2015
View(DeletionMark) AS DeleteMarkText, //string, “Sim” ou “Não”
ViewReferences(DeletionMark) AS DeleteMarkBoolean //booleano, True ou False
DE
Documento.Relatório Avançado

EXPRESSAR

Express permite converter valores de campo para o tipo de dados desejado. Você pode converter um valor em um tipo primitivo ou em um tipo de referência.

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

EXPRESS(TableCost.Subconto1 AS Directory.Cost Items).Tipo de ActivityForTaxAccountingCosts

Para tipos primitivos, esta função é frequentemente 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 é possível comparar campos
comprimento ilimitado e campos de tipos incompatíveis
", você precisa expressar esses campos da seguinte forma:

EXPRESS(Comentário AS Linha(150))

DATA DIFERENÇA

Obtenha 267 videoaulas em 1C gratuitamente:

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

SELECIONE * DE
Referência
CONEXÃO ESQUERDA RegisterAccumulations.ProductsInWarehouses.Remaining AS Produto Restante
Software NomenclatureRef.Link = MercadoriasVendidasCommitteesRemains.Nomenclature
ONDE NÃO Produtos Restantes QuantidadeRemanescente É NULO.

O tipo de dados em uma consulta pode ser determinado usando as funções TYPE() e VALUETYPE() ou usando o operador lógico REFERENCE. As duas funções são semelhantes.

Valores predefinidos

Além de usar parâmetros passados ​​em consultas na linguagem de consulta 1C, você pode usar valores predefinidos ou . Por exemplo, transferências, diretórios predefinidos, planos de contas e assim por diante, é utilizada a construção “Value()”.

Exemplo de uso:

WHERE Nomenclatura.Tipo de Nomenclatura = Valor(Diretório.Tipos de Nomenclatura.Produto)

WHERE Contrapartes.Tipo de informações de contato = Valor(Enumeração.Tipos de informações de contato.Telefone)

ONDE Saldos de contas.Conta contábil = Valor (Plano de contas.Pós-contabilidade.Perda de lucros)

Conexões

Existem 4 tipos de conexões: ESQUERDA, CERTO, COMPLETO, INTERNO.

CONEXÃO ESQUERDA E DIREITA

As junções são usadas para vincular duas tabelas com base em uma condição específica. Recurso quando PARTIR À ESQUERDAé que pegamos a primeira tabela especificada em sua totalidade e vinculamos condicionalmente a segunda tabela. Os campos da segunda tabela que não puderam ser vinculados pela condição são preenchidos com o valor NULO.

Por exemplo:

Irá retornar toda a tabela de Contrapartes e preencher o campo “Banco” apenas 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 como NULO.

RIGHT JOIN na linguagem 1C absolutamente semelhante Conexão ESQUERDA, com exceção de uma diferença - em DIREITO DE CONEXÃO A tabela “principal” é a segunda, não a primeira.

CONEXÃO COMPLETA

CONEXÃO COMPLETA difere da esquerda e da direita porque exibe todos os registros de duas tabelas e conecta apenas aqueles que podem ser conectados por condição.

Por exemplo:

DE

CONEXÃO COMPLETA
Directory.Banks COMO Bancos

POR

A linguagem de consulta retornará ambas as tabelas completamente somente se a condição para unir os registros for atendida. Ao contrário de uma junção esquerda/direita, é possível que NULL apareça em dois campos.

JUNÇÃO INTERNA

JUNÇÃO INTERNA difere de completo porque exibe apenas os registros que podem ser conectados de acordo com uma determinada condição.

Por exemplo:

DE
Diretório de Contrapartes AS Clientes

JUNÇÃO INTERNA
Directory.Banks COMO Bancos

POR
Clientes.Nome = Bancos.Nome

Esta consulta retornará apenas linhas em que o banco e a contraparte tenham o mesmo nome.

Associações

As construções JOIN e JOIN ALL combinam dois resultados em um. Aqueles. o resultado da execução de dois será “mesclado” em um, comum.

Ou seja, o sistema funciona exatamente como os normais, apenas para uma tabela temporária.

Como usar INDEX BY

Contudo, um ponto deve ser levado em consideração. 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 houver certeza de que haverá mais de 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 necessário para construir o índice.

ESCOLHER
Taxas de câmbio Última seção transversal Moeda AS Moeda,
Taxas de câmbio Última seção transversal.
Taxas de moeda PUT
DE
Registro de informações.Taxas de moeda.Última fatia (&Período,) Taxas de moeda ASÚltima fatia
ÍNDICE POR
Moeda
;
ESCOLHER
PreçosNomenclatura.Nomenclatura,
PreçosNomenclaturas.Preço,
PreçosNomenclaturas.Moeda,
Taxas de câmbio.Taxa
DE
Cadastro de Informações.Preços de Nomenclatura.Última Fatia(&Período,
Nomenclatura B (&Nomenclatura) AND PriceType = &PriceType) AS PriceNomenclature
LEFT JOIN Taxas de câmbio AS Taxas de câmbio
Preços de softwareNomenclaturas.Moeda = Taxas de moeda.Moeda

Agrupamento

A linguagem de consulta 1C permite que você use especial funções agregadas ao agrupar os resultados da consulta. O agrupamento também pode ser usado sem funções agregadas para “eliminar” duplicatas.

Existem as seguintes funções:

Quantidade, Quantidade, Número de diferentes, Máximo, Mínimo, Média.

Exemplo #1:

ESCOLHER
Nomenclatura de Vendas de Bens e Serviços.
SOMA(Vendas de MercadoriasServiçosBens.Quantidade) AS Quantidade,
SOMA(Vendas de MercadoriasServiçosBens.Valor) AS Valor
DE

Agrupar por
Nomenclatura de Vendas de Bens e Serviços.

A consulta recebe todas as linhas com mercadorias e as resume por quantidade e valores por item.

Exemplo nº 2

ESCOLHER
Bancos.Código,
QUANTIDADE(DIFERENTES Banks.Link) COMO Número de duplicatas
DE
Directory.Banks COMO Bancos
Agrupar por
Bancos.Código

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

Resultados

Os resultados são uma forma de obter dados de um sistema com estrutura hierárquica. Funções agregadas podem ser usadas para campos de resumo, assim como para agrupamentos.

Uma das maneiras mais populares de usar os resultados na prática é a baixa de mercadorias em lote.

ESCOLHER




DE
Documento. Venda de Bens e Serviços COMO Vender Bens e Serviços.
ENCOMENDAR POR

RESULTADOS
SOMA(Quantidade),
SOMA(Soma)
POR
Nomenclatura

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

Resultados gerais

Se você precisar obter os totais de todos os “totais”, use o operador “GENERAL”.

ESCOLHER
Vendas de Bens e Serviços Bens. Nomenclatura AS Nomenclatura,
Vendas de Bens e Serviços Bens Link AS Documento,
Vendas de bens e serviços. Quantidade AS Quantidade,
Vendas de Bens e Serviços Valor AS Valor.
DE
Documento. Venda de Bens e Serviços COMO Vender Bens e Serviços.
ENCOMENDAR POR
Data de Vendas de Bens e Bens de Serviços.
RESULTADOS
SOMA(Quantidade),
SOMA(Soma)
POR
EM GERAL,
Nomenclatura

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

Em que 1 nível de agrupamento é a agregação de todos os campos necessários.

Organizando

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

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

ESCOLHER

DE
Diretório.Nomenclatura AS Nomenclatura
ENCOMENDAR POR
Nome

A solicitação exibirá uma lista de nomes no diretório de nomenclatura, classificados em ordem alfabética.

Pedido automático

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 que as linhas serão geradas na mesma sequência ao executar consultas idênticas.

Se precisar exibir registros de tabela em uma ordem constante, você deverá usar a construção Auto-Order.

ESCOLHER
Nomenclatura.Nome AS Nome
DE
Diretório.Nomenclatura AS Nomenclatura
PEDIDO AUTOMÁTICO

Mesas virtuais

Tabelas virtuais em 1C são recurso exclusivo Linguagem de consulta 1C, que não é encontrada em outras sintaxes semelhantes. Mesa virtual – maneira rápida obtenção de informações de perfil de registros.

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

  • corte do primeiro;
  • corte deste último.
  • sobras;
  • revoluções;
  • saldos e rotatividade.
  • movimentos do subconto;
  • revoluções;
  • velocidade Dt Kt;
  • sobras;
  • saldos e rotatividade
  • subconto.
  • base;
  • dados gráficos;
  • período de validade real.

Para o desenvolvedor da solução, os dados são retirados de uma tabela (virtual), mas na verdade a plataforma 1C os retira de várias tabelas, transformando-as no formato desejado.

ESCOLHER
Produtos em Armazéns Restos e Nomenclatura,
ProdutosEmArmazénsRemanescenteAndTurnover.QuantidadeInicialRemanescente,
ProdutosEmArmazénsRestosEFuturo.QuantidadeFuturo,
MercadoriasEmArmazénsRestosEFuturo.QuantidadeEntrada,
ProdutosEm ArmazénsRestosEFuturo.QuantidadeConsumo,
ProdutosEmArmazénsRestosEFuturo.QuantidadeFinalResto
DE
RegistrarAcumulações.MercadoriasEmArmazéns.RestosEFuturo COMO MercadoriasEmArmazénsRestosEFuturo

Esta solicitação permite que você obtenha rapidamente grande número dados.

Opções de mesa virtual

Um aspecto muito importante do trabalho com tabelas virtuais é o uso de parâmetros. Parâmetros de tabela virtual – parâmetros especializados para seleção e configuração.

Para tais tabelas, considera-se incorreto utilizar a seleção na construção “WHERE”. Além de a consulta ficar abaixo do ideal, é possível receber dados incorretos.

Um exemplo de uso desses parâmetros:

Registo de Acumulações de Mercadorias em Armazéns e Movimentos (& Início do Período, & Fim do Período, Mês, Movimentos e Fronteiras do Período, Nomenclatura = & Nomenclatura Obrigatória)

Algoritmo para tabelas virtuais

Por exemplo, a tabela virtual mais utilizada do tipo “Restos” armazena dados de duas tabelas físicas – saldos e movimentos.

Ao utilizar uma tabela 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. “Somamos” o valor da tabela de movimentos ao valor da tabela de totais.


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

Usando o Construtor de Consultas

Construtor de consultas– uma ferramenta integrada ao sistema 1C Enterprise que facilita muito o desenvolvimento de consultas de banco de dados.

O construtor de consultas possui uma interface bastante simples e intuitiva. No entanto, vamos examinar mais detalhadamente o uso do construtor de consulta.

O construtor do texto de consulta é iniciado a partir do menu de contexto (botão direito do mouse) no local desejado no código do programa.

Descrição do construtor de solicitação 1C

Vejamos cada guia do designer com mais detalhes. A exceção é a aba Builder, que é tema para outra discussão.

Guia Tabelas e Campos

Esta guia especifica a fonte de dados e os campos que precisam ser exibidos no relatório. Em essência, as construções SELECT.. FROM são descritas aqui.

A fonte pode ser uma tabela de banco de dados física, uma 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:

Guia Conexões

A aba é utilizada para descrever conexões de diversas tabelas e criar construções com a palavra CONNECTION.

Guia 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.

Guia Condições

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

Guia Avançado

Guia Adicionalmente repleto de todos os tipos de parâmetros que são muito importantes. Vejamos cada uma das propriedades.

Agrupamento Selecionando registros:

  • Primeiro N– um parâmetro que retorna apenas N registros para a consulta (o operador FIRST)
  • Sem duplicatas– garante a unicidade dos registros recebidos (operador DIFERENTE)
  • Permitido– permite selecionar apenas os registros que o sistema permite selecionar levando em consideração (construção PERMITIDA)

Agrupamento Tipo de solicitação determina que tipo de consulta será: recuperação de dados, criação de uma tabela temporária ou destruição de uma tabela temporária.

Abaixo há uma bandeira Bloqueie os dados recebidos para modificação posterior. Permite ativar a possibilidade de definir o bloqueio de dados, o que garante a segurança dos dados desde o momento da sua leitura até à sua alteração (relevante apenas para Modo automático intertravamentos, design PARA MUDAR).

Guia Junções/Aliases

Nesta guia do designer de consulta, você pode definir a capacidade de unir diferentes tabelas e aliases (a construção HOW). As tabelas estão indicadas no lado esquerdo. Se você definir os sinalizadores opostos à tabela, a construção UNITE será usada, caso contrário - UNITE ALL (diferenças entre os dois métodos). No lado direito é indicada a correspondência dos campos nas diferentes tabelas; caso a correspondência não seja especificada, a consulta retornará NULL;

Guia Pedido

Especifica a ordem em que os valores são classificados (ORDER BY) - decrescente (DESC) ou crescente (ASC).

Há também uma bandeira interessante - Pedido automático(no pedido - PEDIDO AUTOMÁTICO). Por padrão, o sistema 1C exibe os dados em uma ordem “caótica”. Se você definir esse sinalizador, o sistema classificará os dados por dados internos.

Guia Lote de Consultas

Na aba do designer de consultas, você pode criar novas, e também utilizá-las como navegação. No texto da solicitação, os pacotes são separados pelo símbolo “;” (vírgula).

Botão “Consulta” no designer de consultas

No canto inferior esquerdo do designer de solicitações há um botão Solicitar, com o qual você pode visualizar o texto da solicitação 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 simples 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 download do Query Console.

Vamos dar uma olhada mais de perto nesta ferramenta.

Baixe o console de consulta 1C

Primeiro de tudo, para começar a trabalhar com o console de consulta, você precisa baixá-lo de algum lugar. Os tratamentos são geralmente divididos em dois tipos - formulários controlados e regular (ou às vezes chamado de 8.1 e 8.2/8.3).

Tentei combinar esses dois tipos em um tratamento - em modo desejado operação, o formulário desejado é aberto (no modo gerenciado, o console só funciona no modo grosso).

Descrição do console de consulta 1C

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

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 designs em termos de desempenho.

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

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

  • Executarsolicitar– execução e resultados simples
  • Executar pacote– permite visualizar todas as consultas intermediárias em um lote de consultas
  • Visualizando tabelas temporárias– permite que você veja os resultados que as consultas temporárias retornam em uma tabela

Parâmetros de solicitação:

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

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

  • Botão Obter da solicitação encontra automaticamente todos os parâmetros da solicitação para conveniência do desenvolvedor.
  • Bandeira Parâmetros comuns para todas as solicitações– quando instalado, seu processamento não limpa os parâmetros ao passar de solicitação em solicitação na lista geral de solicitações.

Defina um parâmetro com uma lista de valoresÉ muito simples, basta ao escolher um valor de parâmetro, clicar no botão limpar valor (cruz), o sistema solicitará que você selecione o tipo de dado, onde você precisa selecionar “Lista de Valores”:

Também no painel superior há um botão para acessar as configurações do console de consulta:

Aqui você pode especificar parâmetros para consultas de salvamento automático e parâmetros de execução de consultas.

O texto da solicitação é inserido no campo de solicitação do console. Isso pode ser feito simplesmente digitando um teste de consulta ou chamando uma ferramenta especial - o designer de consulta.

O construtor de solicitação 1C 8 é chamado de menu de contexto(botão direito do mouse) ao clicar no campo de entrada:

Este menu também possui funções úteis como limpar ou adicionar quebras de linha (“|”) à solicitação ou receber o código da solicitação neste formato conveniente:

Solicitação = Nova Solicitação;
Solicitação.Text = ”
|SELECIONE
| Moedas.Link
|DE
| Diretório.Moedas AS Moedas”;
RequestResult = Request.Execute();

O campo inferior do console de consulta exibe o campo de resultado da consulta, por isso este processamento foi criado:



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

Otimização de consulta

Um dos pontos mais importantes para aumentar a produtividade da empresa 1C 8.3 é otimizaçãosolicitações. Este ponto também é muito importante quando passando na certificação. Abaixo falaremos sobre motivos típicos para não desempenho ideal consultas e métodos de otimização.

Seleções em uma tabela virtual usando a construção WHERE

É necessário aplicar filtros nos detalhes da tabela virtual somente através dos parâmetros do VT. Sob nenhuma circunstância você deve usar a construção WHERE para seleção em uma tabela virtual; isso é um erro grave do ponto de vista da otimização; No caso de seleção através de WHERE, de fato, o sistema receberá TODOS os registros e só então selecionará os necessários.

CERTO:

ESCOLHER

DE
Cadastro de Acumulações. Liquidações Mútuas com Participantes de Organizações (.
,
Organização = &Organização
E Individual = &Individual) COMO Liquidações mútuas com participantes de organizações Saldos

ERRADO:

ESCOLHER
Liquidações mútuas com participantes de saldos de organizações.
DE
Cadastro de Acumulações com Participantes de Organizações (,) COMO Liquidações Mútuas com Participantes de Organizações.
ONDE
Liquidações mútuas com participantes de saldos de organizações Organização = & Organização.
E Liquidações Mútuas com Participantes de Saldos de Organizações Individual = &Individual.

Obtendo o valor de um campo de tipo complexo usando um ponto

Ao receber dados de tipo complexo em uma consulta através de um ponto, o sistema conecta com left join exatamente tantas tabelas quantos forem os tipos possíveis no campo do tipo complexo.

Por exemplo, é altamente indesejável para otimização acessar o campo de registro de registro – registrador. O registrador possui um tipo de dados composto, entre os quais estão todos os tipos de documentos possíveis que podem gravar dados no registrador.

ERRADO:

ESCOLHER
Conjunto de registros.Recorder.Date,
RecordSet.Quantidade
DE
RegisterAccumulations.ProductsOrganizations AS SetRecords

Ou seja, de fato, tal consulta acessará não uma tabela, mas 22 tabelas de banco de dados (este registro possui 21 tipos de registradores).

CERTO:

ESCOLHER
ESCOLHA
QUANDO ProdutosOrg.Registrar LINK Documento.Vendas de Produtos e Serviços
ENTÃO EXPRESSA(ProdutosOrganização.Registrar Documento AS.Vendas de MercadoriasServiços).Data
QUANDO GoodsOrg.Registrar LINK Documento.Recebimento de MercadoriasServiços
ENTÃO EXPRESSA(GoodsOrg.Registrar AS Document.Receipt of GoodsServices).Data
TERMINA COMO DATA,
ProdutosOrg.Quantidade
DE
RegistrarAcumulações.ProdutosOrganizações AS ProdutosOrganização

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

CERTO:

ESCOLHER
ProdutosOrganizações.Data,
ProdutosOrganizações.Quantidade
DE
Registro de Acumulações de Bens de Organizações COMO Bens 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 retarda significativamente a consulta. É aconselhável usar VT nesses casos. Para se conectar, é necessário utilizar apenas metadados e objetos VT, previamente indexados por campos de conexão.

ERRADO:

ESCOLHER …

JUNTE-SE À ESQUERDA (
SELECIONE EM RegisterInformation.Limits
ONDE …
GRUPO POR...
) POR …

CERTO:

ESCOLHER …
Limites PUT
DE Informações Registrar.Limites
ONDE …
GRUPO POR...
ÍNDICE POR...;

ESCOLHER …
DO Documento de Vendas de Bens e Serviços
Limites de LEFT JOIN
POR …;

Unindo Registros com Tabelas Virtuais

Existem situações em que, ao conectar uma mesa virtual a outras, o sistema não funciona de forma otimizada. Neste caso, para otimizar o desempenho da consulta, pode-se tentar colocar a tabela virtual em uma temporária, não esquecendo de indexar os campos unidos na consulta da tabela temporária. Isso se deve ao fato de que os VTs geralmente estão contidos em várias tabelas físicas do SGBD, como resultado, uma subconsulta é compilada para selecioná-los e o problema acaba sendo semelhante ao ponto anterior;

Usando seleções baseadas 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 uma consulta de maneira ideal se a consulta incluir seleção em campos não indexáveis. Se você usar uma tabela temporária, também precisará indexar os campos de conexão.

Deve haver um índice adequado para cada condição. Um índice adequado é aquele que satisfaz os seguintes requisitos:

  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 são consecutivas, ou seja, valores que não estão envolvidos na condição de consulta não ficam “entalados” entre eles.

Se o SGBD não selecionar 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 abordou os aspectos básicos da otimização de consultas que todo especialista 1C deveria conhecer.

Um curso em vídeo gratuito muito útil sobre desenvolvimento e otimização de consultas, Eu recomendo fortemente para iniciantes e muito mais!