Alterando as tags uCom, qCom, uTrib e qTrib no XML da NF-e via Ponto de Entrada no Protheus

Quem trabalha com TOTVS Protheus sabe que nem todo cenário de negócio segue o “padrão feliz” do ERP.
Conversão de unidades, formas alternativas de venda e exigências específicas de clientes são situações muito mais comuns do que parece — principalmente em ambientes industriais e atacadistas.

Neste artigo, vamos mostrar como alterar as tags uCom, qCom, uTrib e qTrib diretamente no XML da NF-e, antes da transmissão, utilizando um ponto de entrada padrão do Protheus.

O problema: quando o padrão do Protheus não atende

Recentemente surgiu a seguinte dúvida:

“É possível modificar a unidade de medida e a quantidade de um produto no XML da nota antes de transmitir para a SEFAZ?”

A resposta é: sim, é possível.

Esse tipo de necessidade aparece, por exemplo, quando:

  • O cliente compra por caixa, mas o produto está cadastrado em unidade ou milheiro;
  • A empresa não utiliza o fator de conversão padrão do Protheus;
  • A unidade comercial e a unidade tributável precisam ser forçadas no XML, independentemente do cadastro base.

Nesses casos, tentar resolver apenas com parametrização geralmente não é suficiente.

A solução: Ponto de Entrada PE01NFESEFAZ

O Protheus disponibiliza o ponto de entrada PE01NFESEFAZ, que permite interferir diretamente nos dados da NF-e no momento da geração do XML, antes da transmissão.

A grande vantagem aqui é que:

  • Você não altera o pedido, o faturamento ou o estoque;
  • A customização atua somente no XML;
  • O comportamento fica 100% controlado por regra de negócio.

Lógica aplicada na customização

A lógica implementada no exemplo segue este fluxo:

  1. Valida se a nota não é devolução e não envolve fornecedor;
  2. Posiciona no cadastro do cliente (SA1);
  3. Verifica um campo customizado que indica se o cliente prefere comprar por caixa;
  4. Percorre o array de produtos da nota;
  5. Posiciona no cadastro do produto (SB1);
  6. Verifica se existe segunda unidade de medida e fator de conversão;
  7. Realiza o cálculo conforme o tipo de conversão (multiplica ou divide);
  8. Altera diretamente no array:
    • uCom
    • qCom
    • uTrib
    • qTrib
  9. Retorna o array já ajustado para geração do XML.

Exemplo de código no PE01NFESEFAZ

Abaixo está um exemplo funcional, seguindo exatamente essa lógica:

User Function PE01NFESEFAZ()
    Local aArea      := FWGetArea()
    Local aAreaSA1   := SA1->(FWGetArea())
    Local aAreaSB1   := SB1->(FWGetArea())
    Local aDados     := PARAMIXB
    Local aProd      := aDados[01]
    Local nProdAtu   := 0

    // Se não for devolução e nem 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))

            // Cliente configurado para comprar por caixa
            If SA1->A1_X_UM == "C"

                // Percorre os produtos da nota
                For nProdAtu := 1 To Len(aProd)

                    // Código do produto no XML
                    cXCodProd := aProd[nProdAtu][02]

                    DbSelectArea("SB1")
                    SB1->(DbSetOrder(1))

                    // Produto com segunda unidade configurada
                    If SB1->(MsSeek(FWxFilial("SB1") + cXCodProd)) .And. ;
                       SB1->B1_UM == "MI" .And. ;
                       SB1->B1_SEGUM == "CX"

                        cXUmDipi   := SB1->B1_SEGUM
                        nXConvDip  := SB1->B1_X_QTDCX
                        nXQuantid  := aProd[nProdAtu][09]
                        cXTipoConv := SB1->B1_TIPCONV

                        If nXConvDip != 0

                            cUnTrib := cXUmDipi

                            If cXTipoConv == "M"
                                nQtdTrib := nXConvDip * nXQuantid
                            Else
                                nQtdTrib := nXQuantid / nXConvDip
                            EndIf

                            // Atualiza tags do 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

Pontos importantes de atenção

Alguns cuidados essenciais ao usar esse tipo de abordagem:

  • Essa customização não altera estoque nem financeiro, apenas o XML;
  • É fundamental validar:
    • Tipo de nota;
    • Cliente;
    • Produto;
    • Conversão;
  • Sempre teste em ambiente de homologação;
  • Tenha atenção às regras fiscais do seu estado, principalmente para unidade tributável.

Existe solução padrão no Protheus?

Sim.
O exemplo acima é didático, para demonstrar como funciona a intervenção direta no XML.

O Protheus possui recurso padrão para segunda unidade de medida no XML, documentado pela TOTVS.
Segue o material oficial de apoio:

👉 https://centraldeatendimento.totvs.com/hc/pt-br/articles/360044212253

Mesmo assim, em cenários mais complexos, o ponto de entrada acaba sendo inevitável.

Conclusão

Alterar uCom, qCom, uTrib e qTrib via PE01NFESEFAZ é uma solução poderosa quando:

  • O padrão do sistema não atende;
  • O negócio exige regras específicas;
  • A empresa precisa manter consistência fiscal sem comprometer processos internos.

Se você enfrenta cenários parecidos no seu ambiente Protheus, esse tipo de ajuste pode evitar retrabalho, rejeições de nota e dores de cabeça com o fiscal.

Se quiser trocar ideia sobre esse ou outros pontos de entrada do Protheus, é só chamar a Geeker Company.

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=
O ERP não falha. O problema quase sempre é o treinamento da equipe
É comum ouvir frases como “esse ERP não funciona”, “o sistema é travado” ou “ninguém gosta de usar isso aqui”. Na maioria dos casos, o problema não está no ERP em si. Está na forma como a equipe foi (ou não foi) preparada para usar o sistema no dia a dia. Empresas investem valores altos […]
{{brizy_dc_image_alt entityId=
Campanha de Indicação Geeker Company: transforme conexões em renda recorrente
Se você conhece empresas que enfrentam desafios com ERP Protheus, Power BI ou integrações de sistemas, essa é uma oportunidade real de transformar bons contatos em dinheiro no bolso — sem burocracia, sem esforço comercial e com total transparência. A Campanha de Indicação da Geeker Company foi criada para recompensar quem conecta pessoas certas às […]
{{brizy_dc_image_alt entityId=
Erro x:\smartclient.exe no Protheus: como resolver “O sistema não pode encontrar a unidade especificada”
Ao abrir o Protheus, alguns usuários se deparam com a seguinte mensagem de erro: “x:\smartclient.exeO sistema não pode encontrar a unidade especificada.” Esse erro é relativamente comum em ambientes Protheus e, apesar de parecer um problema grave de instalação ou infraestrutura, na maioria dos casos está relacionado a um parâmetro de configuração do próprio sistema. […]
{{brizy_dc_image_alt entityId=
Tecnologia em movimento: TOTVS, IA e o novo rumo do mercado
A tecnologia deixou definitivamente de ser apenas um tema de inovação para se tornar um pilar central de estratégia, crescimento e sobrevivência das empresas. As seis notícias que movimentaram o Brasil e o mundo nesta semana mostram com muita clareza esse cenário: consolidação de grandes players, confiança do mercado financeiro, avanço acelerado da inteligência artificial […]