Hola @ruben_digital62,
Los compañeros @pablo_bici y @pabloiberia17 han dado en el clavo. Vuestro enfoque de añadir filter_key es correcto para la interfaz, pero el AdminController necesita una 'ayuda' para saber cómo aplicar ese filtro en la consulta SQL. La lógica de parent::getList() no lo hace por sí misma para campos no estándar.
La solución pasa por modificar el $this->_where del controlador justo antes de llamar a parent::getList(), o incluso después, si la lógica de _filterHaving se procesa antes. Aquí tienes un snippet que debería funcionar dentro de tu override de AdminProductsController para PS 8.2.7:
public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_category = null, $id_parent = null)
{
$this->fields_list['upc'] = [
'title' => $this->l('Código UPC'),
'type' => 'text',
'filter_key' => 'a!upc',
'class' => 'fixed-width-lg'
];
parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_category, $id_parent);
if (isset($this->_filterHaving['a!upc'])) {
Con esto, después de que parent::getList() prepare la consulta principal, tu código añade manualmente la condición WHERE para el UPC. Es crucial que el alias de la tabla a sea el de ps_product.
Como bien menciona @pabloiberia17, los overrides son frágiles. Para evitar problemas en futuras actualizaciones y tener una solución más limpia y mantenible, especialmente en un entorno de producción, la forma más segura es usar un módulo dedicado. Te recomiendo echar un vistazo a esta solución para filtro de upc que ya gestiona estas complejidades de forma encapsulada.