Eu estava com o mesmo problema que você Gabriel, efetuei essa correção e funcionou. Obrigado.
Arquivo: pcnNfeW
procedure TNFeW.GerarDetImpostoIPI(const i: Integer);
var
CST00495099: Boolean;
begin
// variavel CST00495099 usada para Ignorar Tag <IPI>
// se GerarTagIPIparaNaoTributado = False e CST00495099 = False
CST00495099 := (nfe.Det[i].Imposto.IPI.CST in [ipi00, ipi49, ipi50, ipi99]);
if (not FOpcoes.FGerarTagIPIparaNaoTributado) and (not CST00495099) then
exit;
//se valores padrão de quando não foi preenchido a TAG IPI
if ((nfe.Det[i].Imposto.IPI.cEnq = '') and
(nfe.Det[i].Imposto.IPI.CST = ipi00) and
(nfe.Det[i].Imposto.IPI.vBC = 0) and
(nfe.Det[i].Imposto.IPI.qUnid = 0) and
(nfe.Det[i].Imposto.IPI.vUnid = 0) and
(nfe.Det[i].Imposto.IPI.pIPI = 0) and
(nfe.Det[i].Imposto.IPI.vIPI = 0)) then
EXIT; //não deve preencher a TAG
Gerador.wGrupo('IPI', 'O01');
Gerador.wCampo(tcStr, 'O02', 'clEnq ', 01, 05, 0, nfe.Det[i].Imposto.IPI.clEnq, DSC_CLENQ);
Gerador.wCampo(tcStr, 'O03', 'CNPJProd', 14, 14, 0, nfe.Det[i].Imposto.IPI.CNPJProd, DSC_CNPJPROD);
Gerador.wCampo(tcStr, 'O04', 'cSelo ', 01, 60, 0, nfe.Det[i].Imposto.IPI.cSelo, DSC_CSELO);
Gerador.wCampo(tcInt, 'O05', 'qSelo ', 01, 12, 0, nfe.Det[i].Imposto.IPI.qSelo, DSC_QSELO);
if nfe.Det[i].Imposto.IPI.cEnq = '' then
nfe.Det[i].Imposto.IPI.cEnq := '999';
Gerador.wCampo(tcStr, 'O06', 'cEnq ', 03, 03, 1, nfe.Det[i].Imposto.IPI.cEnq, DSC_CENQ);
if CST00495099 then
begin
if (nfe.Det[i].Imposto.IPI.vBC + nfe.Det[i].Imposto.IPI.pIPI > 0) and (nfe.Det[i].Imposto.IPI.qUnid + nfe.Det[i].Imposto.IPI.vUnid > 0) then
Gerador.wAlerta('O07', 'IPITrib', DSC_IPITrib, 'As TAG <vBC> e <pIPI> não podem ser informadas em conjunto com as TAG <qUnid> e <vUnid>');
(*
Leandro de Paula Caires - 10/03/2015
As linhas "Gerador.wGrupo('IPITrib', 'O07');" do if foram alteradas, pois
os itens O10 e O11 são excludentes.
*)
if (nfe.Det[i].Imposto.IPI.qUnid + nfe.Det[i].Imposto.IPI.vUnid > 0) then
begin
Gerador.wGrupo('IPITrib', 'O11'); //Leandro - alterado de O07 para O11
Gerador.wCampo(tcStr, 'O09', 'CST ', 02, 02, 1, CSTIPITOStr(nfe.Det[i].Imposto.IPI.CST), DSC_CST);
Gerador.wCampo(tcDe4, 'O11', 'qUnid ', 01, 16, 1, nfe.Det[i].Imposto.IPI.qUnid, DSC_QUNID);
Gerador.wCampo(tcDe4, 'O12', 'vUnid ', 01, 15, 1, nfe.Det[i].Imposto.IPI.vUnid, DSC_VUNID);
Gerador.wCampo(tcDe2, 'O14', 'vIPI ', 01, 15, 1, nfe.Det[i].Imposto.IPI.vIPI, DSC_VIPI);
Gerador.wGrupo('/IPITrib');
end
else
begin
Gerador.wGrupo('IPITrib', 'O10'); //Leandro - alterado de O07 para O10
Gerador.wCampo(tcStr, 'O09', 'CST ', 02, 02, 1, CSTIPITOStr(nfe.Det[i].Imposto.IPI.CST), DSC_CST);
Gerador.wCampo(tcDe2, 'O10', 'vBC ', 01, 15, 1, nfe.Det[i].Imposto.IPI.vBC, DSC_VBC);
Gerador.wCampo(IIf(Usar_tcDe4,tcDe4,tcDe2), 'O13', 'pIPI ', 01, IIf(Usar_tcDe4,06,05), 1, nfe.Det[i].Imposto.IPI.pIPI, DSC_PIPI);
Gerador.wCampo(tcDe2, 'O14', 'vIPI ', 01, 15, 1, nfe.Det[i].Imposto.IPI.vIPI, DSC_VIPI);
Gerador.wGrupo('/IPITrib');
end;
end
else (* Quando CST/IPI for 01,02,03,04,51,52,53,54 ou 55 *)
begin
Gerador.wGrupo('IPINT', 'O08');
Gerador.wCampo(tcStr, 'O09', 'CST ', 02, 02, 1, CSTIPITOStr(nfe.Det[i].Imposto.IPI.CST), DSC_CST);
Gerador.wGrupo('/IPINT');
end;
Gerador.wGrupo('/IPI');
end;
Arquivo: pcnLayoutTXT
Troquei
LoadLayout('<O07> O07|CST¨|VIPI¨');
LoadLayout('<O07> O10|VBC¨|PIPI¨|VIPI¨');
LoadLayout('<O07> O11|QUnid¨|VUnid¨|VIPI¨');
por
LoadLayout('<O10> O07|CST¨|VIPI¨');
LoadLayout('<O10> O10|VBC¨|PIPI¨|VIPI¨');
LoadLayout('<O11> O07|CST¨|VIPI¨');
LoadLayout('<O11> O11|QUnid¨|VUnid¨|VIPI¨');
Há um outro problema também, porém este erro esta presente no manual de layout txt 3.10.
No manual e no ACBr, especificamente no campo x03 (Dados do Transportador) está assim:
X03|xNome|IE|xEnder|xMun|UF|
Porém o emissor do governo recusa e aceita somente se invertermos os campos xMun e UF assim:
X03|xNome|IE|xEnder|UF|xMun|
Vou fazer mais alguns testes aqui e posto se achar mais alguma coisa
At+