Pular para conteúdo

ECD — Bloco 0 (Abertura e Identificação)

Finalidade do Bloco

O Bloco 0 contém os dados de identificação da empresa, do período e de inscrições cadastrais. É obrigatoriamente o primeiro bloco serializado no arquivo SPED ECD. Ele informa à Receita Federal quem é o contribuinte, qual o período escriturado, onde está localizado e sob qual regime contábil a escrituração foi feita.


Registro 0000 — Abertura do Arquivo Digital e Identificação do Empresário

Finalidade

Identificação completa do contribuinte, período da escrituração e parâmetros gerais. Este registro é único por arquivo e é tratado de forma especial: ele é gravado diretamente no objeto _arq._registro_abertura (não via _blocos['0'].add()), porque o ArquivoDigital o serializa como a primeira linha absoluta do arquivo texto.

Quando é gerado

Sempre que o registro 0000 estiver habilitado em company.l10n_br_sped_ecd_registros.

Método e localização

  • Método: enviar_registro_0000() — linha 220 de account_sped_ecd.py
  • Classe do registro: Registro0000 em sped/ecd/registros.py (linha 11)
  • Destino: _arq._registro_abertura (não no bloco — é o cabeçalho global)

Formatação especial

O CNPJ passa por _format_cnpj_cpf() que remove ., / e -.

def _format_cnpj_cpf(cnpj_cpf):
    if cnpj_cpf:
        return cnpj_cpf.replace("/","").replace("-","").replace(".","")
    else:
        return ""

Por exemplo, 12.345.678/0001-90 vira 12345678000190.

Campos do registro — detalhamento completo

# Campo SPED Tipo Valor no código Origem Significado legal Configurável? Como alterar
1 REG Fixo 0000 CampoFixo Identificador do registro
2 LECD Fixo LECD CampoFixo Identificação do tipo de escrituração (Leiaute ECD)
3 DT_INI Data self.date_ini ⚙️ Wizard Data de início do período de escrituração. Formato interno: DDMMAAAA Campo "Data Inicial" no formulário
4 DT_FIN Data self.date_fim ⚙️ Wizard Data de fim do período de escrituração Campo "Data Final" no formulário
5 NOME Alfanum. company.name 🏢 Empresa Razão social do contribuinte tal como registrado no cadastro da empresa no Odoo Configurações → Empresa → Nome
6 CNPJ Alfanum. company.l10n_br_cnpj 🏢 Empresa CNPJ sem formatação. Se o campo estiver vazio, gera string vazia — o PVA rejeitará Empresa → CNPJ
7 UF Alfanum. company.state_id.code 🏢 Empresa Sigla do estado (ex: SP, RJ, MG) Empresa → Estado
8 IE Alfanum. company.l10n_br_ie 🏢 Empresa Inscrição Estadual. Se a empresa for isenta, pode conter ISENTO Empresa → Inscrição Estadual
9 COD_MUN Alfanum. company.l10n_br_municipio_id.codigo_ibge 🏢 Empresa Código IBGE do município (7 dígitos). Depende de o município ter sido cadastrado com código IBGE Empresa → Município → Código IBGE
10 IM Alfanum. company.l10n_br_im or '' 🏢 Empresa Inscrição Municipal. Se vazio, gravo string vazia — o campo é opcional no leiaute SPED Empresa → Inscrição Municipal
11 IND_SIT_ESP Alfanum. '' (vazio) 🔒 Fixo Indicador de situação especial. Valores possíveis: 0=abertura, 1=cisão, 2=fusão, 3=incorporação, 4=encerramento, 5=transformação. Vazio = sem situação especial Requer desenvolvimento
12 IND_SIT_INI_PER Alfanum. '0' 🔒 Fixo Indicador de início do período. 0=abertura normal, 1=início de obrigatoriedade, 2=resultado de cisão/fusão/incorporação Requer desenvolvimento
13 IND_NIRE Alfanum. '1' 🔒 Fixo Indicador de NIRE. 0=NIRE em ato societário registrado, 1=sem NIRE. O sistema grava '1' mesmo que l10n_br_nire esteja preenchido — ponto de atenção Requer desenvolvimento
14 IND_FIN_ESC Alfanum. '0' 🔒 Fixo Finalidade da escrituração. 0=original, 1=substituta. O sistema sempre gera como original Requer desenvolvimento
15 COD_HASH_SUB Alfanum. '' 🔒 Fixo Hash da escrituração substituída. Vazio porque IND_FIN_ESC = '0' (original)
16 IND_GRANDE_PORTE Alfanum. '0' 🔒 Fixo 0=empresa NÃO é de grande porte, 1=empresa de grande porte (Lei 11.638/2007). Sempre fixo como '0' Requer desenvolvimento
17 TIP_ECD Alfanum. '0' 🔒 Fixo Tipo de ECD. 0=ECD de empresa não participante de SCP, 1=ECD de empresa participante de SCP como sócia ostensiva, 2=ECD de SCP Requer desenvolvimento
18 COD_SCP Alfanum. '' 🔒 Fixo CNPJ da SCP. Vazio porque TIP_ECD = '0'
19 IDENT_MF Alfanum. 'N' 🔒 Fixo Identificação de moeda funcional. S=sim, N=não. Sempre 'N' Requer desenvolvimento
20 IND_ESC_CONS Alfanum. 'N' 🔒 Fixo Indicador de escrituração consolidada. S=consolidada, N=individual. Sempre 'N' (individual) Requer desenvolvimento
21 IND_CENTRALIZADA Alfanum. '0' 🔒 Fixo Indicador de centralização. 0=escrituração centralizada na matriz, 1=filial Requer desenvolvimento
22 IND_MUDANC_PC Alfanum. '0' 🔒 Fixo Indicador de mudança de plano de contas. 0=sem mudança, 1=com mudança, 2=com mudança e extinção Requer desenvolvimento
23 COD_PLAN_REF Alfanum. self.cod_plan_ref ⚙️ Wizard Código do plano de contas referencial da RFB (1 a 10) Aba Parâmetros → Plano Referencial

Observações sobre campos fixos

Por que tantos campos fixos? O sistema atende ao cenário padrão de uma empresa no Lucro Presumido ou Real, com escrituração individual, centralizada na matriz, sem situação especial, sem SCP e sem moeda funcional. Cenários como cisão, fusão, incorporação, SCP, grande porte ou escrituração consolidada exigiriam desenvolvimento para tornar esses campos parametrizáveis.

Ponto de atenção — IND_NIRE: O campo é fixo como '1' (sem NIRE), mesmo quando company.l10n_br_nire está preenchido. Na prática, isso pode gerar inconsistência — se a empresa tem NIRE registrado, o valor deveria ser '0'.

Problemas comuns e diagnóstico

Problema Causa raiz Verificação Solução
CNPJ vazio no SPED l10n_br_cnpj não preenchido Empresa → CNPJ Preencher CNPJ
UF vazia state_id não vinculado Empresa → Endereço → Estado Vincular estado
COD_MUN vazio Município sem codigo_ibge Empresa → Município → verificar se tem código IBGE Cadastrar código IBGE no município
IE vazia l10n_br_ie não preenchido Empresa → Inscrição Estadual Preencher IE ou ISENTO
PVA rejeita COD_PLAN_REF Valor incorreto para o regime Verificar regime tributário real Trocar para código correto na aba Parâmetros

Referência técnica

  • Arquivo: account_sped_ecd.py, método enviar_registro_0000(), linhas 220–251
  • Classe: Registro0000 em sped/ecd/registros.py, linhas 11–40

Registro 0001 — Abertura do Bloco 0

Finalidade

Indicador obrigatório de presença de dados no bloco. Se IND_DAD = '0', significa que o bloco contém dados. Se '1', o bloco está vazio.

Quando é gerado

Sempre que habilitado. Grava diretamente no _blocos['0'].registro_abertura — não cria um novo registro, mas preenche o objeto de abertura do bloco.

Campos

# Campo Valor Significado legal
1 REG 0001 Identificador do registro
2 IND_DAD '0' 🔒 Fixo — o bloco sempre contém dados. 0=com dados, 1=sem dados

Referência técnica

  • enviar_registro_0001() — linha 253
  • Destino: _arq._blocos['0'].registro_abertura.IND_DAD

Registro 0007 — Outras Inscrições Cadastrais (Inscrição Estadual)

Finalidade

Registro complementar para vincular a entidade à inscrição estadual. Pode haver múltiplos 0007 (um por estado onde a empresa tem IE), mas o sistema gera apenas um — o da UF principal da empresa.

Quando é gerado

Sempre que habilitado. Cria um novo registro via _blocos['0'].add().

Campos — detalhamento

# Campo SPED Valor Origem Significado legal Configurável?
1 REG 0007 Fixo Identificador
2 COD_ENT_REF company.state_id.code 🏢 Empresa Sigla da UF da inscrição (ex: SP). Na tabela do SPED, corresponde ao órgão da entidade referenciada ✅ Empresa → Estado
3 COD_INSCR company.l10n_br_ie 🏢 Empresa Número da inscrição estadual ✅ Empresa → IE

Limitações conhecidas

  • Empresas com múltiplas inscrições estaduais (multi-UF) terão apenas a IE principal. Para gerar múltiplas, seria necessário desenvolvimento.

Referência técnica

  • enviar_registro_0007() — linha 260
  • Classe: Registro0007 em sped/ecd/registros.py, linha 53

Registro 0990 — Encerramento do Bloco 0

Finalidade

Registro obrigatório com a contagem total de linhas do Bloco 0. Inclui todos os registros 0001, 0007, 0990 e o próprio 0990.

Quando é gerado

Sempre que habilitado.

Cálculo da contagem

QTD_LIN_0 = len(_arq._blocos['0'].registros) + 1
# +1 porque o próprio registro 0990 conta como linha

Campos

# Campo Valor Significado
1 REG 0990 Identificador
2 QTD_LIN_0 Calculado Quantidade de registros no Bloco 0, incluindo o próprio 0990

Referência técnica

  • enviar_registro_0990() — linha 272
  • Destino: _arq._blocos['0'].registro_encerramento.QTD_LIN_0

Registros Definidos na Biblioteca mas Não Implementados

Registro Classe Python Finalidade legal Status no código Campos definidos
0020 Registro0020 Escrituração contábil descentralizada — identifica filiais que possuem escrituração própria ❌ Nunca chamado no fluxo gerar_sped() IND_DEC, CNPJ, UF, IE, COD_MUN, IM, NIRE
0150 Registro0150 Tabela de cadastro de participantes — pessoas físicas ou jurídicas referenciadas nos lançamentos (ex: fornecedores, clientes) ❌ Nunca chamado COD_PART, NOME, COD_PAIS, CNPJ, CPF, NIT, UF, IE, IE_ST, COD_MUN, IM, SUFRAMA
0180 Registro0180 Identificação do relacionamento com o participante — tipo e período do vínculo ❌ Nunca chamado COD_REL, DT_INI_REL, DT_FIN_REL

Consequência prática: O campo COD_PART no registro I250 é sempre gravado como vazio (''). Se futuramente for necessário vincular participantes aos lançamentos contábeis, será preciso implementar os registros 0150/0180.


Referências