Каталог решений - Поблочная обработка таблицы. Обзор решений

Поблочная обработка таблицы. Обзор решений

Поблочная обработка таблицы. Обзор решений

В наличии

8 способов реализации повседневной актуальной задачи, готовый код

Категория:

Описание

Довольно часто возникает ситуация, когда в таблице БД, в коллекции на форме или в таблице значений содержатся данные, логически связанные N:1, и требующие поблочной обработки, т.е. группировки в блоки и некоего действия. Содержимое таблицы надо разбить на смысловые фрагменты-блоки, и обработать каждый блок как отдельное подмножество. Частным случаем являются связки 1:1, подлежащие обработке той же механикой.

Примерами могут быть товары, которые надо инвентаризировать по их видам номенклатуры (колонки "Товар", "Вид") и должно быть столько инвентаризаций, сколько видов товаров; или связки "Товар"+"Склад", словом, задача возникает в текучке разработки постоянно. Есть несколько способов решения, каждый из которых имеет плюсы и минусы, но суть одна — "сгрести" единообразные данные из таблицы в отдельные множества и обработать.

Так, будем говорить о группировочных колонках и о группируемых. Будем оперировать простыми и ссылочными типами, и оставим за кадром статьи специфику поведения 1С в случаях, когда группировать надо по колонкам, содержащим коллекции или всякие экзотические объекты.

Основные отличия в способах зависят от:

  • Происхождения данных. Если это таблица БД, то разумно применить запросную технику или СКД; важно учитывать размер выборки. Если это таблица на интерфейсе или в сеансовом кэше (например, прочитанная из Excel), то можно оперировать таблицей значений напрямую (заносить таблицу в запрос ради удобства реализации может оказаться нерационально).
  • Наполнения и объёма данных. Если это таблица с высокой селективностью группировочных полей (много мелких фрагментиков), разнотипным наполнением, необходимостью дообработки "по месту" (например, ВРег или СокрЛП), то запрос может проиграть простым действиям с таблицами. Аналогично, если таблица мала по объёму.
  • Логики задачи. Просто "перетасовать" данные, записав их в другую коллекцию, или же обращаться к БД, в т.ч. на запись — это влияет на выбор способа в соответствии с количеством и качеством конкретных действий с каждым фрагментом. Важно количество группировочных полей — если оно одно (один критерий), всё просто, а если блок однозначно определяется только кортежем, совокупностью значений нескольких полей, то не все способы годятся.
  • Ресурсов, используемых 1С. Разнесённость серверов СУБД и приложений при плохой связи между ними, или малое место под сеансовые данные — это тоже может сказаться на поведении запросов и СКД.

Обзор не ставит целью утвердить превосходство какого-либо из способов, все они выигрышны либо костыльны в той или иной конкретной ситуации.

 

Будем рассматривать способы решения на примере сотрудников. Есть таблица из колонок "Сотрудник" (ссылка), "Должность" (ссылка), "ДатаРождения" (дата). Задача, например, сформировать списки на премии и штрафы согласно должностям (см. картинку). Для простоты примем, что группировочные колонки однотипны, не могут содержать пустые значения.

В описании каждого способа применён запрос, но указано, обязательно ли это, или можно работать сразу с таблицей. Указаны места, где реализуется конкретная логика. В нашем примере это вывод сообщений в текстовый документ "тЛог". Работа с группировочными (т.н."ключевыми") полями приведена универсально, с группируемыми — на конкретном примере.

Итак:

 

has been added to your cart:
Оформление заказа