Exibe incorretamente os saldos no armazenamento. Cálculo incorreto de saldos ao utilizar sistema de controle de acesso. Você tem alguma dúvida ou precisa da ajuda de um consultor?

Outro erro comum na criação de relatórios sobre sistemas de controle de acesso para empresas 1C é que os saldos inicial e final nas tabelas virtuais de registros de acumulação são calculados incorretamente. Por exemplo, vamos criar um relatório simples que mostrará saldos e movimentos no cadastro GoodsInWarehouses. Seu pedido ficará assim:

Também criaremos configurações simples opção:

Como resultado, obtemos o seguinte relatório:

Você tem alguma dúvida ou precisa da ajuda de um consultor?

Porque Não indicamos o início e o final do período em nenhum lugar do relatório que deveria mostrar os dados desde o início da manutenção do banco de dados. Mas em nossos armazéns e agrupamentos de itens há saldos iniciais diferentes de zero. É fácil entender que os dados são exibidos incorretamente, porque... Não deve haver saldos no início da manutenção do banco de dados. Embora a solicitação em si esteja correta.

O fato é que o ACS possui mecanismo próprio de cálculo de saldos. Para ele operação corretaé necessário determinar inequivocamente a localização dos gravadores no eixo do tempo. Neste caso, apenas o link está presente na seleção, portanto o sistema de layout não pode fazer isso. Para evitar esse comportamento do sistema de controle de acesso, deve-se selecionar o campo PeriodSecond na solicitação. Neste caso, o sistema calculará corretamente os saldos:

Lembre-se de que os campos com a função “Período” possuem uma caixa de seleção “Adicional”. E se por algum motivo for removido do campo PeriodSecond, o relatório retornará para opção incorreta. Para calcular corretamente os saldos, é necessário marcar a caixa de seleção "Adicional" na função ou a presença do campo nos campos do relatório selecionados no nível da variante.

Não sei quantas pessoas já se depararam com o erro de calcular saldos iniciais e finais por agrupamentos. Pessoalmente, tive “sorte”, mais de uma vez. A razão, como pude descobrir, está nas configurações de campo incorretas Dados ACS, cuja importância muitos programadores novatos (e não tão novatos) ainda não estão totalmente conscientes.

Quando um conjunto de dados ACS é criado automaticamente com base em uma consulta, geralmente não surgem problemas, porque a própria plataforma preenche corretamente as configurações dos campos com base no texto da solicitação. Mas há situações em que as configurações do campo de dados não são preenchidas automaticamente (por exemplo, você está usando uma fonte de dados externa) e os dados iniciais contêm movimentos com saldos e giros.

Se você ainda não encontrou esse problema, para entender melhor sua essência, sugiro reproduzi-lo você mesmo usando um relatório universal (baseado em metadados). Lançamos o relatório, selecionamos qualquer registro de acumulação não vazio com saldos e giros, habilitamos a caixa de seleção “Registros detalhados” nas configurações do relatório (), indicamos alguns agrupamentos e adicionamos o Registrador aos campos de saída. Voila - os saldos iniciais e finais são somados para cada agrupamento. O resultado é um relatório com números absolutamente incorretos, que não podem ser mostrados aos usuários.

Para resolver este problema, é necessário preencher corretamente as configurações dos campos do conjunto de dados ACS - em particular, o campo “Role”, que é de fundamental importância.

SOLUÇÃO interativa ( não é adequado para relatório universal):

Abra o diagrama de layout de dados do seu relatório e observe as configurações de campo do conjunto de dados.

Para os campos de saldos iniciais e finais de cada recurso, deve-se preencher a função: selecione o grupo de funções “Remanescente” e nele especifique o valor “Saldo inicial” ou “Saldo final”, respectivamente. Então ( ) isso é feito no construtor ACS.

Da mesma forma, você precisa atribuir a função "Dimensão" a todas as dimensões do seu conjunto de dados.

Mas isso não é suficiente para que os relatórios funcionem corretamente. Para calcular corretamente os campos residuais, é necessário conhecer o período de cada movimento para colocá-los na ordem cronológica correta. Se a sua fonte de dados original não tiver um campo de período, você precisará adicioná-lo. Se o campo período já existir no conjunto de dados, ele deverá ser especificado com a função “Período” e o número do período correspondente (você pode ler mais sobre numeração de períodos na ajuda).

Tais configurações dos campos de dados ACS, na maioria dos casos, permitem obter o cálculo correto dos saldos agrupando quando com configurações padrão eles são calculados incorretamente.

SOLUÇÃO DE Software (usando o exemplo do Relatório Universal de Metadados):

Agora vamos ver como corrigir o mesmo erro no Relatório de metadados universais. O relatório universal difere da maioria dos outros relatórios porque o esquema de layout de dados é gerado inteiramente de forma programática, portanto, você também precisa configurar funções para campos de dados ACS de forma programática.

Para funções saldos inicial e final para cada recurso A maneira mais fácil é não reinventar a roda (tudo já foi escrito antes de nós) e usar o procedimento padrão Preencha DataSetFieldRemainder() de módulo comum Relatórios típicos. Lá você passa o campo do conjunto de dados e o nome do recurso como parâmetros e, como resultado, um campo restante com uma função preenchida corretamente é criado no conjunto de dados.

Da mesma forma, ao criar campos de conjunto de dados para dimensões, você deve atribuir a eles a função Dimensão. O código será algo assim:

NewDimension = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, Dimension.Name, Dimension.Synonym); NewDimension.Role.Dimension = Verdadeiro;

As manipulações com campos de recursos e dimensões descritas acima são necessárias, mas não suficientes para resolver o problema - o principal problema do relatório universal é a falta de numeração de períodos. Os campos de período estão presentes no conjunto de dados, mas suas funções não são preenchidas.

Os campos de período são adicionados ao relatório pelo procedimento do módulo geral StandardReports.AddPeriodFieldsToDataSet(), que é chamado a partir do procedimento do módulo objeto AddDataSetFields(). Infelizmente, este procedimento não atribui números de período.

Além disso, os campos “Número da linha” e “Registrador” não são adicionados programaticamente em nenhum lugar do relatório. Me pareceu estranho, porque... eles estão presentes no conjunto de dados final.

Como se viu, campos "Número da linha" e "Registrador"(Gravador) é adicionado pela própria plataforma automaticamente quando o construtor de configurações é inicializado. Além disso, a plataforma não preenche as funções dos campos que cria e não é possível preenchê-las de forma programática, o que cria problemas no trabalho posterior com eles. Mas se você criar esses campos “manualmente” e atribuir programaticamente as funções corretas a eles, a plataforma não tentará mais criá-los novamente.

Abaixo apresento uma receita que me ajudou a resolver quase completamente esse problema da plataforma e do Relatório Universal de Metadados:

Aqui está este trecho de código do módulo de objeto:

// Adicionar campos de período If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); fimSe; precisa ser substituído pelo seguinte: // Adicionar campos de período If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then PeriodList = TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); //Preencha os campos de serviço e insira os períodos manualmente, pois a plataforma não preenche Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "RowNumber", "RowNumber"); Field.Role.PeriodNumber = 1; Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "Registrador", "Registrador"); Field.Role.PeriodNumber = 2; сч = 3; Para cada FieldPeriod da lista de períodos Ciclo FieldPeriod.Value.Role.PeriodNumber = count; Se contagem > 3 Então FieldPeriod.Value.Role.PeriodType = DataCompositionPeriodType.Additional; fimSe; sch = sch+1; Fim do Ciclo; fimSe;

Consegui encontrar uma limitação associada a esta solução. Para cálculo correto do início. e con. saldos, é necessário que, ao usar quaisquer detalhes de um documento do registrador em um relatório, o próprio registrador também seja selecionado. Caso contrário, o relatório universal após tais modificações não causa mais alergias entre os usuários.

ATUALIZAÇÃO: Disseram-me nos comentários que uma vez um artigo sobre este tópico foi publicado no disco ITS. Infelizmente, este artigo passou despercebido, mas só pôde me ajudar parcialmente na solução de problemas com o relatório universal. Infelizmente, os problemas da plataforma com campos de serviço ACS, como "Recorder", também não são descritos lá.

De qualquer forma, espero que meu artigo ajude todos aqueles que têm problemas semelhantes. Passei muito tempo procurando essa solução...

Não sei quantas pessoas já se depararam com o erro de calcular saldos iniciais e finais por agrupamentos. Pessoalmente, tive “sorte”, mais de uma vez. A razão, como pude descobrir, está nas configurações incorretas dos campos de dados ACS, cuja importância muitos programadores novatos (e não tão novatos) ainda não estão totalmente conscientes.

Quando um conjunto de dados ACS é criado automaticamente com base em uma consulta, geralmente não surgem problemas, porque a própria plataforma preenche corretamente as configurações dos campos com base no texto da solicitação. Mas há situações em que as configurações do campo de dados não são preenchidas automaticamente (por exemplo, você está usando uma fonte de dados externa) e os dados iniciais contêm movimentos com saldos e giros.

Se você ainda não encontrou esse problema, para entender melhor sua essência, sugiro reproduzi-lo você mesmo usando um relatório universal (baseado em metadados). Lançamos o relatório, selecionamos qualquer registro de acumulação não vazio com saldos e giros, habilitamos a caixa de seleção “Registros detalhados” nas configurações do relatório (), indicamos alguns agrupamentos e adicionamos o Registrador aos campos de saída. Voila - os saldos iniciais e finais são somados para cada agrupamento. O resultado é um relatório com números absolutamente incorretos, que não podem ser mostrados aos usuários.

Para resolver este problema, é necessário preencher corretamente as configurações dos campos do conjunto de dados ACS - em particular, o campo “Role”, que é de fundamental importância.

SOLUÇÃO interativa ( não é adequado para relatório universal):

Abra o diagrama de layout de dados do seu relatório e observe as configurações de campo do conjunto de dados.

Para os campos de saldos iniciais e finais de cada recurso, deve-se preencher a função: selecione o grupo de funções “Remanescente” e nele especifique o valor “Saldo inicial” ou “Saldo final”, respectivamente. Então ( ) isso é feito no construtor ACS.

Da mesma forma, você precisa atribuir a função "Dimensão" a todas as dimensões do seu conjunto de dados.

Mas isso não é suficiente para que os relatórios funcionem corretamente. Para calcular corretamente os campos residuais, é necessário conhecer o período de cada movimento para colocá-los na ordem cronológica correta. Se a sua fonte de dados original não tiver um campo de período, você precisará adicioná-lo. Se o campo período já existir no conjunto de dados, ele deverá ser especificado com a função “Período” e o número do período correspondente (você pode ler mais sobre numeração de períodos na ajuda).

Tais configurações dos campos de dados ACS, na maioria dos casos, permitem obter o cálculo correto dos saldos agrupando quando com configurações padrão eles são calculados incorretamente.

SOLUÇÃO DE Software (usando o exemplo do Relatório Universal de Metadados):

Agora vamos ver como corrigir o mesmo erro no Relatório de metadados universais. O relatório universal difere da maioria dos outros relatórios porque o esquema de layout de dados é gerado inteiramente de forma programática, portanto, você também precisa configurar funções para campos de dados ACS de forma programática.

Para funções saldos inicial e final para cada recurso A maneira mais fácil é não reinventar a roda (tudo já foi escrito antes de nós) e usar o procedimento padrão Preencha DataSetFieldRemainder() de módulo geral StandardReports. Lá você passa o campo do conjunto de dados e o nome do recurso como parâmetros e, como resultado, um campo restante com uma função preenchida corretamente é criado no conjunto de dados.

Da mesma forma, ao criar campos de conjunto de dados para dimensões, você deve atribuir a eles a função Dimensão. O código será algo assim:

NewDimension = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, Dimension.Name, Dimension.Synonym); NewDimension.Role.Dimension = Verdadeiro;

As manipulações com campos de recursos e dimensões descritas acima são necessárias, mas não suficientes para resolver o problema - o principal problema do relatório universal é a falta de numeração de períodos. Os campos de período estão presentes no conjunto de dados, mas suas funções não são preenchidas.

Os campos de período são adicionados ao relatório pelo procedimento do módulo geral StandardReports.AddPeriodFieldsToDataSet(), que é chamado a partir do procedimento do módulo objeto AddDataSetFields(). Infelizmente, este procedimento não atribui números de período.

Além disso, os campos “Número da linha” e “Registrador” não são adicionados programaticamente em nenhum lugar do relatório. Me pareceu estranho, porque... eles estão presentes no conjunto de dados final.

Como se viu, campos "Número da linha" e "Registrador"(Gravador) é adicionado pela própria plataforma automaticamente quando o construtor de configurações é inicializado. Além disso, a plataforma não preenche as funções dos campos que cria e não é possível preenchê-las de forma programática, o que cria problemas no trabalho posterior com eles. Mas se você criar esses campos “manualmente” e atribuir programaticamente as funções corretas a eles, a plataforma não tentará mais criá-los novamente.

Abaixo apresento uma receita que me ajudou a resolver quase completamente esse problema da plataforma e do Relatório Universal de Metadados:

Aqui está este trecho de código do módulo de objeto:

// Adicionar campos de período If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); fimSe; precisa ser substituído pelo seguinte: // Adicionar campos de período If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then PeriodList = TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); //Preencha os campos de serviço e insira os períodos manualmente, pois a plataforma não preenche Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "RowNumber", "RowNumber"); Field.Role.PeriodNumber = 1; Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "Registrador", "Registrador"); Field.Role.PeriodNumber = 2; сч = 3; Para cada FieldPeriod da lista de períodos Ciclo FieldPeriod.Value.Role.PeriodNumber = count; Se contagem > 3 Então FieldPeriod.Value.Role.PeriodType = DataCompositionPeriodType.Additional; fimSe; sch = sch+1; Fim do Ciclo; fimSe;

Consegui encontrar uma limitação associada a esta solução. Para cálculo correto do início. e con. saldos, é necessário que, ao usar quaisquer detalhes de um documento do registrador em um relatório, o próprio registrador também seja selecionado. Caso contrário, o relatório universal após tais modificações não causa mais alergias entre os usuários.

ATUALIZAÇÃO: Disseram-me nos comentários que uma vez um artigo sobre este tópico foi publicado no disco ITS. Infelizmente, este artigo passou despercebido, mas só pôde me ajudar parcialmente na solução de problemas com o relatório universal. Infelizmente, os problemas da plataforma com campos de serviço ACS, como "Recorder", também não são descritos lá.

De qualquer forma, espero que meu artigo ajude todos aqueles que têm problemas semelhantes. Passei muito tempo procurando essa solução...

Bom dia, queridos leitores do blog! Da última vez já tocamos em um tópico que falava sobre o uso da função. E hoje, no primeiro desta série de artigos, vamos descobrir Para que são utilizadas as funções dos campos de composição de dados? e também considere exemplos de preenchimento dessas funções.

Papel Campos ACS indica o que é esse campo. Cada função de campo pode conter sua própria propriedade. Por exemplo, possui um valor numérico e contém o número do período se o campo for período. Se o valor da propriedade “Período” for 0 (zero), significa que este campo não é um ponto. Ou a propriedade “Dimension” – contém uma indicação de que o campo é uma dimensão. Se o campo for uma dimensão, essas informações serão usadas ao calcular os totais dos campos de saldo.

Para cada campo no esquema de composição de dados, você pode especificar uma função. Funções afetar a exatidão dos cálculos de saldo. Em particular, o saldo inicial e final de acordo com alguma tabela. Se a tabela virtual “Saldos e Giros” for selecionada na consulta, então os saldos inicial e final são calculados usando um algoritmo complexo, especialmente se usarmos spreads adicionais por período.

Mas se nas consultas tudo isso funciona corretamente, com base em um conjunto de campos de saída, então na composição dos dados as coisas são um pouco piores. Afinal, não sabemos quais campos o usuário realmente selecionará. Tudo vai depender das configurações da versão do seu relatório, que ele pode alterar a qualquer momento. Portanto, o sistema de composição de dados possui seu próprio mecanismo para calcular os saldos iniciais e finais para um determinado conjunto de dados, e as funções são utilizadas para isso de acordo. Vamos abri-lo e ver se você pode definir funções para cada campo.

Vamos adicionar um conjunto de dados de consulta. Para fazer isso, precisamos ativar o elemento raiz “Query Builder”. Passemos à mesa virtual “Saldos e Giros” do registro de acumulação. O que vemos?

Como você pode ver na ilustração acima, vemos que para alguns campos a função foi preenchida. Isso aconteceu porque temos o sinalizador AutoComplete definido. Mas isso nem sempre é possível, então às vezes é necessário inserir a função manualmente. Vejamos alguns exemplos.

Vamos supor que em uma consulta que utilizamos, por exemplo, utilizamos o operador de linguagem de consulta “SELECT”. Vamos descrever a seguinte condição:

SELEÇÃO QUANDO Produto RemainingRemainingsAndTurnover.Nomenclature = Value(Directory.Nomenclature.EmptyLink) THEN Value(Directory.Nomenclature.Shampoo) ELSE Produto RemainingRemainingAndTurnover.Nomenclature END

Esta entrada significa que se o item corresponder a um link vazio (nos referimos ao diretório de valores da função “Nomenclatura”, link vazio), então o valor do elemento predefinido será retornado. Vamos supor que em nossa configuração exista esse elemento predefinido e se chame “Shampoo”. Caso contrário, retornamos o valor do próprio item. Obtemos o seguinte:

Como você pode perceber, a função não foi preenchida para o campo “Nomenclatura”. Mas como você pode ver na imagem, na realidade não temos uma função inserida para o campo “Campo1”, e neste caso o restante não será calculado corretamente.

Existem outros exemplos em que a função não pode ser atribuída de forma independente. Por exemplo, este é o uso de , ou seja, uma determinada tabela de valores é fornecida como entrada, digamos, carregada de outro banco de dados, e os saldos precisam ser calculados a partir dela. Neste caso, devemos atribuir nós mesmos as funções. Veremos como isso é feito.

No final do artigo, quero recomendar um artigo gratuito de Anatoly Sotnikov. Este é um curso de um programador experiente. Ele mostrará separadamente como construir relatórios no sistema de controle de acesso. Você só precisa ouvir com atenção e lembrar! Você receberá respostas para as seguintes perguntas:
  • Como criar um relatório de lista simples?
  • Para que servem as colunas Campo, Caminho e Título na guia “Campos”?
  • Quais são as limitações para campos de layout?
  • Como configurar funções corretamente?
  • Quais são as funções dos campos de layout?
  • Onde posso encontrar a guia de composição de dados em uma consulta?
  • Como configurar parâmetros no sistema de controle de acesso?
  • Fica ainda mais interessante...
Talvez você não deva tentar navegar na Internet em busca das informações necessárias? Além disso, tudo está pronto para uso. Basta começar! Todos os detalhes sobre o que está nas videoaulas gratuitas

41
Recentemente fiz um relatório com um número indefinido de colunas. Não queria mexer no código, então resolvi fazer no sistema de controle de acesso. Não houve problema com isso, foi necessário esticar o resultado em um layout arbitrário (seu próprio cabeçalho +... 27
Mesmo que os alunos do CDS se deparem com isso no primeiro ou no segundo dia, isso deve estar na seção de perguntas frequentes. Um exemplo simples de saída programática de um relatório em um layout, usando as configurações padrão. 18
//Obter o diagrama de... 10
Nesta aba você pode especificar quais conexões são feitas entre dois ou mais conjuntos de dados, de acordo com quais parâmetros e condições..png 1. “Fonte de conexão” - indica o primeiro conjunto de dados, de... 9
O que é necessário ao desenvolver relatórios é que para um usuário com direitos limitados, o relatório seja gerado completamente sem verificação de direitos! Especialmente se o RLS estiver configurado. Existem várias maneiras de fazer isso: 1. Instalar....

Wi-fi