Ordenar resultados de consultas. Pequeños trucos de grandes consultas Obteniendo el valor de un campo de tipo complejo usando un punto

El lenguaje de consulta en 1C 8 es un análogo simplificado del conocido "lenguaje de programación estructurado" (como se le llama más a menudo SQL). Pero en 1C se usa solo para leer datos; un modelo de datos de objetos se usa para cambiar datos.

Otra diferencia interesante es la sintaxis rusa. Aunque en realidad puedes utilizar construcciones en inglés.

Solicitud de ejemplo:

ELEGIR
Bancos.Nombre,
Bancos.CuentaCorresponsal
DE
Directorio.Bancos CÓMO Bancos

Esta solicitud nos permitirá ver información sobre el nombre y cuenta corresponsal de todos los bancos existentes en la base de datos.

El lenguaje de consulta es la forma más sencilla y eficaz de obtener información. Como puede verse en el ejemplo anterior, en el lenguaje de consulta es necesario utilizar nombres de metadatos (esta es una lista de objetos del sistema que componen la configuración, es decir, directorios, documentos, registros, etc.).

Descripción de las construcciones del lenguaje de consulta.

Estructura de consulta

Para obtener datos, basta con utilizar las construcciones "SELECT" y "FROM". La solicitud más simple se ve así:

SELECCIONAR * DE Directorios.Nomenclatura

Donde "*" significa seleccionar todos los campos de la tabla y Directorios.Nomenclatura: el nombre de la tabla en la base de datos.

Veamos un ejemplo más complejo y general:

ELEGIR
<ИмяПоля1>CÓMO<ПредставлениеПоля1>,
Suma(<ИмяПоля2>) CÓMO<ПредставлениеПоля2>
DE
<ИмяТаблицы1>CÓMO<ПредставлениеТаблицы1>
<ТипСоединения>COMPUESTO<ИмяТаблицы2>CÓMO<ПредставлениеТаблицы2>
POR<УсловиеСоединениеТаблиц>

DÓNDE
<УсловиеОтбораДанных>

AGRUPAR POR
<ИмяПоля1>

ORDENAR POR
<ИмяПоля1>

RESULTADOS
<ИмяПоля2>
POR
<ИмяПоля1>

En esta consulta, seleccionamos los datos de los campos “FieldName1” y “FieldName1” de las tablas “TableName1” y “TableName”, asignamos sinónimos a los campos usando el operador “HOW” y los conectamos según una determinada condición “ Condición de conexión de tabla”.

De los datos recibidos, seleccionamos solo los datos que cumplen con la condición de "DÓNDE" "Condición de selección de datos". A continuación, agrupamos la solicitud por el campo "Nombre de campo1", mientras sumamos "Nombre de campo2". “Nombre de campo1” y el campo final “Nombre de campo2”.

El último paso es ordenar la solicitud utilizando la construcción ORDER BY.

Diseños generales

Consideremos las estructuras generales del lenguaje de consulta 1C 8.2.

PRIMEROnorte

Con este operador, puede obtener el número n de primeros registros. El orden de los registros está determinado por el orden en la consulta.

SELECCIONA LOS PRIMEROS 100
Bancos.Nombre,
Bancos Código AS BIC
DE
Directorio.Bancos CÓMO Bancos
ORDENAR POR
Bancos.Nombre

La solicitud recibirá las primeras 100 entradas del directorio “Bancos”, ordenadas alfabéticamente.

PERMITIDO

Este diseño es relevante para trabajar con el mecanismo. La esencia del mecanismo es restringir la lectura (y otras acciones) a los usuarios de registros específicos en una tabla de base de datos, y no de la tabla en su conjunto.

Si un usuario intenta utilizar una consulta para leer registros a los que no puede acceder, recibirá un mensaje de error. Para evitar esto, debe utilizar la construcción "PERMITIDO", es decir, la solicitud leerá solo los registros que le estén permitidos.

SELECCIONAR PERMITIDO
Repositorio de Información Adicional.
DE
Directorio.Repositorio de Información Adicional

VARIOS

El uso de "DIFERENTE" evitará que líneas duplicadas ingresen al resultado de la consulta 1C. La duplicación significa que todos los campos de la solicitud coinciden.

SELECCIONA LOS PRIMEROS 100
Bancos.Nombre,
Bancos Código AS BIC
DE
Directorio.Bancos CÓMO Bancos

Mesa vacía

Esta construcción rara vez se utiliza para combinar consultas. Al unirse, es posible que deba especificar una tabla anidada vacía en una de las tablas. El operador "EmptyTable" es perfecto para esto.

Ejemplo de ayuda de 1C 8:

SELECCIONE Enlace.Número, TABLA VACÍA.(Nº, Artículo, Cantidad) COMO Composición
DESDE Documento.Factura de Gastos
COMBINA TODO
SELECCIONAR Enlace.Número, Contenido.(Número de Línea, Producto, Cantidad)
DESDE Documento.Factura Documento.Factura.Composición.*

ES NULO

Una característica muy útil que te permite evitar muchos errores. YesNULL() le permite reemplazar el valor NULL por el deseado. Se utiliza muy a menudo para comprobar la presencia de un valor en tablas unidas, por ejemplo:

ELEGIR
Enlace de referencia de nomenclatura,
IsNULL(Artículo restante.Cantidad restante,0) COMO Cantidad restante
DE


Se puede utilizar de otras maneras. Por ejemplo, si para cada fila no se sabe en qué tabla existe el valor:

ISNULL(Fecha de recepción de factura, Fecha de emisión de factura)

CÓMO es un operador que nos permite asignar un nombre (sinónimo) a una tabla o campo. Vimos un ejemplo de uso arriba.

Estas construcciones son muy similares: le permiten obtener una representación en cadena del valor deseado. La única diferencia es que REPRESENTATION convierte cualquier valor a un tipo de cadena, mientras que REPRESENTATIONREF convierte solo valores de referencia. Se recomienda utilizar la REPRESENTACIÓN DE REFERENCIA en consultas del sistema de composición de datos para optimización, a menos, por supuesto, que se planee utilizar el campo de datos de referencia en las selecciones.

ELEGIR
Ver(Enlace), //cadena, por ejemplo “Informe anticipado No. 123 del 10/10/2015
Ver(DeletionMark) AS DeleteMarkText, //cadena, “Sí” o “No”
ViewReferences(DeletionMark) AS DeleteMarkBoolean //booleano, verdadero o falso
DE
Documento.Informe Anticipado

EXPRESAR

Express le permite convertir valores de campo al tipo de datos deseado. Puede convertir un valor a un tipo primitivo o a un tipo de referencia.

Express para un tipo de referencia se utiliza para restringir los tipos de datos solicitados en campos de un tipo complejo, a menudo utilizado para optimizar el rendimiento del sistema. Ejemplo:

EXPRESS(CostoTabla.Subconto1 Directorio AS.Elementos de costo).Tipo de actividadParaCostosContablesImpuestos

Para tipos primitivos, esta función se usa a menudo para limitar la cantidad de caracteres en campos de longitud ilimitada (dichos campos no se pueden comparar con). Para evitar el error " Parámetros no válidos en la operación de comparación. No se pueden comparar campos
longitud ilimitada y campos de tipos incompatibles
", debe expresar dichos campos de la siguiente manera:

EXPRESS(Comentario AS Line(150))

DIFERENCIAFECHA

Obtenga 267 lecciones en video sobre 1C gratis:

Un ejemplo de uso de IS NULL en una solicitud 1C:

ESCOGE DE
Árbitro
CONEXIÓN IZQUIERDA RegistrarAcumulaciones.ProductosEnAlmacén.Restante COMO Producto Restante
Nomenclatura de softwareRef.Link = Productos vendidosComitésRemains.Nomenclature
DONDE NO Los productos restantes. La cantidad restante ES NULA

El tipo de datos en una consulta se puede determinar usando las funciones TYPE() y VALUETYPE(), o usando el operador lógico REFERENCIA. Las dos funciones son similares.

Valores predefinidos

Además de utilizar parámetros pasados ​​en consultas en el lenguaje de consulta 1C, puede utilizar valores predefinidos o . Por ejemplo, transferencias, directorios predefinidos, planes de cuentas, etc. Para ello, se utiliza la construcción "Value()".

Ejemplo de uso:

DONDE Nomenclatura.Tipo de Nomenclatura = Valor(Directorio.Tipos de Nomenclatura.Producto)

DONDE Contrapartes.Tipo de Información de Contacto = Valor(Enumeración.Tipos de Información de Contacto.Teléfono)

DONDE Saldos de cuentas. Cuenta contable = Valor (Plan de cuentas. Ganancias. Pérdidas de ganancias)

Conexiones

Hay 4 tipos de conexiones: IZQUIERDA, BIEN, COMPLETO, INTERNO.

CONEXIÓN IZQUIERDA y DERECHA

Las uniones se utilizan para vincular dos tablas según una condición específica. Característica cuando UNIRSE A LA IZQUIERDA es que tomamos la primera tabla especificada en su totalidad y vinculamos condicionalmente la segunda tabla. Los campos de la segunda tabla que no pudieron estar vinculados por condición se completan con el valor NULO.

Por ejemplo:

Devolverá la tabla completa de Contrapartes y completará el campo “Banco” solo en aquellos lugares donde se cumpla la condición “Contrapartes.Nombre = Bancos.Nombre”. Si no se cumple la condición, el campo Banco se establecerá en NULO.

ÚNETE DERECHO en lenguaje 1C absolutamente similar conexión IZQUIERDA, con la excepción de una diferencia: en DERECHO DE CONEXIÓN La tabla "principal" es la segunda, no la primera.

CONEXIÓN COMPLETA

CONEXIÓN COMPLETA se diferencia de izquierda y derecha en que muestra todos los registros de dos tablas y conecta solo aquellos que puede conectar por condición.

Por ejemplo:

DE

CONEXIÓN COMPLETA
Directorio.Bancos CÓMO Bancos

POR

El lenguaje de consulta devolverá ambas tablas completamente solo si se cumple la condición para unir los registros. A diferencia de una unión izquierda/derecha, es posible que NULL aparezca en dos campos.

UNIR INTERNAMENTE

UNIR INTERNAMENTE se diferencia del completo en que muestra solo aquellos registros que podrían conectarse según una condición determinada.

Por ejemplo:

DE
Directorio de Contrapartes AS Clientes.

UNIR INTERNAMENTE
Directorio.Bancos CÓMO Bancos

POR
Clientes.Nombre = Bancos.Nombre

Esta consulta devolverá sólo filas en las que el banco y la contraparte tengan el mismo nombre.

Asociaciones

Las construcciones JOIN y JOIN ALL combinan dos resultados en uno. Aquellos. el resultado de realizar dos se “fusionará” en uno, común.

Es decir, el sistema funciona exactamente igual que los normales, solo que para una tabla temporal.

Cómo utilizar ÍNDICE POR

Sin embargo, conviene tener en cuenta un punto. La creación de un índice en una tabla temporal también lleva tiempo. Por lo tanto, es aconsejable utilizar la construcción " " sólo si se sabe con seguridad que habrá más de 1 o 2 registros en la tabla temporal. De lo contrario, el efecto puede ser el contrario: el rendimiento de los campos indexados no compensa el tiempo necesario para crear el índice.

ELEGIR
Tipos de cambio Última sección transversal Moneda AS Moneda,
Tipos de cambio Última sección transversal.
Tipos de cambio PUT
DE
Registro de información.Tipos de moneda.Último segmento(&Período,) AS Tipos de cambioÚltimo segmento
ÍNDICE POR
Divisa
;
ELEGIR
PreciosNomenclatura.Nomenclatura,
PreciosNomenclaturas.Precio,
PreciosNomenclaturas.Moneda,
Tipos de cambio.Tasa
DE
Registro de información.Nomenclatura Precios.Último tramo(&Periodo,
Nomenclatura B (&Nomenclatura) AND PriceType = &PriceType) AS PriceNomenclature
LEFT JOIN Tipos de cambio AS Tipos de cambio
Precios de softwareNomenclaturas.Moneda = Tipos de cambio.Moneda

Agrupamiento

El lenguaje de consulta 1C le permite utilizar funciones agregadas especiales al agrupar los resultados de la consulta. La agrupación también se puede utilizar sin funciones agregadas para "eliminar" duplicados.

Existen las siguientes funciones:

Importe, Cantidad, Número de diferentes, Máximo, Mínimo, Promedio.

Ejemplo 1:

ELEGIR
Ventas de Bienes y Servicios Nomenclatura,
SUMA(Ventas de BienesServiciosBienes.Cantidad) COMO Cantidad,
SUMA(Ventas de BienesServiciosBienes.Monto) COMO Monto
DE

AGRUPAR POR
Ventas de Bienes y Servicios Nomenclatura.

La solicitud recibe todas las líneas con mercancías y las resume por cantidad y montos por artículo.

Ejemplo No. 2

ELEGIR
Código.de.bancos,
CANTIDAD (DIFERENTES Bancos.Enlace) COMO Número de duplicados
DE
Directorio.Bancos CÓMO Bancos
AGRUPAR POR
Código.de.bancos

Este ejemplo mostrará una lista de BIC en el directorio "Bancos" y mostrará cuántos duplicados existen para cada uno de ellos.

Resultados

Los resultados son una forma de obtener datos de un sistema con una estructura jerárquica. Las funciones agregadas se pueden utilizar para campos de resumen, al igual que para agrupaciones.

Una de las formas más populares de utilizar los resultados en la práctica es la cancelación de bienes por lotes.

ELEGIR




DE
Documento de Venta de Bienes y Servicios. Bienes CÓMO Venta de Bienes y Servicios.
ORDENAR POR

RESULTADOS
SUMA(Cantidad),
SUMA(Suma)
POR
Nomenclatura

El resultado de la consulta será el siguiente jerárquico:

Resultados generales

Si necesita obtener totales para todos los "totales", utilice el operador "GENERAL".

ELEGIR
Ventas de Bienes y Servicios Nomenclatura AS Nomenclatura,
Ventas de Bienes y Servicios Bienes Enlace AS Documento,
Ventas de Bienes y Servicios Bienes Cantidad AS Cantidad,
Ventas de Bienes y Servicios Bienes Importe AS Importe.
DE
Documento de Venta de Bienes y Servicios. Bienes CÓMO Venta de Bienes y Servicios.
ORDENAR POR
Ventas de Bienes y Servicios Fecha Enlace.
RESULTADOS
SUMA(Cantidad),
SUMA(Suma)
POR
SON COMUNES,
Nomenclatura

Como resultado de ejecutar la solicitud, obtenemos el siguiente resultado:

En el cual 1 nivel de agrupación es la agregación de todos los campos necesarios.

arreglando

El operador ORDER BY se utiliza para ordenar el resultado de una consulta.

La clasificación por tipos primitivos (cadena, número, booleano) sigue las reglas habituales. Para los campos de tipo de referencia, la clasificación se realiza según la representación interna del enlace (el identificador único), en lugar de por código o representación de referencia.

ELEGIR

DE
Directorio.Nomenclatura AS Nomenclatura
ORDENAR POR
Nombre

La solicitud mostrará una lista de nombres en el directorio de nomenclatura, ordenados alfabéticamente.

Pedido automático

El resultado de una consulta sin ordenar es un conjunto de filas presentadas de forma caótica. Los desarrolladores de la plataforma 1C no garantizan que las filas se muestren en la misma secuencia al ejecutar consultas idénticas.

Si necesita mostrar los registros de la tabla en un orden constante, debe utilizar la construcción Orden automático.

ELEGIR
Nomenclatura.Nombre AS Nombre
DE
Directorio.Nomenclatura AS Nomenclatura
PEDIDO AUTOMÁTICO

Mesas virtuales

Las tablas virtuales en 1C son una característica única del lenguaje de consulta 1C que no se encuentra en otras sintaxis similares. Una mesa virtual es una forma rápida de obtener información de perfil de los registros.

Cada tipo de registro tiene su propio conjunto de tablas virtuales, que pueden diferir según la configuración del registro.

  • corte del primero;
  • corte de este último.
  • sobras;
  • revoluciones;
  • saldos y facturación.
  • movimientos desde subconto;
  • revoluciones;
  • velocidad Dt Kt;
  • sobras;
  • saldos y facturación
  • subconto.
  • base;
  • datos gráficos;
  • período de validez real.

Para el desarrollador de la solución, los datos se toman de una tabla (virtual), pero en realidad la plataforma 1C toma de muchas tablas y las transforma al formato requerido.

ELEGIR
Productos en Almacenes Restos y Rotación.
Productos en almacenes restantes y volumen de negocios. Cantidad inicial restante,
ProductosEnAlmacenesRemainsAndTurnover.CantidadRotación,
GoodsInWarehousesRemainsAndTurnover.CantidadEntrante,
Productos En Almacenes Restos Y Facturación.CantidadConsumo,
ProductosEnAlmacenesRestantesYFacturación.CantidadFinalRestante
DE
RegistrarAcumulaciones.BienesEnAlmacén.RemainsAndTurnover COMO BienesEnAlmacénRemainsAndTurnover

Esta consulta le permite recuperar rápidamente una gran cantidad de datos.

Opciones de mesa virtual

Un aspecto muy importante al trabajar con tablas virtuales es el uso de parámetros. Los parámetros de la tabla virtual son parámetros especializados para selección y configuración.

Para este tipo de tablas, se considera incorrecto utilizar la selección en la construcción "DÓNDE". Además del hecho de que la consulta no es óptima, es posible recibir datos incorrectos.

Un ejemplo de uso de estos parámetros:

Registro de Acumulaciones de Mercancías en Almacenes y Rotaciones (& Inicio del Período, & Fin del Período, Mes, Movimientos y Fronteras del Período, Nomenclatura = & Nomenclatura Requerida).

Algoritmo para tablas virtuales

Por ejemplo, la tabla virtual más utilizada del tipo “Restos” almacena datos de dos tablas físicas: saldos y movimientos.

Cuando se utiliza una mesa virtual, el sistema realiza las siguientes manipulaciones:

  1. Obtenemos el valor calculado más cercano en términos de fecha y medidas en la tabla de totales.
  2. “Sumamos” el importe de la tabla de movimientos al importe de la tabla de totales.


Acciones tan simples pueden mejorar significativamente el rendimiento del sistema en su conjunto.

Usando el generador de consultas

Consultor de construcción– una herramienta integrada en el sistema 1C Enterprise que facilita enormemente el desarrollo de consultas de bases de datos.

El generador de consultas tiene una interfaz bastante sencilla e intuitiva. Sin embargo, veamos con más detalle el uso del constructor de consultas.

El constructor de texto de consulta se inicia desde el menú contextual (botón derecho del mouse) en el lugar deseado en el código del programa.

Descripción del constructor de solicitudes 1C

Veamos cada pestaña del diseñador con más detalle. La excepción es la pestaña Constructor, que es un tema para otra discusión.

Pestaña Tablas y campos

Esta pestaña especifica la fuente de datos y los campos que deben mostrarse en el informe. En esencia, aquí se describen las construcciones SELECT.. FROM.

La fuente puede ser una tabla de base de datos física, una tabla de registro virtual, tablas temporales, consultas anidadas, etc.

En el menú contextual de las tablas virtuales, puede configurar los parámetros de la tabla virtual:

Pestaña de conexiones

La pestaña se utiliza para describir conexiones de varias tablas y crea construcciones con la palabra CONEXIÓN.

Pestaña de agrupación

En esta pestaña, el sistema le permite agrupar y resumir los campos requeridos del resultado de la tabla. Describe el uso de las construcciones GRUPO POR, SUMA, MÍNIMO, PROMEDIO, MÁXIMO, CANTIDAD, NÚMERO DE DIFERENTES.

Pestaña de condiciones

Responsable de todo lo que viene en el texto de la solicitud después de la construcción WHERE, es decir, de todas las condiciones impuestas a los datos recibidos.

Lengüeta avanzada

Pestaña Además repleto de todo tipo de parámetros que son muy importantes. Veamos cada una de las propiedades.

Agrupamiento Seleccionar registros:

  • Primero N– un parámetro que devuelve solo N registros a la consulta (el PRIMER operador)
  • Sin duplicados– asegura la unicidad de los registros recibidos (operador DIFERENTE)
  • Permitido– le permite seleccionar solo aquellos registros que el sistema le permite seleccionar teniendo en cuenta (construcción PERMITIDA)

Agrupamiento Tipo de solicitud determina qué tipo de consulta será: recuperar datos, crear una tabla temporal o destruir una tabla temporal.

Debajo hay una bandera Bloquear los datos recibidos para su posterior modificación. Le permite habilitar la capacidad de configurar el bloqueo de datos, lo que garantiza la seguridad de los datos desde el momento en que se leen hasta que se modifican (relevante solo para el modo de bloqueo automático, diseño PARA CAMBIO).

Ficha Uniones/Alias

En esta pestaña del diseñador de consultas, puede configurar la capacidad de unir diferentes tablas y alias (la construcción CÓMO). Las tablas están indicadas en el lado izquierdo. Si configura las banderas frente a la mesa, se utilizará la construcción UNITE; de lo contrario, UNITE ALL (diferencias entre los dos métodos). En el lado derecho se indica la correspondencia de campos en diferentes tablas; si no se especifica la correspondencia, la consulta devolverá NULL.

Pestaña de pedido

Esto especifica el orden en que se ordenan los valores (ORDER BY): descendente (DESC) o ascendente (ASC).

También hay una bandera interesante: Pedido automático(en la solicitud - PEDIDO AUTOMÁTICO). De forma predeterminada, el sistema 1C muestra los datos en un orden "caótico". Si configura esta bandera, el sistema ordenará los datos por datos internos.

Pestaña Consultar lote

En la pestaña del diseñador de consultas, puede crear otras nuevas y también utilizarlas como navegación. En el texto de la solicitud, los paquetes están separados por el símbolo ";" (coma).

Botón “Consulta” en el diseñador de consultas

En la esquina inferior izquierda del diseñador de solicitudes hay un botón Solicitar, con el que puede ver el texto de la solicitud en cualquier momento:

En esta ventana, puede realizar ajustes a la solicitud y ejecutarla.


Usando la consola de consultas

Query Console es una forma sencilla y cómoda de depurar consultas complejas y obtener información rápidamente. En este artículo, intentaré describir cómo usar Query Console y proporcionaré un enlace para descargar Query Console.

Echemos un vistazo más de cerca a esta herramienta.

Descargar la consola de consultas 1C

En primer lugar, para comenzar a trabajar con la consola de consulta, debe descargarla desde algún lugar. Los tratamientos suelen dividirse en dos tipos: formas controladas y convencionales (o, a veces, se denominan 8.1 y 8.2/8.3).

Intenté combinar estas dos vistas en un solo procesamiento: el formulario deseado se abre en el modo operativo deseado (en el modo administrado, la consola solo funciona en modo grueso).

Descripción de la consola de consulta 1C

Comencemos mirando la consola de consultas con una descripción del panel de procesamiento principal:

En el encabezado de la consola de consultas, puede ver el tiempo de ejecución de la última consulta con una precisión de milisegundos, esto le permite comparar diferentes diseños en términos de rendimiento.

El primer grupo de botones en la barra de comandos es responsable de guardar las consultas actuales en un archivo externo. Esto es muy conveniente; siempre puedes volver a escribir una solicitud compleja. O, por ejemplo, almacenar una lista de ejemplos típicos de determinados diseños.

A la izquierda, en el campo "Solicitud", puede crear nuevas solicitudes y guardarlas en una estructura de árbol. El segundo grupo de botones se encarga de gestionar la lista de solicitudes. Utilizándolo puede crear, copiar, eliminar y mover una solicitud.

  • Ejecutarpedido– ejecución y resultados simples
  • Ejecutar paquete– le permite ver todas las consultas intermedias en un lote de consultas
  • Ver tablas temporales– le permite ver los resultados que devuelven las consultas temporales en una tabla

Parámetros de solicitud:

Le permite configurar los parámetros actuales para la solicitud.

En la ventana de parámetros de consulta, es interesante lo siguiente:

  • Botón Obtener de la solicitud encuentra automáticamente todos los parámetros en la solicitud para comodidad del desarrollador.
  • Bandera Parámetros comunes para todas las solicitudes.– cuando está instalado, su procesamiento no borra los parámetros al pasar de una solicitud a otra en la lista general de solicitudes.

Establecer un parámetro con una lista de valores Es muy simple, simplemente al elegir un valor de parámetro, haga clic en el botón borrar valor (cruz), el sistema le pedirá que seleccione el tipo de datos, donde deberá seleccionar “Lista de valores”:

También en el panel superior hay un botón para abrir la configuración de la consola de consulta:

Aquí puede especificar parámetros para consultas de guardado automático y parámetros de ejecución de consultas.

El texto de la solicitud se ingresa en el campo de solicitud de la consola. Esto se puede hacer simplemente escribiendo una prueba de consulta o llamando a una herramienta especial: el diseñador de consultas.

El diseñador de consultas 1C 8 se llama desde el menú contextual (botón derecho del mouse) cuando hace clic en el campo de entrada:

Este menú también tiene funciones tan útiles como borrar o agregar saltos de línea (“|”) a la solicitud, o recibir el código de solicitud en esta conveniente forma:

Solicitud = Nueva Solicitud;
Solicitud.Texto = "
|SELECCIONAR
| Monedas.Enlace
|DESDE
| Directorio.Monedas AS Monedas”;
SolicitudResultado = Solicitud.Execute();

El campo inferior de la consola de consultas muestra el campo de resultado de la consulta, razón por la cual se creó este procesamiento:



Además, la consola de consultas, además de la lista, puede mostrar datos en forma de árbol, para consultas que contienen totales.

Optimización de consultas

Uno de los puntos más importantes para aumentar la productividad de 1C Enterprise 8.3 es mejoramientopeticiones. Este punto también es muy importante cuando pasando la certificación. A continuación, hablaremos sobre las razones típicas por las que el rendimiento de las consultas y los métodos de optimización no son óptimos.

Selecciones en una tabla virtual usando la construcción WHERE

Es necesario aplicar filtros a los detalles de la tabla virtual solo a través de los parámetros VT. Bajo ninguna circunstancia debe utilizar la construcción WHERE para seleccionar en una tabla virtual; esto es un error grave desde el punto de vista de la optimización. En el caso de seleccionar mediante DÓNDE, de hecho, el sistema recibirá TODOS los registros y solo entonces seleccionará los necesarios.

BIEN:

ELEGIR

DE
Registro de Acumulación. Liquidaciones mutuas con Participantes de Organizaciones.
,
Organización = &Organización
Y Individual = &Individual) CÓMO Liquidaciones mutuas con Participantes de Organizaciones Saldos

EQUIVOCADO:

ELEGIR
Liquidaciones mutuas con Participantes de Saldos de Organizaciones Monto Saldo.
DE
Registro de Acumulaciones Mutuas con Participantes de Organizaciones Saldos (,) CÓMO Mutuas Liquidaciones con Participantes de Organizaciones Saldos.
DÓNDE
Liquidaciones mutuas con Participantes de Organizaciones Saldos Organización = & Organización.
Y Liquidaciones mutuas con Participantes de Organizaciones Saldos Individual = &Individual.

Obtener el valor de un campo de tipo complejo usando un punto

Al recibir datos de tipo complejo en una consulta a través de un punto, el sistema conecta con una unión izquierda exactamente tantas tablas como tipos posibles haya en el campo del tipo complejo.

Por ejemplo, es muy indeseable para la optimización acceder al campo de registro: registrador. El registrador tiene un tipo de datos compuesto, entre los que se encuentran todos los tipos de documentos posibles que pueden escribir datos en el registro.

EQUIVOCADO:

ELEGIR
Conjunto de registros.Grabador.Fecha,
RecordSet.Cantidad
DE
RegistrarAcumulaciones.ProductosOrganizaciones AS SetRecords

Es decir, de hecho, dicha consulta accederá no a una tabla, sino a 22 tablas de bases de datos (este registro tiene 21 tipos de registradores).

BIEN:

ELEGIR
ELECCIÓN
CUANDO ProductosOrg.Registrar LINK Documento.Ventas de Productos y Servicios
ENTONCES EXPRESS(ProductsOrg.Registrar AS Document.Venta de BienesServicios).Fecha
CUANDO GoodsOrg.Registrar LINK Documento.Recepción de BienesServicios
ENTONCES EXPRESS(GoodsOrg.Registrar AS Documento.Recepción de BienesServicios).Fecha
FINALIZAR COMO FECHA,
ProductosOrg.Cantidad
DE
RegistrarseAcumulaciones.Organizaciones de Bienes AS Organización de Bienes

O la segunda opción es agregar dicha información a los detalles, por ejemplo, en nuestro caso, agregando una fecha.

BIEN:

ELEGIR
ProductosOrganizaciones.Fecha,
ProductosOrganizaciones.Cantidad
DE
Registro de Acumulaciones de Bienes de Organizaciones AS Bienes de Organizaciones.

Subconsultas en una condición de unión

Para la optimización, es inaceptable utilizar subconsultas en condiciones de unión; esto ralentiza significativamente la consulta. Es aconsejable utilizar VT en tales casos. Para conectarse, debe utilizar solo metadatos y objetos VT, habiéndolos indexado previamente por campos de conexión.

EQUIVOCADO:

ELEGIR …

UNIRSE A LA IZQUIERDA (
SELECCIONE DE RegisterInformation.Limits
DÓNDE …
AGRUPAR POR...
) POR …

BIEN:

ELEGIR …
Límites de colocación
DESDE Registro de Información.Límites
DÓNDE …
AGRUPAR POR...
ÍNDICE POR...;

ELEGIR …
DE Documento. Ventas de bienes y servicios.
Límites de UNIÓN IZQUIERDA
POR …;

Unir registros con tablas virtuales

Hay situaciones en las que, al conectar una mesa virtual a otras, el sistema no funciona de forma óptima. En este caso, para optimizar el rendimiento de la consulta, puede intentar colocar la tabla virtual en una tabla temporal, sin olvidar indexar los campos unidos en la consulta de la tabla temporal. Esto se debe al hecho de que los VT a menudo están contenidos en varias tablas DBMS físicas, por lo que se compila una subconsulta para seleccionarlos y el problema resulta ser similar al punto anterior;

Usar selecciones basadas en campos no indexados

Uno de los errores más comunes al escribir consultas es utilizar condiciones en campos no indexados, esto contradice reglas de optimización de consultas. El DBMS no puede ejecutar una consulta de manera óptima si la consulta incluye una selección en campos no indexables. Si toma una tabla temporal, también necesita indexar los campos de conexión.

Debe haber un índice adecuado para cada condición. Un índice adecuado es aquel que satisface los siguientes requisitos:

  1. El índice contiene todos los campos enumerados en la condición.
  2. Estos campos se encuentran al principio del índice.
  3. Estas selecciones son consecutivas, es decir, los valores que no están involucrados en la condición de consulta no están "encajados" entre ellos.

Si el DBMS no selecciona los índices correctos, se escaneará toda la tabla; esto tendrá un impacto muy negativo en el rendimiento y puede provocar un bloqueo prolongado de todo el conjunto de registros.

Uso de OR lógico en condiciones

Eso es todo, este artículo cubrió los aspectos básicos de la optimización de consultas que todo experto de 1C debería conocer.

Un curso en vídeo gratuito muy útil sobre desarrollo y optimización de consultas. Lo recomiendo¡Para principiantes y más!

El lenguaje de consulta es uno de los mecanismos fundamentales de 1C 8.3 para desarrolladores. Mediante consultas, puede recuperar rápidamente cualquier dato almacenado en la base de datos. Su sintaxis es muy similar a SQL, pero existen algunas diferencias.

Las principales ventajas del lenguaje de consulta 1C 8.3 (8.2) sobre SQL:

  • desreferenciar campos de referencia (remitir uno o más puntos a detalles del objeto);
  • trabajar con resultados es muy conveniente;
  • la capacidad de crear tablas virtuales;
  • la solicitud puede redactarse tanto en inglés como en ruso;
  • capacidad de bloquear datos para evitar puntos muertos.

Desventajas del lenguaje de consulta en 1C:

  • a diferencia de SQL, en 1C las consultas no permiten cambiar datos;
  • falta de procedimientos almacenados;
  • imposibilidad de convertir una cadena en un número.

Echemos un vistazo a nuestro mini tutorial sobre las construcciones básicas del lenguaje de consulta 1C.

Debido a que las consultas en 1C solo le permiten recibir datos, cualquier consulta debe comenzar con la palabra "SELECCIONAR". Tras este comando se indican los campos de los que se deben obtener datos. Si especifica “*”, se seleccionarán todos los campos disponibles. Después de la palabra “DESDE”, se indica el lugar desde donde se seleccionarán los datos (documentos, registros, directorios, etc.).

En el ejemplo que se analiza a continuación, los nombres de toda la nomenclatura se seleccionan del directorio "Nomenclatura". Después de la palabra "CÓMO", se indican los alias (nombres) de tablas y campos.

ELEGIR
Nomenclatura Nombre AS Nombre de la Nomenclatura.
DE
Directorio.Nomenclatura AS Nomenclatura

Junto al comando "SELECCIONAR" puede especificar palabras clave:

  • VARIOS. La consulta seleccionará solo filas que difieran en al menos un campo (sin duplicados).
  • Primero N, Dónde norte– el número de filas desde el principio del resultado que deben seleccionarse. Muy a menudo, esta construcción se utiliza junto con la clasificación (ORDER BY). Por ejemplo, cuando necesita seleccionar una determinada cantidad de documentos recientes por fecha.
  • PERMITIDO. Este diseño le permite seleccionar de la base de datos solo aquellos registros que están disponibles para el usuario actual. Según el uso de esta palabra clave, el usuario recibirá un mensaje de error al intentar consultar registros a los que no tiene acceso.

Estas palabras clave se pueden utilizar juntas o por separado.

PARA CAMBIAR

Esta propuesta bloquea datos para evitar conflictos mutuos. Los datos bloqueados no se leerán desde otra conexión hasta que finalice la transacción. En esta cláusula, puede especificar tablas específicas que deben bloquearse. De lo contrario, todos serán bloqueados. El diseño es relevante sólo para el modo de bloqueo automático.

La mayoría de las veces, la cláusula "PARA CAMBIO" se utiliza al recibir saldos. Después de todo, cuando varios usuarios trabajan en el programa simultáneamente, mientras uno recibe saldos, otro puede cambiarlos. En este caso, el resto resultante ya no será correcto. Si bloquea los datos con esta propuesta, hasta que el primer empleado reciba el saldo correcto y realice todas las manipulaciones necesarias con él, el segundo empleado se verá obligado a esperar.

ELEGIR
Acuerdos mutuos.
Liquidaciones mutuas Importe de las liquidaciones mutuas Saldo
DE
Registro de Acumulaciones Mutuas con empleados Saldos AS Mutuas.
PARA CAMBIAR

DÓNDE

El diseño es necesario para imponer algún tipo de selección a los datos cargados. En algunos casos de obtención de datos de registros, es más razonable especificar las condiciones de selección en los parámetros de las tablas virtuales. Cuando se utiliza "DÓNDE", primero se recuperan todos los registros y solo después se aplica la selección, lo que ralentiza significativamente la consulta.

A continuación se muestra un ejemplo de una solicitud para obtener personas de contacto para un puesto específico. El parámetro de selección tiene el formato: &ParameterName (el nombre del parámetro es arbitrario).

SELECCIÓN (CASO)

El diseño le permite especificar condiciones directamente en el cuerpo de la solicitud.

En el siguiente ejemplo, el "Campo adicional" contendrá texto dependiendo de si el documento se publica o no:

ELEGIR
AdmisiónTiU.Link,
ELECCIÓN
CUÁNDO AdmisiónT&U.Realizada
ENTONCES “¡El documento ha sido aprobado!”
ELSE “El documento no fue publicado...”
FINALIZAR COMO campo adicional
DE
Documento de Recepción de Bienes y Servicios CÓMO Recepción T&C.

UNIRSE

Las uniones vinculan dos tablas según una condición de relación específica.

CONEXIÓN IZQUIERDA/DERECHA

La esencia de la unión IZQUIERDA es que la primera tabla especificada se toma en su totalidad y la segunda se vincula a ella de acuerdo con la condición de conexión. Si no hay registros correspondientes a la primera tabla en la segunda, entonces se sustituye NULL como sus valores. En pocas palabras, la tabla principal es la primera tabla especificada y los datos de la segunda tabla (si los hay) ya están sustituidos por sus datos.

Por ejemplo, es necesario obtener artículos de los documentos "Recepción de bienes y servicios" y precios del registro de información "Precios de artículos". En este caso, si no se encuentra el precio de cualquier posición, sustitúyalo por NULL. Se seleccionarán todos los artículos del documento independientemente de si tienen precio o no.

ELEGIR
Recibo y nomenclatura U.,
Precios.Precio
DE
Documento de Recepción de Bienes y Servicios. Recepción de Bienes y Especificaciones.
UNIÓN INTERNA RegisterInformation.PricesNomenclature.SliceLast AS Precios
Recibo de software&U.Nomenclatura = Precios.Nomenclatura

EN LA DERECHA todo es exactamente al revés.

CONEXIÓN COMPLETA

Este tipo de conexión se diferencia de las anteriores en que como resultado se devolverán todos los registros tanto de la primera tabla como de la segunda. Si no se encuentran registros en la primera o segunda tabla según la condición de enlace especificada, se devolverá NULL.

Cuando se utiliza una conexión completa en el ejemplo anterior, se seleccionarán todos los artículos del documento "Recepción de bienes y servicios" y todos los precios más recientes del registro "Precios de artículos". Los valores de los registros no encontrados tanto en la primera como en la segunda tabla serán iguales a NULL.

UNIR INTERNAMENTE

La diferencia entre INNER JOIN y FULL JOIN es que si no se encuentra un registro en al menos una de las tablas, la consulta no lo mostrará en absoluto. Como resultado, solo se seleccionarán aquellos artículos del documento “Recepción de bienes y servicios” para los cuales existan registros en el registro de información “Precios de artículos”, si en el ejemplo anterior reemplazamos “COMPLETO” por “INTERNO”.

AGRUPAR POR

La agrupación en consultas 1C le permite colapsar las filas de la tabla (campos de agrupación) de acuerdo con una determinada característica común (campos de agrupación). Los campos de agrupación solo se pueden mostrar utilizando funciones agregadas.

El resultado de la siguiente consulta será una lista de tipos de productos con precios máximos para ellos.

ELEGIR
,
MAX(Precio.Precio) COMO Precio
DE

AGRUPAR POR
Precios.Nomenclatura.Tipo de Nomenclatura

RESULTADOS

A diferencia de la agrupación, cuando se utilizan totales, se muestran todos los registros y se les agregan filas de totales. La agrupación muestra sólo registros generalizados.

Los resultados se pueden resumir para toda la tabla (usando la palabra clave “GENERAL”), para varios campos, para campos con una estructura jerárquica (palabras clave “JERARQUÍA”, “SÓLO JERARQUÍA”). Al resumir los resultados, no es necesario utilizar funciones agregadas.

Veamos un ejemplo similar al anterior usando agrupación. En este caso, el resultado de la consulta devolverá no sólo campos agrupados, sino también registros detallados.

ELEGIR
Precios.Nomenclatura.Tipo de Nomenclatura AS Tipo de Nomenclatura,
Precios.Precio AS Precio
DE
Registro de Información de Precios de Nomenclatura. Instantánea de los Últimos Precios de AS.
RESULTADOS
MÁXIMO(Precio)
POR
TipoNomenclatura

TENIENDO

Este operador es similar al operador WHERE, pero se usa solo para funciones agregadas. El resto de campos, excepto los utilizados por este operador, deben estar agrupados. El operador WHERE no es aplicable a funciones agregadas.

En el siguiente ejemplo, los precios máximos de un artículo se seleccionan si superan 1000, agrupados por tipo de artículo.

ELEGIR

MAX(Precio.Precio) COMO Precio
DE
Registro de Información de Precios de Nomenclatura. Instantánea de los Últimos Precios de AS.
AGRUPAR POR
Precios.Nomenclatura.Tipo de Nomenclatura
TENIENDO
MÁXIMO(Precios.Precio) > 1000

ORDENAR POR

El operador ORDER BY ordena el resultado de una consulta. Para garantizar que los registros se muestren en un orden coherente, se utiliza ORDEN AUTOMÁTICO. Los tipos primitivos se clasifican según las reglas habituales. Los tipos de referencia están ordenados por GUID.

Un ejemplo de cómo obtener una lista de empleados ordenados por nombre:

ELEGIR
Empleados.Nombre AS Nombre
DE
Directorio.Empleados CÓMO Empleados
ORDENAR POR
Nombre
PEDIDO AUTOMÁTICO

Otras construcciones del lenguaje de consulta 1C

  • COMBINAR– resultados de dos consultas en una.
  • COMBINA TODO– similar a COMBINAR, pero sin agrupar filas idénticas.
  • MESA VACÍA– a veces se utiliza al unir consultas para especificar una tabla anidada vacía.
  • LUGAR– crea una tabla temporal para optimizar consultas complejas de 1C. Estas solicitudes se denominan solicitudes por lotes.

Funciones del lenguaje de consulta

  • SUBCADE trunca una cadena desde una posición especificada hasta un número específico de caracteres.
  • AÑO...SEGUNDO le permite obtener el valor seleccionado de un tipo numérico. El parámetro de entrada es la fecha.
  • INICIO DEL PERIODO y FINAL DEL PERIODO Se utiliza cuando se trabaja con fechas. Como parámetro adicional se indica el tipo de periodo (DÍA, MES, AÑO, etc.).
  • AGREGAR FECHA le permite sumar o restar un tiempo específico de un cierto tipo de una fecha (SEGUNDO, MINUTO, DÍA, etc.).
  • DIFERENCIAFECHA determina la diferencia entre dos fechas, indicando el tipo de valor de salida (DÍA, AÑO, MES, etc.).
  • ES NULO reemplaza el valor faltante con la expresión especificada.
  • REPRESENTACIÓN y ENLACES DE REPRESENTACIÓN obtiene una representación de cadena del campo especificado. Aplicar a cualquier valor y solo a los de referencia, respectivamente.
  • TIPO, TIPO VALORES se utilizan para determinar el tipo de parámetro de entrada.
  • ENLACE es un operador de comparación lógica para el tipo de valor de atributo.
  • EXPRESAR se utiliza para convertir un valor al tipo deseado.
  • FECHA Y HORA obtiene un valor de tipo "Fecha" a partir de valores numéricos (Año, Mes, Día, Hora, Minuto, Segundo).
  • SIGNIFICADO en una solicitud 1C se utiliza para indicar valores predefinidos: directorios, enumeraciones, planes para tipos de características. Ejemplo de uso: " Donde Persona Jurídica = Valor(Enumeración. Persona Jurídica. Individuo)«.

Consultor de construcción

Para crear consultas con 1C existe un mecanismo integrado muy conveniente: el diseñador de consultas. Contiene las siguientes pestañas principales:

  • “Tablas y campos”: contiene los campos que deben seleccionarse y sus fuentes.
  • “Conexiones”: describe las condiciones para la estructura CONEXIÓN.
  • "Agrupación": contiene una descripción de las estructuras de agrupación y los campos sumados en función de ellas.
  • “Condiciones” - es responsable de seleccionar los datos en la solicitud.
  • "Avanzado": parámetros de consulta adicionales, como palabras clave para el comando "SELECT", etc.
  • “Uniones/Alias”: se indican las posibilidades de unir tablas y se especifican los alias (la construcción “CÓMO”).
  • “Pedido” se encarga de ordenar el resultado de las consultas.
  • “Totales”: similar a la pestaña “Agrupación”, pero se utiliza para la construcción “TOTALES”.

El texto de la solicitud en sí se puede ver haciendo clic en el botón "Solicitar" en la esquina inferior izquierda. De esta forma, se puede corregir manualmente o copiar.


Solicitar consola

Para ver rápidamente el resultado de una consulta en modo empresarial o depurar consultas complejas, utilice . Contiene el texto de la solicitud, establece los parámetros y muestra el resultado.

Puede descargar la consola de consultas en el disco ITS o mediante .

/
Implementación del procesamiento de datos.

Ordenar resultados de consultas

1.1. Si el algoritmo para procesar los resultados de la consulta depende del orden de los registros en la consulta o si el resultado del procesamiento de la consulta se presenta al usuario de una forma u otra, entonces la oración debe usarse en el texto de la consulta. ORDENAR POR. En ausencia de expresión ORDENAR POR No se pueden hacer suposiciones sobre el orden en que aparecerán los registros en los resultados de la consulta.

Ejemplos típicos de problemas que pueden ocurrir:

  • diferente secuencia de filas en la sección tabular al completar según los resultados de la consulta;
  • orden diferente de salida de datos (filas, columnas) en los informes;
  • llenado diferente de movimientos de documentos en función de los resultados de la consulta (*).

Aumenta la probabilidad de que se produzcan resultados diferentes al realizar las mismas acciones.

  • al transferir una base de información a otro DBMS
  • al cambiar la versión del DBMS
  • al cambiar los parámetros DBMS

* Nota: ordenar los resultados de consultas que generan movimientos se justifica solo si el pedido es parte del algoritmo de generación de movimientos (por ejemplo, cancelar los saldos de lotes de mercancías mediante FIFO). En otros casos, los registros no se deben ordenar, ya que un orden adicional creará una carga excesiva en el DBMS.

1.2. Si los resultados de una consulta deben mostrarse al usuario de alguna manera, entonces

  • es necesario organizar los resultados de dichas consultas por campos de tipos primitivos;
  • El orden por campos de tipos de referencia debe reemplazarse por el orden por representaciones de cadenas de estos campos.

De lo contrario, el orden de las líneas le parecerá aleatorio (inexplicable) al usuario.

Ver también: Ordenar filas de la tabla de valores

1.3. Sin ofertas ORDENAR POR justificado sólo en los casos en que

  • el algoritmo para procesar los resultados de la consulta no se basa en un orden específico de registros
  • el resultado del procesamiento de la solicitud ejecutada no se muestra al usuario
  • el resultado de la consulta es obviamente un registro

Uso compartido con VARIOS diseños

2. Si la solicitud utiliza la construcción. VARIOS, el pedido debe realizarse únicamente por los campos incluidos en la selección (en la sección ELEGIR).

Este requisito está asociado con la siguiente característica de ejecución de consultas: los campos de ordenación están incluidos implícitamente en los campos de selección, lo que a su vez puede llevar a la aparición de varias filas con los mismos valores de los campos de selección como resultado de la consulta.

Restricciones en el uso de la construcción AUTO ORDER.

3. Uso del diseño PRIMERO junto con la estructura PEDIDO AUTOMÁTICO prohibido.

En otros casos, el diseño PEDIDO AUTOMÁTICO Tampoco se recomienda su uso, ya que el desarrollador no controla qué campos se utilizarán para realizar pedidos. El uso de dicho diseño se justifica sólo en los casos en que el orden resultante de los registros no es importante, pero debe ser el mismo independientemente del DBMS utilizado.

Decidí hacer mi contribución y describir aquellas características del lenguaje que no se discutieron en los artículos anteriores. El artículo está dirigido a desarrolladores principiantes.

1. Diseño “IZ”.

Para obtener datos de la base de datos, no es necesario utilizar la construcción "DESDE".
Ejemplo: Necesitamos seleccionar toda la información sobre bancos del directorio de bancos.
Pedido:

SELECCIONAR Directorio.Bancos.*

Selecciona todos los campos del directorio de bancos. Y es similar a la solicitud:

SELECCIONAR Bancos.* DESDE Directorio.Bancos AS Bancos

2. Ordenar datos por campo de referencia

Cuando necesitamos organizar los datos de la consulta por tipos primitivos: "Cadena", "Número", "Fecha", etc., entonces todo se resuelve utilizando la construcción "ORDER BY" si necesita ordenar los datos por un campo de referencia. El campo de referencia es un enlace, un identificador único, es decir. En términos generales, un conjunto arbitrario de caracteres y un orden ordinario pueden producir un resultado que no es del todo esperado. Para ordenar campos de referencia, se utiliza la construcción "ORDEN AUTOMÁTICA". Para hacer esto, primero debe ordenar los datos directamente por el tipo de referencia usando la construcción "ORDER BY" y luego la construcción "AUTO ORDER".

En este caso, para los documentos el orden se realizará en el orden "Fecha->Número", para los libros de referencia en la "Vista principal". Si el pedido no se realiza por campos de referencia, no se recomienda utilizar la construcción "ORDEN AUTOMÁTICA".

En algunos casos, la construcción "PEDIDO AUTOMÁTICO" puede ralentizar el proceso de selección. De manera similar, puede reescribir sin ordenar automáticamente los documentos:

3.Obtener una representación textual de un tipo de referencia. Diseño "PRESENTACIÓN".

Cuando necesite mostrar un campo de un tipo de referencia, por ejemplo, el campo "Banco", que es un enlace a un elemento del directorio "Bancos", debe comprender que al mostrar este campo, se crea una subconsulta al " El directorio de bancos se ejecutará automáticamente para obtener una vista del directorio. Esto ralentizará la salida de datos. Para evitar esto, debe utilizar la construcción "PREPRESENTACIÓN" en la solicitud para obtener inmediatamente una representación del objeto y luego mostrarlo para verlo.

En el sistema de composición de datos, este mecanismo se utiliza de forma predeterminada, pero al crear diseños en celdas, debe especificar la representación del campo de referencia y, por ejemplo, colocar el enlace en sí en la transcripción.

4. Condición para el muestreo de datos según una plantilla.

Por ejemplo, es necesario adquirir los teléfonos móviles de los empleados del tipo (8-123-456-78-912). Para hacer esto, debe establecer la siguiente condición en la solicitud:

SELECCIONE Empleado.Nombre, Empleado.Teléfono COMO Teléfono DEL Directorio.Empleados COMO Empleados DONDE Teléfono COMO "_-___-___-__-__"

El carácter "_" es un carácter de servicio y reemplaza cualquier carácter.

5. Utilización simultánea de totales y agrupaciones.


Los totales se utilizan a menudo junto con agrupaciones; en este caso, es posible que las funciones agregadas no se especifiquen en los totales.

SELECCIONAR Provisión de Servicios.Organización COMO Organización, Provisión de Servicios.Nomenclatura AS Nomenclatura, SUMA(Provisión de Servicios.Cantidad de Documento) COMO Suma de Documento DESDE Documento.Provisión de Servicios COMO Provisión de Servicios GRUPO POR Provisión de Servicios.Organización, Provisión de Servicios.Nomenclatura RESULTADOS POR GENERAL, Organización, nomenklatura

En este caso, la consulta devolverá casi lo mismo que la siguiente consulta:

SELECCIONAR Prestación de Servicios.Organización COMO Organización, Prestación de Servicios.Nomenclatura AS Nomenclatura, Prestación de Servicios.Cantidad de Documento COMO Cantidad de Documento DESDE Documento.Provisión de Servicios COMO Prestación de Servicios RESULTADOS IMPORTE (Cantidad de Documento) POR GENERAL, Organización, Nomenclatura

Sólo la primera consulta colapsará los registros con la misma nomenclatura.

6. Desreferenciación de campos.

Hacer referencia a campos a través de un punto se denomina operación de desreferenciación de campo de referencia. Por ejemplo Organización.de.Pago.Unidad Administrativa. En este caso, en el campo de referencia “Organización” del documento “Pago”, se hace referencia a otra tabla “Organizaciones”, en la que se obtendrá el valor del atributo “Unidad Administrativa”. Es importante entender que al acceder a campos a través de un punto, la plataforma implícitamente crea una subconsulta y une estas tablas.

Pedido:

Se puede representar como:

SELECCIONE Pago.Enlace, Pago.Organización, Pago.Organización, Organizaciones. Unidad Administrativa DESDE Documento.Pago COMO Pago IZQUIERDA UNIRSE Directorio.Organizaciones COMO Organizaciones Software Pago.Organización = Organizaciones.Enlace

Al eliminar la referencia a campos de referencia de un tipo compuesto, el marco intenta crear uniones implícitas a todas las tablas que forman parte del tipo de ese campo. En este caso, la consulta no será óptima. Si se sabe claramente qué tipo de campo es, es necesario limitar dichos campos por tipo con una construcción. EXPRESAR().

Por ejemplo, existe un registro de acumulación “Pagos no distribuidos”, donde varios documentos pueden actuar como registrador. En este caso, es incorrecto obtener los valores de los datos del registrador de esta forma:

SELECCIONE Pagos no asignados.Fecha de registro, ..... DE Acumulación de registros.Pagos no asignados COMO Pagos no asignados

debes restringir el tipo de campo compuesto a registrador:

SELECCIONE EXPRESS (Pagos no asignados. Registrar como documento. Pago). Fecha, ..... DESDE Registrar acumulación. Pagos no asignados COMO Pagos no asignados

7. Construcción "DÓNDE"

Con una unión izquierda de dos tablas, cuando impone una condición "DÓNDE" en la tabla derecha, obtendremos un resultado similar al resultado con una unión interna de tablas.

Ejemplo. Es necesario seleccionar todos los Clientes del Directorio de Clientes y para aquellos clientes que tengan un documento de pago con el valor del atributo "Organización" = &Organización mostrar el documento "Pago", para los que no lo tengan no mostrarlo.

El resultado de la consulta devolverá registros solo para aquellos clientes que tenían pago por organización en el parámetro y filtrará a otros clientes. Por lo tanto, primero debe recibir todos los pagos de "tal o cual" organización en una tabla temporal y luego conectarla al directorio "Clientes" mediante una conexión izquierda.

SELECCIONE Pago.Enlace COMO Pago, Pago.Accionista COMO Cliente LUGAR alPago DESDE Documento.Pago COMO Pago DONDE Pago.Sucursal = &Sucursal; ///////////////////////////////////////////////// // /////////////////////////// SELECCIONE Clients.Link AS Cliente, ISNULL(tPayment.Payment, "") AS Pago DESDE Directorio .Clients AS Clientes DEJÓ CONEXIÓN a pagos COMO a pagos SOFTWARE Clientes.Link = a pagos.Cliente

Puede solucionar esta condición de otra manera. Es necesario imponer una condición "DÓNDE" directamente a la relación entre las dos tablas. Ejemplo:

SELECCIONE Clientes.Enlace, Pago.Enlace DESDE Directorio.US_Subscribers COMO US_Subscribers CONEXIÓN IZQUIERDA Documento.Pago COMO Software de pago (Clientes.Enlace = Pago.Cliente Y Pago.Cliente.Nombre COMO "Paquete de azúcar") GRUPO POR Clientes.Enlace, Pago. Enlace

8. Uniones con tablas anidadas y virtuales

Consultas anidadas A menudo es necesario recuperar datos en función de alguna condición. Si luego las utiliza junto con otras tablas, esto puede ralentizar gravemente la ejecución de la consulta.

Por ejemplo, necesitamos obtener el monto del saldo a la fecha actual para algunos clientes.

Seleccione UnlocatedPaymentsBalances.customer, UnlocatedPaymentsBalances.MountBalance de (seleccione clientes.link como enlace de directorio.clients como clientes donde los clientes. Cliente

Al ejecutar dicha consulta, el optimizador DBMS puede cometer errores al elegir un plan, lo que conducirá a una ejecución subóptima de la consulta. Al unir dos tablas, el optimizador DBMS selecciona un algoritmo de unión de tablas en función del número de registros en ambas tablas. Si hay una consulta anidada, es extremadamente difícil determinar la cantidad de registros que devolverá la consulta anidada. Por lo tanto, siempre debes utilizar tablas temporales en lugar de consultas anidadas. Así que reescribamos la solicitud.

SELECCIONE Clients.Link COMO Enlace COLOQUE tClients DESDE Directory.Clients COMO Clientes DONDE
Clientes.Enlace B (&Clientes) ; ///////////////////////////////////////////////// // //////////////////////////// SELECCIONE tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, FROM tClients AS tClients IZQUIERDO UNIRSE RegisterAccumulations.UnallocatedPayments.Balances (, Cliente EN (SELECCIONE tClients.Link DESDE tClients)) COMO UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

En este caso, el optimizador podrá determinar cuántos registros utiliza la tabla temporal tClients y podrá seleccionar el algoritmo óptimo para unir tablas.

Mesas virtuales , le permiten obtener datos prácticamente listos para la mayoría de las tareas aplicadas (Parte de la primera, Parte de la última, Restos, Rotaciones, Restos y Rotaciones) La palabra clave aquí es virtual. Estas tablas no son físicas, sino que el sistema las compila sobre la marcha, es decir. Al recibir datos de las mesas virtuales, el sistema recopila datos de las tablas del registro final, los ensambla, los agrupa y los entrega al usuario.

Aquellos. Al conectarse a una tabla virtual, se realiza una conexión a una subconsulta. En este caso, el optimizador DBMS también puede elegir un plan de conexión no óptimo. Si la consulta no se genera lo suficientemente rápido y utiliza combinaciones en tablas virtuales, se recomienda mover el acceso a las tablas virtuales a una tabla temporal y luego realizar una combinación entre dos tablas temporales. Reescribamos la solicitud anterior.

SELECCIONE Clientes.Enlace COMO Enlace COLOQUE tClientes DESDE Directorio.Clientes COMO Clientes ÍNDICE POR Enlace DONDE
Clientes.Enlace B (&Clientes) ; ///////////////////////////////////////////////// // //////////////////////////// SELECCIONE UnallocatedPayments.AmountBalance, UnallocatedPayments.Client COMO Cliente COLOQUE los saldos DESDE RegisterAccumulations.UnallocatedPayments.Balances(, Cliente B ( SELECCIONE tClients. Enlace DESDE tClients)) COMO Saldos de pagos no asignados; ///////////////////////////////////////////////// // //////////////////////////// SELECCIONE tClients.Link, toRemainders.AmountRemaining AS AmountRemaining FROM tClients AS tClients IZQUIERDA UNIRSE aRemainders AS Remainders POR tClients.Link = tRemainings.Cliente

9.Comprobación del resultado de la solicitud.

El resultado de la consulta puede estar vacío; para comprobar si hay valores vacíos, utilice la siguiente construcción:

ResRequest = Solicitud.Execute(); Si resQuery.Empty() Entonces regresa; terminara si;

Método Vacío() debe usarse antes de los métodos Elegir() o Descargar(), ya que recuperar la colección lleva tiempo.

Para nadie es una revelación que es extremadamente indeseable utilizar consultas en un bucle. Esto puede afectar críticamente el tiempo de funcionamiento de una función particular. Es muy deseable recibir todos los datos de la solicitud y luego procesarlos en un bucle. Pero a veces hay casos en los que resulta imposible mover la solicitud fuera del bucle. En este caso, para optimizar, puede mover la creación de la consulta fuera del bucle y, en el bucle, sustituir los parámetros necesarios y ejecutar la consulta.

Solicitud = Nueva Solicitud; Query.Text = "SELECCIONAR | Clientes.Enlace, | Clientes.Fecha de nacimiento |DESDE | Directorio.Clientes COMO Clientes |DÓNDE | Clientes.Enlace = &Cliente"; Para cada fila DESDE TableClients Loop Query.SetParameter("Cliente", Cliente); QueryResult = Query.Execute().Select(); Fin del ciclo;

Esto evitará que el sistema tenga que comprobar la sintaxis de la solicitud en un bucle.

11. Construcción "TENIENDO".

Un diseño que es bastante poco común en las solicitudes. Le permite imponer condiciones a los valores de funciones agregadas (SUMA, MÍNIMO, PROMEDIO, etc.). Por ejemplo, debe seleccionar solo aquellos clientes cuyo monto de pago en septiembre fue superior a 13.000 rublos. Si utiliza la condición "DÓNDE", primero tendrá que crear una tabla temporal o una consulta anidada, agrupar los registros allí por monto de pago y luego aplicar la condición. La construcción “TENER” ayudará a evitar esto.

SELECCIONE Pago.Cliente, CANTIDAD(Pago.Importe) COMO Importe DESDE Documento.Pago COMO Pago DONDE MES(Pago.Fecha) = 9 GRUPO POR Pago.Cliente QUE TIENE CANTIDAD(Pago.Importe) > 13000

En el constructor, para hacer esto, simplemente vaya a la pestaña "Condiciones", agregue una nueva condición y marque la casilla "Personalizado". Entonces solo escribe Monto(Pago.Monto) > 13000


12. valor NULO

No describiré aquí los principios de la lógica de tres valores en la base de datos; hay muchos artículos sobre este tema. Sólo brevemente sobre cómo NULO puede afectar el resultado de la consulta. El valor NULL no es en realidad un valor y se desconoce el hecho de que el valor no está definido. Por lo tanto, cualquier operación con NULL devuelve NULL, ya sea suma, resta, división o comparación. Un valor NULL no se puede comparar con un valor NULL porque no sabemos qué comparar. Aquellos. ambas comparaciones son: NULL = NULL, NULL<>NULL no es Verdadero ni Falso, se desconoce.

Veamos un ejemplo.

Para aquellos clientes que no tienen pagos, debemos mostrar el campo "Firmar" con el valor "Sin pagos". Además, sabemos con certeza que tenemos este tipo de clientes. Y para reflejar la esencia de lo que escribí arriba, hagámoslo de esta manera.

SELECCIONE "Sin pagos" COMO Atributo, NULL COMO Documento LUGAR a pagos; ///////////////////////////////////////////////// // /////////////////////////// SELECCIONE Clients.Link COMO Cliente, Payment.Link CÓMO Pago PON tClientPayment DESDE Directorio.Clients COMO Clientes DEJÓ CONEXIÓN Documento. Pago AS Software de pago Clientes.Enlace = Pago.Accionista; ///////////////////////////////////////////////// // /////////////////////////// SELECCIONE tClientPayment.Client DESDE tClientPayment COMO tClientPayment INTERNO ÚNASE a tPayment COMO tTopay POR tClientPayment.Payment = tPayment.

Preste atención a la segunda tabla temporal tClientPayment. Con la combinación izquierda selecciono todos los clientes y todos los pagos para estos clientes. Para aquellos clientes que no tengan pagos, el campo “Pago” será NULO. Siguiendo la lógica, en la primera tabla temporal “tPayments” designé 2 campos, uno de ellos NULL, la segunda línea “No tiene pagos”. En la tercera tabla, conecto las tablas “tClientPayment” y “tPayment” usando los campos “Pago” y “Documento” con una unión interna. Sabemos que en la primera tabla el campo “Documento” es NULL, y en la segunda tabla, los que no tienen pagos en el campo “Pago” también son NULL. ¿Qué nos devolverá esa conexión? Pero no devolverá nada. Porque la comparación NULL = NULL no se evalúa como Verdadera.

Para que la solicitud devuelva el resultado esperado, reescribámosla:

SELECCIONE "Sin pagos" COMO Atributo, VALOR(Documento.Pago.EmptyLink) COMO Documento LUGAR aPagos; ///////////////////////////////////////////////// // /////////////////////////// SELECCIONE Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink)) CÓMO Pago PON tClientePago DESDE Directorio.Clientes COMO Clientes IZQUIERDA CONEXIÓN Documento.Pago COMO Pago POR Clientes.Enlace = Pago.Accionista; ///////////////////////////////////////////////// // /////////////////////////// SELECCIONE tClientPayment.Client DESDE tClientPayment COMO tClientPayment INTERNO ÚNASE a tPayment COMO tTopay POR tClientPayment.Payment = tPayment.

Ahora, en la segunda tabla temporal, hemos indicado que si el campo “Pago” es NULL, entonces este campo = un enlace vacío al documento de pago. En la Primera tabla también reemplazamos NULL con una referencia vacía. Ahora la conexión involucra campos no NULL y la solicitud devolverá el resultado esperado.

Todas las solicitudes contenidas en el artículo reflejan las situaciones que me gustaría considerar y nada más. ACERCA DE Puede que no sean delirantes ni subóptimos, lo principal es que reflejen la esencia del ejemplo.

13. Una característica no documentada del diseño "ELECCIÓN CUANDO...ENTONCES...TERMINAR".

En el caso de que sea necesario describir la construcción "Condiciones" en la solicitud, utilizamos la sintaxis estándar:

SELECCIONE LA SELECCIÓN CUANDO Usuarios.Nombre = "Vasya Pupkin" ENTONCES "Nuestro empleado favorito" MÁS "No sabemos esto" FINALIZAR COMO Campo1 DESDE Directorio.Usuarios COMO Usuarios

Pero ¿qué pasa si, por ejemplo, necesitamos obtener el nombre del mes en una solicitud? Escribir una construcción enorme en una solicitud es feo y requiere mucho tiempo, por lo que esta forma de escritura anterior puede ayudarnos:

SELECCIONE MES(US_CalculationConsumption_TurnoverSchedule.CalculationPeriod) CUANDO 1 ENTONCES "Enero" CUANDO 2 ENTONCES "Febrero" CUANDO 3 ENTONCES "Marzo" CUANDO 4 ENTONCES "Abril" CUANDO 5 ENTONCES "Mayo" CUANDO 6 ENTONCES "Junio" CUANDO 7 ENTONCES "Julio" CUANDO 8 LUEGO "Agosto" CUANDO 9 LUEGO "Septiembre" CUANDO 10 LUEGO "Octubre" CUANDO 11 LUEGO "Noviembre" CUANDO 12 ENTONCES "Diciembre" TERMINA COMO Mes

Ahora el diseño parece menos engorroso y es fácil de entender.

14. Ejecución por lotes de una solicitud.


Para no multiplicar las solicitudes, puede crear una solicitud grande, dividirla en paquetes y trabajar con ella.
Por ejemplo, necesito obtener los siguientes campos del directorio "Usuarios": "Fecha de nacimiento" y los roles disponibles para cada usuario. cárguelo en diferentes partes tabulares del formulario. Por supuesto, puede hacer esto en una sola solicitud, luego tendrá que recorrer los registros o contraerlos, o puede hacer esto:

SELECCIONE Usuarios.Enlace COMO Nombre completo, Usuarios.Fecha de nacimiento, Usuarios.Rol PON vtUsers DESDE Directorio.Usuarios COMO Usuarios; ///////////////////////////////////////////////// // //////////////////////////// SELECCIONE tueUsers.Nombre completo, tueUsers.Fecha de nacimiento DE tueUsers COMO tueUsers GRUPO POR tueUsers.nombre completo, tueUsers . Fecha de nacimiento; ///////////////////////////////////////////////// // /////////////////////////// SELECCIONE wUsers.Nombre completo, wUsers.Role DE wUsers COMO wUsers GRUPO POR wUsers.Nombre completo, wUsers Fecha. de nacimiento

tPackage = Solicitud.ExecutePackage();

TP_BirthDate = tPackage.Upload();
TP_Roles = tPackage.Unload();

Como podemos ver, la consulta se puede ejecutar en lotes y el resultado se puede procesar como una matriz. En algunos casos es muy conveniente.

15. Condiciones en una solicitud por lotes

Por ejemplo, tenemos una solicitud por lotes, donde primero obtenemos los campos: "Nombre, Fecha de nacimiento, Código" del directorio "Usuarios" y queremos obtener registros con condiciones para estos campos del directorio "Individuos".

SELECCIONE Usuarios.Individual.Nombre COMO Nombre, Usuarios.Individual.Fecha de nacimiento COMO Fecha de nacimiento, Usuarios.Individual.Código COMO Código LUGAR vtUsers DESDE Directorio.Usuarios COMO Usuarios; ///////////////////////////////////////////////// // /////////////////////////// SELECCIONE Individuos COMO Individuo DESDE Directorio Individuos COMO Individuos.

Puedes imponer condiciones como esta:

DONDE Individuos.Code IN (SELECCIONE vtUsers.Code DE vtUsers) Y Individuos.Name IN (SELECCIONE vtUsers.Code DE vtUsers) Y Individuos.BirthDate IN (SELECCIONE vtUsers.DateBirth DE tvUsers)

Y puedes hacerlo así:

DONDE (Individuos.Código, Individuos.Nombre, Individuos.Fecha de nacimiento) EN (SELECCIONE marUsuarios.Código, marUsuarios.Nombre, marUsuarios.Fecha de nacimiento DESDE marUsuarios)

Además, es necesario mantener el orden.

16. Llamar al generador de consultas para "condición" en una solicitud por lotes

Cuando es necesario imponer una condición, como en el ejemplo anterior, puedes olvidar cómo se llama tal o cual campo en la tabla virtual.
Por ejemplo, debe imponer una condición en el campo "Fecha de nacimiento", y en la tabla virtual este campo se llama "Fecha de nacimiento del deudor", y si olvida el nombre, tendrá que salir editando la condición sin guardar y mirar el nombre del campo. Para evitar esto, puedes utilizar la siguiente técnica.

Es necesario poner corchetes después de la Construcción “B” y dejar un espacio vacío (espacio) entre los corchetes, seleccionar este espacio y llamar al constructor de consultas. El diseñador tendrá acceso a todas las tablas de la consulta por lotes. La técnica funciona tanto en tablas de registro virtuales como en la pestaña “Condiciones”. En el último caso, debe marcar la casilla "P (condición arbitraria)" e ingresar al modo de edición "F4".

Las consultas a menudo se inventaron sobre la marcha y simplemente sirven para ilustrar las “técnicas” que estaba considerando.

Quería analizar el uso de índices en consultas, pero este es un tema muy amplio. Lo pondré en un artículo aparte o lo agregaré aquí más adelante.

upd1. Puntos 11,12
upd2. Puntos 13,14,15,16

Libros usados:
Lenguaje de consulta "1C:Enterprise 8" - E.Yu. Khrustaleva
Desarrollo profesional en el sistema 1C:Enterprise 8."

Para generar y ejecutar consultas a tablas de bases de datos en la plataforma 1C, se utiliza un objeto de lenguaje de programación especial Pedido. Este objeto se crea llamando a la construcción. Nueva solicitud. La consulta es conveniente de utilizar cuando necesita obtener una muestra de datos complejos, agrupados y ordenados según sea necesario. Un ejemplo clásico de uso de una consulta es obtener un resumen del estado del registro de acumulación en un momento determinado. Además, el mecanismo de consulta facilita la obtención de información en diferentes periodos de tiempo.

El cuerpo de la solicitud es la instrucción según la cual se debe ejecutar la solicitud. El cuerpo de la solicitud describe:

  • tablas de bases de datos utilizadas como fuentes de datos de consulta;
  • campos de la tabla que deben procesarse en la consulta;
  • reglas de agrupación;
  • resultados de clasificación;
  • etc.
La instrucción se compila en un lenguaje especial: el lenguaje de consulta y consta de partes separadas: secciones, oraciones, palabras clave, funciones, operadores aritméticos y lógicos, comentarios, constantes y parámetros.

El lenguaje de consulta de la plataforma 1C es muy similar a la sintaxis de otros lenguajes SQL, pero existen diferencias. Las principales ventajas del lenguaje de consulta integrado son: desreferenciación de campos, presencia de tablas virtuales, trabajo conveniente con resultados, campos sin escribir en consultas.

  • valores de enumeración;
  • datos predefinidos:
  • libros de referencia;
  • planos de tipos de características;
  • planes de cuentas;
  • planes para tipos de cálculos;
  • enlaces vacíos;
  • Valores de puntos de ruta de procesos de negocio.
Además, el texto de la solicitud puede contener los valores de las enumeraciones del sistema que se pueden asignar a los campos de las tablas de la base de datos: Tipo de movimiento de acumulación, Tipo de cuenta y Tipo de movimiento contable. Solicita acceso a datos de configuración predefinidos y valores de enumeración del sistema mediante un literal de tipo de función SIGNIFICADO. Este literal mejora la legibilidad de la consulta y reduce la cantidad de parámetros de consulta.

Ejemplo de uso de un literal SIGNIFICADO:
DONDE Ciudad = VALOR(Directorio.Ciudades.Moscú)
DONDE Ciudad = VALOR(Directorio.Ciudades.EmptyLink)
DONDEProductType = VALOR(Enumeración.ProductTypes.Service)
DONDETipoMovimiento = VALOR(TipoMovimientoAcumulación.Entrante)
DONDE RoutePoint = VALOR(BusinessProcess.BusinessProcess1.RoutePoint.Action1

2) Usando las instrucciones PEDIDO AUTOMÁTICO La consulta puede tardar mucho en completarse, por lo que si no es necesario ordenarla, es mejor no utilizarla en absoluto. En la mayoría de los casos, es mejor utilizar la clasificación de instrucciones. ORDENAR POR.

El pedido automático funciona según los siguientes principios:

  • Si en la solicitud se especificó la cláusula ORDER BY, cada enlace a la tabla que se encuentra en esta cláusula será reemplazado por los campos por los cuales la tabla está ordenada de forma predeterminada (para libros de referencia, este es el código o nombre, para documentos, el fecha del documento). Si el campo a ordenar hace referencia a un directorio jerárquico, entonces se aplicará la clasificación jerárquica según este directorio.
  • Si la solicitud no contiene la cláusula ORDER BY, pero hay una cláusula TOTAL, entonces el resultado de la consulta se ordenará por los campos presentes en la cláusula TOTAL después de la palabra clave BY, en la misma secuencia y, si los totales fueron calculados por campos de referencia, luego por los campos de clasificación por defecto de las tablas a las que se hizo referencia.
  • Si la consulta no contiene las cláusulas ORDER BY y TOTAL, pero sí hay una cláusula GROUP BY, entonces el resultado de la consulta se ordenará por los campos presentes en la cláusula en la misma secuencia y, si la agrupación se realizó por campos de referencia , luego, de forma predeterminada, ordena las tablas de campos a las que se hace referencia.
  • Si la consulta no contiene cláusulas ORDER BY, TOTAL o GROUP BY, el resultado se ordenará según los campos de clasificación predeterminados para las tablas de las que se seleccionan los datos, en el orden en que aparecen en la consulta.

Si la consulta contiene una cláusula TOTAL, cada nivel total se ordena por separado.

3) Para evitar repetir una consulta a la base de datos al mostrar el resultado de la consulta al usuario (por ejemplo, crear una consulta o mostrar el resultado de la consulta utilizando un documento de hoja de cálculo), es útil utilizar la instrucción INTRODUCCIÓN ENLACES, que le permite obtener una representación de un valor de referencia.

También es posible utilizar instrucciones. ACTUACIÓN- diseñado para obtener una representación de cadena de un valor de tipo arbitrario. La diferencia entre estas instrucciones es que en el primer caso, si las instrucciones pasan un enlace, el resultado será una cadena. En otros casos, el resultado será el valor del parámetro pasado. En el segundo caso, ¡el resultado de la instrucción siempre será una cadena!

4) Si la solicitud contiene un campo con un tipo compuesto, entonces para dichos campos es necesario convertir los valores del campo a un tipo específico mediante una instrucción. EXPRESAR, que le permitirá eliminar tablas innecesarias de la combinación izquierda con un campo de tipo de datos compuesto y acelerar la ejecución de consultas.

Ejemplo:
Existe un registro de acumulación de Bienes Restantes, en el cual el campo Registrador es de tipo compuesto. En la solicitud se selecciona la Fecha y Número de Documento de Recepción de Mercancías, mientras que al acceder a los detalles del documento a través del campo Registrador, muchas conexiones izquierdas de la tabla del registro de acumulación con las tablas de documentos del registrador no ocurren.

ELEGIR
EXPRESS(Bienes Restantes. Registrador AS Documento. Recibo de Bienes). Número AS Número de Recibo,
EXPRESS(Bienes Restantes. Registrador AS Documento. Recepción de Mercancías). Fecha AS Fecha de Recepción
DE
Registro de Acumulaciones de Bienes Restantes COMO Bienes Restantes.

Si una conversión de tipos no se considera factible, entonces el resultado de la conversión de tipos será NULL.

5) No te olvides de las instrucciones PERMITIDO, lo que significa que la consulta solo seleccionará registros sobre los que el usuario actual tiene derechos. Si no se especifica esta palabra, si la solicitud selecciona registros para los cuales el usuario no tiene derechos, la solicitud fallará.

6) Si la consulta utiliza una combinación y algunas partes de la combinación contienen tablas anidadas (un documento con una parte tabular) y otras no, es necesario complementar la lista de selección con campos: tablas anidadas vacías. Esto se hace usando una palabra clave. MESA VACÍA, tras lo cual se indican entre paréntesis los alias de los campos que conformarán la tabla anidada.

Ejemplo:
// Seleccionar campos Número y Composición
// desde la tabla virtual Documento.Expenditure
SELECCIONE Enlace.Número, TABLA VACÍA.(Nº, Artículo, Cantidad) COMO Composición
DESDE Documento.Factura de Gastos
COMBINA TODO
SELECCIONAR Enlace.Número, Contenido.(Número de Línea, Producto, Cantidad)
DESDE Documento.Factura Documento.Factura.Composición.*
7) Para evitar que aparezcan líneas duplicadas en el resultado de la consulta, debe utilizar la instrucción VARIOS, porque es más visual y comprensible, y las instrucciones AGRUPAR POR Se utiliza para agrupar utilizando funciones agregadas. Ksati, al usar funciones agregadas, una sugerencia AGRUPAR POR Es posible que no se especifique en absoluto, pero todos los resultados de la consulta se agruparán en una sola línea.

Ejemplo:
// Es necesario saber qué contrapartes en general
// los bienes fueron enviados durante el período.
Seleccione Varios
Documento.Factura.Contraparte

8) Instrucciones AGRUPAR POR le permite acceder a campos de nivel superior, sin agrupar los resultados por estos campos, si se aplican funciones agregadas a los campos de una tabla anidada. Aunque la ayuda de 1C dice que al agrupar los resultados de una consulta, las funciones agregadas deben especificarse en la lista de campos de selección, y además de las funciones agregadas en la lista de campos de selección, se permite indicar solo los campos mediante los cuales se realiza la agrupación. .

Ejemplo:
ELEGIR
Recepción de Bienes y Servicios (SUM (Cantidad), Nomenclatura),
Recepción de Bienes y Servicios.
Recepción de Bienes y Servicios.
DE
Documento de Recepción de Bienes y Servicios CÓMO Recepción de Bienes y Servicios.
AGRUPAR POR
Recepción de Bienes y Servicios (Nomenclatura).

9) Instrucciones ES NULO está destinado a reemplazar el valor NULL por otro valor, pero no olvide que el segundo parámetro se convertirá al tipo del primero si el tipo del primer parámetro es una cadena o un número.

10) Al acceder a la tabla principal, puede acceder condicionalmente a los datos de la tabla subordinada. Esta característica se denomina desreferenciación de campos de una tabla subordinada.

Ejemplo (busque documentos que contengan un producto específico en la sección tabular):
ELEGIR
Entrada.Enlace
DE
Documento.Admisión Donde Entrada.Productos.Nomenclatura = &Nomenclatura.

La ventaja de esta consulta sobre una consulta en la tabla subordinada Recibo.Bienes es que si hay duplicados en los documentos, el resultado de la consulta devolverá solo documentos únicos sin usar la palabra clave. VARIOS.

11) Opción de operador interesante EN- esta es una verificación de la inclusión de un conjunto ordenado en un conjunto de dichos conjuntos (Campo1, Campo2, ..., CampoN) EN (Campo1, Campo2, ..., CampoN).

Ejemplo:
ELEGIR
Contrapartes.Enlace
DÓNDE
(Contrapartes.Enlace, Productos.Enlace) B
(SELECCIONE Ventas.Cliente, Ventas.Producto
DESDE RegistroAcumulación.Ventas COMO Ventas)
DE
Directorio.
Directorio.Productos

12) Siempre que sea posible, utilice mesas virtuales peticiones. Al crear una consulta, el sistema proporciona una serie de tablas virtuales como fuentes de datos; estas son tablas que también son el resultado de una consulta que el sistema genera en el momento en que se ejecuta la sección de código correspondiente.

El desarrollador puede obtener de forma independiente los mismos datos que el sistema le proporciona en forma de tablas virtuales, pero el algoritmo para obtener estos datos no estará optimizado porque:

  • Todas las tablas virtuales están parametrizadas, es decir, el desarrollador tiene la oportunidad de establecer algunos parámetros que el sistema utilizará al generar una solicitud para crear una tabla virtual. Dependiendo de qué parámetros de la tabla virtual especifique el desarrollador, el sistema puede generar DIFERENTES consultas para obtener la misma tabla virtual, y se optimizarán en términos de los parámetros pasados.
  • No siempre es posible que un desarrollador obtenga acceso a los datos a los que tiene acceso el sistema.
13) En el modo de operación cliente-servidor, la función SUBCADE() se implementa utilizando la función SUBSTRING() de la instrucción SQL correspondiente pasada al servidor de base de datos SQL Server, que calcula el tipo de resultado de la función SUBSTRING() utilizando reglas complejas dependiendo del tipo y valores de sus parámetros, como así como dependiendo del contexto en el que se utilice. En la mayoría de los casos, estas reglas no tienen ningún efecto en la ejecución de la consulta, pero hay ocasiones en las que la longitud máxima de la fila de resultados calculada por SQL Server es importante para la ejecución de la consulta. Es importante tener en cuenta que en algunos contextos cuando se utiliza la función SUBSTRING(), la longitud máxima de su resultado puede ser igual a la longitud máxima de una cadena de longitud limitada, que en SQL Server es de 4000 caracteres. Esto puede provocar que la consulta falle inesperadamente:
Proveedor Microsoft OLE DB para SQL Server: Advertencia: El procesador de consultas no pudo generar un plan de consulta desde el optimizador porque la longitud total de todas las columnas en la cláusula GROUP BY u ORDER BY excede los 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, nativo=8618
Para evitar este error, no se recomienda utilizar la función SUBSTRING() para convertir cadenas de longitud ilimitada en cadenas de longitud limitada. En su lugar, es mejor utilizar el operador de conversión EXPRESS().

14) Úselo con precaución O en la construcción WHERE, ya que el uso de una condición OR puede "ponderar" significativamente la consulta. El problema se puede resolver utilizando el diseño UNITE EVERYTHING.

Ejemplo:
ELEGIR

DE

DÓNDE
_Contratistas de demostración.Enlace = &Enlace1

COMBINA TODO

ELEGIR
_Contratistas de demostración.Nombre completo
DE
Directorio._Contrapartes de demostración CÓMO _Contrapartes de demostración
DÓNDE
_Contratistas de demostración.Enlace = &Enlace2

15) Condición NO EN en la construcción WHERE aumenta el tiempo de ejecución de la consulta, ya que es una especie de NOT (OR1 OR2... ORn), por lo que para tablas grandes intente utilizar un LEFT JOIN con la condición IS NULL.

Ejemplo:
ELEGIR
_Contratistas de demostración.Enlace
DE
Directorio._Contrapartes de demostración CÓMO _Contrapartes de demostración
CONEXIÓN IZQUIERDA Documento._Pedido de demostración del comprador CÓMO _Pedido de demostración del comprador
Software _Enlace Demo Contrapartes = _Orden Demo del Comprador.
DÓNDE
_La Orden de Demostración del Comprador ES NULA.

15) Al usar Tablas temporales Debe indexar la condición y unir campos en estas tablas, PERO, cuando se usan índices, la consulta puede ser incluso más lenta. Por tanto, es necesario analizar cada consulta con y sin índice, medir la velocidad de ejecución de la consulta y tomar una decisión final.
Si coloca datos en una tabla temporal que inicialmente está indexada por algunos campos, la tabla temporal ya no tendrá un índice en estos campos.

16) Si no usas Administrador de mesa temporal, entonces no es necesario eliminar explícitamente la tabla temporal; se eliminará después de que se complete la consulta por lotes; de lo contrario, debe eliminar la tabla temporal de una de las siguientes maneras: usando el comando DESTROY en la solicitud, llamando a TemporaryTableManager. Método cerrar().