1s verificando se a data está vazia. Converter para a data

Muitas vezes há necessidade de trabalhar com variáveis ​​do tipo “Data”. Neste artigo veremos as técnicas básicas - passar a data atual, verificar um valor vazio, uma data arbitrária.

Ao escrever consultas, muitas vezes você precisa comparar os dados com a data atual. A linguagem 1C integrada possui a função CurrentDate(). Ele permite que você determine a hora e a data atuais em seu computador. Para realizar operações com a data atual, você deve passar o valor desta função como parâmetro para a requisição.

Abaixo segue uma consulta que seleciona todos os arquivos anexados aos relatórios de despesas com data de criação até o momento:

ExemploRequest = Nova Solicitação;
Exemplo de solicitação.Text = "
|SELECIONE
| AdvanceReportAttachedFiles.Link
|DE
| Directory.AdvanceReportAttachedFilesAS AdvanceReportAttachedFiles
|ONDE
| AdvanceReportAttachedFiles.Date< &ТекДата»;
Exemplo Request.SetParameter("CurrentDate", CurrentDate());

Data personalizada

A função discutida acima permite comparar e, portanto, fazer uma seleção para qualquer período. Este método permite especificar uma seleção estrita na solicitação sem usar parâmetros adicionais.

Observe que ao usar esta função no exemplo acima, passamos apenas três números (ano, mês, dia) como parâmetros de entrada. Os três últimos (hora, minuto, segundo) são opcionais e, caso ausentes, são substituídos por “0”, ou seja, o início do dia.

Este exemplo recuperará todos os arquivos anexados aos relatórios de despesas até o final do ano passado de 2016. Neste sentido, indicaremos a hora, minuto e segundo para comparar o momento “31 de dezembro de 2016 23:59:59”.

ESCOLHER
AdvanceReportAttachedFiles.Link
DE
Directory.AdvanceReportAttachedFiles AS AdvanceReportAttachedFiles
ONDE
AdvanceReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Data em branco

A maneira mais fácil de verificar uma variável para ver se ela contém uma data vazia é usar uma comparação simples. Neste exemplo, por meio de uma consulta, selecionaremos todos os recebimentos de caixa da conta cuja data de entrada não foi preenchida.

Ao trabalhar com datas 1C, a ordem típica das partes da data é ano, mês, dia, hora, minutos, segundos. Neste caso, horas, minutos, segundos podem ser ignorados.

Ao criar uma data a partir de uma string (“cast to date”), você pode especificá-la em um formato localizado (dia.mês.ano horas:minutos:segundos), mas apenas por completo.

Por exemplo:
//Trabalhando com datas 1C - converta uma data em 1C a partir de partes - ano, mês, dia (mais hora opcional)
Data = Data(2012,10,30); //sem tempo
Data = Data(2012,10,30,12,00,00); //com tempo

//Trabalhando com datas 1C - converta uma data em 1C a partir de uma string, métodos diferentes
Data = Data("20121030"); //ano mês dia
Data = Data("30/10/2012 12:00:00"); //formato localizado, apenas na íntegra

//Trabalhando com datas 1C - especificando o valor da data sem conversão, diretamente
Data = "20121030"; //sem tempo
Data = "20121030120000"; //com tempo

Trabalhando com datas 1C - Data em branco 1C

Para verificar se a data 1C está completa, ela é comparada com a “data vazia”. Caso exista um atributo com o tipo data no livro de referência/documento, caso o usuário não preencha este campo, então seu valor também será “data vazia”.

“Data vazia” é 01/01/0001 00:00:00.

Por exemplo:
DataVazia = "00010101000000";
Se DataObrigatória = "00010101000000" Então
Report("Você não preencheu uma data muito necessária");
fim se;

Trabalhando com datas 1C - Data em detalhes (diretórios, documentos, etc.)

Ao especificar o tipo de atributo, você pode especificar o uso:

  • Apenas a data (a hora é sempre 00:00:00)
  • Apenas hora (a data é sempre 01/01/0001)
  • Data e hora

Obtendo a data

Para obter a data e hora, use a função 1C CurrentDate().

O local onde esta função é chamada é muito importante - no cliente ou no servidor. Para mais informações, consulte o tópico “Modo Performance/Desempenho”. Muitas vezes acontece que o horário nas máquinas clientes é um pouco diferente, então eles tentam usar o horário do servidor em todos os lugares - mesmo que esteja configurado incorretamente no servidor, pelo menos todos os clientes terão o mesmo horário incorreto.

Para obter a data do servidor (data definida no sistema operacional do computador servidor), normalmente é criado um módulo comum na configuração com a caixa de seleção “Servidor” marcada nas propriedades, e nele é criada uma função
//a função está localizada em um módulo comum, por exemplo com o nome Server Functions
//nas propriedades do módulo comum o checkbox “Servidor” está marcado e o checkbox “Cliente” não está marcado
Função GetServerDate() Exportar
Return DataAtual();
Função Final

//chamar esta função para uso de outro módulo é assim
DocumentObject.Date = ServerFunctions.GetServerDate(); //ModuleName.FunctionName()

Também no thin client, diretamente ao lado das funções do módulo, é indicado onde ele será executado:

Início e fim do dia

Para a data “30/10/2012”:

  • a data de início do dia é assim “30/10/2012 00:00:00”
  • a data de final do dia é assim: “30/10/2012 23:59:59”

Utilizado em relatórios e consultas que necessitam de obtenção de dados de um período – dia, mês, ano.

Por exemplo, o período de “01/01/2012 00:00:00” a “31/01/2012 00:00:00” está incorreto porque não inclui um dia do mês (mas inclui um segundo de último dia do mês).

Trabalhando com datas 1C - Comparando datas

Data contém a data e a hora. Ao comparar datas (sem levar em conta o tempo), elas geralmente são reduzidas ao início do dia (mês, ano).

Por exemplo:
Data1 = Data("30/10/2012 12:00:00");
Se StartDay(Date1) = StartDay(DocumentLink.Date) Então
Notify("O documento foi inserido na data especificada");
fim se;

Por precaução, um exemplo de comparação de datas em um período:
Se DocumentLink.Date >= Início do Mês(CurrentDate()) e
DocumentLink.Data

Trabalhando com datas 1C - Alterando a data

A data é o número de segundos. Se quisermos não apenas descobrir se uma data é maior que outra, mas também quanto maior, obteremos a diferença em segundos.

Por exemplo:
FromBeginning Of Day = CurrentDate() – Início do dia(CurrentDate());
Report("Desde o início do dia " + Linha(Desde o início do dia) + " segundos se passaram");
Report("Desde o início do dia " + Linha(Desde o início do dia/60) + "minutos se passaram");
Report("Desde o início do dia " + Linha(Desde o início do dia/60/60) + "horas se passaram");

Também podemos alterar a data; ao alterar, adicionamos ou subtraímos o número de segundos:
StartThisDay = StartDay(CurrentDate());

Início do Dia Anterior = Início do Dia (Início deste Dia – 1); //remover o segundo - fazendo “ontem” e tirar o início do dia de “ontem”

Início do Dia Anterior = Início deste Dia – 24*60*60; //outro método - subtrair 24 horas - 24 (horas) * 60 (minutos) * 60 (segundos)

Trabalhando com datas 1C - Momento no tempo

Um ponto no tempo é uma representação estendida de uma data que se aplica aos documentos (e, portanto, aos registros).

É necessário comparar a hora dos documentos se a data e a hora dos documentos forem iguais. Assim, pode ser usado para seleção em consultas.

Um ponto no tempo pode ser obtido de um documento das seguintes maneiras:
//Método 1
DocumentTimePoint = DocumentLink.TimeTime();

Você também pode comparar um momento com uma data/hora:
TimePointReference = New TimePoint(Início do Dia(CurrentDate()));
Se DocumentRef.TimePoint().Compare(TimeTimeReference) = -1 Então
Notify("O documento foi inserido antes de hoje");
fim se;
//Se um documento for inserido com a data de hoje às 00:00:00, ele ainda será inserido - hoje

Trabalhando com datas 1C - Formatação de data

Ferramentas para identificar links, datas ou strings vazios. Vejamos como verificar um link, data ou linha vazia em uma solicitação 1C.

Você pode definir dados nulos usando operadores especiais.

As informações do banco de dados 1C são solicitadas (e depois recebidas) usando uma ferramenta como a linguagem de consulta (Query). Eles são escritos em latim e cirílico. E uma das palavras-chave dos comandos (operadores) ao receber informações é a palavra de comando SELECT (inglês) em combinação com algumas construções. Aqui estão exemplos de construção de tarefas solicitadas que nos interessam no tema:

Verificando conteúdo NULL

Esta tarefa é executada pelo operador SELECT em combinação com a construção “IS NULL”:

SELECIONAR
PedidosRemains.Cliente,
Pedidos restantes. Quantidade restante
DE
RegisterAccumulations.Orders.Remains AS OrdersRemains
ONDE
OrdersRemaining.QuantityRemaining É NULO

Controle de data

Uma data vazia em uma solicitação 1C é inserida usando a construção “DATETIME(1, 1, 1, 0, 0, 0)”:

SELECIONAR
FaturaIncomingSupplier.Link,
Fornecedor de entrada da fatura. Data de chegada.
DE
Documento. Fatura do fornecedor como fatura do fornecedor
ONDE
FaturaIncomingSupplier.IncomingDate = DATETIME(1, 1, 1, 0, 0, 0)

Verificação de referência

Valores intra-referência inexistentes (para planos de contas, diretórios, etc.) são verificados usando a construção “VALUE(Directory.Name…EmptyLink)”:

Verificação de string

Linhas vazias são detectadas usando um espaço entre aspas "":

SELECIONAR
Compradores.Link
DE
Diretório de compradores como compradores
ONDE
Compradores.Code = ""

Mais sobre links quebrados e regulares

Um “morcego” é um link que leva (aponta) para um elemento inexistente. Por inexistente queremos dizer aquele que não está no banco de dados. É útil conhecer esses links, pelo menos para receber notificações do sistema de uma forma mais compreensível. E gravar, excluir e abrir objetos irreais não faz sentido.

As plataformas 1C não possuem meios internos para interrompê-las. Você também precisa entender que fora dos “quebrados”, existem “links vazios” especiais no sistema, que devem ser diferenciados uns dos outros.
Isso pode ser encontrado sem consultar o banco de dados:

No sistema 1C-7.7

Para o “bit”, o método Link.Selected() e a função EmptyValue() retornam zero. Para “vazio” - no primeiro caso é zero e no segundo caso é um. Para “normal” - um e zero. Acontece que em 1C-7.7 “quebrado” não é um valor inexistente que não seja considerado selecionado.

No sistema 1C-8.x

Tudo é diferente - em ambos os casos (para “quebrado” e “normal”) o método retorna False e a função retorna True. A solução é esta: Para o método “quebrado”, o método Link.GetObject() retorna a função “Indefinida”. Para “vazio” - “Erro de método de contexto” é lançado. Para “normal” – o valor é retornado conforme documentação; Acontece que em 1C-8.x o “quebrado” não será uma função inexistente de um tipo de referência que retorna um valor de objeto Indefinido.

De onde eles vêm

Ao navegar para um endereço inexistente de um link quebrado, o usuário recebe, na melhor das hipóteses, uma notificação de que o objeto não foi encontrado, na pior das hipóteses, uma imagem da página do servidor. Sua pior característica é o sigilo. Daí a dificuldade em verificar sua exatidão. Ao trabalhar com a configuração, ela é constantemente refinada e atualizada. Alguns objetos devem ser excluídos, a estrutura muda. E a referência ao elemento excluído permanece nas estruturas e algoritmos. Assim, endereços inexistentes permanecem no sistema após a exclusão do próprio elemento (junto com o endereço).

A publicação de hoje analisou a construção de consultas especiais. Exemplos de designs são fornecidos. Isso será útil ao procurar valores vazios.

Todos os documentos existentes nas configurações 1C e, consequentemente, quase todos os registros devem ter pelo menos um atributo com o tipo Data, por isso todo desenvolvedor precisa saber e entender:

  • Como converter parâmetros de outros tipos para o tipo em questão;
  • Como determinar uma data vazia em uma solicitação 1C;
  • Qual é a diferença entre uma data e um limite de tempo?

São essas perguntas que tentaremos responder em nosso artigo.

O que é uma data e como determiná-la

Como a maioria das decisões gerenciais e a manutenção de registros não exigem precisão de tempo superior a 1 segundo, os desenvolvedores da plataforma 1C decidiram que esse valor seria o mínimo absoluto no formato de data. Assim, cada atributo que descreve o horário de um evento no programa deve conter:

  • O ano em que o evento ocorreu;
  • Mês deste evento;
  • Dia.

Não é necessário indicar: hora, minuto e segundo. Se estes três parâmetros forem omitidos e não houver condições adicionais, o programa ajusta automaticamente a hora para o início do dia.

Os formatos de data existentes no mundo apresentam diferenças significativas:

  1. Na Rússia, estamos acostumados a colocar primeiro o dia, depois o mês do evento e no final o ano;
  2. Os residentes nos EUA iniciam a data com o mês;
  3. Checos, polacos e eslovenos registam períodos no formato Ano – Mês – Dia.

É o último formato que a plataforma 1C usa.

Converter para a data

Para obter um parâmetro do tipo Data a partir de vários valores ou de uma string, deve-se utilizar o código mostrado na Fig. 1

Como pode ser visto na figura acima, você pode determinar a data usando uma linha ou dividindo esta linha em suas partes componentes usando uma vírgula, o resultado não mudará.

É importante entender que o ano da data deve conter quatro dígitos, incluindo o milênio e o século do evento, o mês, dia, horas e segundos devem ter dois caracteres, incluindo zeros à esquerda.

A contagem regressiva do programa começa no início do dia 1º de janeiro de 0001. Para o código acima, esse valor pode ser determinado de duas maneiras (Figura 2).

Arroz. 2

Na segunda linha omitimos as horas, minutos e segundos do evento, o que não afetou em nada o desempenho do nosso código.

Recursos de uso de data em consultas 1C

Para a maioria dos tipos de dados usados ​​​​pela plataforma 1C, existem valores nulos predefinidos. Para números é 0, para links você pode definir o valor EmptyLink(), para uma data o valor vazio geralmente é considerado a data de início, e é com isso que os detalhes do tipo correspondente devem ser comparados ao definir o parâmetros de solicitação.

É importante entender que mesmo que nenhum número seja especificado no valor de um atributo de formulário que possui o tipo em questão, ou seja, a janela se parece com (Fig. 3), isso não significa que nada esteja especificado nela; a comparação deste parâmetro com uma string vazia não funcionará.

Arroz. 3

Tendo recebido uma data vazia, podemos especificá-la como parâmetro da nossa solicitação, ou seja, utilizar a construção (Fig. 4)

Porém, há momentos em que é melhor verificar dentro do corpo da solicitação, sem passar uma data vazia como parâmetro. Para fazer isso, você pode inserir a condição apropriada no código de solicitação (Fig. 5) e usar a função de solicitação DateTime().

Arroz. 5

No texto da solicitação acima, omitimos os zeros iniciais do ano, mês e dia, e também não indicamos as horas, minutos e segundos, e o programa, como dizem, engoliu essa suposição.

Limite de data e hora

Outro fato interessante a respeito da relação entre consultas e datas é a utilização do conceito de “ponto no tempo” no acesso a diversas tabelas do banco de dados.

A precisão de “até um milissegundo” especificada na documentação técnica ao descrever o tipo primitivo Data se manifesta mais claramente ao selecionar registros das tabelas virtuais do registrador de acumulação: se o registrador de acumulação, além da tabela Turnover, tiver o Remaining e tabelas de Restantes e Rotatividade, então a amostragem delas é realizada por um determinado tempo , pode dar resultados diferentes.

Para entender como e por que isso acontece, considere um exemplo simples:

  1. Antes do documento de venda ser realizado às 12 horas 31 minutos 36 segundos, os saldos segundo a nomenclatura Açúcar eram de 30 kg;
  2. O documento deu baixa em 10 kg no horário especificado;
  3. O relatório gerado na data do documento às 12 horas 31 minutos 36 segundos conforme tabela Remaining mostrará o saldo de 30 kg;
  4. O mesmo relatório da tabela Restos e Faturamentos para o mesmo período mostrará um saldo de 20 kg.

Qual o motivo desse comportamento e como evitá-lo?

O problema é que na tabela Remaining o período é especificado como segmento aberto, ou seja, não são considerados os movimentos realizados no momento da geração do relatório, ou seja, o tempo é considerado no início do segundo especificado no parâmetro. Ao mesmo tempo, para a tabela de Giros e para a tabela de Restos e Giros, são levados em consideração os limites de tempo, ou seja, o tempo é considerado ao final do segundo especificado.

Existem várias maneiras de sair desta situação:

  1. Ao usar a tabela Remains, indique um ponto no tempo 1 segundo maior que o especificado;
  2. Utilizar apenas a tabela de Restos e Volumes de Negócios (não é a opção mais óptima do ponto de vista do desempenho);
  3. Use o conceito de limite.

A última opção pode ser representada pelo código mostrado na Fig. 6.

No primeiro parâmetro do nosso objeto indicamos a data para a qual o relatório deve ser gerado, o segundo parâmetro determina o tipo de borda. Como é importante para nós que os movimentos de uma determinada data sejam incluídos na seleção, devemos colocar este parâmetro na posição “Incluindo”.

Muitas vezes, em consultas 1C, você precisa trabalhar com datas. Principalmente quando a solicitação é feita a objetos de metadados que contêm informações periódicas. Via de regra, são registros (informação, acumulação, cálculo, contabilidade). Vejamos as funções mais comumente usadas da linguagem de consulta 1C para trabalhar com datas. Construiremos exemplos com base no cadastro de informações FuncionáriosOrganizações Configurações ZUP versão 2.5.

  • DATA HORA

    Permite obter uma data em uma solicitação (com ou sem hora) especificando ano, mês, dia, hora, minuto, segundo.
    Sintaxe:
    DATETIME(Ano, Mês, Dia, Hora, Minuto, Segundo)
    Normalmente a hora, minuto e segundo não são indicados. Vamos dar um mini exemplo. Insira o seguinte texto no Console de Consultas:

    SELECIONE DATA HORA (2016, 1, 1)

    Como resultado da execução da solicitação, obtemos a data - 01/01/2016
    Na verdade, é difícil imaginar uma situação em que a data fosse indicada desta forma num pedido. Afinal, quando é necessário especificar um período, são utilizados parâmetros. Mas há um caso em que esta função tem um valor particular. É quando precisamos indicar uma data vazia nos campos ou nas condições da solicitação. Deixe-me lembrá-lo de que para a linguagem 1C, uma data vazia tem o formato - 0001.01.01. Assim, para obter uma data vazia em uma solicitação, basta especificar DATAHORA(1, 1, 1). Como exemplo, vamos selecionar no registro de informações FuncionáriosOrganizações registros que não são preenchidos Período de conclusão:

    SELECIONE Funcionários Organizacionais.Período, Funcionários Organizacionais.Funcionário, Funcionários Organizacionais.Posição, Funcionários Organizacionais.Divisão da Organização FROM Informações de Registro.Funcionários Organizacionais AS Funcionários Organizacionais WHERE Funcionários Organizacionais.Período de Conclusão = DATETIME(1, 1, 1)

  • INÍCIO DO PERÍODO

    Para a data especificada, retorna o início do período ao qual pertence.
    Sintaxe:
    INÍCIO DO PERÍODO (Data, Tipo de Período)
    PeriodType pode assumir os seguintes valores: MINUTO, HORA, DIA, SEMANA, MÊS, TRIMESTRE, ANO, DÉCADA, SEMESTRE
    No Console de consultas, insira:

    SELECIONE INÍCIO DO PERÍODO (DATA HORA (2016, 1, 15), MÊS)

    A solicitação retornará - 01/01/2016
    E agora um exemplo. Como você sabe, a periodicidade do cadastro FuncionáriosOrganizações um dia. Vamos criar uma consulta na qual será exibida a data de início do mês em vez do período de registro real.

    SELECIONE INÍCIO DO PERÍODO (Funcionários de Organizações.Período, MÊS) COMO Início do Mês, Funcionários de Organizações.Funcionário, Funcionários de Organizações.Posição, Funcionários de Organizações.Divisão de Organização A PARTIR DE Informações de Registro.Funcionários de Organizações COMO Funcionários de Organizações

  • FIM DO PERÍODO

    A sintaxe é a mesma do início do período. E como o nome indica, retorna o final do período por data e tipo de período. Não consideraremos isso em detalhes. Vamos nos limitar a um mini exemplo.
    Solicitar:

    SELECIONE FIM DO PERÍODO(DATETIME(2016, 1, 15), MÊS)

    Retorna 31/01/2016 23:59:59
    Como você pode ver, o valor é retornado com precisão de segundo.

  • ADICIONAR DATA

    Adiciona o número especificado de intervalos de tempo à data.
    Sintaxe:
    ADDKDATE(Data, TipoPeríodo, Quantidade)
    PeriodType assume os mesmos valores da função INÍCIO DO PERÍODO
    Por exemplo, vamos escolher a data de fevereiro:

    SELECIONE ADDKDATE(DATETIME(2016, 2, 15), MÊS, 2)

    Obtemos a data 15/04/2016 0:00:00 Apesar de fevereiro ser um mês curto, o dia da data de recebimento é igual ao original. É muito conveniente que você não precise pensar no número de dias dos meses.
    A quantidade também pode ser negativa. Então o intervalo é contado na direção oposta.

  • DATA DIFERENÇA

    Calcule a diferença entre duas datas nas unidades de medida especificadas.
    Sintaxe:
    DIFERENÇA DE DATA (data de início, data de término, tipo de período)
    O tipo de período pode assumir os seguintes valores: SEGUNDO, MINUTO, HORA, DIA, MÊS, TRIMESTRE, ANO
    Por exemplo:

    SELECIONE DATADIFERENÇA(DATETIME(2016, 2, 15), DATETIME(2016, 3, 1), DIA)

    retorna 15

Aqui revisamos as funções mais usadas da linguagem de consulta 1C. O resto raramente é usado. Se necessário, exemplos de como trabalhar com eles podem ser encontrados na ajuda integrada à plataforma 1C.