Olá!
Tive problema ao gerar a cobrança SR para a Caixa Economica (SICOB) também.
O código gerado para a linha digitável pelo ACBrBoleto não batia com o código gerado pelo COBCAIXA.
Fiz a alteração que o GutoSantos postou, mas mesmo assim ainda tive problemas.
Conferindo, notei que o "Campo Livre" usa o comando "Copy(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 1, 4)".
No meu caso, a agência é "0327" e é formatada pela procedure SetAgencia para 5 posições, por causa da propriedade TamanhoAgencia que no caso da CEF é 5 posições, passando então para o valor "00327".
Usando o comando "Copy(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 1, 4)", o valor retornado é "0032", o que ocasiona um erro na montagem da variável "Campo Livre".
Fiz a modificação na função "TACBrCaixaEconomicaSICOB.MontarCodigoBarras", deixando a condição "Carteira = 'SR'" para que não atrapalhe a geração dos outros tipos de carteira.
Depois disso, a código gerado para a "Linha Digitável" bateu com o programa do COBCaixa.
Se alguém quiser utilizar a correção, ou se quiserem incorporar ao SVN, segue a função modificada logo abaixo:
function TACBrCaixaEconomicaSICOB.MontarCodigoBarras(const ACBrTitulo: TACBrTitulo): String;
var
CodigoBarras, FatorVencimento, DigitoCodBarras: String;
ANossoNumero, CampoLivre, aCodCedente: String;
begin
FatorVencimento := CalcularFatorVencimento(ACBrTitulo.Vencimento);
ANossoNumero := FormataNossoNumero(ACBrTitulo);
aCodCedente := padR(RightStr(ACBrTitulo.ACBrBoleto.Cedente.CodigoCedente, 11), 11, '0');
if UpperCase(ACBrTitulo.Carteira) = 'SR' then
CampoLivre := Copy(aCodCedente, 7, 5) + RightStr(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 4) + '87' + RightStr(ANossoNumero, 14)
else
CampoLivre := ANossoNumero + RightStr(ACBrTitulo.ACBrBoleto.Cedente.Agencia, 4) + aCodCedente;
{ Codigo de Barras }
with ACBrTitulo.ACBrBoleto do
CodigoBarras := IntToStrZero(Banco.Numero, 3) + '9' + FatorVencimento + IntToStrZero(Round(ACBrTitulo.ValorDocumento * 100), 10) + CampoLivre;
DigitoCodBarras := CalcularDigitoCodigoBarras(CodigoBarras);
Result := Copy(CodigoBarras, 1, 4) + DigitoCodBarras + Copy(CodigoBarras, 5, 44);
end;
Lembrando que essa modificação foi testada apenas para Nosso Número com 15 posições.
Abraço a todos!