Como alterar unidade de medida e quantidade no XML da nota fiscal no Protheus

Você já precisou ajustar as tags de quantidade e unidade de medida diretamente no XML da nota fiscal do Protheus antes da transmissão?
Esse tipo de situação é mais comum do que parece, principalmente em empresas que trabalham com fatores de conversão específicos ou utilizam unidades diferentes das cadastradas no padrão do sistema.

Neste artigo, vamos mostrar como tratar esse cenário via ponto de entrada PE01NFESEFAZ, com um exemplo prático de código em ADVPL, que permite editar as informações dos produtos antes da geração do XML da nota.

Por que alterar a unidade e a quantidade no XML do Protheus?

Existem empresas que vendem em unidades comerciais diferentes da unidade padrão do produto.
Por exemplo: o item pode estar cadastrado com unidade principal MI (milheiro), mas o cliente prefere comprar por CX (caixa).
Se o sistema não estiver preparado para lidar com esse tipo de conversão, o XML da nota pode ser gerado com informações incorretas, causando erros na SEFAZ ou divergências fiscais.

Por isso, o ponto de entrada PE01NFESEFAZ é ideal para ajustar dinamicamente as tags antes do envio, garantindo que os dados estejam consistentes e aderentes à operação de cada cliente.

Como funciona a lógica do ponto de entrada PE01NFESEFAZ

A ideia aqui é simples, mas eficiente:

  1. Validar se a nota não é devolução e não utiliza fornecedor.
  2. Verificar no cadastro do cliente se ele prefere comprar por caixa em vez da unidade padrão.
  3. Percorrer o array de produtos do XML.
  4. Localizar o produto na tabela SB1.
  5. Pegar as informações de unidade secundária, fator de conversão e quantidade vendida.
  6. Realizar a conversão de unidade e quantidade conforme o tipo de cálculo (multiplicação ou divisão).
  7. Atualizar as posições do array que definem as tags de uCom, qCom, uTrib e qTrib antes de gerar o XML.

Exemplo prático: alterando unidade e quantidade do XML via ADVPL

Abaixo está o exemplo completo da função utilizada para alterar as informações no XML antes da transmissão da nota fiscal.

⚠️ Importante: o código é apenas um exemplo de customização. Sempre valide com seu time técnico antes de aplicar em ambiente produtivo.

User Function PE01NFESEFAZ()
    Local aArea      := FWGetArea()
    Local aAreaSA1   := SA1->(FWGetArea())
    Local aAreaSB1   := SB1->(FWGetArea())
    Local aDados     := PARAMIXB
    Local cMsgAux    := ""
    Local cTipoRedes := ""
    Local cQrySC5    := ""
    Local aProd      := aDados[01]
    Local nProdAtu   := 0
  
    //Se não for devolução e nem usa fornecedor
    If ! SF2->F2_TIPO $ "B;D;"
  
        //Posiciona no cliente
        DbSelectArea("SA1")
        SA1->(DbSetOrder(1))
        If SA1->(MsSeek(FWxFilial("SA1") + SF2->F2_CLIENTE + SF2->F2_LOJA))
  
            //Somente se o cliente for por caixa, irá converter
            If SA1->A1_X_UM == "C"
  
                //Percorre os produtos
                For nProdAtu := 1 To Len(aProd)
  
                    //Pega o código do produto na tag
                    cXCodProd  := aProd[nProdAtu][02]
  
                    //Abre a tabela de produtos
                    DbSelectArea("SB1")
                    SB1->(DbSetOrder(1))
  
                    //Se conseguiu posicionar no produto e a unidade for Milheiro e a segunda for Caixa
                    If SB1->(MsSeek(FWxFilial("SB1") + cXCodProd)) .And. SB1->B1_UM == "MI" .And. SB1->B1_SEGUM == "CX"
                        //Pega a unidade de conversão, o valor de conversão, a quantidade vendida e o tipo de conversão
                        cXUmDipi   := SB1->B1_SEGUM //B5_UMDIPI
                        nXConvDip  := SB1->B1_X_QTDCX  //B5_CONVDIP
                        nXQuantid  := aProd[nProdAtu][09]
                        cXTipoConv := SB1->B1_TIPCONV
  
                        //Se tiver valor de conversão
                        If nXConvDip != 0
                            //Altera a unidade para a convertida
                            cUnTrib        := cXUmDipi
  
                            //Faz a conversão se for multiplicação / divisão
                            If cXTipoConv == "M"
                                nQtdTrib    := nXConvDip * nXQuantid
                            Else
                                nQtdTrib    := nXQuantid / nXConvDip
                            EndIf
  
                            //Altera as posições do produto antes de gerar o XML
                            aProd[nProdAtu][08] := cUnTrib  //uCom
                            aProd[nProdAtu][09] := nQtdTrib //qCom
                            aProd[nProdAtu][11] := cUnTrib  //uTrib
                            aProd[nProdAtu][12] := nQtdTrib //qTrib
                        EndIf
                    EndIf
  
                Next
  
            EndIf
        EndIf
    EndIf
  
    FWRestArea(aAreaSB1)
    FWRestArea(aAreaSA1)
    FWRestArea(aArea)
Return aDados

Observações importantes

O processo acima mostra como personalizar a geração do XML da NFe, alterando as tags uCom, qCom, uTrib e qTrib antes do envio à SEFAZ.
Entretanto, vale lembrar que o Protheus já possui um recurso padrão para trabalhar com segunda unidade de medida, que pode ser utilizado em muitos casos sem necessidade de customização.

Para entender melhor esse recurso, confira a documentação oficial da TOTVS:
👉 Como gerar Segunda unidade de medida no XML

Quando usar essa customização?

Esse tipo de desenvolvimento é recomendado quando:

  • A empresa usa conversões próprias não contempladas no padrão do Protheus.
  • regras específicas de clientes que exigem unidades diferentes no XML.
  • O negócio precisa de flexibilidade fiscal sem alterar cadastros padrão.

A customização via ponto de entrada PE01NFESEFAZ permite tratar essas exceções de forma isolada, sem comprometer a integridade dos dados mestres do sistema.

Conclusão

Alterar as tags de unidade e quantidade diretamente no XML do Protheus pode parecer complexo, mas com a lógica correta e um bom uso do ponto de entrada PE01NFESEFAZ, o processo se torna totalmente controlável e seguro.

Na Geeker Company, desenvolvemos customizações sob medida para empresas que precisam de mais autonomia e precisão nos processos fiscais do Protheus.
Se sua empresa também lida com situações como essa — e precisa garantir que o XML saia exatamente como o cliente e a SEFAZ esperam — entre em contato conosco.

Fale com a Geeker Company e veja como podemos ajudar seu Protheus a ir além do padrão.

Index

Categorias

Sobre o Autor

Foto do Autor
Fábio Hayama

Apaixonado por gestão, tecnologia e inovação, Fábio Hayama possui mais de 15 anos de experiência no universo do ERP Protheus, estratégia empresarial e automação de processos.

Leia mais sobre o Fábio

Entre em contato conosco

Veja mais artigos relacionados

{{brizy_dc_image_alt entityId=
POUI vs ADVPL: qual escolher no Protheus sem travar seu projeto?
Se você trabalha com Protheus há algum tempo, provavelmente já passou por isso: surge uma demanda nova, alguém comenta sobre POUI, outro fala que resolve com ADVPL, e pronto… começa aquele debate que parece mais opinião do que decisão técnica. E é exatamente aqui que muitas empresas começam a errar. Não porque escolheram POUI ou […]
{{brizy_dc_image_alt entityId=
Primeiros Passos no POUI: participe do workshop ao vivo com a Rayanne
Se você sente que está perdendo tempo tentando entender como usar o POUI da melhor forma… relaxa, você não está sozinho. A real é que muita gente até sabe que o POUI pode ajudar — mas trava logo no começo. E é exatamente por isso que a gente criou esse workshop. No dia 07 de […]
{{brizy_dc_image_alt entityId=
Como estruturar pedidos de venda automáticos no Protheus (e parar de perder tempo com processos manuais)
Se você trabalha com o Protheus no dia a dia, provavelmente já viveu essa cena: o time comercial fecha uma venda, alguém precisa parar o que está fazendo para lançar o pedido, conferir informações, ajustar detalhe, corrigir erro… e quando percebe, já perdeu um tempo enorme em algo que deveria ser simples. Agora multiplica isso […]
{{brizy_dc_image_alt entityId=
Como corrigir a rejeição 1155 no Protheus (sem travar seu faturamento)
Se você trabalha com faturamento no Protheus, sabe como é: está tudo certo, pedido pronto, nota gerada… e quando vai transmitir, toma uma rejeição do nada. E não é qualquer rejeição.É aquela que trava tudo: “1155 – Data de previsão de entrega anterior ao permitido” E aí começa a correria. Neste artigo, vou te mostrar […]