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:
- Valida se a nota não é devolução e não envolve fornecedor;
- Posiciona no cadastro do cliente (SA1);
- Verifica um campo customizado que indica se o cliente prefere comprar por caixa;
- Percorre o array de produtos da nota;
- Posiciona no cadastro do produto (SB1);
- Verifica se existe segunda unidade de medida e fator de conversão;
- Realiza o cálculo conforme o tipo de conversão (multiplica ou divide);
- Altera diretamente no array:
uComqComuTribqTrib
- 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.




