Se tem uma coisa que pode virar dor de cabeça rápida dentro do Protheus, é exclusão indevida de documento de saída.
E não estamos falando só de erro operacional… estamos falando de impacto fiscal, retrabalho e, em alguns casos, até problema com auditoria.
Recentemente, em um cliente, surgiu exatamente esse cenário:
como impedir que qualquer usuário saia excluindo documento de saída sem controle?
E a resposta não envolve nada mirabolante.
É controle, regra de negócio e uso inteligente de ponto de entrada.
O problema que ninguém quer ter
No dia a dia, é comum usuários terem acesso a rotinas que permitem exclusão de documentos.
Só que o sistema padrão não impede, por exemplo:
- exclusões por engano
- exclusões sem rastreabilidade clara
- exclusões fora do fluxo de aprovação
E aí começa o caos:
- divergência fiscal
- inconsistência em relatórios
- retrabalho manual pesado
- dificuldade de auditoria
Se você já passou por isso, sabe o tamanho do prejuízo.
A solução: bloquear na raiz com ponto de entrada
Aqui a ideia é simples e muito eficiente:
- interceptar a exclusão no momento em que ela acontece
- validar se o usuário tem permissão
- permitir ou bloquear com mensagem clara
E o melhor: sem precisar alterar padrão do Protheus.
Estratégia utilizada
Para resolver isso, utilizamos o ponto de entrada:
👉 MS520VLD
Esse ponto é acionado exatamente na validação da exclusão do documento de saída.
A lógica aplicada foi:
- Criar um parâmetro (
MV_X_USDEL) com os usuários autorizados - Verificar se o usuário atual está dentro desse parâmetro
- Se estiver → permite excluir
- Se não estiver → bloqueia e exibe mensagem
Simples, direto e extremamente eficiente.
Código utilizado
Aqui está exatamente como implementamos (sem alteração):
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function MS520VLD
Ponto de entrada na validação da exclusão do documento de saída corrente
@type Function
@author Atilio
@since 24/11/2023
@see https://tdn.totvs.com/display/public/PROT/MS520VLD
/*/
User Function MS520VLD()
Local aArea := FWGetArea()
Local lContinua := .T.
Local cUsrsDel := SuperGetMV("MV_X_USDEL", .F., "000000;")
Local cFilDoc := SF2->F2_FILIAL
Local cDocumento := SF2->F2_DOC
Local cSerie := SF2->F2_SERIE
//Se o usuário estiver no parâmetro que ele pode excluir a NF, permite prosseguir normalmente
If RetCodUsr() $ cUsrsDel
lContinua := .T.
//Senão, exibe mensagem avisando que não é possível excluir
Else
ExibeHelp("Help_MS520VLD", "Não é possível excluir o documento (" + cFilDoc + "-" + cDocumento + "-" + cSerie + ")!", "Verifique com os responsáveis para prosseguir!")
lContinua := .F.
EndIf
FWRestArea(aArea)
Return lContinua
O que esse código resolve na prática
Pode parecer simples, mas isso aqui muda o jogo:
- elimina exclusões indevidas
- centraliza controle em parâmetro (sem precisar alterar código toda hora)
- melhora governança
- reduz risco fiscal
- evita retrabalho
E principalmente:
👉 tira o risco da operação ir pro espaço por um clique errado
Dica importante (que pouca gente aplica)
Não adianta só bloquear.
Se você quiser fazer isso direito, combine com:
- definição clara de quem pode excluir
- registro de justificativa (se necessário)
- acompanhamento via logs
- revisão periódica dos usuários autorizados
Controle técnico sem processo = problema futuro.
Quando vale aplicar isso?
Se você tem:
- alto volume de faturamento
- mais de um usuário operando fiscal
- integrações com outros sistemas
- necessidade de auditoria
Então isso aqui deixa de ser opcional.
Vira obrigação.
Conclusão
O Protheus permite muita coisa — inclusive coisas que podem te dar problema se não tiver controle.
Esse tipo de ajuste é exatamente o que separa:
👉 um sistema funcionando
de
👉 uma operação realmente segura
E normalmente, são essas pequenas validações que evitam os grandes prejuízos.




