Trabajar con grandes cantidades de datos es uno de los problemas más comunes a los que se enfrentan los desarrolladores de 1C. Informes lentos, procesamientos que se cuelgan y usuarios insatisfechos: todo esto es consecuencia de un enfoque incorrecto para trabajar con los datos. Veamos cómo hacerlo bien.
¿Por qué surgen problemas de rendimiento?
Cuando hay varios miles de documentos en la base de datos, todo funciona rápidamente. Pero tan pronto como los datos crecen a cientos de miles o millones de registros, el código que antes se ejecutaba instantáneamente comienza a funcionar en minutos. La razón es simple: cada acceso a la base de datos lleva tiempo, y las consultas no optimizadas pueden procesar muchos más datos de los necesarios.
Principios básicos del trabajo con macrodatos
1. Usa consultas en lugar de bucles
El error más común de los desarrolladores novatos es el procesamiento de datos en bucles. Por ejemplo, si necesita obtener los saldos de productos en el almacén, no debe ordenar todos los productos en un ciclo y hacer una solicitud por separado para cada uno.
❌ Mal:
Для Каждого Товар Из СписокТоваров Цикл
Запрос = Новый Запрос;
Запрос.Текст = "SELECT Remainder WHERE Nomenclature = &Nomenclature";
Запрос.УстановитьПараметр("Nomenclature", Товар);
// ¡Se ejecuta cientos de veces!
КонецЦикла;✅ Bien:
Запрос = Новый Запрос;
Запрос.Текст =
"SELECT
| Nomenclature,
| Balance
|FROM RegisterAccumulation.BalanceGoods.Balance
|WHERE Nomenclature IN (&List of Goods)";
Запрос.УстановитьПараметр("List of goods", СписокТоваров);
// ¡Se ejecuta una vez!Importante: Una solicitud en lugar de cientos es la diferencia entre un segundo y un minuto de trabajo.
2. Limita la selección de datos
No cargue todos los campos si no son necesarios. No seleccione todas las entradas si solo necesita una parte.
// Seleccionamos solo los campos necesarios
Запрос.Текст =
"SELECT
| Document.Number,
| Document.Date,
| Document.Amount
| FROM Document.SaleOfGoodsServices AS Document
|WHERE Document.Date BETWEEN &StartDate AND &EndDate
| AND Document.Posted = TRUE";Utiliza las condiciones WHERE para filtrar los datos a nivel de base de datos, no en el código después de recibir todos los registros.
3. Aplica índices
Los índices son los que hacen que la búsqueda en la base de datos sea rápida. En 1C, los índices se crean automáticamente para los detalles marcados como indexables. Si filtra datos con frecuencia en función de un atributo específico, asegúrese de que se cree un índice para dicho atributo.
4. Usa tablas temporales
Cuando se necesita hacer varias consultas relacionadas entre sí, las tablas temporales ayudan a guardar los resultados intermedios y no volver a consultar las tablas principales.
Запрос = Новый Запрос;
Запрос.Текст =
"SELECT
| Counterparty,
| AMOUNT (Amount) AS TotalAmount
| PLACE InAmountsByCounterparties | FROM Document.SaleOfGoodsServices
| GROUP BY Counterparty |; | | SELECT
| InAmountsByCounterparties.Counterparty,
| InAmountsByCounterparties.TotalAmount
| FROM VtAmountsByCounterparties | WHERE VtAmountsByCounterparties.TotalAmount> 100000";
5. Trabaja por paquetes
Si necesita procesar un millón de registros, no los cargue todos a la vez. Procese los datos en porciones de 1000-10000 registros.
СчётчикПорции = 0;
РазмерПорции = 5000;
Пока Истина Цикл
Запрос.Текст =
"SELECT FIRST " + РазмерПорции + "
| Link
|FROM Reference Book.Nomenclature
| WHERE Link> & LastLink | SORT BY Link";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
// Procesando la porción
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Procesamiento del elemento
ПоследняяСсылка = Выборка.Ссылка;
КонецЦикла;
КонецЦикла;6. Utiliza correctamente los registros de acumulación
Los registros de acumulación son una herramienta poderosa para trabajar con datos cuantitativos. Permiten obtener rápidamente saldos y movimientos sin tener que volver a contar todo el historial de movimientos.
// Obtención de saldos en la fecha
Запрос.Текст =
"SELECT
| Remainders.Nomenclature,
| Remainders.QuantityRemainder
| FROM AccumulationRegister. GoodsInWarehouses. Remains (& Date) AS Remains";7. Optimiza las combinaciones de tablas
Cuando se utilizan combinaciones (JOIN) en una consulta, el orden y el tipo de combinación son importantes. Primero, conecta las tablas con el menor número de registros.
Consejos prácticos
Analiza los planes de consulta. En la consola de consultas de 1C, puedes ver exactamente cómo se ejecuta la consulta y dónde se producen los cuellos de botella.
Utilice las mediciones de rendimiento. Las herramientas integradas de 1C te permiten encontrar operaciones lentas. ¡No adivines, mide!
Evite las consultas anidadas. La mayoría de las veces, se pueden reemplazar por combinaciones o tablas temporales con un mejor rendimiento.
Almacena en caché los datos inmutables. Si los datos cambian raramente, guárdelos en las variables del módulo o utilice registros de información con la posibilidad de almacenamiento en caché.
Errores frecuentes
Obtener todos los campos a través de "SELECCIONAR *" en lugar de enumerar explícitamente los necesarios
Uso de cálculos complejos en condiciones WHERE en lugar de cálculo previo
Ausencia de condiciones de filtrado cuando se puede limitar la selección
Múltiples llamadas a la base de datos en lugar de una única solicitud por lotes
Conclusión
Trabajar con big data en 1C requiere una comprensión de los principios de la base de datos y las consultas. Las reglas básicas son simples: minimiza el número de llamadas a la base de datos, usa consultas en lugar de bucles, selecciona solo los datos necesarios y usa las herramientas correctas para las tareas correctas.
Recuerda: la optimización no es una complicación prematura del código, sino un diseño competente desde el principio. El hábito de escribir consultas efectivas le ahorrará horas de depuración y semanas de optimización en el futuro.
🚀 ¿Quieres saber más?
Puedes estudiar este y muchos otros temas en Codice — ¡nuestra plataforma para desarrolladores principiantes! Hemos creado cursos estructurados que te ayudarán a dominar el desarrollo desde cero hasta un nivel seguro.
Y también tenemos un canal de Telegram genial con una comunidad amistosa, donde desarrolladores experimentados ayudan a los principiantes, comparten sus experiencias y discuten temas de programación actuales.
