initial commit

This commit is contained in:
Dmitry Belyaev 2022-08-29 16:49:09 +03:00
commit a26f7a2c55
Signed by: b4tman
GPG Key ID: 41A00BF15EA7E5F3
3 changed files with 574 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/*.e[rp]f

28
src/Итератор.xml Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.14">
<ExternalDataProcessor uuid="86475353-53f5-41d2-bfae-930bb0d54e1b">
<InternalInfo>
<xr:ContainedObject>
<xr:ClassId>c3831ec8-d8d5-4f93-8a22-f9bfae07327f</xr:ClassId>
<xr:ObjectId>0bd91f3e-e223-4f10-ac23-2b291886a146</xr:ObjectId>
</xr:ContainedObject>
<xr:GeneratedType name="ExternalDataProcessorObject.Итератор" category="Object">
<xr:TypeId>99521403-f04d-4841-a577-90e91ad36a23</xr:TypeId>
<xr:ValueId>8082550c-6dae-48f2-9e4d-a5279581317f</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>Итератор</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Итератор</v8:content>
</v8:item>
</Synonym>
<Comment/>
<DefaultForm/>
<AuxiliaryForm/>
</Properties>
<ChildObjects/>
</ExternalDataProcessor>
</MetaDataObject>

View File

@ -0,0 +1,545 @@
Перем Коллекция;
Перем Контекст;
Перем ТекИндекс;
Перем ИтерацияНачата;
#Область Служебные
Функция __ВыполнитьФрагмент(Знач Код, Знач Вход, Знач ИмяВход = "Вход", Знач ИмяВыход = "Выход", Знач Инициализировать = Ложь, Знач _ = Неопределено)
Выход = ?(Инициализировать, Вход, Неопределено);
Если НЕ "Вход" = ИмяВход Тогда
Код = СтрШаблон("%1=Вход;%2", ИмяВход, Код);
КонецЕсли;
Если НЕ "Выход" = ИмяВыход Тогда
Код = СтрШаблон("%1;Выход=%2", Код, ИмяВыход);
КонецЕсли;
Выполнить(Код);
Возврат Выход;
КонецФункции
Функция __Мап(Знач Код, Знач Коллекция, Знач _ = Неопределено)
Результат = Новый Массив;
Для Каждого Элемент Из Коллекция Цикл
НовыйЭлемент = __ВыполнитьФрагмент(Код, Элемент, "Элемент", "Результат", Истина, _);
Результат.Добавить(НовыйЭлемент);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция __Фильтр(Знач КодУсловия, Знач Коллекция, Знач _ = Неопределено)
Результат = Новый Массив;
Для Каждого Элемент Из Коллекция Цикл
Условие = __ВыполнитьФрагмент(КодУсловия, Элемент, "Элемент", "Условие", , _);
Если Условие Тогда
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция __ВыполнитьФрагмент_ДляСвертки(Знач Код, Знач Элемент, Знач Результат, Знач _ = Неопределено)
Выполнить(Код);
Возврат Результат;
КонецФункции
Функция __Свернуть(Знач Код, Знач Коллекция, Знач Результат = Неопределено, Знач _ = Неопределено)
Для Каждого Элемент Из Коллекция Цикл
Результат = __ВыполнитьФрагмент_ДляСвертки(Код, Элемент, Результат, _);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция __ВзятьНеБольше(Знач Коллекция, Знач Количество)
Результат = Новый Массив;
Для Каждого ТекСтр Из Коллекция Цикл
Если 1 > Количество Тогда
Прервать;
КонецЕсли;
Результат.Добавить(ТекСтр);
Количество = Количество - 1;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция __Пропустить(Знач Коллекция, Знач Количество)
Результат = Новый Массив;
Для Каждого ТекСтр Из Коллекция Цикл
Если 0 < Количество Тогда
Количество = Количество - 1;
Продолжить;
КонецЕсли;
Результат.Добавить(ТекСтр);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция __Обратить(Знач Коллекция)
Если 0 = Коллекция.Количество() Тогда
Возврат Коллекция;
КонецЕсли;
Результат = Новый Массив;
Для Смещение = 1 По Коллекция.Количество() Цикл
ТекИндекс = Коллекция.Количество() - Смещение;
Результат.Добавить(Коллекция[ТекИндекс]);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция __СимволыВСтроке(Знач Стр) Экспорт
Результат = Новый Массив;
Для Сч = 1 По СтрДлина(Стр) Цикл
Результат.Добавить(Сред(Стр, Сч, 1));
КонецЦикла;
Возврат Результат;
КонецФункции
Функция __МассивПоДиапазонуЧисел(Число_С, Числоо) Экспорт
Результат = Новый Массив;
Для ТекЧисло = Число_С По Числоо Цикл
Результат.Добавить(ТекЧисло);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция __ЭтоКоллекция(ЧтоТо) Экспорт
Результат = Ложь;
Если Неопределено = ЧтоТо Тогда
Возврат Результат;
Конецесли;
Попытка
Для Каждого ТекСтр Из ЧтоТо Цикл
Прервать;
КонецЦикла;
Результат = Истина;
Исключение
;
КонецПопытки;
Возврат Результат;
КонецФункции
Функция __ОбходДерева(Дерево, Знач КодПолученияСтрок = "", Знач ВШирину = Ложь) Экспорт
Результат = Новый Массив;
Если ПустаяСтрока(КодПолученияСтрок) Тогда
Если Тип("ДеревоЗначений") = ТипЗнч(Дерево) Тогда
КодПолученияСтрок = "Строки = Узел.Строки";
КонецЕсли;
КонецЕсли;
Очередь = Новый Массив;
Очередь.Добавить(Дерево);
Пока Очередь.Количество() > 0 Цикл
Следующий = ?(ВШирину, 0, Очередь.ВГраница());
Узел = Очередь.Получить(Следующий);
Очередь.Удалить(Следующий);
Результат.Добавить(Узел);
Строки = Неопределено;
Если ПустаяСтрока(КодПолученияСтрок) Тогда
// для массива массивов не нужно определять свойство где лежат строки
Строки = Узел;
Иначе
Строки = __ВыполнитьФрагмент(КодПолученияСтрок, Узел, "Узел", "Строки", Истина);
КонецЕсли;
Если НЕ __ЭтоКоллекция(Строки) Тогда
Продолжить;
КонецЕсли;
Для Каждого ТекСтр Из Строки Цикл
Очередь.Добавить(ТекСтр);
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция __Транспонировать(МассивМассивов)
Результат = Новый Массив;
МинКоличество = Неопределено;
Для Каждого ТекМассив Из МассивМассивов Цикл
Если Неопределено = МинКоличество Тогда
МинКоличество = ТекМассив.Количество();
Продолжить;
КонецЕсли;
МинКоличество = Мин(МинКоличество, ТекМассив.Количество());
КонецЦикла;
Если 0 = МинКоличество Тогда
Возврат Результат;
КонецЕсли;
Для Индекс = 0 По МинКоличество - 1 Цикл
Элемент = Новый Массив;
Для Каждого ТекМассив Из МассивМассивов Цикл
Элемент.Добавить(ТекМассив[Индекс]);
КонецЦикла;
Результат.Добавить(Элемент);
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти
Функция ЗагрузитьКоллекцию(_Значение)
Результат = Неопределено;
Если Тип("Строка") = ТипЗнч(_Значение) Тогда
Результат = __СимволыВСтроке(_Значение);
ИначеЕсли Тип("Массив") = ТипЗнч(_Значение) Тогда
Результат = _Значение;
ИначеЕсли Тип("ФиксированныйМассив") = ТипЗнч(_Значение) Тогда
Результат = Новый Массив(_Значение);
ИначеЕсли Тип("ДеревоЗначений") = ТипЗнч(_Значение) Тогда
Результат = __ОбходДерева(_Значение);
ИначеЕсли Тип("ВнешниеОбработкиОбъект.Итератор") = ТипЗнч(_Значение) Тогда
Результат = _Значение.Собрать();
ИначеЕсли __ЭтоКоллекция(_Значение) Тогда
Результат = Новый Массив;
Для Каждого ТекСтр Из _Значение Цикл
Результат.Добавить(ТекСтр);
КонецЦикла;
Иначе ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(_Значение);
КонецЕсли;
Возврат Результат;
Конецфункции
Функция СоздатьНовый() Экспорт
Возврат ВнешниеОбработки.Иттератор.Создать();
КонецФункции
Функция Клонировать() Экспорт
НоваяКоллекция = Новый ФиксированныйМассив(Коллекция);
НоваяКоллекция = Новый Массив(НоваяКоллекция);
Возврат ЭтотОбъект.СоздатьНовый().ВзятьИз(НоваяКоллекция);
КонецФункции
Функция Начать() Экспорт
Коллекция = Новый Массив;
Возврат ЭтотОбъект;
Конецфункции
Функция НачатьС(_Значение) Экспорт
Возврат ЭтотОбъект.Начать().Добавить(_Значение);
Конецфункции
Функция ВзятьИз(_Значение) Экспорт
Коллекция = ЗагрузитьКоллекцию(_Значение);
Возврат ЭтотОбъект;
Конецфункции
Функция РазделитьСтроку(Знач Стр, Знач Разделитель, Знач ВключатьПустые=Ложь) Экспорт
Коллекция = СтрРазделить(Стр, Разделитель, ВключатьПустые);
Возврат ЭтотОбъект;
Конецфункции
Функция ПоДиапазону(Число_С, Числоо) Экспорт
Коллекция = __МассивПоДиапазонуЧисел(Число_С, Числоо);
Возврат ЭтотОбъект;
КонецФункции
Функция УстановитьКонтекст(_Контекст) Экспорт
Контекст = _Контекст;
Возврат ЭтотОбъект;
КонецФункции
Функция Собрать() Экспорт
Если Неопределено = Коллекция Тогда
Коллекция = Новый Массив;
КонецЕсли;
Возврат Коллекция;
КонецФункции
Функция СобратьСтроку(Знач Разделитель) Экспорт
Если Неопределено = Коллекция Тогда
Коллекция = Новый Массив;
КонецЕсли;
Возврат СтрСоединить(Коллекция, Разделитель);
КонецФункции
Функция Контекст() Экспорт
Возврат Контекст;
КонецФункции
Функция Карта(Знач Код) Экспорт
Коллекция = __Мап(Код, Коллекция, Контекст);
Возврат ЭтотОбъект;
КонецФункции
Функция Фильтр(Знач Код) Экспорт
Коллекция = __Фильтр(Код, Коллекция, Контекст);
Возврат ЭтотОбъект;
КонецФункции
Функция Свернуть(Знач Код, Знач Результат = Неопределено) Экспорт
Возврат __Свернуть(Код, Коллекция, Результат, Контекст);
КонецФункции
Функция ВзятьНеБольше(Знач Количество) Экспорт
Коллекция = __ВзятьНеБольше(Коллекция, Количество);
Возврат ЭтотОбъект;
КонецФункции
Функция Пропустить(Знач Количество) Экспорт
Коллекция = __Пропустить(Коллекция, Количество);
Возврат ЭтотОбъект;
КонецФункции
Функция Обратить() Экспорт
Коллекция = __Обратить(Коллекция);
Возврат ЭтотОбъект;
КонецФункции
Функция Транспонировать() Экспорт
Коллекция = __Транспонировать(Коллекция);
Возврат ЭтотОбъект;
КонецФункции
Функция Сортировать(Знач Направление=Неопределено) Экспорт
Если Неопределено = Направление Тогда
Направление = НаправлениеСортировки.Возр;
КонецЕсли;
мСписокЗнч = Новый СписокЗначений;
мСписокЗнч.ЗагрузитьЗначения(Коллекция);
мСписокЗнч.СортироватьПоЗначению(Направление);
Коллекция = мСписокЗнч.ВыгрузитьЗначения();
Возврат ЭтотОбъект;
КонецФункции
Функция Перемешать() Экспорт
НоваяКоллекция = Новый Массив;
ГСЧ = Новый ГенераторСлучайныхЧисел;
Копия = ЭтотОбъект.Клонировать();
Для Сч=1 По ЭтотОбъект.Количество() Цикл
Индекс = ГСЧ.СлучайноеЧисло(0, Копия.ВГраница());
НоваяКоллекция.Добавить(Копия.Получить(Индекс));
Копия.Удалить(Индекс);
КонецЦикла;
Коллекция = НоваяКоллекция;
Возврат ЭтотОбъект;
КонецФункции
Функция ВГраница() Экспорт
Возврат Коллекция.ВГраница();
КонецФункции
Функция Количество() Экспорт
Возврат Коллекция.Количество();
КонецФункции
Функция Вставить(Знач Индекс, Знач Значение) Экспорт
Коллекция.Вставить(Индекс, Значение);
Возврат ЭтотОбъект;
КонецФункции
Функция Добавить(Знач Значение) Экспорт
Коллекция.Добавить(Значение);
Возврат ЭтотОбъект;
КонецФункции
Функция _Найти(Знач Значение) Экспорт
Возврат Коллекция.Найти(Значение);
КонецФункции
Функция Очистить() Экспорт
Коллекция.Очистить();
Возврат ЭтотОбъект;
КонецФункции
Функция Получить(Индекс) Экспорт
Возврат Коллекция.Получить(Индекс);
КонецФункции
Функция Удалить(Индекс) Экспорт
Коллекция.Удалить(Индекс);
Возврат ЭтотОбъект;
КонецФункции
Функция Установить(Индекс, Знач Значение) Экспорт
Коллекция.Установить(Индекс, Значение);
Возврат ЭтотОбъект;
КонецФункции
Функция Пустой() Экспорт
Возврат 0 = ЭтотОбъект.Количество();
КонецФункции
Функция Содержит(Знач Значение) Экспорт
Возврат НЕ Неопределено = ЭтотОбъект._Найти(Значение);
КонецФункции
Функция Первый() Экспорт
Если ЭтотОбъект.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Возврат ЭтотОбъект.Получить(0);
КонецФункции
Функция Последний() Экспорт
Если ЭтотОбъект.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Возврат ЭтотОбъект.Получить(ЭтотОбъект.ВГраница());
КонецФункции
Функция СнятьПервый() Экспорт
Если ЭтотОбъект.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Значение = ЭтотОбъект.Получить(0);
ЭтотОбъект.Удалить(0);
Возврат Значение;
КонецФункции
Функция СнятьПоследний() Экспорт
Если ЭтотОбъект.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Индекс = ЭтотОбъект.ВГраница();
Значение = ЭтотОбъект.Получить(Индекс);
ЭтотОбъект.Удалить(Индекс);
Возврат Значение;
КонецФункции
Функция Дополнить(Источник, ТолькоУникальныеЗначения=Ложь) Экспорт
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Коллекция, ЗагрузитьКоллекцию(Источник), ТолькоУникальныеЗначения);
Возврат ЭтотОбъект;
КонецФункции
Функция ТолькоУникальные() Экспорт
Коллекция = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Коллекция);
Возврат ЭтотОбъект;
КонецФункции
Функция РазностьС(ВычитаемаяКоллекция) Экспорт
НоваяКоллекция = ОбщегоНазначенияКлиентСервер.РазностьМассивов(Коллекция, ЗагрузитьКоллекцию(ВычитаемаяКоллекция));
Возврат ЭтотОбъект.СоздатьНовый().ВзятьИз(НоваяКоллекция);
КонецФункции
Функция УдалитьЗначение(Знач _Значение) Экспорт
Индекс = ЭтотОбъект._Найти(_Значение);
Если Индекс <> Неопределено Тогда
ЭтотОбъект.Удалить(Индекс);
КонецЕсли;
Возврат ЭтотОбъект;
КонецФункции
Функция УдалитьВсеВхождения(Знач _Значение) Экспорт
ОбщегоНазначенияКлиентСервер.УдалитьВсеВхожденияЗначенияИзМассива(Коллекция, _Значение);
Возврат ЭтотОбъект;
КонецФункции
Функция УдалитьВсеВхожденияТипа(Знач Тип) Экспорт
ОбщегоНазначенияКлиентСервер.УдалитьВсеВхожденияТипаИзМассива(Коллекция, Тип);
Возврат ЭтотОбъект;
КонецФункции
Функция СделатьПлоским() Экспорт
КоллекцияРезультат = Новый Массив;
Очередь = Новый Массив;
Очередь.Добавить(Коллекция);
Пока Очередь.Количество() > 0 Цикл
Следующий = 0;
ТекЭлемент = Очередь.Получить(Следующий);
Очередь.Удалить(Следующий);
ЭтоКоллекция = Ложь;
Если ТипЗнч(ЭтотОбъект) = ТипЗнч(ТекЭлемент) Тогда
ТекЭлемент = ТекЭлемент.Собрать();
ЭтоКоллекция = Истина;
ИначеЕсли __ЭтоКоллекция(ТекЭлемент) Тогда
ЭтоКоллекция = Истина;
КонецЕсли;
Если ЭтоКоллекция Тогда
Для Каждого НовЭлемент Из ТекЭлемент Цикл
Очередь.Добавить(НовЭлемент);
КонецЦикла;
Иначе
КоллекцияРезультат.Добавить(ТекЭлемент);
КонецЕсли;
КонецЦикла;
Коллекция = КоллекцияРезультат;
Возврат ЭтотОбъект;
КонецФункции
Функция СброситьПозицию() Экспорт
ТекИндекс = 0;
ИтерацияНачата = Неопределено;
КонецФункции
Функция Следующий() Экспорт
Если ЭтотОбъект.Пустой() Тогда
Возврат Ложь;
КонецЕсли;
Если Неопределено = ТекИндекс Тогда
ЭтотОбъект.СброситьПозицию()
КонецЕсли;
Если Неопределено = ИтерацияНачата Тогда
ИтерацияНачата = Истина;
Возврат ТекИндекс < ЭтотОбъект.ВГраница();
КонецЕсли;
Если ТекИндекс + 1 > ЭтотОбъект.ВГраница() Тогда
Возврат Ложь;
КонецЕсли;
ТекИндекс = 1 + ТекИндекс;
Возврат Истина;
КонецФункции
Функция ТекущийИндекс() Экспорт
Если Неопределено = ТекИндекс Тогда
ЭтотОбъект.СброситьПозицию()
КонецЕсли;
Возврат ТекИндекс;
КонецФункции
Функция ТекущийЭлемент() Экспорт
Если НЕ ЭтотОбъект.ИндексКорректен() Тогда
Возврат Неопределено;
КонецЕсли;
Возврат ЭтотОбъект.Получить(ЭтотОбъект.ТекущийИндекс());
КонецФункции
Функция СледующийЭлемент() Экспорт
Если НЕ ЭтотОбъект.Следующий() Тогда
Возврат Неопределено;
КонецЕсли;
Возврат ЭтотОбъект.ТекущийЭлемент();
КонецФункции
Функция УстановитьИндекс(_Индекс) Экспорт
ИтерацияНачата = Истина;
ТекИндекс = _Индекс;
Возврат ЭтотОбъект;
КонецФункции
Функция Продвинуть(НаСколько=1) Экспорт
ИтерацияНачата = Истина;
ЭтотОбъект.УстановитьИндекс(ЭтотОбъект.ТекущийИндекс() + НаСколько);
Возврат ЭтотОбъект;
КонецФункции
Функция ИндексКорректен() Экспорт
Возврат ЭтотОбъект.ТекущийИндекс() <= ЭтотОбъект.ВГраница() И 0 <= ЭтотОбъект.ТекущийИндекс();
КонецФункции
Функция Максимум() Экспорт
Результат = ЭтотОбъект.Первый();
Результат = ЭтотОбъект.Свернуть("Результат = Макс(Результат,Элемент)", Результат);
Возврат Результат;
КонецФункции
Функция Минимум() Экспорт
Результат = ЭтотОбъект.Первый();
Результат = ЭтотОбъект.Свернуть("Результат = Мин(Результат,Элемент)", Результат);
Возврат Результат;
КонецФункции
Функция Сумма() Экспорт
Результат = 0;
Результат = ЭтотОбъект.Свернуть("Результат = Результат + Элемент", Результат);
Возврат Результат;
КонецФункции
Функция Среднее() Экспорт
Результат = ЭтотОбъект.Сумма() / ЭтотОбъект.Количество();
Возврат Результат;
КонецФункции
Функция Медиана() Экспорт
Результат = ЭтотОбъект.Первый();
мСорт = ЭтотОбъект.Клонировать().Сортировать();
Если 0 < мСорт.Количество() % 2 Тогда
Возврат мСорт.Получить(мСорт.ВГраница() / 2);
КонецЕсли;
Индекс1 = Окр(мСорт.ВГраница() / 2, 0, РежимОкругления.Окр15как10);
Индекс2 = Окр(мСорт.ВГраница() / 2, 0, РежимОкругления.Окр15как20);
Если Индекс1 <= мСорт.ВГраница() И Индекс2 <= мСорт.ВГраница() Тогда
Значение1 = мСорт.Получить(Индекс1);
Значение2 = мСорт.Получить(Индекс2);
Если Тип("Число") = ТипЗнч(Значение1) Тогда
Результат = (Значение1 + Значение2) / 2;
Иначе
Результат = Значение1;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции