BC3 PHP

BC3 Viewer es una aplicación web que permite visualizar archivos en formato BC3 (estándar FIEBDC-3 utilizado en España para el intercambio de presupuestos de construcción). La aplicación muestra una vista jerárquica del presupuesto con capítulos, subcapítulos, partidas y líneas de medición.

BC3 PHP

Si trabajas en el sector de la arquitectura o la construcción en España, el formato BC3 te resultará familiar. Es el estándar FIEBDC-3 que se usa para intercambiar presupuestos entre programas como Presto, Arquímedes o Cost-it. El problema: abrir esos archivos sin el software propietario es prácticamente imposible. Por eso construí BC3 Viewer.

¿Qué es el formato BC3?

El formato BC3 (FIEBDC-3) es un estándar abierto español para el intercambio de bases de datos de construcción. Un archivo .bc3 es, en esencia, un fichero de texto plano con registros delimitados por ~ y campos separados por |. Cada tipo de registro tiene su función:

La estructura es jerárquica: un presupuesto tiene capítulos, que contienen subcapítulos, que agrupan partidas, que a su vez se descomponen en unidades de obra con sus mediciones.

El problema que resuelve

Los archivos BC3 son intercambiables en teoría, pero en la práctica solo los abres con software de presupuestación de pago. Si recibes un BC3 de un cliente, de una administración pública o de un colaborador y no tienes el programa instalado, no puedes ver nada.

BC3 Viewer lo resuelve: subes el archivo, lo procesas y obtienes una vista jerárquica navegable en el navegador. Sin instalar nada. Sin licencias.

Stack tecnológico

Opté deliberadamente por cero dependencias:

Sin frameworks, sin bundlers, sin node_modules. Cualquier servidor con PHP 7.4+ y la extensión mbstring lo ejecuta.

Cómo funciona el parser

El corazón del proyecto es BC3Parser.php. El mayor reto no fue parsear la estructura, sino la codificación de caracteres.

Los archivos BC3 pueden venir en ANSI (Windows-1252), ISO-8859-1, DOS (CP437) o UTF-8, y no siempre coincide lo que declara el campo ~V con la codificación real del fichero. El parser sigue esta lógica de prioridad:


// Primero comprueba si ya es UTF-8 válido
if (mb_check_encoding($content, 'UTF-8')) {
    $encoding = 'UTF-8';
} else {
    // Si no, lee el campo de codificación del registro ~V
    $encoding = 'ISO-8859-1'; // fallback
    if (preg_match('/~V\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|([^|]*)\|/', $content, $matches)) {
        $declaredEncoding = strtoupper(trim($matches[1]));
        // ANSI → Windows-1252, IBMPC/DOS → CP437, ISO → ISO-8859-1
    }
}