Работа с массивом как с абстрактным типом данных на 1С
Реализована библиотека по работе с массивом. В библиотеке доступны абстрактные функции: Отобрать (filter), НайтиЭлемент (find), Сортировать (sort), Отобразить (map), Преобразовать (reduce), Взять (pop), Положить (push), ДляКаждого (forEach).
Функции библиотеки доступны в серверном и клиентском контекстах.
Реализована также и объектная модель АТД массива. Объектная модель позволяет использовать при работе с АТД массивом текучий интерфейс.
Оглавление:
Примеры
Больше примеров смотрите в статьях:
Конструктор
Фрукты = РаботаСМассивом.АТДМассив(СтрРазделить("вишня, арбузы, бананы", ", ", Ложь));
Фрукты.ДляКаждого("Сообщить(Элемент)");// [вишня, арбузы, бананы]
Сортировать (sort)
Фрукты.Сортировать();
Фрукты.ДляКаждого("Сообщить(Элемент)");// [арбузы, бананы, вишня]
Отобрать (filter)
Фрукты.Отобрать("СтрНайти(Элемент, ""а"") > 0");
Фрукты.ДляКаждого("Сообщить(Элемент)");// [арбузы, бананы]
Отобразить (map)
Фрукты.Отобразить("ВРег(Лев(Элемент, 1)) + Прав(Элемент, СтрДлина(Элемент) - 1)");
Фрукты.ДляКаждого("Сообщить(Элемент)");// [Арбузы, Бананы]
Преобразовать (reduce)
Количество = Фрукты.Преобразовать("Накопитель + 1", 0);
Сообщить(Количество);// 2
Еще примеры
// Настройка связей элементов формы
Элементы.ДоговорКонтрагентов.СвязиПараметровВыбора = РаботаСМассивом.АТДМассив()
.Положить(Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Организация"))
.ВФиксированныйМассив()
;
// Конструктор описания типов на основе массива типов
ДопустимыеТипы = Новый ОписаниеТипов(РаботаСМассивом.АТДМассив()
.Положить(Тип("СправочникСсылка._ДемоНоменклатура"))
.Положить(ОбщегоНазначения.ОписаниеТипаСтрока(20))
.ВМассив())
;
// Сортировка по ФИО
Сотрудники = РаботаСМассивом.АТДМассив()
.Положить(Новый Структура("Фамилия, Имя, Отчество", "Иванов", "Иван", "Иванович"))
.Положить(Новый Структура("Фамилия, Имя, Отчество", "Иванов", "Иван", "Гермагенович"))
.Положить(Новый Структура("Фамилия, Имя, Отчество", "Савельев", "Иван", "Иванович"))
.Положить(Новый Структура("Фамилия, Имя, Отчество", "Андреев", "Иван", "Иванович"))
.Положить(Новый Структура("Фамилия, Имя, Отчество", "Андреев", "Андрей", "Андреевич"))
;
Сотрудники.СортироватьПо("Фамилия, Имя, Отчество");
Сотрудники.ДляКаждого("Сообщить(СтрШаблон(""%1 %2 %3"", Элемент.Фамилия, Элемент.Имя, Элемент.Отчество))"); // [Андреев Андрей Андреевич, Андреев Иван Иванович, Иванов Иван Гермагенович, Иванов Иван Иванович, Савельев Иван Иванович]
// Список пользователей с полными правами
СписокПользователей = РаботаСМассивом.АТДМассив(ПользователиИнформационнойБазы.ПолучитьПользователей())
.Отобрать("Элемент.Роли.Содержит(Метаданные.Роли.ПолныеПрава)")
.Отобразить("Элемент.Имя")
.ВМассив()
;
Сообщить(ОбщийКлиентСервер.ЗначениеВJSON(СписокПользователей));
Совместно с БСП
Файлы = Новый Массив;
РаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(СсылкаНаДокумент, Файлы);
СсылкаНаПрисоединенныйФайл = РаботаСМассивом.АТДМассив(Файлы)
.Отобрать("СтрНайти(Элемент.Наименование, ""#БДДС#"") > 0")
.Отобрать("НЕ Элемент.ПометкаУдаления")
.Взять()
;
Пример использования оператора Спрямить (flat)
МетаданныеРасширений = РаботаСМассивом.АТДМассив(СтрРазделить("Константы, Справочники, Документы, РегистрыСведений, РегистрыНакопления", ", ", Ложь))
.Отобразить("РаботаСМассивом.АТДМассив(Метаданные[Элемент]).Отобрать(""Элемент.РасширениеКонфигурации() <> Неопределено"").ВМассив()")
.Спрямить()
.Отобразить("Новый Структура(""ПолноеИмя, Расширение"", Элемент.ПолноеИмя(), Элемент.РасширениеКонфигурации().Имя)")
.Отобрать("НЕ СтрНачинаетсяС(Элемент.ПолноеИмя, ""Константа."")")
.ВМассив()
;
Сообщить(ОбщийКлиентСервер.ОбъектВJSON(МетаданныеРасширений));
Пример использования абстракций Диапазон и Срез
// Создание массива чисел от 1 до 100
ИсходныйМассив = РаботаСМассивом.Диапазон(1, 101);
Сообщить(ОбщийКлиентСервер.ОбъектВJSON(ИсходныйМассив));
// Формирование подмассивов по 10 чисел
Шаг = 10;
Для Каждого Индекс Из РаботаСМассивом.Диапазон(0, 100, Шаг) Цикл
Срез = РаботаСМассивом.Срез(ИсходныйМассив, Индекс, Индекс + Шаг);
Сообщить(ОбщийКлиентСервер.ОбъектВJSON(Срез));
КонецЦикла;
Группировка
В примере группируются банковские счета по настройкам обмена. На выходе получается словарь настроек и массив счетов.
НастройкиОбмена = РаботаСМассивом.Преобразовать(
БанковскиеСчета,
"ОбщийКлиентСервер.ВставитьСвойство(
|НачальноеЗначение, Элемент.НастройкаОбмена,
| РаботаСМассивом.Добавить(ОбщийКлиентСервер.ЕстьПустоеЗначение(НачальноеЗначение[Элемент.НастройкаОбмена], Новый Массив), Элемент)
|)",
Новый Соответствие
);
Здесь БанковскиеСчета это таблица значений. Если нужен тот же сереализуемый результат:
НастройкиОбмена = РаботаСМассивом.Преобразовать(
ОбщегоНазначения.ТаблицаЗначенийВМассив(БанковскиеСчета),
"ОбщийКлиентСервер.ВставитьСвойство(
|НачальноеЗначение, Элемент.НастройкаОбмена,
| РаботаСМассивом.Добавить(ОбщийКлиентСервер.ЕстьПустоеЗначение(НачальноеЗначение[Элемент.НастройкаОбмена], Новый Массив), Элемент)
|)",
Новый Соответствие
);
Состав и установка
Состав:
- Конфигурация (этот проект):
- модуль библиотеки РаботаСМассивом
- обработка АТДМассив, реализующая объектный интерфейс
Есть несколько вариантов установки: 1. Установить как расширение 2. Объединить с конфигурацией текущего проекта 3. Объединить с конфигурацией проекта KASL
Далее подробнее.
Установить как расширение
Скачать расширение из последнего релиза проекта и установить в базу. Требуется также установить расширения проектов из зависимостей.
Объединить с конфигурацией текущего проекта
Объединить с файлом конфигурации из последнего релиза проекта:
- Снять признак объединения с общих свойств
Установить режим объединения с приоритетом в файле Требуется также установить расширения проектов из зависимостей.
Объединить с конфигурацией проекта KASL
Объединить с файлом конфигурации из Демо-базы к статье Работа с абстрактным массивом или с конфигурацией KASL.cf из релиза:
- Установить режим объединения с приоритетом в файле
Отметить по подсистемам файла:
- KASL->ОбщегоНазначения
KASL->АТДМассив
Зависимости
БСП (работает с версией 3 и выше)
- Общие модули из подсистемы KASL->ОбщегоНазначения