Buscando en la tabla de valores 1s 8.3. Qué métodos existen y cómo buscar varios valores simultáneamente

Para contabilizar el dinero y los bienes, en los negocios se utilizan ampliamente varias tablas. Casi todos los documentos son una tabla.

Una tabla enumera las mercancías que se enviarán desde el almacén. Otro cuadro muestra las obligaciones de pago por estos bienes.

Por lo tanto, en 1C, el trabajo con mesas ocupa un lugar destacado.

Las tablas de 1C también se denominan "partes tabulares". Directorios, documentos y otros los tienen.

La consulta, como resultado de su ejecución, devuelve una tabla a la que se puede acceder de dos formas diferentes.

La primera selección, más rápida, es posible obtener filas a partir de ella solo en orden. El segundo es cargar el resultado de la consulta en una tabla de valores y luego acceder aleatoriamente a ella.

//Opción 1 – acceso secuencial a los resultados de la consulta

//obtiene la mesa
Seleccionar = Consulta.Ejecutar().Select();
// repasamos todas las líneas del resultado de la consulta en orden
Mientras que el bucle Select.Next()
Informe(Selección.Nombre);
Fin del ciclo;

//Opción 2: cargar en una tabla de valores
Solicitud = Nueva Solicitud ("SELECCIONE Nombre DEL Directorio.Nomenclatura");
//obtiene la mesa
Tabla = Consulta.Ejecutar().Descargar().
//además también podemos atravesar todas las líneas
Para cada fila del ciclo de la tabla
Informe(Cadena.Nombre);
Fin del ciclo;
//o acceder arbitrariamente a cadenas
Fila = Table.Find("Pala", "Nombre");

Una característica importante es que en la tabla que se obtiene del resultado de la consulta, todas las columnas estarán estrictamente escritas. Esto significa que al solicitar el campo Nombre del directorio de Nomenclatura, recibirá una columna del tipo Cadena con una longitud permitida de no más de N caracteres.

Tabla en el formulario (cliente pesado)

El usuario trabaja con la tabla cuando se coloca en el formulario.

Discutimos los principios básicos de trabajar con formularios en la lección sobre y en la lección sobre

Entonces, coloquemos la tabla en el formulario. Para hacer esto, puede arrastrar la tabla desde el panel Controles. De manera similar, puede seleccionar Formulario/Insertar control en el menú.

Los datos se pueden almacenar en la configuración; luego debe seleccionar la parte tabular existente (previamente agregada) del objeto de configuración cuyo formulario está editando.

Haga clic en el botón "..." en la propiedad Datos. Para ver la lista de partes tabulares, debe expandir la rama Objeto.

Cuando selecciona la parte tabular, el propio 1C agregará columnas a la tabla en el formulario. Las filas ingresadas por el usuario en dicha tabla se guardarán automáticamente junto con el libro/documento de referencia.

En la misma propiedad de Datos puede ingresar un nombre arbitrario y seleccionar el tipo de Tabla de valores.

Esto significa que se ha seleccionado una tabla de valores arbitraria. No agregará columnas automáticamente ni se guardará automáticamente, pero puedes hacer lo que quieras con él.

Al hacer clic derecho en la tabla puede agregar una columna. En las propiedades de una columna, puede especificar su nombre (como referencia en el código 1C), el encabezado de la columna en el formulario, la conexión con el atributo de la parte tabular (este último, si no es una tabla arbitraria, sino una parte tabular está seleccionado).

En las propiedades de la tabla del formulario, puede especificar si el usuario puede agregar o eliminar filas. Una forma más avanzada es la casilla de verificación Ver sólo. Estas propiedades son cómodas de utilizar para organizar tablas destinadas a mostrar información, pero no a editarla.

Para administrar la tabla, debe mostrar un panel de comando en el formulario. Seleccione el elemento del menú Formulario/Insertar control/Barra de comandos.

En las propiedades de la barra de comandos, seleccione la casilla de verificación Autocompletar para que los botones del panel aparezcan automáticamente.

Tabla en formulario (cliente ligero/administrado)

En un formulario administrado, estas acciones se ven un poco diferentes. Si necesita colocar una parte tabular en el formulario, expanda la rama Objeto y arrastre una de las partes tabulares hacia la izquierda. ¡Eso es todo!

Si necesita colocar una tabla de valores, agregue un nuevo atributo de formulario y en sus propiedades especifique el tipo – tabla de valores.

Para agregar columnas, use el menú contextual en este atributo de formulario, seleccione Agregar columna de atributo.

Luego arrastre también la tabla hacia la izquierda.

Para que una tabla tenga una barra de comandos, en las propiedades de la tabla, seleccione los valores en la sección Uso – Posición de la barra de comandos.

Subir una tabla a Excel

Cualquier tabla 1C ubicada en el formulario se puede imprimir o cargar en Excel.

Para hacer esto, haga clic derecho en un espacio vacío en la tabla y seleccione Lista.

En un cliente (ligero) administrado, se pueden realizar acciones similares usando el elemento del menú Todas las acciones/Lista de visualización.

Buscar en la tabla de valores 1C.

Qué métodos existen y cómo buscar varios valores simultáneamente.

Hay dos métodos especiales para buscar una tabla de valores:

1. Encuentra

TVHorizon = Directorios.Nomenclatura.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//también podemos especificar en qué columnas buscar para acelerar la búsqueda
FoundString = TZNomenclature.Find(TVHorizon, "Nomenclatura");

Este método devuelve la primera fila encontrada con el valor deseado, o Indefinido si no lo encuentra. Por lo tanto, es conveniente usarlo para buscar valores únicos, porque de lo contrario, cuando se encuentre un valor, deberá eliminarlo de la tabla para encontrar el siguiente.

Para evitar esta molestia, existe el siguiente método que le permite encontrar una matriz de cadenas coincidentes:

2. Buscar cadenas


Estructura de selección.Insert("Nomenclatura", TVHorizon); // primero indica la columna dónde buscar y luego qué buscar.

Este método siempre devuelve una matriz, pero puede estar vacía si no se encuentra nada. Y este método, como el anterior, devuelve las filas de la tabla de valores en sí, y no los valores en sí en una matriz separada. Por lo tanto, al cambiar los valores en la cadena de la matriz o, como en el método anterior, para la cadena encontrada, cambiará el valor en la tabla de valores procesada.

Otra ventaja de este método es que puede buscar en varias columnas de la tabla de valores a la vez:


SelectionStructure = Nueva estructura;
Estructura de selección.Insert("Nomenclatura", TVHorizon);
Estructura de selección.Insert("Cantidad", 10);
FoundArray de filas = TZNomenclature.FindLines(SelectionStructure);

Lo único negativo, como ves, es que no se pueden utilizar otros tipos de comparación que no sean “iguales”

Aquí hay un pequeño dato para empezar: ejemplos simples de cómo trabajar con una tabla de valores:

1. Crea una tabla de valores.

Tabla de valores = Nueva tabla de valores;


2. Cree columnas para la tabla de valores:

ValueTable.Columns.Add("Nombre");
Tabla de valores.Columnas.Add("Apellido");


3. Agregue nuevas filas usando nombres de columnas:


NewLine.Name = "Vasily";
NewLine.LastName = "Cachorro";


4. Cómo buscar un valor en la tabla de valores:
Es necesario encontrar una fila de la tabla que contenga el valor deseado.

FoundRow = ValueTable.Find(SearchValue);


5. Encuentre la primera aparición en ciertas columnas de la tabla de valores.

FoundRow = ValueTable.Find(SearchValue, "Proveedor, Comprador");


6. Si necesita encontrar todas las apariciones en la tabla de valores:
Usamos la estructura de búsqueda.

Estructura de búsqueda = Estructura ("Empleado", Valor de búsqueda);
Matriz de FoundRows = ValueTable.FindRows(SearchStructure);


Creemos una estructura de búsqueda, cada elemento del cual contendrá el nombre de la columna como clave y el valor deseado en esta columna como valor. Pasamos la estructura de búsqueda como parámetro al método FindLines(). Como resultado, obtenemos filas de la tabla.
Si agrega una búsqueda del valor deseado a la estructura de búsqueda, por ejemplo, también en la columna Responsable, entonces como resultado de aplicar el método FindLines() obtendremos todas las filas donde tanto el Empleado como el Responsable son iguales a valor buscado.

7. Cómo iterar a través de una tabla de valores en orden aleatorio

Para cada fila actual del bucle de la tabla de valores
Informe(CurrentRow.Name);
Fin del ciclo;

Lo mismo usando índices:

SeniorIndex = ValueTable.Cantidad() - 1;
Para cuenta = 0 al ciclo SeniorIndex
Informe(ValoresTabla[Cuenta].Nombre);
Fin del ciclo;


8. Eliminar una fila de la tabla de valores existente

ValueTable.Delete(Fila a eliminar);

por índice

ValueTable.Delete(0);


9. Eliminar una columna existente de la tabla de valores

ValueTable.Columns.Delete(ColumnaDeleted);


por índice

ValueTable.Columns.Delete(0);

Es necesario tener en cuenta que eliminar una fila (o columna) “desde el medio” de la tabla de valores provocará una disminución en uno de los índices de las filas ubicadas “después” de las eliminadas.

10. ¿Cómo llenar una tabla de valores si los nombres de las columnas están contenidos en variables?

NuevaFila = ValueTable.Add();
Nueva fila [Nombre de columna] = Valor;


11. ¿Cómo llenar toda la columna de la tabla de valores con el valor deseado?
La columna Bandera de Contabilidad Fiscal en la Tabla de Valores debe completarse con el valor Falso

Tabla de Valores. Completar Valores (Falso, “Bandera de Contabilidad Fiscal”);


Usamos el método FillValues() para la tabla de valores. El primer parámetro es el valor que se va a completar. El segundo parámetro es el nombre de la columna a completar.

12. ¿Cómo puedo llenar la tabla de valores “Receiver Table” con datos de la tabla de valores “SourceTable”?

Si la tabla de destinatarios aún no existe en el momento de la operación o no es necesario guardar sus columnas anteriores, puede crearla como una copia completa del original.

Tabla de destinatarios = Tabla de origen.Copy();


Opción dos: la tabla ReceiverTable existe y sería una lástima perder sus columnas y las restricciones sobre los tipos de datos de las columnas. Pero debe completar los datos de las columnas cuyos nombres coincidan con los nombres de la tabla de origen.

Transferencia parcial de datos para columnas con nombres coincidentes:

Para cada fila de SourceTable del ciclo SourceTable
FillPropertyValues(NewRow, SourceTableRow);
Fin del ciclo


Para cada fila de la tabla de origen, se agrega una nueva fila a la tabla de recepción y los valores se completan en aquellas columnas de la nueva tabla cuyos nombres coinciden con los nombres de las columnas de la tabla de origen.

Si las tablas no tienen columnas con los mismos nombres, la tabla de destino terminará conteniendo tantas filas con valores nulos como filas había en la tabla de origen.
Si para algunas columnas del mismo nombre el tipo de valor de datos de la tabla de origen no se encuentra en la matriz de tipos de columnas permitidos en la tabla de destino, obtendremos valores vacíos en dichos campos.
Consideremos el tercer caso. En el caso de columnas con el mismo nombre, la columna de la tabla de destino debe cumplir plenamente con la columna de la tabla de origen.

Copia completa de datos para columnas con nombres coincidentes

Mismas columnas = Nueva matriz();

Para cada columna del ciclo SourceTable.Columns
MatchingColumn = TableReceiver.Columns.Find(Columna.Nombre);

Si la columna coincide<>Indefinido entonces

// Obtener propiedades de la columna.
Nombre = Columna.Nombre;
Tipo de valor = Columna.Tipo de valor;
Encabezado = Columna.Encabezado;
Ancho = Columna.Ancho;

// Reemplazar columnas en la tabla de destino.
Índice = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(Índice);
ReceiverTable.Columns.Insert(Índice, Nombre, Tipo de valor, Encabezado, Ancho);

// Agrega el siguiente nombre de las columnas coincidentes a la matriz.
Mismas columnas. Agregar (Columna. Nombre);

final si;

Fin del ciclo;

// Recorre las filas de la tabla fuente.
Para cada fila de SourceTable del ciclo SourceTable

// Agrega una nueva fila a la tabla de destino.
NuevaFila = TableReceiver.Add();

// Complete los valores en las celdas coincidentes.
Para cada nombre Columnas de columnas del mismo nombre Ciclo
NewRow[ColumnName] = SourceTableRow[ColumnName];

Fin del ciclo;

Fin del ciclo;


Tendremos que reemplazar la columna de la tabla de destino por una nueva, cuyas propiedades coincidan completamente con la columna de la tabla de origen.
Por lo tanto, si se encuentra una columna con el mismo nombre en la tabla de destinatarios, recopilamos todas las propiedades de la nueva columna en variables. A continuación, elimine la anterior y cree una nueva columna. Luego recorremos las filas de la tabla fuente.
En el bucle, agregamos una nueva fila a la tabla receptora y abrimos un bucle sobre los nombres de las columnas en la matriz de columnas coincidentes.
Dentro de este bucle anidado, llenamos las celdas de la tabla de destino con los datos de la celda de la tabla de origen.

13. ¿Cómo agregar columnas a la tabla de valores “ValueTable” con restricciones de tipo?

Al agregar una columna, simplemente puede especificar su nombre y dejar intacto el segundo parámetro del método Add(). En este caso, el tipo de datos de la columna es arbitrario.

Agregar una columna sin especificar un tipo de datos

// Agrega una columna sin restricciones de tipo.
ValueTable.Columns.Add("Objeto");


Puede completar el valor del segundo parámetro. Allí debe pasar una descripción del tipo permitido para la columna. La descripción en sí se puede obtener usando el constructor pasando el nombre de cadena del tipo (si hay muchos tipos, separados por comas) o una matriz de tipos válidos como parámetro.

Agregar una columna que indique el tipo de datos

// Restricciones sobre los tipos de datos de las columnas:
// Sólo elementos del directorio "Contrapartes".
Tabla de Valores.Columnas.Add("Cuenta", Nueva Descripción de Tipos("DirectoryLink.Accounts"));


Si entre los tipos permitidos para completar los datos de la columna se encuentra una cadena, puede limitar su profundidad de bits (longitud), especificar el uso de una longitud variable o fija. Todo esto se logra creando un objeto usando el constructor String Qualifiers. A continuación, este objeto se utilizará como uno de los parámetros del constructor TypeDescription.

Usar calificadores para especificar el tipo de datos de una columna de la tabla de valores

// Preparar y establecer restricciones para datos de tipo String.
Calificadores de cadena = Nuevos calificadores de cadena (20, AllowedLength.Variable);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Se pueden realizar acciones similares con respecto a los calificadores de número y fecha.
Tenga en cuenta: el constructor puede crear descripciones de tipo “desde cero” o puede utilizar una descripción de tipo existente como base.

Usar declaraciones de tipos existentes para especificar el tipo de datos de una columna de la tabla de valores

// Ampliación de la descripción de tipo utilizada anteriormente.
QualifiersNumbers = Nuevos QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = Nuevos DateQualifiers(DateParts.Date);
ValidTypes extendidos = New TypeDescription(ValidTypes, "Número, Fecha", Calificadores de número, Calificadores de fecha);

ValueTable.Columns.Add("Nota", ExtendedAcceptableTypes);