Каждому программисту приходилось работать с таблицей значений, очень часто ее надо объединить с другой таблицей, как вариант запихиваешь их в запрос и объединяешь - код довольно громоздкий и проделывать одно и тоже надоедает. Иногда надо свернуть таблицу значений, но результат должен быть как то сгруппирован, допустим одно поле сотрудник, а другое массив значений с какими то данными по нему. Давно хотел сделать что то, чтобы взять произвольную таблицу и объединить с другой или сгруппировать ее и чтобы это можно было это выполнять в одну строчку, вот написал несколько функций для обработки таблиц.
Пример:
имеем 3 исходных таблицы:
первая функция "Левое соединение"
параметры:
- Таблица1,
- Таблица2
- строка вида "Поле11 = Поле21, Поле12 = Поле22"
(поля Поле11,Поле12 принадлежат первой таблице, Поле21,Поле22 второй, объединять можно только по равенству полей)
таблицаЛевоеСоединение = ЛевоеСоединение(таблицаТест1, таблицаТест2, "Сотрудник = Сотрудник");
Результат ниже:
таблицаВнутреннееСоединение = ВнутреннееСоединение(таблицаТест1, таблицаТест2, "Сотрудник = Сотрудник");
таблицаВнутреннееСоединение1 = ВнутреннееСоединение(таблицаТест1,
таблицаТест3,
"Сотрудник = Сотрудник, ВидРасчета = Начисление");
Еще одна часто встречающаяся задача свернуть табличку значений, но так чтобы результат был сгруппирован в виде массива или таблицы значений или еще каким то образом.
следующая написанная функция "СвернутьТаблицуЗначений"
параметры:
- таблица значений,
- поля для группировки в виде строки, перечислены через запятую
- структура, где ключи имена полей, а значения агрегатные функции СКД
Пример:
Выберем максимальный период для каждого сотрудника:
таблицаСвернутая = СвернутьТаблицуЗначений(таблицаТест1,
"Сотрудник",
Новый Структура("МаксПериод", "МАКСИМУМ(ПериодРегистрации)"));
Для каждого сотрудника получим табличку значений, где поля будут ВидРасчета и Сумма:
таблицаСвернутая1 = СвернутьТаблицуЗначений(
таблицаТест1,
"Сотрудник",
Новый Структура("ТаблицаРасчетов", "ТаблицаЗначений(ВидРасчета КАК Начисление, Результат КАК Сумма)"));
Для каждого сотрудника получим массив уникальных значений видов расчетов:
таблицаСвернутая2 = СвернутьТаблицуЗначений(
таблицаТест1,
"Сотрудник",
Новый Структура("ВидыРасчетов", "Массив(Различные ВидРасчета)"));
Для каждого сотрудника на каждый период получим список строк вида - "Вид расчета, Результат":
таблицаСвертка3 = СвернутьТаблицуЗначений(
таблицаТест1,
"ПериодРегистрации, Сотрудник",
Новый Структура("Начисления", "СоединитьСтроки(ТаблицаЗначений(ВидРасчета, Результат), "";"", "","")"));
Для каждого сотрудника получим сумму начислений и список строк уникальных видов расчетов:
таблицаСвертка4 = СвернутьТаблицуЗначений(
таблицаТест1,
"Сотрудник",
Новый Структура(
"Начислено, ВидыРасчетов",
"Сумма(Результат)", "СоединитьСтроки(Массив(Различные ВидРасчета), "";"")")
);
Функции написаны на основе механизма компоновки данных, СКД формируется программно, за основу взяты статьи
"Программное создание схемы компоновки данных"
//infostart.ru/1c/articles/1179039/
"Агрегатные функции СКД, о которых мало кто знает"
//infostart.ru/1c/articles/1116759/