Por un SharePoint Sostenible – Controla tus listas y bibliotecas, Conjunto de documentos

Escrito por Sergio Hernandez Mancebo - 27/08/2015

​Me podría permitir la licencia de decir que la gran mayoría de las veces nuestras aplicaciones de SharePoint se van ralentizando, o en casos más extremos directamente sufrimos caídas del sistema de forma repentina.

Evidentemente pueden existir muchos factores para provocar estos síntomas, como un mal gobierno de nuestra granja, una actualización inesperada…; pero yo quiero centrarme en un motivo muy concreto y es "el desbordamiento de nuestra información". Me voy a explicar, me refiero a que nuestras listas o bibliotecas empiezan a superar los límites de elementos recomendados por Microsoft, y esto provoca que nuestras consultas o no funcionen o vayan muy lentas, lo que provoca una sensación de ralentización de nuestras aplicaciones.

En este artículo vamos a recordar cuales son nuestros límites, y algunas pautas a tener en cuenta cuando nos planteemos montar una aplicación sobre listas de SharePoint 2013 OnPremises, que ya podemos anticipar que si lo hacemos bien vamos a conseguir una aplicación con un rendimiento óptimo.

Gestiona y controla Tú la información

A partir de ahora nos referiremos al límite máximo de nuestras listas como "umbral", y vamos a tener en cuenta los siguientes umbrales de lista/biblioteca de SharePoint antes de analizar las opciones para gestionar nuestra información:

  • Límite de elementos por vistas: 5.000 (20.000 para usuarios administradores).
  • Límite máximo de columnas de búsqueda por lista: 12.
  • Límite recomendado de permisos exclusivos por ítem: 5.000.

Cuando vayamos a analizar nuestro sistema y plantear una solución técnica nos tenemos que fijar mínimo en estos tres umbrales (existen muchos más expuestos por Microsoft), ya que si los respetamos tendremos mucho terreno ganado.

Ahora bien ¿Existe alguna solución mágica que nos permita cumplir todos estos objetivos?

La respuesta es sencilla, "NO", en estos casos es más fácil por la experiencia vivida saber muchas formas de cómo no hacerlo, que la realmente perfecta, dado que cada proyecto es un mundo y cubrir todos los casos es casi imposible.

Lo que si se recomienda es no hacer lo siguiente:

  • Subir los límites desde administración central
Los umbrales que hemos recordado antes son "modificables" desde la administración central, pero es muy poco recomendable. Por un lado, si llegamos a este punto podemos confirmar que nuestra fase de Análisis y Diseño es un fracaso porque ya notamos el mal rendimiento, y por otro lado es nadar para morir en la orilla, ya que la degradación es exponencial y llegado a este punto cada vez nos va a funcionar menos subir los límites.
  • Pensar en nuestras listas como un modelo "RELACIONAL
    Dejemos claro que las listas de SharePoint nunca pueden representar un modelo relacional como podríamos conseguir directamente en tablas con SQL. Tender a este modelo nos implica llenar nuestras listas de campos del tipo búsqueda para poder reproducir los joins entre tablas, y estamos claramente tendiendo a superar el segundo umbral (nº máximo de columnas de búsqueda sobre listas).
  • Cultivo de carpetas desmedido para gestionar nuestras vistas
    Añadir carpetas a las listas puede ser una buena solución, ya que organizamos nuestra información de forma estructurada y además empezamos a limitar el número de elementos por vista. Tenemos que entender que una carpeta es un ítem más y podemos tener igualmente 5k carpetas por vista como máximo. Pero esta solución alberga un gran problema, y es el usuario. Yo mismo como usuario en mi maquina personal tiendo a tener millones de carpetas para organizar mi información, llevar esto a SharePoint puede ser la perdición para el desarrollador, ya que realizar búsquedas recursivas en ocasiones puede ser muy complejo.

    En conclusión, no es malo añadir carpetas, pero añadir sin control es mala práctica.
  • Vistas infinitas
    ¿Si el problema es 5k elementos por vista, porque no crear vistas a demanda y controlamos así los umbrales?. Ya podemos deducir que esta solución tampoco es la correcta, ya que no podemos asignar vistas a usuarios, es decir todos los usuarios verían las mismas vistas, además de que es casi imposible controlar los umbrales filtrando por columna o agrupando por varias, siempre llega un momento que nos despistamos y perdemos el control de nuestra información, obligándonos incluso a subir los límites para poder crear más vistas aún. 

Entonces visto todo lo anterior, ¿No podemos conseguir nuestros objetivos?, evidentemente la respuesta es sí, si no SharePoint no tendría tanto recorrido en el mercado. Si conjugamos una buena fase de análisis y diseño de nuestra información, ajustamos unos límites de listas realistas y controlados que podrían ser incluso un poco más altos del estándar, no damos el control total al usuario para crear carpetas si no que llevamos un proceso lógico de crecimiento, y lo mezclamos con vistas acotadas / permisos por carpetas, podemos llegar a conseguir sin mucho esfuerzo a futuro un sistema accesible y sobre todo con un rendimiento óptimo.
Pero para realizar todo esto tenemos que tener unos conocimientos altos de SharePoint y de arquitectura en general, por lo que vamos a plantear el uso de los Conjuntos de Documentos para gestionar nuestras bibliotecas, ya que son sencillos de utilizar y nos pueden ayudar a cumplir todos los requisitos anteriores.
Conjunto de Documentos en SharePoint 2013 
Un conjunto de documentos de SharePoint es un tipo especial de carpeta con metadata, que nos permite administrar y gestionar documentos y archivos. Además, tiene su propio tipo de contenido, y permite limitar que tipos de contenido pueden tener los archivos que contiene. Los límites de un conjunto son los mismos que vimos anteriormente, no aplica ninguno nuevo. Un conjunto puede tener permisos exclusivos o se le pueden asignar Workflows, como a cualquier carpeta o elemento de una biblioteca.
Caso práctico: Gestión de proyectos
Vamos a ver un claro caso de uso de conjuntos sobre SharePoint, que puede ser un área de proyectos para el departamento de Finanzas de una empresa. Pongamos que una empresa necesita archivar y gestionar los gastos, pedidos y seguimientos de un proyecto, y que cada proyecto tendrá un grupo acotado de usuarios que podrán aportar la documentación. Cada proyecto vamos a suponer que tiene documentos del tipo Gastos, Pedidos y Resultados; y además un proyecto tendrá usuarios Gestores que puedan administrar la documentación y usuarios Lectores que puedan consultarla.

Activar características

Para poder usar conjuntos de documentos, lo primero que debemos hacer es activar la característica "Conjunto de documentos o document sets" desde las características de la colección de sitios.

Imagen 1.- Característica con las funcionalidades de conjuntos de documentos. 

Crear tipos de contenido

Necesitamos crear los tipos de contenido para el Proyecto (conjunto padre) y para los documentos del tipo Gastos, Pedidos y Resultados. Para ello accedemos a configuración del sitio raíz, y en tipos de contenido creamos los que necesitamos como muestra la imagen.

Imagen 2.- Creamos un tipo de contenido para nuestro conjunto de documentos. 

Para el proyecto crearemos un tipo de contenido primario Conjunto de documentos, para el resto del tipo Documento. Agruparemos todos los tipos de contenido en un nuevo grupo que llamaremos Finanzas.

Imagen 3.- Documentos y Conjuntos de Documentos del grupo Finanzas. 

Podemos añadir alguna columna al tipo de contenido, como por ejemplo he hecho con los gastos.

Imagen 4.- Columnas del tipo de contenido Gastos. 

Los gastos contienen un nombre, descripción del mismo, un usuario aprobador que consume un grupo de seguridad que he creado como Aprobadores_Gastos_Proyectos, y por ultimo una fecha para auditar el registro del gasto en el proyecto. Como Gastos hereda del tipo Documento, tendremos que subir por ejemplo un PDF o una Excel con el resumen de Gastos para que el Aprobador revise los números. Para el resto de documentos deberíamos hacer algo similar, así como con el proyecto que en mi caso queda con Título, Descripción, Gestor Proyecto (Persona), Fecha Inicio y Fecha de Finalización. El campo Gestor Proyecto se alimenta del nuevo grupo de seguridad Gestores_Proyectos.

Imagen 5.- Columnas del tipo de contenido Proyecto. 

Crear biblioteca de documentos

Creamos una biblioteca de documentos con el tipo Proyecto como tipo de contenido primario, con lo que tendremos una biblioteca con Conjunto de documentos implementada. Para conseguir esto, en contenido del sitio Agregamos una aplicación del tipo Biblioteca de Documentos, con el nombre Proyectos.

Imagen 6.- Habilitando el uso de tipos de contenidos. 

Una vez creada la biblioteca en la configuración avanzada de la biblioteca => configuración avanzada, permitimos administrar los tipos del contenido como muestra la imagen. Ahora desde la página de configuración de la lista en el apartado "Tipos de documentos" podemos  borrar el tipo de contenido Documento y agregar el tipo de contenido Proyecto creado anteriormente.

Imagen 7.- Agregamos el tipo de contenido Proyecto a la biblioteca. 

Configurar Conjunto de documentos

En este punto ya podríamos crear un nuevo proyecto, pero antes vamos a configurar algunos aspectos interesantes de nuestro conjunto de documentos. Desde la configuración de la biblioteca, en Tipos de Contenido vamos a acceder al tipo de contenido Proyecto. Una vez allí seleccionamos configuración del conjunto de documentos, y en esta pestaña podemos gestionar lo siguiente:

  • Tipos de contenido permitidos

Se pueden elegir qué tipos de contenido van a tener los documentos del conjunto, en este caso vamos a seleccionar los creados para Finanzas (Gastos, Pedidos, Resultados).

Imagen 8.- Administramos los tipos de contenido del conjunto de documentos. 

  • Contenido predeterminado

Una opción interesante es que el conjunto coloque en distintas carpetas los documentos en función del tipo de contenido, o que incluso cuando creemos un documento del tipo Gasto se genere un documento predeterminado como podría ser un contrato a firmar o un documento de privacidad.

Imagen 9.- Documentos predeterminados. 

  • Vista página principal

Podemos crearnos y elegir que vista queremos ver en la página principal del conjunto de documentos en la relación de documentos del proyecto. Nos vamos a crear una vista que va a contener los campos Titulo, Gestor Proyecto, Fecha de Inicio, Fecha de Finalización de proyecto, y la llamaremos "Vista Proyecto General".

Imagen 10.- Vista principal. 

  • Personalizar página principal

Cuando creamos un conjunto de documentos, este tiene una página principal que se puede asemejar a la vista de detalle de una biblioteca pero que es mucho más completa.

Esta página es configurable al punto que podemos añadir WebParts ya existentes o desarrolladas por nosotros de forma sencilla, como en una página cualquiera de bibliotecas de SharePoint. Para personalizarla seleccionamos "Personalizar la página principal" y una vez en la página, podemos seleccionar editar Página en la ribbon superior y editar la página a nuestro gusto. Por defecto la página añade un logo predeterminado, y las dos WebPart que tenemos de serie para conjuntos de documentos.

Imagen 11.- Página del conjunto de documentos en modo edición. 

    • Propiedades del conjunto:

Esta WebPart visualiza las columnas indicadas en el apartado "Columnas de página principal" en la configuración de nuestro conjunto de documentos.

    • Contenido del conjunto de los documentos:

      Lista todos los documentos pertenecientes al conjunto, y en este caso a nuestro proyecto.

Crear un nuevo proyecto

Hemos configurado nuestra biblioteca de Proyectos de forma correcta, por lo que solo nos queda probar el crear un nuevo proyecto y familiarizarnos con el proceso de dar de alta nuevos documentos.

Imagen 12.- Creando un nuevo proyecto. 

Necesitaremos dar de alta nuestro proyecto con los datos que configuramos en los pasos anteriores.

Imagen 13.- Formulario de creación del conjunto de documentos. 

Una vez creado el documento, vemos la página principal del conjunto definida en la configuración de la biblioteca, en este caso hemos dejado la que nos viene por defecto.

Imagen 14.- Conjunto de documentos de Proyecto. 

El proceso de creación es similar a crear un ítem en una lista de SharePoint, y luego subir los documentos es igual que subir documentos a una biblioteca. Por ejemplo, vamos a subir un documento del tipo Gasto, seleccionando "Nuevo Documento". Se nos solicita que adjuntemos el archivo y los datos que configuramos en el tipo de documento Gastos.

Imagen 15.- Formulario de creación de documento de gastos. 

El resultado es el siguiente, un nuevo conjunto del tipo proyecto llamado Proyecto Demo, que contiene un nuevo documento del tipo Gasto.

Imagen 16.- Conjunto de documento creado. 

Permisos del proyecto y biblioteca

Esta parte la podemos complicar todo lo que queramos, lo más sencillo sería crearnos un grupo de seguridad por cada proyecto con el nombre "Miembros_NombreProyecto", y le daríamos lectura sobre ese nuevo conjunto de documentos. A su vez reutilizaremos el grupo de Gestores_Proyectos para darles permisos de colaboración. Sobre la biblioteca podemos dar permisos de Colaboración a Gestores_Proyecto y lectura al resto de grupos de lectores que vayamos creando.

Esto es una opción que yo acabo de elegir, para demostrar que un conjunto no deja de ser un ítem más al estilo de una carpeta en una biblioteca y podemos dar permisos exclusivos. Debemos recordar que podríamos crear un máximo de 5k proyectos sin sobrepasar el umbral de permisos exclusivos, lo cual en este caso está bastante bien.

Conclusiones

Como hemos podido ver sin tirar una línea de código hemos conseguido administrar información por valor de 5k proyectos, y respetando los límites de SharePoint. Podemos dar seguridad a los conjuntos, personalizar la página de resultados e incluso añadir componentes propios si fuera necesario. Podemos concluir que no hay solución mágica para todo, pero esta es una buena forma de ordenar tus bibliotecas y conseguir que un usuario tenga la información controlada respetando los umbrales que nos marca SharePoint, lo cual nos dará un mayor rendimiento en nuestras aplicaciones.

Conjunto de Documentos: Acceso a Datos desde código

Como hemos visto en el caso práctico con conjunto de documentos y los componentes Out of the box de SharePoint podemos conseguir resultados interesantes, pero para los que les gusta desarrollar, o para casos más complejos vamos a ver un poco como crear y consumir un conjunto de documentos desde código.

Código Servidor / Modelo de Objetos de SharePoint

La primera forma y la más común es desarrollar código servidor en una WebPart, servicio web o una aplicaction page con modelo de objetos de SharePoint en servidor, que gestione nuestros conjuntos de documentos. Para poder realizar esto necesitamos añadir la dll "Microsoft.Office.DocumentManagement", a nuestro proyecto (Viene con la instalación de SharePoint).

Aunque no lo vamos a tratar en este artículo también podemos consultar conjuntos vía CSOM en JavaScript o por PowerShell.

Crear un ítem del tipo conjunto de documentos

Imagen 17.- Código para crear un conjunto de documentos. 

Como vemos con la instrucción DocumentSet.Create que nos proporciona la dll que hemos añadido antes, podemos crear un conjunto de documentos de forma sencilla. Necesitamos el SPContentType con el tipo de contenido primario del conjunto a crear y que debe existir en SharePoint, el rootFolder de la biblioteca donde vamos a añadir el nuevo conjunto y el nombre del nuevo conjunto de documentos.

Insertar documentos a un conjunto

Imagen 18.- Subir un documento a un Conjunto de documentos- 

La función de insertar un nuevo conjunto nos devolvía un SPFolder, que usaremos para insertar sobre este un documento obtenido por pantalla. Como vemos en el código los parámetros recibidos en el método son la carpeta del conjunto, el fichero, el nombre del documento, el título del documento a mostrar por pantalla y el id del tipo de contenido del documento (este debe ser alguno de los permitidos por el conjunto o nos arrojará una excepción).

No es muy distinto a añadir un documento a una librería de SharePoint, ya que como hemos dicho antes un conjunto de documentos no deja de ser un SPFolder para SharePoint.

Leer los documentos de un conjunto

Imagen 19.- Obtener un documento del conjunto de documentos 

Como podemos ver en el código, podemos obtener el conjunto con el nombre de la lista y el nombre del conjunto de documentos, y con una simple iteración sacar todos los SPFiles del conjunto. Aclarar que también podríamos hacer una consulta con CAML o LINQ to SharePoint, si no queremos iterar sobre el listado de ficheros.

En resumen, podemos comprobar que vía código se nos simplifica bastante realizar consultas o insertar elementos con conjunto de documentos, si lo comparamos con estructurar nuestras bibliotecas con carpetas, ya que nos implicaría tener que ir haciendo recorridos recursivos sobre una biblioteca de SharePoint.

 

Sergio Hernández Mancebo
Team Leader en ENCAMINA
shernandez@encamina.com

***