From 534a947ec1ce4abb17022dcdf9b428934c2d8220 Mon Sep 17 00:00:00 2001 From: sfaqer Date: Tue, 4 Apr 2023 13:28:41 +1000 Subject: [PATCH 1/3] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=BE=D1=80=D0=B0=20=D0=BA=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B9=20*=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=94=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0=20*=20?= =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20=D0=BB=D1=8F?= =?UTF-8?q?=D0=BC=D0=B1=D0=B4=D0=B0=20=D0=B2=D1=8B=D1=80=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D0=B8=20lambdas=20*=20=D0=AF=D0=B4=D1=80=D0=BE=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=81=20`notify`=20=D0=BD=D0=B0=20=D1=81=D0=BE=D0=B1=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D1=83=D1=8E=20=D0=B0=D0=B1=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BA=D1=86=D0=B8=D1=8E=20`=D0=A8=D0=B0?= =?UTF-8?q?=D0=B3=D0=9A=D0=BE=D0=BD=D0=B2=D0=B5=D0=B9=D0=B5=D1=80=D0=B0`?= =?UTF-8?q?=20*=20=D0=A8=D0=B0=D0=B3=D0=B8=20=D0=BA=D0=BE=D0=BD=D0=B2?= =?UTF-8?q?=D0=B5=D0=B9=D0=B5=D1=80=D0=B0=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=20=D0=B1=D0=B0=D1=80?= =?UTF-8?q?=D1=8C=D0=B5=D1=80=D0=BD=D1=8B=D0=B5=20=D0=B8=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B1=D0=B0=D1=80=D1=8C=D0=B5=D1=80=D0=BD=D1=8B=D0=B5=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- CHANGELOG.md | 12 + README.md | 644 +++++---- examples/github.os | 76 +- examples/test.os | 53 +- packagedef | 6 +- sonar-project.properties | 2 +- ...20\265\320\261\320\275\321\213\320\271.os" | 265 ---- ...21\207\320\265\320\275\320\270\320\265.os" | 17 + ...21\202\321\200\320\276\320\272\321\203.os" | 23 + ...20\266\320\264\320\276\320\263\320\276.os" | 31 + ...20\265\321\201\321\202\320\262\320\276.os" | 18 + ...21\202\320\262\321\203\320\265\321\202.os" | 54 + ...20\276\321\202\320\260\321\202\321\214.os" | 33 + ...20\265\321\200\320\262\321\213\320\265.os" | 27 + ...21\203\321\207\320\270\321\202\321\214.os" | 69 + ...20\265\321\200\320\262\321\213\320\271.os" | 14 + ...21\201\321\202\320\270\321\202\321\214.os" | 27 + ...21\200\320\275\321\203\321\202\321\214.os" | 50 + ...20\270\321\207\320\275\321\213\320\265.os" | 54 + ...20\260\321\202\320\270\321\202\321\214.os" | 42 + ...20\276\320\262\320\260\321\202\321\214.os" | 85 ++ ...20\276\320\262\320\260\321\202\321\214.os" | 37 + ...20\265\320\271\320\265\321\200\320\260.os" | 13 + ...20\265\320\261\320\275\321\213\320\271.os" | 203 +++ ...20\265\320\272\321\206\320\270\320\271.os" | 1168 +++++++---------- ...20\265\320\272\321\206\320\270\320\271.os" | 71 + tasks/coverage.os | 69 +- tasks/test.os | 45 +- ...20\267\320\260\321\206\320\270\321\217.os" | 18 +- ...20\271\320\242\320\265\321\201\321\202.os" | 224 +++- ...20\265\321\202\320\276\320\264\321\213.os" | 65 +- ...21\202\321\200\320\276\320\272\320\270.os" | 20 +- ...20\275\320\270\321\217\320\274\320\270.os" | 0 ...20\265\321\202\320\276\320\264\321\213.os" | 115 +- 35 files changed, 2115 insertions(+), 1538 deletions(-) delete mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\221\320\260\321\200\321\214\320\265\321\200\320\222\320\265\321\200\320\275\321\203\321\202\321\214\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\222\320\241\321\202\321\200\320\276\320\272\321\203.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\224\320\273\321\217\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\232\320\276\320\273\320\270\321\207\320\265\321\201\321\202\320\262\320\276.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\233\321\216\320\261\320\276\320\271\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\320\265\321\202.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\260\321\202\321\214.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\265\321\200\320\262\321\213\320\265.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214\320\237\320\265\321\200\320\262\321\213\320\271.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\321\200\320\276\320\277\321\203\321\201\321\202\320\270\321\202\321\214.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\262\320\265\321\200\320\275\321\203\321\202\321\214.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\273\320\270\321\207\320\275\321\213\320\265.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\320\272\321\200\320\260\321\202\320\270\321\202\321\214.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214.os" create mode 100644 "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\244\320\270\320\273\321\214\321\202\321\200\320\276\320\262\320\260\321\202\321\214.os" create mode 100644 "src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\320\271\321\201\321\202\320\262\320\270\321\217\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260.os" delete mode 100644 "tests/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\236\320\277\320\276\320\262\320\265\321\211\320\265\320\275\320\270\321\217\320\274\320\270.os" diff --git a/.gitignore b/.gitignore index 35d6173..2cf2ff1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.ospx -coverage/ +build/ .sonar/ .sonarlint/ +.vscode \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 42a2aff..2e16006 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## 0.6.0 +* Добавлена поддержка Действие для функционального интерфейса +* Добавлена поддержка лямбда выражений библиотеки lambdas +* Ядро переписано с `notify` на собственную абстракцию `ШагКонвейера` +* Шаги конвейера разделены на барьерные и не барьерные операции + +> DEPRECATION NOTICE: + +* Отказ от использования notify, в пользу Действие +* Синтаксис лямбда выражений заменён на использование lambdas +* ОписаниеОповещений и старый синтаксис лямбда выражений поддерживаются в рамках обратной совместимости, однако при их использовании будут предупреждения в логе, пожалуйста замените все места использования устаревшей функциональности + ## 0.5.0 * Добавлена возможность отладки временных сценариев путем создания временных файлов под текст сценария. diff --git a/README.md b/README.md index 755dcd8..3ad2303 100644 --- a/README.md +++ b/README.md @@ -42,16 +42,15 @@ Функции сравнения, фильтрации, обработки могут задаваться с помощью: -* Строк -* Описаний оповещения (библиотека [notify](https://github.com/oscript-library/notify)) +* Строк библиотека [lambdas](https://github.com/oscript-library/lambdas) +* Действие Библиотека помимо конструктора класса `ПроцессорКоллекций` содержит вспомогательный модуль, включающий: * построитель процессора коллекций `ИзКоллекции()` * построитель процессора коллекций `ИзСтроки()` * построитель процессора коллекций `ИзНабора()` -* `СтандартнаяФункцияСравнения()` - типовой `comparator`, возвращающий результат сравнения как `1`, `0`, `-1` -* `СтандартнаяФункцияОбработки_Сообщить()` - функция сообщения каждого элемента в консоль +* `СтандартнаяФункцияСравненияПрямойПорядок()` - типовой `comparator`, возвращающий результат сравнения как `1`, `0`, `-1` ## Примеры работы @@ -66,29 +65,33 @@ Результат = ПроцессорыКоллекций.ИзКоллекции(Массив) .Пропустить(1) - .Фильтровать("Элемент >= 5") + .Фильтровать("Элемент -> Элемент >= 5") .Первые(2) - .Обработать("Результат = Элемент + 1") + .Обработать("Элемент -> Элемент + 1") .Получить(Тип("Массив")); // На выходе массив [8, 6] ``` -Тоже самое с помощью `notify`: +Тоже самое с помощью `Действие`: ```bsl -Процедура ОбработчикФильтрации(Результат, ДополнительныеПараметры) Экспорт - Результат = ДополнительныеПараметры.Элемент >= 5; -КонецПроцедуры +Функция ОбработчикФильтрации(Элемент) Экспорт + Возврат Элемент >= 5; +КонецФункции + +Функция ОбработчикОбработки(Элемент) Экспорт -Процедура ОбработчикОбработки(Результат, ДополнительныеПараметры) Экспорт - Элемент = ДополнительныеПараметры.Элемент; Результат = Элемент + 1; + Сообщить("Я - операция map, и это мое послание миру: элемент " + Элемент + " превратился в " + Результат); -КонецПроцедуры -ФункцияФильтрации = Новый ОписаниеОповещения("ОбработчикФильтрации", ЭтотОбъект); -ФункцияОбработки = Новый ОписаниеОповещения("ОбработчикОбработки", ЭтотОбъект); + Возврат Результат; + +КонецФункции + +ФункцияФильтрации = Новый Действие(ЭтотОбъект, "ОбработчикФильтрации"); +ФункцияОбработки = Новый Действие(ЭтотОбъект, "ОбработчикОбработки"); Результат = ПроцессорыКоллекций.ИзКоллекции(Массив) .Пропустить(1) @@ -111,7 +114,7 @@ ПроцессорКоллекций .Различные() .Сортировать() - .ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); + .ДляКаждого("Элемент -> Сообщить(Элемент)"); // На выходе сообщения в консоль: // 2 @@ -126,8 +129,8 @@ ПроцессорыКоллекций .ИзСтроки(Строка, Символы.ПС) - .Фильтровать("Результат = СтрДлина(Элемент) > 1") - .ДляКаждого("Сообщить(Элемент)"); + .Фильтровать("Элемент -> СтрДлина(Элемент) > 1") + .ДляКаждого("Элемент -> Сообщить(Элемент)"); // На выходе сообщения в консоль: // многострочная @@ -148,9 +151,20 @@ // Устанавливает коллекцию для обработки Процессора коллекций. // // Параметры: -// НоваяКоллекция - Массив, ТаблицаЗначений, ДеревоЗначений... - Коллекция, устанавливаемая в процессор. +// НоваяКоллекция - Массив, ТаблицаЗначений, ДеревоЗначений - Коллекция, устанавливаемая в процессор. // -Процедура УстановитьКоллекцию(НоваяКоллекция) Экспорт +Процедура УстановитьКоллекцию(НоваяКоллекция) +``` + +#### Отладка + +```bsl +// Включает возможность отладки. Достигается сохранением текста модуля во временный файл. +// +// Возвращаемое значение: +// ПроцессорКоллекций - Ссылка на текущий инстанс ПроцессорКоллекций +// +Функция Отладка(Включена = Истина) ``` > Конвейерные методы @@ -167,7 +181,7 @@ // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // -Функция Первые(Количество) Экспорт +Функция Первые(Количество) ``` #### Пропустить @@ -182,7 +196,7 @@ // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // -Функция Пропустить(Количество) Экспорт +Функция Пропустить(Количество) ``` #### Различные @@ -192,36 +206,46 @@ // Конвейерный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияРавенства - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Булево, Истина если элементы равны, Ложь в противном случае +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Булево, Истина если элементы равны, Ложь в противном случае +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияРавенства(), +// проверка "Элемент1 = Элемент2" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Различные("Результат = Элемент1 > Элемент2"); // -// 2: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры -// -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); -// ПроцессорКоллекций.Различные(ФункцияСравнения); +// ПроцессорКоллекций = ПроцессорыКоллекций.ИзНабора( +// Новый Структура("Имя, Возраст", "Вася", 25), +// Новый Структура("Имя, Возраст", "Петя", 27), +// Новый Структура("Имя, Возраст", "Ваня", 25) +// ); // -Функция Различные(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт +// // 1: +// ПроцессорКоллекций.Различные("(ЧеловекПервый, ЧеловекВторой) -> ЧеловекПервый.Возраст = ЧеловекВторой.Возраст"); +// +// // В коллекции останутся: Вася(25) и Петя(27) +// +// // 2: +// Функция МояФункцияФункцияРавенства(ЭлементПервый, ЭлементВторой) Экспорт +// Возврат ЧеловекПервый.Возраст = ЧеловекВторой.Возраст; +// КонецФункции +// +// ПроцессорКоллекций.Различные(Новый Действие(ЭтотОбъект, "МояФункцияФункцияРавенства")); +// +// // В коллекции останутся: Вася(25) и Петя(27) +// +Функция Различные(Знач ФункцияРавенства = Неопределено, Знач ДополнительныеПараметры = Неопределено) ``` #### Обработать @@ -231,34 +255,34 @@ // Конвейерный метод. // // Параметры: -// ФункцияОбработки - Строка, ОписаниеОповещения - функция обработки. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Произвольный - Переменная, в которой возвращается значение работы обработчика. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая обработчику. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции обработки. -// Служит для передачи дополнительных данных из прикладного кода в функцию обработки. -// По умолчанию содержит одно значение - Элемент. +// ФункцияОбработки - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает новый элемент +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает новый элемент +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Обработать("Результат = Элемент + 1;"); +// // 1: +// ПроцессорКоллекций.Обработать("Элемент -> Элемент + 1"); // -// 2: -// Процедура МояФункцияОбработки(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент + 1; -// КонецПроцедуры -// -// ФункцияОбработки = Новый ОписаниеОповещения("МояФункцияОбработки", ЭтотОбъект); +// // 2: +// Функция МояФункцияОбработки(Элемент) Экспорт +// Возврат Элемент + 1; +// КонецФункции +// +// ФункцияОбработки = Новый Действие(ЭтотОбъект, "МояФункцияОбработки"); // ПроцессорКоллекций.Обработать(ФункцияОбработки); // -Функция Обработать(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция Обработать(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) ``` #### Развернуть @@ -266,39 +290,38 @@ ```bsl // Развернуть каждый элемент коллекции в процессор коллекций. // Позволяет расширить имеющуюся коллекцию. -// Например, разворачивание массива массивов сделает новый массив, содерщщий все элементы всех массивов. +// Например, разворачивание массива массивов сделает новый массив, содержащий все элементы всех массивов. // Конвейерный метод. // // Параметры: -// ФункцияРазворачивания - Строка, ОписаниеОповещения - функция разворачивания. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// Результат - ПроцессорКоллекций - Переменная, в которую должен быть -// помещен результат работы функции в виде ПроцессораКоллекций. -// ДополнительныеПараметры - Структура - Структура параметров, передаваемая функции разворачивания. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции разворачивания. -// Служит для передачи дополнительных данных из прикладного кода в функцию разворачивания. -// По умолчанию содержит одно значение - Элемент. +// ФункцияРазворачивания - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает ПроцессорКоллекций из элемента +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает ПроцессорКоллекций из элемента +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Развернуть("Результат = ПроцессорыКоллекций.ИзСтроки(Элемент);"); +// // 1: +// ПроцессорКоллекций.Развернуть("Элемент -> ПроцессорыКоллекций.ИзСтроки(Элемент)"); // -// 2: -// Процедура МояФункцияРазворачивания(Результат, ДополнительныеПараметры) Экспорт -// Результат = ПроцессорыКоллекций.ИзСтроки(ДополнительныеПараметры.Элемент); -// КонецПроцедуры +// // 2: +// Функция МояФункцияРазворачивания(Элемент) Экспорт +// Возврат ПроцессорыКоллекций.ИзСтроки(Элемент); +// КонецФункции // -// ФункцияРазворачивания = Новый ОписаниеОповещения("МояФункцияРазворачивания", ЭтотОбъект); +// ФункцияРазворачивания = Новый Действие(ЭтотОбъект, "МояФункцияРазворачивания"); // ПроцессорКоллекций.Развернуть(ФункцияРазворачивания); // -Функция Развернуть(Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция Развернуть(Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) ``` #### Фильтровать @@ -308,34 +331,34 @@ // Конвейерный метод. // // Параметры: -// ФункцияФильтрации - Строка, ОписаниеОповещения - Функция фильтрации. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции фильтрации. -// Служит для передачи дополнительных данных из прикладного кода в функцию фильтрации. -// По умолчанию содержит одно значение - Элемент. +// ФункцияФильтрации - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Фильтровать("Результат = СтрДлина(Элемент) > 1"); +// // 1: +// ПроцессорКоллекций.Фильтровать("Элемент -> СтрДлина(Элемент) > 1"); // -// 2: -// Процедура МояПроцедураФильтрации(Результат, ДополнительныеПараметры) Экспорт -// Результат = СтрДлина(ДополнительныеПараметры.Элемент) > 1; -// КонецПроцедуры +// // 2: +// Функция МояФункцияФильтрации(Результат, ДополнительныеПараметры) Экспорт +// Возврат СтрДлина(ДополнительныеПараметры.Элемент) > 1; +// КонецФункции // -// ФункцияФильтрации = Новый ОписаниеОповещения("МояПроцедураФильтрации", ЭтотОбъект); +// ФункцияФильтрации = Новый Действие(ЭтотОбъект, "МояФункцияФильтрации"); // ПроцессорКоллекций.Фильтровать(ФункцияФильтрации); // -Функция Фильтровать(Знач ФункцияФильтрации, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция Фильтровать(Знач ФункцияФильтрации, Знач ДополнительныеПараметры = Неопределено) ``` #### Сортировать @@ -345,36 +368,47 @@ // Конвейерный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(), +// проверка через ">", "<", "=" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Сортировать("Результат = Элемент1 > Элемент2"); -// -// 2: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры +// // 1: +// ПроцессорКоллекций.Сортировать("(Первый, Второй) -> +// | Если Первый > Второй Тогда Возврат 1; +// | ИначеЕсли Второй > Первый Тогда Возврат -1; +// | Иначе Возврат 0; +// | КонецЕсли;" +// ); +// +// // 2: +// Функция МояФункцияСравнения(Первый, Второй) Экспорт +// Если Первый > Второй Тогда +// Возврат 1; +// ИначеЕсли Второй > Первый Тогда +// Возврат -1; +// Иначе +// Возврат 0; +// КонецЕсли; +// КонецФункции // -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения"); // ПроцессорКоллекций.Сортировать(ФункцияСравнения); // -Функция Сортировать(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция Сортировать(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) ``` #### СортироватьПо @@ -386,36 +420,47 @@ // Параметры: // ИмяПоля - Строка - Имя поля элемента коллекции, по которому необходимо осуществлять сортировку. // -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(), +// проверка через ">", "<", "=" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.СортироватьПо("НомерСтроки", "Результат = Элемент1 > Элемент2"); -// -// 2: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры +// // 1: +// ПроцессорКоллекций.СортироватьПо("НомерСтроки", "(Первый, Второй) -> +// | Если Первый > Второй Тогда Возврат 1; +// | ИначеЕсли Второй > Первый Тогда Возврат -1; +// | Иначе Возврат 0; +// | КонецЕсли;" +// ); +// +// // 2: +// Функция МояФункцияСравнения(Первый, Второй) Экспорт +// Если Первый > Второй Тогда +// Возврат 1; +// ИначеЕсли Второй > Первый Тогда +// Возврат -1; +// Иначе +// Возврат 0; +// КонецЕсли; +// КонецФункции // -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения"); // ПроцессорКоллекций.СортироватьПо("НомерСтроки", ФункцияСравнения); // -Функция СортироватьПо(Знач ИмяПоля, Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция СортироватьПо(Знач ИмяПоля, Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) ``` > Терминальные методы @@ -423,15 +468,13 @@ #### ПолучитьПервый ```bsl -// Терминальные методы - // Получить первый элемент. // Терминальный метод. // // Возвращаемое значение: // Произвольный - Первый элемент из коллекции. Если коллекция пуста, возвращает Неопределено. // -Функция ПолучитьПервый() Экспорт +Функция ПолучитьПервый() ``` #### ВМассив @@ -443,7 +486,7 @@ // Возвращаемое значение: // Массив - Массив элементов коллекции. // -Функция ВМассив() Экспорт +Функция ВМассив() ``` #### ВСтроку @@ -458,7 +501,7 @@ // Возвращаемое значение: // Строка - Элементы коллекции, соединенные в строку методом конкатенации. // -Функция ВСтроку(РазделительСтрок = "") Экспорт +Функция ВСтроку(РазделительСтрок = "") ``` #### Количество @@ -470,8 +513,7 @@ // Возвращаемое значение: // Число - Количество элементов коллекции. // -Функция Количество() Экспорт - +Функция Количество() ``` #### ДляКаждого @@ -481,34 +523,29 @@ // Терминальный метод. // // Параметры: -// ФункцияОбработки - Строка, ОписаниеОповещения - функция обработки. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Произвольный - Игнорируется. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая обработчику. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции обработки. -// Служит для передачи дополнительных данных из прикладного кода в функцию обработки. -// По умолчанию содержит одно значение - Элемент. +// ФункцияОбработки - Строка - Лямбда выражение процедура с одним параметром в который будет передан элемент +// - Действие - Делегат на процедуру с одним параметром в который будет передан элемент // -// Примеры: -// 1: -// ПроцессорКоллекций.ДляКаждого("Сообщить(Элемент);"); +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // -// 2: -// ПроцессорКоллекций.ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); +// Примеры: +// // 1: +// ПроцессорКоллекций.ДляКаждого("Элемент -> Сообщить(Элемент);"); // -// 3: -// Процедура МояФункцияОбработки(Результат, ДополнительныеПараметры) Экспорт -// Сообщить(ДополнительныеПараметры.Элемент); +// // 2: +// Процедура МояПроцедураОбработки(Элемент) Экспорт +// Сообщить(Элемент); // КонецПроцедуры // -// ФункцияОбработки = Новый ОписаниеОповещения("МояФункцияОбработки", ЭтотОбъект); -// ПроцессорКоллекций.ДляКаждого(ФункцияОбработки); +// ПроцедураОбработки = Новый Действие(ЭтотОбъект, "МояПроцедураОбработки"); +// ПроцессорКоллекций.ДляКаждого(ПроцедураОбработки); // -Процедура ДляКаждого(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) Экспорт +Процедура ДляКаждого(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) ``` #### Минимум @@ -518,39 +555,50 @@ // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(), +// проверка через ">", "<", "=" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Произвольный - минимальный элемент коллекции. // // Примеры: -// 1: +// // 1: // ПроцессорКоллекций.Минимум(); // -// 2: -// ПроцессорКоллекций.Минимум("Результат = Элемент1 > Элемент2"); -// -// 3: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры +// // 2: +// ПроцессорКоллекций.Минимум("(Первый, Второй) -> +// | Если Первый > Второй Тогда Возврат 1; +// | ИначеЕсли Второй > Первый Тогда Возврат -1; +// | Иначе Возврат 0; +// | КонецЕсли;" +// ); +// +// // 3: +// Функция МояФункцияСравнения(Первый, Второй) Экспорт +// Если Первый > Второй Тогда +// Возврат 1; +// ИначеЕсли Второй > Первый Тогда +// Возврат -1; +// Иначе +// Возврат 0; +// КонецЕсли; +// КонецФункции // -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения"); // ПроцессорКоллекций.Минимум(ФункцияСравнения); // -Функция Минимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция Минимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) ``` #### Максимум @@ -560,39 +608,50 @@ // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(), +// проверка через ">", "<", "=" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Произвольный - максимальный элемент коллекции. // // Примеры: -// 1: +// // 1: // ПроцессорКоллекций.Максимум(); // -// 2: -// ПроцессорКоллекций.Максимум("Результат = Элемент1 > Элемент2"); -// -// 3: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры +// // 2: +// ПроцессорКоллекций.Максимум("(Первый, Второй) -> +// | Если Первый > Второй Тогда Возврат 1; +// | ИначеЕсли Второй > Первый Тогда Возврат -1; +// | Иначе Возврат 0; +// | КонецЕсли;" +// ); +// +// // 3: +// Функция МояФункцияСравнения(Первый, Второй) Экспорт +// Если Первый > Второй Тогда +// Возврат 1; +// ИначеЕсли Второй > Первый Тогда +// Возврат -1; +// Иначе +// Возврат 0; +// КонецЕсли; +// КонецФункции // -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения"); // ПроцессорКоллекций.Максимум(ФункцияСравнения); // -Функция Максимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция Максимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) ``` #### Сократить @@ -602,39 +661,36 @@ // Терминальный метод. // // Параметры: -// ФункцияСокращения - Строка, ОписаниеОповещения - Функция сокращения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Произвольный - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. +// ФункцияСокращения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы +// результат аккумулятор и очередной элемент коллекции, и которая возвращает новое значение результата +// - Действие - Делегат на функцию с двумя параметрами в которые будут переданы +// результат аккумулятор и очередной элемент коллекции, и которая возвращает новое значение результата // // НачальноеЗначение - Произвольный - начальное значение, передаваемое в функцию сокращения в параметр "Результат" // -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сокращения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сокращения. -// По умолчанию содержит одно значение - Элемент. +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Произвольный - результат работы агрегатной функции. // // Примеры: // 2: -// ПроцессорКоллекций.Сократить("Результат = Результат + Элемент"); +// ПроцессорКоллекций.Сократить("Результат, Элемент -> Результат + Элемент", 0); // // 2: -// Процедура МояФункцияСокращения(Результат, ДополнительныеПараметры) Экспорт -// Элемент = ДополнительныеПараметры.Элемент; -// Результат = Результат + Элемент; -// КонецПроцедуры +// Функция МояФункцияСокращения(Результат, Элемент) Экспорт +// Возврат Результат + Элемент; +// КонецФункции // -// ФункцияСокращения = Новый ОписаниеОповещения("МояФункцияСокращения", ЭтотОбъект); +// ФункцияСокращения = Новый Действие(ЭтотОбъект, "МояФункцияСокращения"); // ПроцессорКоллекций.Сократить(ФункцияСокращения); // -Функция Сократить(Знач ФункцияСокращения, - Знач НачальноеЗначение = Неопределено, - Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция Сократить(Знач ФункцияСокращения, Знач НачальноеЗначение = Неопределено, Знач ДополнительныеПараметры = Неопределено) ``` #### Получить @@ -649,7 +705,7 @@ // Возвращаемое значение: // Произвольный - Коллекция в виде объекта нужного типа. // -Функция Получить(ТипРезультата) Экспорт +Функция Получить(ТипРезультата) ``` #### ЛюбойСоответствует @@ -659,24 +715,24 @@ // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит одно значение - Элемент. +// ФункцияСравнения - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Булево - Истина, если минимум один из элементов коллекции удовлетворяет условию Функции сравнения. // В обратном случае возвращает Ложь. // Если коллекция пустая, возвращает Ложь. // -Функция ЛюбойСоответствует(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция ЛюбойСоответствует(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) ``` #### ВсеСоответствуют @@ -686,24 +742,24 @@ // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит одно значение - Элемент. +// ФункцияСравнения - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Булево - Истина, если все элементы коллекции удовлетворяют условию Функции сравнения. // В обратном случае возвращает Ложь. // Если коллекция пустая, возвращает Истина. // -Функция ВсеСоответствуют(Знач ОписаниеОповещения, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция ВсеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) ``` #### ВсеНеСоответствуют @@ -713,24 +769,24 @@ // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит одно значение - Элемент. +// ФункцияСравнения - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Булево - Истина, если все элементы коллекции не удовлетворяют условию Функции сравнения. // В обратном случае возвращает Ложь. // Если коллекция пустая, возвращает Истина. // -Функция ВсеНеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция ВсеНеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) ``` ### Модуль ПроцессорыКоллекций @@ -787,28 +843,40 @@ Функция ИзНабора(Элемент1 = NULL, Элемент2 = NULL, Элемент3 = NULL, ...) Экспорт ``` -#### СтандартнаяФункцияСравнения +#### СтандартнаяФункцияСравненияПрямойПорядок ```bsl // Стандартная функция сравнения. // Сравнивает значения элементов коллекции через операторы ">", "<" и "=". // // Возвращаемое значение: -// ОписаниеОповещения - Инстанс класса ОписаниеОповещения, указывающий на стандартную функцию сравнения. +// Действие - Делегат на стандартный метод сравнения +// +Функция СтандартнаяФункцияСравненияПрямойПорядок() +``` + +#### СтандартнаяФункцияСравненияОбратныйПорядок + +```bsl +// Стандартная функция сравнения в обратном порядке +// Сравнивает значения элементов коллекции через операторы ">", "<" и "=". +// +// Возвращаемое значение: +// Действие - Делегат на стандартный метод сравнения в обратном порядке // -Функция СтандартнаяФункцияСравнения() Экспорт +Функция СтандартнаяФункцияСравненияОбратныйПорядок() ``` -#### СтандартнаяФункцияОбработки_Сообщить +#### СтандартнаяФункцияРавенства ```bsl -// Стандартная функция обработки - "Сообщить". -// Выполняет процедуру "Сообщить()" над каждым элементом коллекции. +// Стандартная функция проверки на равенство +// Сравнивает значения элементов коллекции через "=". // // Возвращаемое значение: -// ОписаниеОповещения - Инстанс класса ОписаниеОповещения, указывающий на стандартную функцию обработки. +// Действие - Делегат на стандартный метод проверки на равенство // -Функция СтандартнаяФункцияОбработки_Сообщить() Экспорт +Функция СтандартнаяФункцияРавенства() ``` ### Отладка методов diff --git a/examples/github.os b/examples/github.os index 18ae8ed..66a3b89 100644 --- a/examples/github.os +++ b/examples/github.os @@ -1,32 +1,49 @@ #Использовать ".." -#Использовать notify Перем Таблица; -Процедура ДобавитьСтрокуВТаблицу(Имя, Фолловеры, Местоположение, Контрибьюции); +Процедура ДобавитьСтрокуВТаблицу(Имя, Фолловеры, Местоположение, Контрибьюции) + Строка = Таблица.Добавить(); - Строка.Имя = Имя; - Строка.Фолловеры = Фолловеры; + + Строка.Имя = Имя; + Строка.Фолловеры = Фолловеры; Строка.Местоположение = Местоположение; - Строка.Контрибьюции = Контрибьюции; -КонецПроцедуры + Строка.Контрибьюции = Контрибьюции; -Процедура Обработчик_ФильтрацияПоМестоположению(РезультатФильтрации, ДополнительныеПараметры) Экспорт - РезультатФильтрации = ДополнительныеПараметры.Элемент.Местоположение = "Россия"; КонецПроцедуры -Процедура Обработчик_СортировкаПоФолловерам(РезультатСравнения, ДополнительныеПараметры) Экспорт - РезультатСравнения = ДополнительныеПараметры.Элемент1.Фолловеры < ДополнительныеПараметры.Элемент2.Фолловеры; -КонецПроцедуры +Функция Обработчик_ФильтрацияПоМестоположению(Элемент) Экспорт + Возврат Элемент.Местоположение = "Россия"; +КонецФункции -Процедура Обработчик_СортировкаПоКонтрибьюциям(РезультатСравнения, ДополнительныеПараметры) Экспорт - РезультатСравнения = ДополнительныеПараметры.Элемент1.Контрибьюции < ДополнительныеПараметры.Элемент2.Контрибьюции; -КонецПроцедуры +Функция Обработчик_СортировкаПоФолловерам(Первый, Второй) Экспорт + + Если Первый.Фолловеры > Второй.Фолловеры Тогда + Возврат 1; + ИначеЕсли Второй.Фолловеры > Первый.Фолловеры Тогда + Возврат -1; + Иначе + Возврат 0; + КонецЕсли; -ФильтрацияПоМестоположению = Новый ОписаниеОповещения("Обработчик_ФильтрацияПоМестоположению", ЭтотОбъект); -СортировкаПоФолловерам = Новый ОписаниеОповещения("Обработчик_СортировкаПоФолловерам", ЭтотОбъект); -СортировкаПоКонтрибьюциям = Новый ОписаниеОповещения("Обработчик_СортировкаПоКонтрибьюциям", ЭтотОбъект); +КонецФункции +Функция Обработчик_СортировкаПоКонтрибьюциям(Первый, Второй) Экспорт + + Если Первый.Контрибьюции > Второй.Контрибьюции Тогда + Возврат 1; + ИначеЕсли Второй.Контрибьюции > Первый.Контрибьюции Тогда + Возврат -1; + Иначе + Возврат 0; + КонецЕсли; + +КонецФункции + +ФильтрацияПоМестоположению = Новый Действие(ЭтотОбъект, "Обработчик_ФильтрацияПоМестоположению"); +СортировкаПоФолловерам = Новый Действие(ЭтотОбъект, "Обработчик_СортировкаПоФолловерам"); +СортировкаПоКонтрибьюциям = Новый Действие(ЭтотОбъект, "Обработчик_СортировкаПоКонтрибьюциям"); Таблица = Новый ТаблицаЗначений; Таблица.Колонки.Добавить("Имя"); @@ -43,7 +60,6 @@ ДобавитьСтрокуВТаблицу("Лавочкин", 10, "Россия", 68); ДобавитьСтрокуВТаблицу("Яковлев", 12, "Россия", 99); - ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(Таблица); Результат = ПроцессорКоллекций .Фильтровать(ФильтрацияПоМестоположению) @@ -58,12 +74,28 @@ КонецЦикла; ПроцессорыКоллекций.ИзКоллекции(Таблица) - .Фильтровать("Результат = Элемент.Местоположение = ""Россия""") - .Сортировать("Результат = Элемент1.Фолловеры < Элемент2.Фолловеры") + .Фильтровать("Элемент -> Элемент.Местоположение = ""Россия""") + .Сортировать("Первый, Второй -> + | Если Первый.Фолловеры > Второй.Фолловеры Тогда + | Возврат 1; + | ИначеЕсли Второй.Фолловеры > Первый.Фолловеры Тогда + | Возврат -1; + | Иначе + | Возврат 0; + | КонецЕсли;" + ) .Первые(5) - .Сортировать("Результат = Элемент1.Контрибьюции < Элемент2.Контрибьюции") + .Сортировать("Первый, Второй -> + | Если Первый.Контрибьюции > Второй.Контрибьюции Тогда + | Возврат 1; + | ИначеЕсли Второй.Контрибьюции > Первый.Контрибьюции Тогда + | Возврат -1; + | Иначе + | Возврат 0; + | КонецЕсли;" + ) .Первые(3) - .ДляКаждого("Сообщить(Элемент.Имя)"); + .ДляКаждого("Элемент -> Сообщить(Элемент.Имя)"); // githubUsers // .filter(_.location == 'Russia') diff --git a/examples/test.os b/examples/test.os index 7a0239e..6205d24 100644 --- a/examples/test.os +++ b/examples/test.os @@ -1,25 +1,22 @@ #Использовать ".." -#Использовать notify -Процедура ОбработчикФильтрации(Результат, ДополнительныеПараметры) Экспорт - Элемент = ДополнительныеПараметры.Элемент; - Результат = Элемент > 3; -КонецПроцедуры +Функция ОбработчикФильтрации(Элемент) Экспорт + Возврат Элемент > 3; +КонецФункции -Процедура ОбработчикОбработки(Результат, ДополнительныеПараметры) Экспорт - Элемент = ДополнительныеПараметры.Элемент; +Функция ОбработчикОбработки(Элемент) Экспорт Результат = Элемент + 1; Сообщить("Я - операция map, и это мое послание миру: элемент " + Элемент + " превратился в " + Результат); -КонецПроцедуры + Возврат Результат; +КонецФункции -Процедура ОбработчикСокращения(Результат, ДополнительныеПараметры) Экспорт - Элемент = ДополнительныеПараметры.Элемент; - Результат = Результат + Элемент; -КонецПроцедуры +Функция ОбработчикСокращения(Результат, Элемент) Экспорт + Возврат Результат + Элемент; +КонецФункции -ФункцияФильтрации = Новый ОписаниеОповещения("ОбработчикФильтрации", ЭтотОбъект); -ФункцияОбработки = Новый ОписаниеОповещения("ОбработчикОбработки", ЭтотОбъект); -ФункцияСокращения = Новый ОписаниеОповещения("ОбработчикСокращения", ЭтотОбъект); +ФункцияФильтрации = Новый Действие(ЭтотОбъект, "ОбработчикФильтрации"); +ФункцияОбработки = Новый Действие(ЭтотОбъект, "ОбработчикОбработки"); +ФункцияСокращения = Новый Действие(ЭтотОбъект, "ОбработчикСокращения"); Массив = Новый Массив; Массив.Добавить(3); @@ -46,7 +43,7 @@ ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(Массив); ПроцессорКоллекций .Сортировать() - .ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); + .ДляКаждого("Элемент -> Сообщить(Элемент)"); Массив = Новый Массив; Массив.Добавить(4); @@ -59,7 +56,7 @@ ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(Массив); ПроцессорКоллекций .Различные() - .ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); + .ДляКаждого("Элемент -> Сообщить(Элемент)"); ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(Массив); Результат = ПроцессорКоллекций @@ -73,19 +70,19 @@ .ИзКоллекции(Массив) .Сортировать() .Первые(1) - .ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); + .ДляКаждого("Элемент -> Сообщить(Элемент)"); Сообщить(Массив[0]); Строка = "ФЫВА"; ПроцессорыКоллекций .ИзСтроки(Строка) .Сортировать() - .ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); + .ДляКаждого("Элемент -> Сообщить(Элемент)"); Строка = "Я строка с пробелами"; ПроцессорыКоллекций .ИзСтроки(Строка, " ") - .ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); + .ДляКаждого("Элемент -> Сообщить(Элемент)"); Строка = "Я |строка @@ -94,19 +91,9 @@ ПроцессорыКоллекций .ИзСтроки(Строка, Символы.ПС) .Сортировать() - .ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); + .ДляКаждого("Элемент -> Сообщить(Элемент)"); ПроцессорыКоллекций .ИзСтроки(Строка, Символы.ПС) - .Фильтровать("Результат = СтрДлина(Элемент) > 1") - .ДляКаждого("Сообщить(Элемент)"); - -// Структура = Новый Структура; -// Структура.Вставить("Элемент1", 0); -// Структура.Вставить("Элемент2", 1); -// Структура.Вставить("Элемент3", 2); - -// ПроцессорыКоллекций -// .ИзКоллекции(Структура) -// .Фильтровать("Результат = Элемент.Значение > 0") -// .Получить(Тип("Структура")); + .Фильтровать("Элемент -> СтрДлина(Элемент) > 1") + .ДляКаждого("Элемент -> Сообщить(Элемент)"); diff --git a/packagedef b/packagedef index 7d2b395..d4a59d7 100644 --- a/packagedef +++ b/packagedef @@ -1,14 +1,18 @@ Описание.Имя("fluent") - .Версия("0.5.0") + .Версия("0.6.0") .Описание("Библиотека для работы с коллекциями в ""текучем"" стиле") .Автор("Nikita Gryzlov") .АдресАвтора("nixel2007@gmail.com") .ВерсияСреды("1.0.18") .ЗависитОт("logos") .ЗависитОт("notify", "0.2.0") + .ЗависитОт("lambdas", "0.1.2") .ЗависитОт("strings") .ЗависитОт("tempfiles") + .РазработкаЗависитОт("1commands") + .РазработкаЗависитОт("1testrunner") + .РазработкаЗависитОт("coverage") .ВключитьФайл("examples") .ВключитьФайл("src") .ВключитьФайл("tasks") diff --git a/sonar-project.properties b/sonar-project.properties index 9c63cd4..5ba9519 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -14,4 +14,4 @@ sonar.sources=./src # Encoding of the source code. Default is default system encoding sonar.sourceEncoding=UTF-8 -sonar.coverageReportPaths=coverage/genericCoverage.xml +sonar.coverageReportPaths=build/coverage/genericCoverage.xml diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" deleted file mode 100644 index b0d7df9..0000000 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" +++ /dev/null @@ -1,265 +0,0 @@ -#Использовать logos -#Использовать notify - -Перем Лог; - -Перем Коллекция; -Перем КэшКолонок; - -Процедура УстановитьКоллекцию(НоваяКоллекция, ОбновлятьКэшКолонок = Истина) Экспорт - - Коллекция = Новый Массив; - - Для Каждого ЭлементНовойКоллекции Из НоваяКоллекция Цикл - Коллекция.Добавить(ЭлементНовойКоллекции); - КонецЦикла; - - Если НЕ ОбновлятьКэшКолонок Тогда - Возврат; - КонецЕсли; - - КэшКолонок = Новый Массив; - - ЕстьРеквизитКолонки = Истина; - Попытка - Колонки = НоваяКоллекция.Колонки; - Исключение - ЕстьРеквизитКолонки = Ложь; - Конецпопытки; - - Если ЕстьРеквизитКолонки Тогда - Для Каждого Колонка Из НоваяКоллекция.Колонки Цикл - КэшКолонок.Добавить(Колонка); - КонецЦикла; - КонецЕсли; - - Лог.Отладка("Кэш колонок содержит %1 колонок", КэшКолонок.Количество()); - -КонецПроцедуры - -Функция ПолучитьКоллекцию() Экспорт - Возврат Коллекция; -КонецФункции - -Функция ПолучитьКэшКолонок() Экспорт - Возврат КэшКолонок; -КонецФункции - -Процедура ВыполнитьПервые(Результат, ДополнительныеПараметры) Экспорт - - Количество = ДополнительныеПараметры.Количество; - - Лог.Отладка("ВыполнитьПервые %1", Количество); - - Результат = Новый Массив; - Для сч = 0 По Количество - 1 Цикл - Элемент = Коллекция[сч]; - Результат.Добавить(Элемент); - КонецЦикла; - -КонецПроцедуры - -Процедура ВыполнитьПропустить(Результат, ДополнительныеПараметры) Экспорт - - Количество = ДополнительныеПараметры.Количество; - - Лог.Отладка("ВыполнитьПропустить %1", Количество); - - Результат = Новый Массив; - Для сч = Количество По Коллекция.ВГраница() Цикл - Элемент = Коллекция[сч]; - Результат.Добавить(Элемент); - КонецЦикла; - -КонецПроцедуры - -Процедура ВыполнитьРазличные(Результат, ДополнительныеПараметры) Экспорт - - Лог.Отладка("ВыполнитьРазличные"); - - Результат = Новый Массив; - - ОбработчикСравнения = ДополнительныеПараметры.Обработчик; - - Для Каждого Элемент Из Коллекция Цикл - - КоличествоСовпадений = 0; - - Для Каждого ЭлементРезультат Из Результат Цикл - ОбработчикСравнения.ДополнительныеПараметры.Элемент1 = Элемент; - ОбработчикСравнения.ДополнительныеПараметры.Элемент2 = ЭлементРезультат; - РезультатСортировки = Неопределено; - ОписанияОповещений.ВыполнитьОбработкуОповещения(ОбработчикСравнения, РезультатСортировки); - Если РезультатСортировки = 0 Тогда - КоличествоСовпадений = КоличествоСовпадений + 1; - КонецЕсли; - КонецЦикла; - - Если КоличествоСовпадений = 0 Тогда - Результат.Добавить(Элемент); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура ВыполнитьФильтровать(Результат, ДополнительныеПараметры) Экспорт - - Обработчик = ДополнительныеПараметры.Обработчик; - - Лог.Отладка("ВыполнитьФильтровать %1", Обработчик.ИмяПроцедуры); - - Результат = Новый Массив; - - Если Обработчик.ДополнительныеПараметры = Неопределено Тогда - Обработчик.ДополнительныеПараметры = Новый Структура; - КонецЕсли; - Обработчик.ДополнительныеПараметры.Вставить("Элемент"); - - Для Каждого Элемент Из Коллекция Цикл - Обработчик.ДополнительныеПараметры.Элемент = Элемент; - РезультатФильтрации = Ложь; - ОписанияОповещений.ВыполнитьОбработкуОповещения(Обработчик, РезультатФильтрации); - - Если РезультатФильтрации Тогда - Результат.Добавить(Элемент); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Процедура ВыполнитьОбработать(Результат, ДополнительныеПараметры) Экспорт - - Обработчик = ДополнительныеПараметры.Обработчик; - - Лог.Отладка("ВыполнитьОбработать %1", Обработчик.ИмяПроцедуры); - - Результат = Новый Массив; - - Если Обработчик.ДополнительныеПараметры = Неопределено Тогда - Обработчик.ДополнительныеПараметры = Новый Структура; - КонецЕсли; - Обработчик.ДополнительныеПараметры.Вставить("Элемент"); - - Для Каждого Элемент Из Коллекция Цикл - Обработчик.ДополнительныеПараметры.Элемент = Элемент; - РезультатОбработки = Элемент; - ОписанияОповещений.ВыполнитьОбработкуОповещения(Обработчик, РезультатОбработки); - - Результат.Добавить(РезультатОбработки); - КонецЦикла; - -КонецПроцедуры - -Процедура ВыполнитьРазвернуть(Результат, ДополнительныеПараметры) Экспорт - - Обработчик = ДополнительныеПараметры.Обработчик; - - Лог.Отладка("ВыполнитьРазвернуть %1", Обработчик.ИмяПроцедуры); - - Результат = Новый Массив; - - Если Обработчик.ДополнительныеПараметры = Неопределено Тогда - Обработчик.ДополнительныеПараметры = Новый Структура; - КонецЕсли; - Обработчик.ДополнительныеПараметры.Вставить("Элемент"); - - Для Каждого Элемент Из Коллекция Цикл - Обработчик.ДополнительныеПараметры.Элемент = Элемент; - РезультатРазворачивания = Элемент; - ОписанияОповещений.ВыполнитьОбработкуОповещения(Обработчик, РезультатРазворачивания); - - ДСО = СтрШаблон("Результат разворачивания для элемента %1 должен иметь тип ПроцессорКоллекций", Элемент); - Ожидаем.Что(РезультатРазворачивания, ДСО).ИмеетТип("ПроцессорКоллекций"); - - РезультатРазворачивания.ДляКаждого( - "ДополнительныеПараметры.Результат.Добавить(Элемент);", - Новый Структура("Результат", Результат) - ); - - КонецЦикла; - -КонецПроцедуры - -Процедура ВыполнитьСортировать(Результат, ДополнительныеПараметры) Экспорт - - Обработчик = ДополнительныеПараметры.Обработчик; - - Лог.Отладка("ВыполнитьСортировать %1", Обработчик.ИмяПроцедуры); - - Результат = Коллекция; - - Если Обработчик.ДополнительныеПараметры = Неопределено Тогда - Обработчик.ДополнительныеПараметры = Новый Структура; - КонецЕсли; - Обработчик.ДополнительныеПараметры.Вставить("Элемент1"); - Обработчик.ДополнительныеПараметры.Вставить("Элемент2"); - - Для й = 0 По Результат.Количество() - 1 Цикл - Флаг = Ложь; - к = Результат.Количество() - 1; - Пока к > й Цикл - Элемент = Результат[к - 1]; - СледующийЭлемент = Результат[к]; - Обработчик.ДополнительныеПараметры.Элемент1 = Элемент; - Обработчик.ДополнительныеПараметры.Элемент2 = СледующийЭлемент; - РезультатСортировки = Неопределено; - ОписанияОповещений.ВыполнитьОбработкуОповещения(Обработчик, РезультатСортировки); - Если РезультатСортировки > 0 Тогда - Результат[к - 1] = СледующийЭлемент; - Результат[к] = Элемент; - Флаг = Истина; - КонецЕсли; - к = к - 1; - КонецЦикла; - Если НЕ Флаг Тогда - Прервать; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Процедура ВыполнитьСортироватьПо(Результат, ДополнительныеПараметры) Экспорт - - Обработчик = ДополнительныеПараметры.Обработчик; - ИмяПоля = Обработчик.ДополнительныеПараметры.ИмяПоля; - Лог.Отладка("ВыполнитьСортироватьПо %1", Обработчик.ИмяПроцедуры); - - Результат = Коллекция; - - Если Обработчик.ДополнительныеПараметры = Неопределено Тогда - Обработчик.ДополнительныеПараметры = Новый Структура; - КонецЕсли; - Обработчик.ДополнительныеПараметры.Вставить("Элемент1"); - Обработчик.ДополнительныеПараметры.Вставить("Элемент2"); - - Для й = 0 По Результат.Количество() - 1 Цикл - Флаг = Ложь; - к = Результат.Количество() - 1; - Пока к > й Цикл - Элемент = Результат[к - 1]; - СледующийЭлемент = Результат[к]; - - Обработчик.ДополнительныеПараметры.Элемент1 = Элемент[ИмяПоля]; - Обработчик.ДополнительныеПараметры.Элемент2 = СледующийЭлемент[ИмяПоля]; - РезультатСортировки = Неопределено; - ОписанияОповещений.ВыполнитьОбработкуОповещения(Обработчик, РезультатСортировки); - Если РезультатСортировки > 0 Тогда - Результат[к - 1] = СледующийЭлемент; - Результат[к] = Элемент; - Флаг = Истина; - КонецЕсли; - к = к - 1; - КонецЦикла; - Если НЕ Флаг Тогда - Прервать; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -Процедура Инициализация() - Лог = Логирование.ПолучитьЛог("oscript.lib.stream"); -КонецПроцедуры - -Инициализация(); \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\221\320\260\321\200\321\214\320\265\321\200\320\222\320\265\321\200\320\275\321\203\321\202\321\214\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\221\320\260\321\200\321\214\320\265\321\200\320\222\320\265\321\200\320\275\321\203\321\202\321\214\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265.os" new file mode 100644 index 0000000..1edcf30 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\221\320\260\321\200\321\214\320\265\321\200\320\222\320\265\321\200\320\275\321\203\321\202\321\214\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\265.os" @@ -0,0 +1,17 @@ +Перем Значение; + +Функция Принять(Коллекция) Экспорт + Возврат Новый Структура("Действие, Значение", ДействияКонвейера.ВернутьЗначение, Значение); +КонецФункции + +Функция Барьерный() Экспорт + Возврат Истина; +КонецФункции + +Процедура Деструктор() Экспорт + // no-op +КонецПроцедуры + +Процедура ПриСозданииОбъекта(пЗначение) + Значение = пЗначение; +КонецПроцедуры \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\222\320\241\321\202\321\200\320\276\320\272\321\203.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\222\320\241\321\202\321\200\320\276\320\272\321\203.os" new file mode 100644 index 0000000..e0654fd --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\222\320\241\321\202\321\200\320\276\320\272\321\203.os" @@ -0,0 +1,23 @@ +Перем РазделительСтрок; + +Функция Принять(Коллекция) Экспорт + + Возврат Новый Структура( + "Действие, Значение", + ДействияКонвейера.ВернутьЗначение, + СтрСоединить(Коллекция, РазделительСтрок) + ); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Истина; +КонецФункции + +Процедура Деструктор() Экспорт + // no-op +КонецПроцедуры + +Процедура ПриСозданииОбъекта(пРазделительСтрок) + РазделительСтрок = пРазделительСтрок; +КонецПроцедуры \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\224\320\273\321\217\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\224\320\273\321\217\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" new file mode 100644 index 0000000..22e4804 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\224\320\273\321\217\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" @@ -0,0 +1,31 @@ +#Использовать lambdas +#Использовать notify + +Перем Действие; + +Функция Принять(Элемент) Экспорт + + Действие.Выполнить(Элемент); + + Возврат Новый Структура("Действие", ДействияКонвейера.Бездействие); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Ложь; +КонецФункции + +Процедура Деструктор() Экспорт + ОсвободитьОбъект(Действие); +КонецПроцедуры + +Процедура ПриСозданииОбъекта(ФункцияОбработки, ДополнительныеПараметры, Отладка) + + Действие = ПроцессорыКоллекцийСлужебный.ДействиеИзПараметров( + ФункцияОбработки, + ФункциональныеИнтерфейсы.УниПроцедура(), + ДополнительныеПараметры, + Отладка + ); + +КонецПроцедуры \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\232\320\276\320\273\320\270\321\207\320\265\321\201\321\202\320\262\320\276.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\232\320\276\320\273\320\270\321\207\320\265\321\201\321\202\320\262\320\276.os" new file mode 100644 index 0000000..337ac79 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\232\320\276\320\273\320\270\321\207\320\265\321\201\321\202\320\262\320\276.os" @@ -0,0 +1,18 @@ +Функция Принять(Коллекция) Экспорт + Возврат Новый Структура( + "Действие, Значение", + ДействияКонвейера.ВернутьЗначение, + Коллекция.Количество() + ); +КонецФункции + +Функция Барьерный() Экспорт + Возврат Истина; +КонецФункции + +Процедура Деструктор() Экспорт + // no-op +КонецПроцедуры + +Процедура ПриСозданииОбъекта() +КонецПроцедуры \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\233\321\216\320\261\320\276\320\271\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\320\265\321\202.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\233\321\216\320\261\320\276\320\271\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\320\265\321\202.os" new file mode 100644 index 0000000..04b0efe --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\233\321\216\320\261\320\276\320\271\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\320\265\321\202.os" @@ -0,0 +1,54 @@ +#Использовать lambdas +#Использовать notify + +Перем Действие; +Перем ВозвращаемоеЗначение; + +Функция Принять(Элемент) Экспорт + + Если Действие.Выполнить(Элемент) Тогда + Возврат Новый Структура("Действие, Значение", ДействияКонвейера.ВернутьЗначение, ВозвращаемоеЗначение); + КонецЕсли; + + Возврат Новый Структура("Действие", ДействияКонвейера.Бездействие); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Ложь; +КонецФункции + +Процедура Деструктор() Экспорт + + ОсвободитьОбъект(Действие); + + Действие = Неопределено; + +КонецПроцедуры + +Процедура Инвертировать(ТолькоЗначение = Ложь) Экспорт + + Если Не ТолькоЗначение Тогда + + Действие = Лямбда.Выражение("Элемент -> Возврат Не Действие.Выполнить(Элемент)") + .Контекст(Новый Структура("Действие", Действие)) + .ВДействие(); + + КонецЕсли; + + ВозвращаемоеЗначение = Не ВозвращаемоеЗначение; + +КонецПроцедуры + +Процедура ПриСозданииОбъекта(ФункцияФильтрации, ДополнительныеПараметры, Отладка) + + Действие = ПроцессорыКоллекцийСлужебный.ДействиеИзПараметров( + ФункцияФильтрации, + ФункциональныеИнтерфейсы.УниФункция(), + ДополнительныеПараметры, + Отладка + ); + + ВозвращаемоеЗначение = Истина; + +КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\260\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\260\321\202\321\214.os" new file mode 100644 index 0000000..2b0ee82 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\260\321\202\321\214.os" @@ -0,0 +1,33 @@ +#Использовать lambdas +#Использовать notify + +Перем Действие; + +Функция Принять(Элемент) Экспорт + + Возврат Новый Структура("Действие, Элемент", ДействияКонвейера.ЗаменитьЭлемент, Действие.Выполнить(Элемент)); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Ложь; +КонецФункции + +Процедура Деструктор() Экспорт + + ОсвободитьОбъект(Действие); + + Действие = Неопределено; + +КонецПроцедуры + +Процедура ПриСозданииОбъекта(ФункцияОбработки, ДополнительныеПараметры, Отладка) + + Действие = ПроцессорыКоллекцийСлужебный.ДействиеИзПараметров( + ФункцияОбработки, + ФункциональныеИнтерфейсы.УниФункция(), + ДополнительныеПараметры, + Отладка + ); + +КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\265\321\200\320\262\321\213\320\265.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\265\321\200\320\262\321\213\320\265.os" new file mode 100644 index 0000000..bc57185 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\265\321\200\320\262\321\213\320\265.os" @@ -0,0 +1,27 @@ +Перем мКоличество; +Перем КоличествоПринято; + +Функция Принять(Элемент) Экспорт + + Если КоличествоПринято = мКоличество Тогда + Возврат Новый Структура("Действие", ДействияКонвейера.ПрекратитьОбход); + КонецЕсли; + + КоличествоПринято = КоличествоПринято + 1; + + Возврат Новый Структура("Действие", ДействияКонвейера.Бездействие); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Ложь; +КонецФункции + +Процедура Деструктор() Экспорт + // no-op +КонецПроцедуры + +Процедура ПриСозданииОбъекта(Количество) + мКоличество = Количество; + КоличествоПринято = 0; +КонецПроцедуры \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214.os" new file mode 100644 index 0000000..128aa3e --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214.os" @@ -0,0 +1,69 @@ +Перем ТипРезультата; +Перем КэшКолонок; + +Функция Принять(Коллекция) Экспорт + + Результат = Новый(ТипРезультата); + + РезультатСодержитКолонки = Истина; + Попытка + Колонки = Результат.Колонки; + Исключение + РезультатСодержитКолонки = Ложь; + КонецПопытки; + + Если РезультатСодержитКолонки Тогда + + Для Каждого Колонка Из КэшКолонок Цикл + Результат.Колонки.Добавить( + Колонка.Имя, + Колонка.ТипЗначения, + Колонка.Заголовок, + Колонка.Ширина + ); + КонецЦикла; + + Если Результат.Колонки.Количество() = 0 Тогда + Результат.Колонки.Добавить("Значение"); + КонецЕсли; + + КонецЕсли; + + ЭлементСодержитКолонки = КэшКолонок.Количество() > 0; + + Для Каждого ЭлементКоллекции Из Коллекция Цикл + + Если РезультатСодержитКолонки И ЭлементСодержитКолонки Тогда + ЗаполнитьЗначенияСвойств(Результат.Добавить(), ЭлементКоллекции); + ИначеЕсли РезультатСодержитКолонки Тогда + НоваяСтрока = Результат.Добавить(); + НоваяСтрока.Значение = ЭлементКоллекции; + Иначе + Результат.Добавить(ЭлементКоллекции); + КонецЕсли; + + КонецЦикла; + + Возврат Новый Структура("Действие, Значение", ДействияКонвейера.ВернутьЗначение, Результат); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Истина; +КонецФункции + +Процедура Деструктор() Экспорт + КэшКолонок = Неопределено; +КонецПроцедуры + +Процедура ПриСозданииОбъекта(пТипРезультата, пКэшКолонок = Неопределено) + + ТипРезультата = пТипРезультата; + + Если пКэшКолонок = Неопределено Тогда + КэшКолонок = Новый Массив; + Иначе + КэшКолонок = пКэшКолонок; + КонецЕсли; + +КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214\320\237\320\265\321\200\320\262\321\213\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214\320\237\320\265\321\200\320\262\321\213\320\271.os" new file mode 100644 index 0000000..305aabc --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214\320\237\320\265\321\200\320\262\321\213\320\271.os" @@ -0,0 +1,14 @@ +Функция Принять(Элемент) Экспорт + Возврат Новый Структура("Действие, Значение", ДействияКонвейера.ВернутьЗначение, Элемент); +КонецФункции + +Функция Барьерный() Экспорт + Возврат Ложь; +КонецФункции + +Процедура Деструктор() Экспорт + // no-op +КонецПроцедуры + +Процедура ПриСозданииОбъекта() +КонецПроцедуры \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\321\200\320\276\320\277\321\203\321\201\321\202\320\270\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\321\200\320\276\320\277\321\203\321\201\321\202\320\270\321\202\321\214.os" new file mode 100644 index 0000000..24b82d4 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\237\321\200\320\276\320\277\321\203\321\201\321\202\320\270\321\202\321\214.os" @@ -0,0 +1,27 @@ +Перем мКоличество; +Перем КоличествоПропущено; + +Функция Принять(Элемент) Экспорт + + Если КоличествоПропущено = мКоличество Тогда + Возврат Новый Структура("Действие", ДействияКонвейера.Бездействие); + КонецЕсли; + + КоличествоПропущено = КоличествоПропущено + 1; + + Возврат Новый Структура("Действие", ДействияКонвейера.ПропуститьЭлемент); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Ложь; +КонецФункции + +Процедура Деструктор() Экспорт + // no-op +КонецПроцедуры + +Процедура ПриСозданииОбъекта(Количество) + мКоличество = Количество; + КоличествоПропущено = 0; +КонецПроцедуры \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\262\320\265\321\200\320\275\321\203\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\262\320\265\321\200\320\275\321\203\321\202\321\214.os" new file mode 100644 index 0000000..3a3d8f5 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\262\320\265\321\200\320\275\321\203\321\202\321\214.os" @@ -0,0 +1,50 @@ +#Использовать lambdas +#Использовать notify +#Использовать asserts + +Перем Действие; + +Функция Принять(Коллекция) Экспорт + + Результат = Новый Массив; + + Для каждого Элемент Из Коллекция Цикл + + Процессор = Действие.Выполнить(Элемент); + + ДСО = СтрШаблон("Результат разворачивания для элемента %1 должен иметь тип ПроцессорКоллекций", Элемент); + Ожидаем.Что(Процессор, ДСО).ИмеетТип("ПроцессорКоллекций"); + + Процессор.ДляКаждого( + "Элемент -> Коллекция.Добавить(Элемент)", + Новый Структура("Коллекция", Результат) + ); + + КонецЦикла; + + Возврат Новый Структура("Действие, Коллекция", ДействияКонвейера.ЗаменитьКоллекцию, Результат); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Истина; +КонецФункции + +Процедура Деструктор() Экспорт + + ОсвободитьОбъект(Действие); + + Действие = Неопределено; + +КонецПроцедуры + +Процедура ПриСозданииОбъекта(ФункцияРазворачивания, ДополнительныеПараметры, Отладка) + + Действие = ПроцессорыКоллекцийСлужебный.ДействиеИзПараметров( + ФункцияРазворачивания, + ФункциональныеИнтерфейсы.УниФункция(), + ДополнительныеПараметры, + Отладка + ); + +КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\273\320\270\321\207\320\275\321\213\320\265.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\273\320\270\321\207\320\275\321\213\320\265.os" new file mode 100644 index 0000000..b62c4f4 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\273\320\270\321\207\320\275\321\213\320\265.os" @@ -0,0 +1,54 @@ +#Использовать lambdas +#Использовать notify + +Перем ДействиеРавенство; +Перем ПринятыеЭлементы; + +Функция Принять(Элемент) Экспорт + + Для каждого ПринятыйЭлемент Из ПринятыеЭлементы Цикл + + Если ДействиеРавенство.Выполнить(ПринятыйЭлемент, Элемент) Тогда + Возврат Новый Структура("Действие", ДействияКонвейера.ПропуститьЭлемент); + КонецЕсли; + + КонецЦикла; + + ПринятыеЭлементы.Добавить(Элемент); + + Возврат Новый Структура("Действие", ДействияКонвейера.Бездействие); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Ложь; +КонецФункции + +Процедура Деструктор() Экспорт + + ОсвободитьОбъект(ПринятыеЭлементы); + ОсвободитьОбъект(ДействиеРавенство); + + ПринятыеЭлементы = Неопределено; + ДействиеРавенство = Неопределено; + +КонецПроцедуры + +Процедура ПриСозданииОбъекта(ФункцияРавенства, ДополнительныеПараметры, Отладка) + + ПринятыеЭлементы = Новый Массив(); + + Если ФункцияРавенства = Неопределено Тогда + ДействиеРавенство = ПроцессорыКоллекций.СтандартнаяФункцияРавенства(); + Иначе + + ДействиеРавенство = ПроцессорыКоллекцийСлужебный.ДействиеИзПараметров( + ФункцияРавенства, + ФункциональныеИнтерфейсы.БиФункция(), + ДополнительныеПараметры, + Отладка + ); + + КонецЕсли; + +КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\320\272\321\200\320\260\321\202\320\270\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\320\272\321\200\320\260\321\202\320\270\321\202\321\214.os" new file mode 100644 index 0000000..8195f42 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\320\272\321\200\320\260\321\202\320\270\321\202\321\214.os" @@ -0,0 +1,42 @@ +Перем Действие; +Перем НачальноеЗначение; + +Функция Принять(Коллекция) Экспорт + + Результат = НачальноеЗначение; + Для Каждого Элемент Из Коллекция Цикл + Результат = Действие.Выполнить(Результат, Элемент); + КонецЦикла; + + Возврат Новый Структура( + "Действие, Значение", + ДействияКонвейера.ВернутьЗначение, + Результат + ); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Истина; +КонецФункции + +Процедура Деструктор() Экспорт + + ОсвободитьОбъект(Действие); + Действие = Неопределено; + +КонецПроцедуры + +Процедура ПриСозданииОбъекта(ФункцияСокращения, ДополнительныеПараметры, пНачальноеЗначение, Отладка) + + Действие = ПроцессорыКоллекцийСлужебный.ДействиеИзПараметров( + ФункцияСокращения, + ФункциональныеИнтерфейсы.БиФункция(), + ДополнительныеПараметры, + Отладка, + Истина + ); + + НачальноеЗначение = пНачальноеЗначение; + +КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214.os" new file mode 100644 index 0000000..0c4ca70 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214.os" @@ -0,0 +1,85 @@ +#Использовать lambdas +#Использовать notify +#Использовать asserts + +Перем Действие; +Перем ПолеСортировки; + +Функция Принять(Коллекция) Экспорт + + Результат = Коллекция; + + Для й = 0 По Результат.ВГраница() Цикл + Флаг = Ложь; + к = Результат.ВГраница(); + Пока к > й Цикл + + Элемент = Результат[к - 1]; + СледующийЭлемент = Результат[к]; + + Если ПустаяСтрока(ПолеСортировки) Тогда + РезультатСортировки = Действие.Выполнить(Элемент, СледующийЭлемент); + Иначе + РезультатСортировки = Действие.Выполнить(Элемент[ПолеСортировки], СледующийЭлемент[ПолеСортировки]); + КонецЕсли; + + Если РезультатСортировки > 0 Тогда + Результат[к - 1] = СледующийЭлемент; + Результат[к] = Элемент; + Флаг = Истина; + КонецЕсли; + к = к - 1; + КонецЦикла; + Если НЕ Флаг Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат Новый Структура("Действие, Коллекция", ДействияКонвейера.ЗаменитьКоллекцию, Результат); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Истина; +КонецФункции + +Процедура Деструктор() Экспорт + + ОсвободитьОбъект(Действие); + + Действие = Неопределено; + +КонецПроцедуры + +Процедура Инвертировать() Экспорт + + Если Действие = ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок() Тогда + Действие = ПроцессорыКоллекций.СтандартнаяФункцияСравненияОбратныйПорядок(); + Иначе + + Действие = Лямбда.Выражение("Первый, Второй -> Возврат -Действие.Выполнить(Первый, Второй)") + .Контекст(Новый Структура("Действие", Действие)) + .ВДействие(); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПриСозданииОбъекта(ФункцияРазворачивания, ДополнительныеПараметры, Отладка, Поле = "") + + Если ФункцияРазворачивания = Неопределено Тогда + Действие = ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(); + Иначе + + Действие = ПроцессорыКоллекцийСлужебный.ДействиеИзПараметров( + ФункцияРазворачивания, + ФункциональныеИнтерфейсы.БиФункция(), + ДополнительныеПараметры, + Отладка + ); + + КонецЕсли; + + ПолеСортировки = Поле; + +КонецПроцедуры diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\244\320\270\320\273\321\214\321\202\321\200\320\276\320\262\320\260\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\244\320\270\320\273\321\214\321\202\321\200\320\276\320\262\320\260\321\202\321\214.os" new file mode 100644 index 0000000..8fad3b5 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\244\320\270\320\273\321\214\321\202\321\200\320\276\320\262\320\260\321\202\321\214.os" @@ -0,0 +1,37 @@ +#Использовать lambdas +#Использовать notify + +Перем Действие; + +Функция Принять(Элемент) Экспорт + + Если Действие.Выполнить(Элемент) Тогда + Возврат Новый Структура("Действие", ДействияКонвейера.Бездействие); + КонецЕсли; + + Возврат Новый Структура("Действие", ДействияКонвейера.ПропуститьЭлемент); + +КонецФункции + +Функция Барьерный() Экспорт + Возврат Ложь; +КонецФункции + +Процедура Деструктор() Экспорт + + ОсвободитьОбъект(Действие); + + Действие = Неопределено; + +КонецПроцедуры + +Процедура ПриСозданииОбъекта(ФункцияФильтрации, ДополнительныеПараметры, Отладка) + + Действие = ПроцессорыКоллекцийСлужебный.ДействиеИзПараметров( + ФункцияФильтрации, + ФункциональныеИнтерфейсы.УниФункция(), + ДополнительныеПараметры, + Отладка + ); + +КонецПроцедуры diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\320\271\321\201\321\202\320\262\320\270\321\217\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\320\271\321\201\321\202\320\262\320\270\321\217\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260.os" new file mode 100644 index 0000000..4896b9d --- /dev/null +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\320\271\321\201\321\202\320\262\320\270\321\217\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260.os" @@ -0,0 +1,13 @@ +Перем ЗаменитьКоллекцию Экспорт; +Перем ПропуститьЭлемент Экспорт; +Перем ПрекратитьОбход Экспорт; +Перем ЗаменитьЭлемент Экспорт; +Перем Бездействие Экспорт; +Перем ВернутьЗначение Экспорт; + +ЗаменитьКоллекцию = "ЗаменитьКоллекцию"; +ПропуститьЭлемент = "ПропуститьЭлемент"; +ПрекратитьОбход = "ПрекратитьОбход"; +ЗаменитьЭлемент = "ЗаменитьЭлемент"; +Бездействие = "Бездействие"; +ВернутьЗначение = "ВернутьЗначение"; diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" index 5ced96e..a888bac 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" @@ -1,3 +1,7 @@ +#Использовать lambdas + +Перем Лог; + Процедура ФункцияСравнения(РезультатСортировки, ДополнительныеПараметры) Экспорт Элемент1 = ДополнительныеПараметры.Элемент1; Элемент2 = ДополнительныеПараметры.Элемент2; @@ -15,3 +19,202 @@ Элемент = ДополнительныеПараметры.Элемент; Сообщить(Элемент); КонецПроцедуры + +// Функция сравнивает два элемента и возвращает результат сравнения +// +// Параметры: +// ЭлементПервый - Произвольный - Первый сравниваемый элемент +// ЭлементВторой - Произвольный - Второй сравниваемый элемент +// +// Возвращаемое значение: +// Число - Положительное, если первый элемент больше второго +// Отрицательное если второй элемент больше первого +// Ноль если элементы равны +// +Функция СравнениеЗначенийПрямойПорядок(ЭлементПервый, ЭлементВторой) Экспорт + + Если ЭлементПервый > ЭлементВторой Тогда + Возврат 1; + ИначеЕсли ЭлементПервый < ЭлементВторой Тогда + Возврат -1; + Иначе + Возврат 0; + КонецЕсли; + +КонецФункции + +// Функция сравнивает два элемента и возвращает результат сравнения +// +// Параметры: +// ЭлементПервый - Произвольный - Первый сравниваемый элемент +// ЭлементВторой - Произвольный - Второй сравниваемый элемент +// +// Возвращаемое значение: +// Число - Положительное, если второй элемент больше первого +// Отрицательное если первый элемент больше второго +// Ноль если элементы равны +// +Функция СравнениеЗначенийОбратныйПорядок(ЭлементПервый, ЭлементВторой) Экспорт + Возврат -СравнениеЗначенийПрямойПорядок(ЭлементПервый, ЭлементВторой); +КонецФункции + +Функция РавенствоЗначений(ЭлементПервый, ЭлементВторой) Экспорт + Возврат ЭлементПервый = ЭлементВторой; +КонецФункции + +Функция ДействиеИзПараметров( + ОписаниеФункции, + Интерфейс, + ДополнительныеПараметры, + Отладка, + ЭлементРезультат = Ложь) Экспорт + + Если ТипЗнч(ОписаниеФункции) = Тип("ОписаниеОповещения") + Или ТипЗнч(ОписаниеФункции) = Тип("Строка") И СтрНайти(ОписаниеФункции, "->") = 0 Тогда + + Действие = ДействиеПоОписаниюОповещения( + ОписаниеФункции, + Интерфейс, + ДополнительныеПараметры, + Отладка, + ЭлементРезультат + ); + + ИначеЕсли ТипЗнч(ОписаниеФункции) = Тип("Строка") Тогда + + ЛямбдаВыражение = Лямбда.Выражение(ОписаниеФункции) + .Интерфейс(Интерфейс) + .Отладка(Отладка); + + Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда + ЛямбдаВыражение.Контекст(ДополнительныеПараметры); + ИначеЕсли Не ДополнительныеПараметры = Неопределено Тогда + ЛямбдаВыражение.ЗахватитьОбъект(ДополнительныеПараметры); + КонецЕсли; + + Действие = ЛямбдаВыражение.ВДействие(); + + Иначе + + Действие = ОписаниеФункции; + + КонецЕсли; + + Возврат Действие; + +КонецФункции + +Функция ДействиеПоОписаниюОповещения(ОписаниеОповещения, Интерфейс, ДополнительныеПараметры, Отладка, ЭлементРезультат) + + Лог.Предупреждение(" + | Использование синтаксиса лямбда выражений без ""->"" а так же описания оповещения является устаревшим + | и будет удален в последующих версиях, необходимо заменить места использования" + ); + + ЭтоФункция = Интерфейс.ПолучитьКартуИнтерфейса()[0].ЭтоФункция; + КоличествоПараметров = Интерфейс.ПолучитьКартуИнтерфейса()[0].КоличествоПараметров; + + Если ДополнительныеПараметры = Неопределено Тогда + ДополнительныеПараметры = Новый Структура(); + КонецЕсли; + + Если КоличествоПараметров = 1 Тогда + Префикс = "(Элемент) -> ДополнительныеПараметры.Вставить(""Элемент"", Элемент);"; + Иначе + Префикс = "(Элемент1, Элемент2) -> + | ДополнительныеПараметры.Вставить(""Элемент1"", Элемент1); + | ДополнительныеПараметры.Вставить(""Элемент2"", Элемент2);"; + КонецЕсли; + + Если ЭлементРезультат Тогда + + Префикс = Префикс + Символы.ПС + " + | Результат = Элемент1; + | Элемент = Элемент2; + | ДополнительныеПараметры.Вставить(""Элемент"", Элемент);"; + + Иначе + Префикс = Префикс + Символы.ПС + "Результат = Неопределено;"; + КонецЕсли; + + Если ЭтоФункция Тогда + Суффикс = "; Возврат Результат;"; + Иначе + Суффикс = ""; + КонецЕсли; + + Если ТипЗнч(ОписаниеОповещения) = Тип("Строка") Тогда + + Возврат Лямбда.Выражение(Префикс + ОписаниеОповещения + Суффикс) + .Отладка(Отладка) + .Интерфейс(Интерфейс) + .Контекст(Новый Структура("ДополнительныеПараметры", ДополнительныеПараметры)) + .ВДействие(); + + Иначе + + ДополнитьСтруктуру(ДополнительныеПараметры, ОписаниеОповещения.ДополнительныеПараметры, Истина); + + Возврат Лямбда + .Выражение(Префикс + " + | Оповещение.ДополнительныеПараметры = ДополнительныеПараметры; + | ОписанияОповещений.ВыполнитьОбработкуОповещения(Оповещение, Результат)" + Суффикс) + .Отладка(Отладка) + .Интерфейс(Интерфейс) + .Контекст(Новый Структура( + "Оповещение, ДополнительныеПараметры", + ОписаниеОповещения, + ДополнительныеПараметры + )) + .ВДействие(); + + КонецЕсли; + +КонецФункции + +// Дополняет структуру значениями из другой структуры. +// +// Параметры: +// Приемник - Структура - коллекция, в которую будут добавляться новые значения. +// Источник - Структура - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. +// Заменять - Булево, Неопределено - что делать в местах пересечения ключей источника и приемника: +// - Истина - заменять значения приемника (самый быстрый способ), +// - Ложь - не заменять значения приемника (пропускать), +// - Неопределено - значение по умолчанию. Бросать исключение. +// +// Функция скопирована из "Библиотеки Стандартных Подсистем" на следующих условиях: +// +// Copyright (c) 2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +// +// В функцию внесены следующие изменения: +// - использование СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку заменено на СтрШаблон; +// - добавлена инициализиация структур приемника и источника +// +Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) + + Если Приемник = Неопределено Тогда + Приемник = Новый Структура; + КонецЕсли; + + Если Источник = Неопределено Тогда + Источник = Новый Структура; + КонецЕсли; + + Для Каждого Элемент Из Источник Цикл + Если Заменять <> Истина И Приемник.Свойство(Элемент.Ключ) Тогда + Если Заменять = Ложь Тогда + Продолжить; + Иначе + ВызватьИсключение СтрШаблон(НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'"), Элемент.Ключ); + КонецЕсли; + КонецЕсли; + Приемник.Вставить(Элемент.Ключ, Элемент.Значение); + КонецЦикла; + +КонецПроцедуры + +Лог = Логирование.ПолучитьЛог("oscript.lib.stream"); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" index 3646992..81217f0 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" @@ -7,18 +7,15 @@ Перем Лог; +Перем Коллекция; +Перем КэшКолонок; + Перем Конвейер; -Перем ПроцессорКоллекцийСлужебный; -Перем ВременныеОписанияОповещений; -Перем ТекстШаблонаИзолированногоКласса; +Перем НомерПроходаКонвейера; // Флаг поддержки возможности отладки добавленных методов Перем Отладка; -Процедура ПриСозданииОбъекта() - Отладка = ЗначениеЗаполнено(ПолучитьПеременнуюСреды("OSCRIPT_FLUENT_DEBUG")); -КонецПроцедуры - // Общее API // Устанавливает коллекцию для обработки Процессора коллекций. @@ -27,8 +24,31 @@ // НоваяКоллекция - Массив, ТаблицаЗначений, ДеревоЗначений - Коллекция, устанавливаемая в процессор. // Процедура УстановитьКоллекцию(НоваяКоллекция) Экспорт - ПроцессорКоллекцийСлужебный.УстановитьКоллекцию(НоваяКоллекция); - Лог.Отладка("Установлена коллекция размером %1", ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию().Количество()); + + Коллекция = Новый Массив; + + Для Каждого ЭлементНовойКоллекции Из НоваяКоллекция Цикл + Коллекция.Добавить(ЭлементНовойКоллекции); + КонецЦикла; + + КэшКолонок = Новый Массив; + + ЕстьРеквизитКолонки = Истина; + Попытка + Колонки = НоваяКоллекция.Колонки; + Исключение + ЕстьРеквизитКолонки = Ложь; + КонецПопытки; + + Если ЕстьРеквизитКолонки Тогда + Для Каждого Колонка Из НоваяКоллекция.Колонки Цикл + КэшКолонок.Добавить(Колонка); + КонецЦикла; + КонецЕсли; + + Лог.Отладка("Кэш колонок содержит %1 колонок", КэшКолонок.Количество()); + Лог.Отладка("Установлена коллекция размером %1", Коллекция.Количество()); + КонецПроцедуры // Включает возможность отладки. Достигается сохранением текста модуля во временный файл. @@ -37,11 +57,8 @@ // ПроцессорКоллекций - Ссылка на текущий инстанс ПроцессорКоллекций // Функция Отладка(Включена = Истина) Экспорт - Отладка = Включена; - Возврат ЭтотОбъект; - КонецФункции // Конвейерные методы @@ -56,13 +73,8 @@ // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // Функция Первые(Количество) Экспорт - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Количество", Количество); - - ПоложитьЯчейкуВКонвейер("Первые", , ДополнительныеПараметры); + ДобавитьШагВКонвейер(Новый ШагКонвейераПервые(Количество)); Возврат ЭтотОбъект; - КонецФункции // Пропустить первые N элементов. @@ -75,105 +87,92 @@ // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // Функция Пропустить(Количество) Экспорт - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Количество", Количество); - - ПоложитьЯчейкуВКонвейер("Пропустить", , ДополнительныеПараметры); + ДобавитьШагВКонвейер(Новый ШагКонвейераПропустить(Количество)); Возврат ЭтотОбъект; - КонецФункции // Выбрать различные элементы. // Конвейерный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияРавенства - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Булево, Истина если элементы равны, Ложь в противном случае +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Булево, Истина если элементы равны, Ложь в противном случае +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияРавенства(), +// проверка "Элемент1 = Элемент2" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Различные("Результат = Элемент1 > Элемент2"); // -// 2: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры -// -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); -// ПроцессорКоллекций.Различные(ФункцияСравнения); +// ПроцессорКоллекций = ПроцессорыКоллекций.ИзНабора( +// Новый Структура("Имя, Возраст", "Вася", 25), +// Новый Структура("Имя, Возраст", "Петя", 27), +// Новый Структура("Имя, Возраст", "Ваня", 25) +// ); // -Функция Различные(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт - - Если ФункцияСравнения = Неопределено Тогда - ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); - Иначе - Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда - ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); - КонецЕсли; - КонецЕсли; - ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПоложитьЯчейкуВКонвейер("Различные", ФункцияСравнения); +// // 1: +// ПроцессорКоллекций.Различные("(ЧеловекПервый, ЧеловекВторой) -> ЧеловекПервый.Возраст = ЧеловекВторой.Возраст"); +// +// // В коллекции останутся: Вася(25) и Петя(27) +// +// // 2: +// Функция МояФункцияФункцияРавенства(ЭлементПервый, ЭлементВторой) Экспорт +// Возврат ЧеловекПервый.Возраст = ЧеловекВторой.Возраст; +// КонецФункции +// +// ПроцессорКоллекций.Различные(Новый Действие(ЭтотОбъект, "МояФункцияФункцияРавенства")); +// +// // В коллекции останутся: Вася(25) и Петя(27) +// +Функция Различные(Знач ФункцияРавенства = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт + ДобавитьШагВКонвейер(Новый ШагКонвейераРазличные(ФункцияРавенства, ДополнительныеПараметры, Отладка)); Возврат ЭтотОбъект; - КонецФункции // Обработать каждый элемент коллекции. // Конвейерный метод. // // Параметры: -// ФункцияОбработки - Строка, ОписаниеОповещения - функция обработки. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Произвольный - Переменная, в которой возвращается значение работы обработчика. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая обработчику. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции обработки. -// Служит для передачи дополнительных данных из прикладного кода в функцию обработки. -// По умолчанию содержит одно значение - Элемент. +// ФункцияОбработки - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает новый элемент +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает новый элемент +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Обработать("Результат = Элемент + 1;"); +// // 1: +// ПроцессорКоллекций.Обработать("Элемент -> Элемент + 1"); // -// 2: -// Процедура МояФункцияОбработки(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент + 1; -// КонецПроцедуры -// -// ФункцияОбработки = Новый ОписаниеОповещения("МояФункцияОбработки", ЭтотОбъект); +// // 2: +// Функция МояФункцияОбработки(Элемент) Экспорт +// Возврат Элемент + 1; +// КонецФункции +// +// ФункцияОбработки = Новый Действие(ЭтотОбъект, "МояФункцияОбработки"); // ПроцессорКоллекций.Обработать(ФункцияОбработки); // Функция Обработать(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) Экспорт - - Если ТипЗнч(ФункцияОбработки) = Тип("Строка") Тогда - ФункцияОбработки = СформироватьВременноеОписаниеОповещения(ФункцияОбработки, ДополнительныеПараметры); - КонецЕсли; - ДополнитьСтруктуру(ФункцияОбработки.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПоложитьЯчейкуВКонвейер("Обработать", ФункцияОбработки); + ДобавитьШагВКонвейер(Новый ШагКонвейераОбработать(ФункцияОбработки, ДополнительныеПараметры, Отладка)); Возврат ЭтотОбъект; - КонецФункции // Развернуть каждый элемент коллекции в процессор коллекций. @@ -182,136 +181,121 @@ // Конвейерный метод. // // Параметры: -// ФункцияРазворачивания - Строка, ОписаниеОповещения - функция разворачивания. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// * Результат - ПроцессорКоллекций - Переменная, в которую должен быть -// помещен результат работы функции в виде ПроцессораКоллекций. -// * ДополнительныеПараметры - Структура - Структура параметров, передаваемая функции разворачивания. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции разворачивания. -// Служит для передачи дополнительных данных из прикладного кода в функцию разворачивания. -// По умолчанию содержит одно значение - Элемент. +// ФункцияРазворачивания - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает ПроцессорКоллекций из элемента +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает ПроцессорКоллекций из элемента +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Развернуть("Результат = ПроцессорыКоллекций.ИзСтроки(Элемент);"); +// // 1: +// ПроцессорКоллекций.Развернуть("Элемент -> ПроцессорыКоллекций.ИзСтроки(Элемент)"); // -// 2: -// Процедура МояФункцияРазворачивания(Результат, ДополнительныеПараметры) Экспорт -// Результат = ПроцессорыКоллекций.ИзСтроки(ДополнительныеПараметры.Элемент); -// КонецПроцедуры +// // 2: +// Функция МояФункцияРазворачивания(Элемент) Экспорт +// Возврат ПроцессорыКоллекций.ИзСтроки(Элемент); +// КонецФункции // -// ФункцияРазворачивания = Новый ОписаниеОповещения("МояФункцияРазворачивания", ЭтотОбъект); +// ФункцияРазворачивания = Новый Действие(ЭтотОбъект, "МояФункцияРазворачивания"); // ПроцессорКоллекций.Развернуть(ФункцияРазворачивания); // Функция Развернуть(Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) Экспорт - - Если ТипЗнч(ФункцияРазворачивания) = Тип("Строка") Тогда - ФункцияРазворачивания = СформироватьВременноеОписаниеОповещения(ФункцияРазворачивания, ДополнительныеПараметры); - КонецЕсли; - ДополнитьСтруктуру(ФункцияРазворачивания.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПоложитьЯчейкуВКонвейер("Развернуть", ФункцияРазворачивания); + ДобавитьШагВКонвейер(Новый ШагКонвейераРазвернуть(ФункцияРазворачивания, ДополнительныеПараметры, Отладка)); Возврат ЭтотОбъект; - КонецФункции // Фильтровать коллекцию по условию. // Конвейерный метод. // // Параметры: -// ФункцияФильтрации - Строка, ОписаниеОповещения - Функция фильтрации. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции фильтрации. -// Служит для передачи дополнительных данных из прикладного кода в функцию фильтрации. -// По умолчанию содержит одно значение - Элемент. +// ФункцияФильтрации - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Фильтровать("Результат = СтрДлина(Элемент) > 1"); +// // 1: +// ПроцессорКоллекций.Фильтровать("Элемент -> СтрДлина(Элемент) > 1"); // -// 2: -// Процедура МояПроцедураФильтрации(Результат, ДополнительныеПараметры) Экспорт -// Результат = СтрДлина(ДополнительныеПараметры.Элемент) > 1; -// КонецПроцедуры +// // 2: +// Функция МояФункцияФильтрации(Результат, ДополнительныеПараметры) Экспорт +// Возврат СтрДлина(ДополнительныеПараметры.Элемент) > 1; +// КонецФункции // -// ФункцияФильтрации = Новый ОписаниеОповещения("МояПроцедураФильтрации", ЭтотОбъект); +// ФункцияФильтрации = Новый Действие(ЭтотОбъект, "МояФункцияФильтрации"); // ПроцессорКоллекций.Фильтровать(ФункцияФильтрации); // Функция Фильтровать(Знач ФункцияФильтрации, Знач ДополнительныеПараметры = Неопределено) Экспорт - - Если ТипЗнч(ФункцияФильтрации) = Тип("Строка") Тогда - ФункцияФильтрации = СформироватьВременноеОписаниеОповещения(ФункцияФильтрации, ДополнительныеПараметры); - КонецЕсли; - ДополнитьСтруктуру(ФункцияФильтрации.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПоложитьЯчейкуВКонвейер("Фильтровать", ФункцияФильтрации); + ДобавитьШагВКонвейер(Новый ШагКонвейераФильтровать(ФункцияФильтрации, ДополнительныеПараметры, Отладка)); Возврат ЭтотОбъект; - КонецФункции // Сортировать элементы коллекции. // Конвейерный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(), +// проверка через ">", "<", "=" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.Сортировать("Результат = Элемент1 > Элемент2"); -// -// 2: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры +// // 1: +// ПроцессорКоллекций.Сортировать("(Первый, Второй) -> +// | Если Первый > Второй Тогда Возврат 1; +// | ИначеЕсли Второй > Первый Тогда Возврат -1; +// | Иначе Возврат 0; +// | КонецЕсли;" +// ); +// +// // 2: +// Функция МояФункцияСравнения(Первый, Второй) Экспорт +// Если Первый > Второй Тогда +// Возврат 1; +// ИначеЕсли Второй > Первый Тогда +// Возврат -1; +// Иначе +// Возврат 0; +// КонецЕсли; +// КонецФункции // -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения"); // ПроцессорКоллекций.Сортировать(ФункцияСравнения); // Функция Сортировать(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт - - Если ФункцияСравнения = Неопределено Тогда - ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); - Иначе - Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда - ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); - КонецЕсли; - КонецЕсли; - ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПоложитьЯчейкуВКонвейер("Сортировать", ФункцияСравнения); + ДобавитьШагВКонвейер(Новый ШагКонвейераСортировать(ФункцияСравнения, ДополнительныеПараметры, Отладка)); Возврат ЭтотОбъект; - КонецФункции // Сортировать элементы коллекции по выбранному полю. @@ -320,49 +304,52 @@ // Параметры: // ИмяПоля - Строка - Имя поля элемента коллекции, по которому необходимо осуществлять сортировку. // -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(), +// проверка через ">", "<", "=" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". // // Примеры: -// 1: -// ПроцессорКоллекций.СортироватьПо("НомерСтроки", "Результат = Элемент1 > Элемент2"); -// -// 2: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры +// // 1: +// ПроцессорКоллекций.СортироватьПо("НомерСтроки", "(Первый, Второй) -> +// | Если Первый > Второй Тогда Возврат 1; +// | ИначеЕсли Второй > Первый Тогда Возврат -1; +// | Иначе Возврат 0; +// | КонецЕсли;" +// ); +// +// // 2: +// Функция МояФункцияСравнения(Первый, Второй) Экспорт +// Если Первый > Второй Тогда +// Возврат 1; +// ИначеЕсли Второй > Первый Тогда +// Возврат -1; +// Иначе +// Возврат 0; +// КонецЕсли; +// КонецФункции // -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения"); // ПроцессорКоллекций.СортироватьПо("НомерСтроки", ФункцияСравнения); // -Функция СортироватьПо(Знач ИмяПоля, Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция СортироватьПо( + Знач ИмяПоля, + Знач ФункцияСравнения = Неопределено, + Знач ДополнительныеПараметры = Неопределено) Экспорт - Если ФункцияСравнения = Неопределено Тогда - ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); - Иначе - Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда - ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); - КонецЕсли; - КонецЕсли; - ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ФункцияСравнения.ДополнительныеПараметры.Вставить("ИмяПоля", ИмяПоля); - - ПоложитьЯчейкуВКонвейер("СортироватьПо", ФункцияСравнения); + ДобавитьШагВКонвейер(Новый ШагКонвейераСортировать(ФункцияСравнения, ДополнительныеПараметры, Отладка, ИмяПоля)); Возврат ЭтотОбъект; КонецФункции @@ -376,19 +363,8 @@ // Произвольный - Первый элемент из коллекции. Если коллекция пуста, возвращает Неопределено. // Функция ПолучитьПервый() Экспорт - Лог.Отладка("ПолучитьПервый"); - - ПройтиКонвейер(); - - Результат = Неопределено; - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - Для Каждого Элемент Из Коллекция Цикл - Результат = Элемент; - Прервать; - КонецЦикла; - - Возврат Результат; - + ДобавитьШагВКонвейер(Новый ШагКонвейераПолучитьПервый()); + Возврат ПройтиКонвейер(); КонецФункции // Получить коллекцию в виде массива. @@ -398,19 +374,8 @@ // Массив - Массив элементов коллекции. // Функция ВМассив() Экспорт - - Лог.Отладка("ВМассив"); - - ПройтиКонвейер(); - - Результат = Новый Массив; - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - Для Каждого Элемент Из Коллекция Цикл - Результат.Добавить(Элемент); - КонецЦикла; - - Возврат Результат; - + ДобавитьШагВКонвейер(Новый ШагКонвейераПолучить(Тип("Массив"))); + Возврат ПройтиКонвейер(); КонецФункции // Получить коллекцию в виде строки. @@ -423,21 +388,8 @@ // Строка - Элементы коллекции, соединенные в строку методом конкатенации. // Функция ВСтроку(РазделительСтрок = "") Экспорт - Лог.Отладка("ВСтроку"); - - ПройтиКонвейер(); - - Результат = ""; - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - Для Каждого Элемент Из Коллекция Цикл - Результат = Результат + Элемент + РазделительСтрок; - КонецЦикла; - - Если НЕ РазделительСтрок = "" И СтрДлина(Результат) > 0 Тогда - СтроковыеФункции.УдалитьПоследнийСимволВСтроке(Результат, СтрДлина(РазделительСтрок)); - КонецЕсли; - - Возврат Результат; + ДобавитьШагВКонвейер(Новый ШагКонвейераВСтроку(РазделительСтрок)); + Возврат ПройтиКонвейер(); КонецФункции // Получить количество элементов коллекции. @@ -447,133 +399,94 @@ // Число - Количество элементов коллекции. // Функция Количество() Экспорт - - Лог.Отладка("Количество"); - - ПройтиКонвейер(); - - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - Результат = Коллекция.Количество(); - - Возврат Результат; - + ДобавитьШагВКонвейер(Новый ШагКонвейераКоличество()); + Возврат ПройтиКонвейер(); КонецФункции // Обработать каждый элемент коллекции и завершить работу процессора. // Терминальный метод. // // Параметры: -// ФункцияОбработки - Строка, ОписаниеОповещения - функция обработки. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Произвольный - Игнорируется. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая обработчику. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции обработки. -// Служит для передачи дополнительных данных из прикладного кода в функцию обработки. -// По умолчанию содержит одно значение - Элемент. +// ФункцияОбработки - Строка - Лямбда выражение процедура с одним параметром в который будет передан элемент +// - Действие - Делегат на процедуру с одним параметром в который будет передан элемент // -// Примеры: -// 1: -// ПроцессорКоллекций.ДляКаждого("Сообщить(Элемент);"); +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // -// 2: -// ПроцессорКоллекций.ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); +// Примеры: +// // 1: +// ПроцессорКоллекций.ДляКаждого("Элемент -> Сообщить(Элемент);"); // -// 3: -// Процедура МояФункцияОбработки(Результат, ДополнительныеПараметры) Экспорт -// Сообщить(ДополнительныеПараметры.Элемент); +// // 2: +// Процедура МояПроцедураОбработки(Элемент) Экспорт +// Сообщить(Элемент); // КонецПроцедуры // -// ФункцияОбработки = Новый ОписаниеОповещения("МояФункцияОбработки", ЭтотОбъект); -// ПроцессорКоллекций.ДляКаждого(ФункцияОбработки); +// ПроцедураОбработки = Новый Действие(ЭтотОбъект, "МояПроцедураОбработки"); +// ПроцессорКоллекций.ДляКаждого(ПроцедураОбработки); // Процедура ДляКаждого(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) Экспорт - - Лог.Отладка("ДляКаждого"); - - Если ТипЗнч(ФункцияОбработки) = Тип("Строка") Тогда - ФункцияОбработки = СформироватьВременноеОписаниеОповещения(ФункцияОбработки, ДополнительныеПараметры); - КонецЕсли; - ДополнитьСтруктуру(ФункцияОбработки.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - + ДобавитьШагВКонвейер(Новый ШагКонвейераДляКаждого(ФункцияОбработки, ДополнительныеПараметры, Отладка)); ПройтиКонвейер(); - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Обработчик", ФункцияОбработки); - - ПроцессорКоллекцийСлужебный.ВыполнитьОбработать(Неопределено, ДополнительныеПараметры); - - ОчиститьВременныеОписанияОповещений(); - КонецПроцедуры // Получить минимальный элемент. // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(), +// проверка через ">", "<", "=" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Произвольный - минимальный элемент коллекции. // // Примеры: -// 1: +// // 1: // ПроцессорКоллекций.Минимум(); // -// 2: -// ПроцессорКоллекций.Минимум("Результат = Элемент1 > Элемент2"); -// -// 3: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры +// // 2: +// ПроцессорКоллекций.Минимум("(Первый, Второй) -> +// | Если Первый > Второй Тогда Возврат 1; +// | ИначеЕсли Второй > Первый Тогда Возврат -1; +// | Иначе Возврат 0; +// | КонецЕсли;" +// ); +// +// // 3: +// Функция МояФункцияСравнения(Первый, Второй) Экспорт +// Если Первый > Второй Тогда +// Возврат 1; +// ИначеЕсли Второй > Первый Тогда +// Возврат -1; +// Иначе +// Возврат 0; +// КонецЕсли; +// КонецФункции // -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения"); // ПроцессорКоллекций.Минимум(ФункцияСравнения); // Функция Минимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт - Лог.Отладка("Минимум"); - - Если ФункцияСравнения = Неопределено Тогда - ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); - Иначе - Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда - ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); - КонецЕсли; - КонецЕсли; - ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПройтиКонвейер(); - - Результат = Новый Массив; - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Обработчик", ФункцияСравнения); + ДобавитьШагВКонвейер(Новый ШагКонвейераСортировать(ФункцияСравнения, ДополнительныеПараметры, Отладка)); + ДобавитьШагВКонвейер(Новый ШагКонвейераПолучитьПервый()); - ПроцессорКоллекцийСлужебный.ВыполнитьСортировать(Результат, ДополнительныеПараметры); - - ОчиститьВременныеОписанияОповещений(); - - Если Результат.Количество() = 0 Тогда - Возврат Неопределено; - Иначе - Возврат Результат[0]; - КонецЕсли; + Возврат ПройтиКонвейер(); КонецФункции @@ -581,126 +494,102 @@ // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// Если параметр не передан, выполняется стандартная функция сравнения: -// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит два значения - Элемент1 и Элемент2. +// ФункцияСравнения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Действие - Делегат на функцию с двумя параметрами, в которые будут переданы два элемента, +// и которая возвращает Число, 1 - если первый элемент больше, -1 если второй элемент больше, 0 - если элементы равны +// - Неопределено - см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок(), +// проверка через ">", "<", "=" +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Произвольный - максимальный элемент коллекции. // // Примеры: -// 1: +// // 1: // ПроцессорКоллекций.Максимум(); // -// 2: -// ПроцессорКоллекций.Максимум("Результат = Элемент1 > Элемент2"); -// -// 3: -// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт -// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; -// КонецПроцедуры +// // 2: +// ПроцессорКоллекций.Максимум("(Первый, Второй) -> +// | Если Первый > Второй Тогда Возврат 1; +// | ИначеЕсли Второй > Первый Тогда Возврат -1; +// | Иначе Возврат 0; +// | КонецЕсли;" +// ); +// +// // 3: +// Функция МояФункцияСравнения(Первый, Второй) Экспорт +// Если Первый > Второй Тогда +// Возврат 1; +// ИначеЕсли Второй > Первый Тогда +// Возврат -1; +// Иначе +// Возврат 0; +// КонецЕсли; +// КонецФункции // -// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ФункцияСравнения = Новый Действие(ЭтотОбъект, "МояФункцияСравнения"); // ПроцессорКоллекций.Максимум(ФункцияСравнения); // Функция Максимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт - Лог.Отладка("Максимум"); - - Если ФункцияСравнения = Неопределено Тогда - ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); - Иначе - Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда - ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); - КонецЕсли; - КонецЕсли; - ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПройтиКонвейер(); - - Результат = Новый Массив; - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Обработчик", ФункцияСравнения); - - ПроцессорКоллекцийСлужебный.ВыполнитьСортировать(Результат, ДополнительныеПараметры); - - ОчиститьВременныеОписанияОповещений(); - - Если Результат.Количество() = 0 Тогда - Возврат Неопределено; - Иначе - Возврат Результат[Результат.Количество() - 1]; - КонецЕсли; - + Сортировка = Новый ШагКонвейераСортировать(ФункцияСравнения, ДополнительныеПараметры, Отладка); + Сортировка.Инвертировать(); + + ДобавитьШагВКонвейер(Сортировка); + ДобавитьШагВКонвейер(Новый ШагКонвейераПолучитьПервый()); + + Возврат ПройтиКонвейер(); + КонецФункции // Выполнить агрегатную функцию над элементами коллекции. // Терминальный метод. // // Параметры: -// ФункцияСокращения - Строка, ОписаниеОповещения - Функция сокращения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Произвольный - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. +// ФункцияСокращения - Строка - Лямбда выражение функция с двумя параметрами в которые будут переданы +// результат аккумулятор и очередной элемент коллекции, и которая возвращает новое значение результата +// - Действие - Делегат на функцию с двумя параметрами в которые будут переданы +// результат аккумулятор и очередной элемент коллекции, и которая возвращает новое значение результата // // НачальноеЗначение - Произвольный - начальное значение, передаваемое в функцию сокращения в параметр "Результат" // -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сокращения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сокращения. -// По умолчанию содержит одно значение - Элемент. +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Произвольный - результат работы агрегатной функции. // // Примеры: // 2: -// ПроцессорКоллекций.Сократить("Результат = Результат + Элемент"); +// ПроцессорКоллекций.Сократить("Результат, Элемент -> Результат + Элемент", 0); // // 2: -// Процедура МояФункцияСокращения(Результат, ДополнительныеПараметры) Экспорт -// Элемент = ДополнительныеПараметры.Элемент; -// Результат = Результат + Элемент; -// КонецПроцедуры +// Функция МояФункцияСокращения(Результат, Элемент) Экспорт +// Возврат Результат + Элемент; +// КонецФункции // -// ФункцияСокращения = Новый ОписаниеОповещения("МояФункцияСокращения", ЭтотОбъект); +// ФункцияСокращения = Новый Действие(ЭтотОбъект, "МояФункцияСокращения"); // ПроцессорКоллекций.Сократить(ФункцияСокращения); // Функция Сократить(Знач ФункцияСокращения, Знач НачальноеЗначение = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт - Лог.Отладка("Сократить"); - - Если ТипЗнч(ФункцияСокращения) = Тип("Строка") Тогда - ФункцияСокращения = СформироватьВременноеОписаниеОповещения(ФункцияСокращения, ДополнительныеПараметры); - КонецЕсли; - ДополнитьСтруктуру(ФункцияСокращения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПройтиКонвейер(); - - Результат = НачальноеЗначение; - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - Для Каждого Элемент Из Коллекция Цикл - ФункцияСокращения.ДополнительныеПараметры.Вставить("Элемент", Элемент); - ОписанияОповещений.ВыполнитьОбработкуОповещения(ФункцияСокращения, Результат); - КонецЦикла; - - ОчиститьВременныеОписанияОповещений(); - - Возврат Результат; + ДобавитьШагВКонвейер( + Новый ШагКонвейераСократить(ФункцияСокращения, ДополнительныеПараметры, НачальноеЗначение, Отладка) + ); + Возврат ПройтиКонвейер(); КонецФункции @@ -714,71 +603,25 @@ // Произвольный - Коллекция в виде объекта нужного типа. // Функция Получить(ТипРезультата) Экспорт - - Лог.Отладка("Получить %1", ТипРезультата); - - ПройтиКонвейер(); - - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - КэшКолонок = ПроцессорКоллекцийСлужебный.ПолучитьКэшКолонок(); - - Результат = Новый(ТипРезультата); - - РезультатСодержитКолонки = Истина; - Попытка - Колонки = Результат.Колонки; - Исключение - РезультатСодержитКолонки = Ложь; - КонецПопытки; - - Если РезультатСодержитКолонки Тогда - Для Каждого Колонка Из КэшКолонок Цикл - Результат.Колонки.Добавить( - Колонка.Имя, - Колонка.ТипЗначения, - Колонка.Заголовок, - Колонка.Ширина - ); - КонецЦикла; - - Если Результат.Колонки.Количество() = 0 Тогда - Результат.Колонки.Добавить("Значение"); - КонецЕсли; - КонецЕсли; - - ЭлементСодержитКолонки = КэшКолонок.Количество() > 0; - Лог.Отладка("Результат содержит колонки %1", РезультатСодержитКолонки); - Лог.Отладка("Элемент содержит колонки %1", ЭлементСодержитКолонки); - Для Каждого ЭлементКоллекции Из Коллекция Цикл - Если РезультатСодержитКолонки И ЭлементСодержитКолонки Тогда - ЗаполнитьЗначенияСвойств(Результат.Добавить(), ЭлементКоллекции); - ИначеЕсли РезультатСодержитКолонки Тогда - НоваяСтрока = Результат.Добавить(); - НоваяСтрока.Значение = ЭлементКоллекции; - Иначе - Результат.Добавить(ЭлементКоллекции); - КонецЕсли; - КонецЦикла; - - Возврат Результат; - + ДобавитьШагВКонвейер(Новый ШагКонвейераПолучить(ТипРезультата, КэшКолонок)); + Возврат ПройтиКонвейер(); КонецФункции // Проверить, что хотя бы один элемент коллекции удовлетворяет условию в функции сравнения. // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит одно значение - Элемент. +// ФункцияСравнения - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Булево - Истина, если минимум один из элементов коллекции удовлетворяет условию Функции сравнения. @@ -787,34 +630,10 @@ // Функция ЛюбойСоответствует(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) Экспорт - Лог.Отладка("ЛюбойСоответствует"); - - Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда - ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); - КонецЕсли; - ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПройтиКонвейер(); - - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - Результат = Ложь; - - ФункцияСравнения.ДополнительныеПараметры.Вставить("Элемент"); - - Для Каждого Элемент Из Коллекция Цикл - ФункцияСравнения.ДополнительныеПараметры.Элемент = Элемент; - РезультатФильтрации = Ложь; - ОписанияОповещений.ВыполнитьОбработкуОповещения(ФункцияСравнения, РезультатФильтрации); - - Если РезультатФильтрации Тогда - Результат = Истина; - Прервать; - КонецЕсли; - КонецЦикла; + ДобавитьШагВКонвейер(Новый ШагКонвейераЛюбойСоответствует(ФункцияСравнения, ДополнительныеПараметры, Отладка)); + ДобавитьШагВКонвейер(Новый ШагКонвейераБарьерВернутьЗначение(Ложь)); - ОчиститьВременныеОписанияОповещений(); - - Возврат Результат; + Возврат ПройтиКонвейер(); КонецФункции @@ -822,17 +641,17 @@ // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит одно значение - Элемент. +// ФункцияСравнения - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Булево - Истина, если все элементы коллекции удовлетворяют условию Функции сравнения. @@ -841,34 +660,13 @@ // Функция ВсеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) Экспорт - Лог.Отладка("ВсеСоответствуют"); - - Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда - ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); - КонецЕсли; - ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПройтиКонвейер(); - - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - Результат = Истина; - - ФункцияСравнения.ДополнительныеПараметры.Вставить("Элемент"); - - Для Каждого Элемент Из Коллекция Цикл - ФункцияСравнения.ДополнительныеПараметры.Элемент = Элемент; - РезультатФильтрации = Ложь; - ОписанияОповещений.ВыполнитьОбработкуОповещения(ФункцияСравнения, РезультатФильтрации); - - Если НЕ РезультатФильтрации Тогда - Результат = Ложь; - Прервать; - КонецЕсли; - КонецЦикла; + Фильтр = Новый ШагКонвейераЛюбойСоответствует(ФункцияСравнения, ДополнительныеПараметры, Отладка); + Фильтр.Инвертировать(); - ОчиститьВременныеОписанияОповещений(); - - Возврат Результат; + ДобавитьШагВКонвейер(Фильтр); + ДобавитьШагВКонвейер(Новый ШагКонвейераБарьерВернутьЗначение(Истина)); + + Возврат ПройтиКонвейер(); КонецФункции @@ -876,17 +674,17 @@ // Терминальный метод. // // Параметры: -// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. -// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные -// "Результат", "ДополнительныеПараметры", "Элемент". -// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра -// (имена произвольные): -// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. -// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. -// -// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. -// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. -// По умолчанию содержит одно значение - Элемент. +// ФункцияСравнения - Строка - Лямбда выражение функция с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// - Действие - Делегат на функцию с одним параметром в который будет передан элемент, +// и которая возвращает Булево, Истина если элемент проходит фильтр, ложь в противном случае +// +// ДополнительныеПараметры - Структура - Контекст добавляемый в лямбда выражение, +// значения будут доступны по обращению к ключу как к переменной. +// При передачи действия в первом параметре, этот параметр игнорируется +// - Сценарий - Экземпляр объекта, который будет захвачен в лямбда выражение, +// в лямбда выражении будет доступен контекст (публичные и приватные поля, публичные методы) объекта. +// При передачи действия в первом параметре, этот параметр игнорируется // // Возвращаемое значение: // Булево - Истина, если все элементы коллекции не удовлетворяют условию Функции сравнения. @@ -895,193 +693,129 @@ // Функция ВсеНеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) Экспорт - Лог.Отладка("ВсеНеСоответствуют"); - - Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда - ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); - КонецЕсли; - ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); - - ПройтиКонвейер(); - - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - Результат = Истина; - - ФункцияСравнения.ДополнительныеПараметры.Вставить("Элемент"); - - Для Каждого Элемент Из Коллекция Цикл - ФункцияСравнения.ДополнительныеПараметры.Элемент = Элемент; - РезультатФильтрации = Ложь; - ОписанияОповещений.ВыполнитьОбработкуОповещения(ФункцияСравнения, РезультатФильтрации); - - Если РезультатФильтрации Тогда - Результат = Ложь; - Прервать; - КонецЕсли; - КонецЦикла; + Фильтр = Новый ШагКонвейераЛюбойСоответствует(ФункцияСравнения, ДополнительныеПараметры, Отладка); + Фильтр.Инвертировать(Истина); - ОчиститьВременныеОписанияОповещений(); - - Возврат Результат; + ДобавитьШагВКонвейер(Фильтр); + ДобавитьШагВКонвейер(Новый ШагКонвейераБарьерВернутьЗначение(Истина)); + + Возврат ПройтиКонвейер(); КонецФункции // Служебные процедуры и функции -Процедура ПоложитьЯчейкуВКонвейер(ИмяОперации, - ВходящееОписаниеОповещения = Неопределено, - ДополнительныеПараметры = Неопределено) - - Сообщение = ИмяОперации; - Если ВходящееОписаниеОповещения <> Неопределено Тогда - Сообщение = Сообщение + " " + ВходящееОписаниеОповещения.ИмяПроцедуры; - КонецЕсли; - Лог.Отладка(Сообщение); +Процедура ДобавитьШагВКонвейер(ШагКонвейера) - Если ДополнительныеПараметры = Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - КонецЕсли; + Если ШагКонвейера.Барьерный() Тогда + + Если Не Конвейер.Получить(НомерПроходаКонвейера) = Неопределено Тогда + НомерПроходаКонвейера = НомерПроходаКонвейера + 1; + КонецЕсли; - Если ВходящееОписаниеОповещения <> Неопределено Тогда - ДополнительныеПараметры.Вставить("Обработчик", ВходящееОписаниеОповещения); + Конвейер.Вставить(НомерПроходаКонвейера, ШагКонвейера); + + Иначе + + Если Не ТипЗнч(Конвейер.Получить(НомерПроходаКонвейера)) = Тип("Массив") + И Не Конвейер.Получить(НомерПроходаКонвейера) = Неопределено Тогда + НомерПроходаКонвейера = НомерПроходаКонвейера + 1; + КонецЕсли; + + Если Конвейер.Получить(НомерПроходаКонвейера) = Неопределено Тогда + Конвейер.Вставить(НомерПроходаКонвейера, Новый Массив); + КонецЕсли; + + Конвейер.Получить(НомерПроходаКонвейера).Добавить(ШагКонвейера); + КонецЕсли; - Ячейка = Новый ОписаниеОповещения("Выполнить" + ИмяОперации, ПроцессорКоллекцийСлужебный, ДополнительныеПараметры); - - Конвейер.Добавить(Ячейка); - КонецПроцедуры -Процедура ПройтиКонвейер() +Функция ПройтиКонвейер() - Лог.Отладка("Прохожу по конвейеру"); + Для Проход = 1 По НомерПроходаКонвейера Цикл - Результат = Новый Массив; - Для Каждого Ячейка Из Конвейер Цикл - Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); - - Лог.Отладка("Выполняю ячейку конвейера %1", Ячейка.ИмяПроцедуры); - Лог.Отладка("Размер коллекции %1", Коллекция.Количество()); + ШагПроходаКонвейера = Конвейер.Получить(Проход); - ОписанияОповещений.ВыполнитьОбработкуОповещения(Ячейка, Результат); - ПроцессорКоллекцийСлужебный.УстановитьКоллекцию(Результат, Ложь); - КонецЦикла; + Если ТипЗнч(ШагПроходаКонвейера) <> Тип("Массив") Тогда // Барьер + + Результат = ШагПроходаКонвейера.Принять(Коллекция); - Конвейер.Очистить(); - ОчиститьВременныеОписанияОповещений(); + Если Результат.Действие = ДействияКонвейера.ЗаменитьКоллекцию Тогда + Коллекция = Результат.Коллекция; + ИначеЕсли Результат.Действие = ДействияКонвейера.ВернутьЗначение Тогда + ОчиститьКонвейер(); + Возврат Результат.Значение; + КонецЕсли; -КонецПроцедуры + Иначе -Функция СформироватьВременноеОписаниеОповещения(ПользовательскоеВыражение, ДополнительныеПараметры) + НоваяКоллекция = Новый Массив; - Если ДополнительныеПараметры = Неопределено Тогда - ДополнительныеПараметры = Новый Структура; - КонецЕсли; + Для каждого ЭлементКоллекции Из Коллекция Цикл + + Для каждого ШагКонвейера Из ШагПроходаКонвейера Цикл + + Результат = ШагКонвейера.Принять(ЭлементКоллекции); - ТекстИзолированногоКласса = СтрЗаменить( - ТекстШаблонаИзолированногоКласса, - "А = 0;", - ПользовательскоеВыражение - ); + Если Результат.Действие = ДействияКонвейера.ПропуститьЭлемент + Или Результат.Действие = ДействияКонвейера.ПрекратитьОбход Тогда + Прервать; + ИначеЕсли Результат.Действие = ДействияКонвейера.ЗаменитьЭлемент Тогда + ЭлементКоллекции = Результат.Элемент; + ИначеЕсли Результат.Действие = ДействияКонвейера.ВернутьЗначение Тогда + ОчиститьКонвейер(); + Возврат Результат.Значение; + КонецЕсли - Если Отладка = Истина Тогда - ИмяВременногоФайла = ВременныеФайлы.НовоеИмяФайла("os"); - ЗаписьТекста = Новый ЗаписьТекста(); - ЗаписьТекста.Открыть(ИмяВременногоФайла); - ЗаписьТекста.Записать(ТекстИзолированногоКласса); - ЗаписьТекста.Закрыть(); - ВременныйСценарий = ЗагрузитьСценарий(ИмяВременногоФайла); - Иначе - ВременныйСценарий = ЗагрузитьСценарийИзСтроки(ТекстИзолированногоКласса); - КонецЕсли; + КонецЦикла; - ОписаниеОповещения = Новый ОписаниеОповещения( - "ОбработкаОповещения", - ВременныйСценарий, - ДополнительныеПараметры - ); - - ВременныеОписанияОповещений.Добавить(ВременныйСценарий); - ВременныеОписанияОповещений.Добавить(ОписаниеОповещения); + Если Результат.Действие = ДействияКонвейера.ПропуститьЭлемент Тогда + Продолжить; + ИначеЕсли Результат.Действие = ДействияКонвейера.ПрекратитьОбход Тогда + Прервать; + КонецЕсли; - Возврат ОписаниеОповещения; + НоваяКоллекция.Добавить(ЭлементКоллекции); -КонецФункции + КонецЦикла; + + Коллекция = НоваяКоллекция; + + КонецЕсли; -Процедура ОчиститьВременныеОписанияОповещений() - Для Каждого ВременныйСценарий Из ВременныеОписанияОповещений Цикл - ОсвободитьОбъект(ВременныйСценарий); КонецЦикла; - ВременныеОписанияОповещений = Новый Массив; -КонецПроцедуры -Процедура Инициализация() - Конвейер = Новый Массив; - ВременныеОписанияОповещений = Новый Массив; - Лог = Логирование.ПолучитьЛог("oscript.lib.stream"); + ОчиститьКонвейер(); - ПроцессорКоллекцийСлужебный = Новый ПроцессорКоллекцийСлужебный(); - - ТекстШаблонаИзолированногоКласса = - "Процедура ОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт - | - | Элемент = Неопределено; - | Элемент1 = Неопределено; - | Элемент2 = Неопределено; - | - | ДополнительныеПараметры.Свойство(""Элемент"", Элемент); - | ДополнительныеПараметры.Свойство(""Элемент1"", Элемент1); - | ДополнительныеПараметры.Свойство(""Элемент2"", Элемент2); - | - | А = 0; - | - |КонецПроцедуры"; - -КонецПроцедуры +КонецФункции -// Дополняет структуру значениями из другой структуры. -// -// Параметры: -// Приемник - Структура - коллекция, в которую будут добавляться новые значения. -// Источник - Структура - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. -// Заменять - Булево, Неопределено - что делать в местах пересечения ключей источника и приемника: -// - Истина - заменять значения приемника (самый быстрый способ), -// - Ложь - не заменять значения приемника (пропускать), -// - Неопределено - значение по умолчанию. Бросать исключение. -// -// Функция скопирована из "Библиотеки Стандартных Подсистем" на следующих условиях: -// -// Copyright (c) 2018, ООО 1С-Софт -// Все права защищены. Эта программа и сопроводительные материалы предоставляются -// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) -// Текст лицензии доступен по ссылке: -// https://creativecommons.org/licenses/by/4.0/legalcode -// -// В функцию внесены следующие изменения: -// - использование СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку заменено на СтрШаблон; -// - добавлена инициализиация структур приемника и источника -// -Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) Экспорт - - Если Приемник = Неопределено Тогда - Приемник = Новый Структура; - КонецЕсли; - - Если Источник = Неопределено Тогда - Источник = Новый Структура; - КонецЕсли; - - Для Каждого Элемент Из Источник Цикл - Если Заменять <> Истина И Приемник.Свойство(Элемент.Ключ) Тогда - Если Заменять = Ложь Тогда - Продолжить; - Иначе - ВызватьИсключение СтрШаблон(НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'"), Элемент.Ключ); - КонецЕсли; +Процедура ОчиститьКонвейер() + + Для Каждого КлючИЗначение Из Конвейер Цикл + Если ТипЗнч(КлючИЗначение.Значение) = Тип("Массив") Тогда + Для каждого ШагКонвейера Из КлючИЗначение.Значение Цикл + ШагКонвейера.Деструктор(); + КонецЦикла; + Иначе + КлючИЗначение.Значение.Деструктор(); КонецЕсли; - Приемник.Вставить(Элемент.Ключ, Элемент.Значение); КонецЦикла; - + + Конвейер = Новый Соответствие; + НомерПроходаКонвейера = 1; + КонецПроцедуры -Инициализация(); +Процедура ПриСозданииОбъекта() + + Отладка = ЗначениеЗаполнено(ПолучитьПеременнуюСреды("OSCRIPT_FLUENT_DEBUG")); + + Конвейер = Новый Соответствие; + + НомерПроходаКонвейера = 1; + + Лог = Логирование.ПолучитьЛог("oscript.lib.stream"); + +КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" index bc09530..2fac075 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" @@ -2,6 +2,12 @@ #Использовать "../internal" +Перем СравнениеЗначенийПрямойПорядок; // Делегат на функцию сравнения в прямом порядке +Перем СравнениеЗначенийОбратныйПорядок; // Делегат на функцию сравнения в обратном порядке +Перем РавенствоЗначений; // Делегат на функцию равенства + +Перем Лог; // Инстанс логера + // Создать ПроцессорКоллекций на основании переданной коллекции. // // Параметры: @@ -118,6 +124,7 @@ КонецФункции +// Устарела. Следует использовать см. ПроцессорыКоллекций.СтандартнаяФункцияСравненияПрямойПорядок // Стандартная функция сравнения. // Сравнивает значения элементов коллекции через операторы ">", "<" и "=". // @@ -125,6 +132,12 @@ // ОписаниеОповещения - Инстанс класса ОписаниеОповещения, указывающий на стандартную функцию сравнения. // Функция СтандартнаяФункцияСравнения() Экспорт + + Лог.Предупреждение(" + |Метод ПроцессорыКоллекций.СтандартнаяФункцияСравнения объявлен устаревшим и будет удалён в последующих релизах + |Следует использовать новые методы: СтандартнаяФункцияСравненияПрямойПорядок, СтандартнаяФункцияСравненияОбратныйПорядок" + ); + ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("Элемент1"); ДополнительныеПараметры.Вставить("Элемент2"); @@ -133,6 +146,55 @@ Возврат ФункцияСравнения; КонецФункции +// Стандартная функция сравнения. +// Сравнивает значения элементов коллекции через операторы ">", "<" и "=". +// +// Возвращаемое значение: +// Действие - Делегат на стандартный метод сравнения +// +Функция СтандартнаяФункцияСравненияПрямойПорядок() Экспорт + + Если СравнениеЗначенийПрямойПорядок = Неопределено Тогда + СравнениеЗначенийПрямойПорядок = Новый Действие(ПроцессорыКоллекцийСлужебный, "СравнениеЗначенийПрямойПорядок"); + КонецЕсли; + + Возврат СравнениеЗначенийПрямойПорядок; + +КонецФункции + +// Стандартная функция сравнения в обратном порядке +// Сравнивает значения элементов коллекции через операторы ">", "<" и "=". +// +// Возвращаемое значение: +// Действие - Делегат на стандартный метод сравнения в обратном порядке +// +Функция СтандартнаяФункцияСравненияОбратныйПорядок() Экспорт + + Если СравнениеЗначенийОбратныйПорядок = Неопределено Тогда + СравнениеЗначенийОбратныйПорядок = Новый Действие(ПроцессорыКоллекцийСлужебный, "СравнениеЗначенийОбратныйПорядок"); + КонецЕсли; + + Возврат СравнениеЗначенийОбратныйПорядок; + +КонецФункции + +// Стандартная функция проверки на равенство +// Сравнивает значения элементов коллекции через "=". +// +// Возвращаемое значение: +// Действие - Делегат на стандартный метод проверки на равенство +// +Функция СтандартнаяФункцияРавенства() Экспорт + + Если РавенствоЗначений = Неопределено Тогда + РавенствоЗначений = Новый Действие(ПроцессорыКоллекцийСлужебный, "РавенствоЗначений"); + КонецЕсли; + + Возврат РавенствоЗначений; + +КонецФункции + +// Устарела. Используйте выражение "Элемент -> Сообщить(Элемент)" // Стандартная функция обработки - "Сообщить". // Выполняет процедуру "Сообщить()" над каждым элементом коллекции. // @@ -140,8 +202,15 @@ // ОписаниеОповещения - Инстанс класса ОписаниеОповещения, указывающий на стандартную функцию обработки. // Функция СтандартнаяФункцияОбработки_Сообщить() Экспорт + + Лог.Предупреждение(" + |Метод ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить объявлен устаревшим и будет удалён в последующих релизах + |Используйте выражение: ""Элемент -> Сообщить(Элемент)""" + ); + ФункцияОбработки = Новый ОписаниеОповещения("ФункцияОбработки_Сообщить", ПроцессорыКоллекцийСлужебный); Возврат ФункцияОбработки; + КонецФункции Процедура ДобавитьНеПустоеЗначениеВКоллекцию(Коллекция, Значение) @@ -149,3 +218,5 @@ Коллекция.Добавить(Значение); КонецЕсли; КонецПроцедуры + +Лог = Логирование.ПолучитьЛог("oscript.lib.stream"); diff --git a/tasks/coverage.os b/tasks/coverage.os index 9e18686..907b935 100644 --- a/tasks/coverage.os +++ b/tasks/coverage.os @@ -1,73 +1,34 @@ +#Использовать coverage #Использовать 1commands -#Использовать asserts #Использовать fs -#Использовать json СистемнаяИнформация = Новый СистемнаяИнформация; ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; -ФС.ОбеспечитьПустойКаталог("coverage"); -ПутьКСтат = "coverage/stat.json"; +ФС.ОбеспечитьПустойКаталог(ОбъединитьПути("build", "coverage")); +ПутьКСтат = "build/coverage/stat.json"; Команда = Новый Команда; Команда.УстановитьКоманду("oscript"); Если НЕ ЭтоWindows Тогда Команда.ДобавитьПараметр("-encoding=utf-8"); КонецЕсли; -Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); +Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); Команда.ДобавитьПараметр("tasks/test.os"); -Команда.ПоказыватьВыводНемедленно(Истина); +Команда.ПоказыватьВыводНемедленно(Истина); КодВозврата = Команда.Исполнить(); -Сообщить(Команда.ПолучитьВывод()); -Ожидаем.Что(КодВозврата).Равно(0); -Файл_Стат = Новый Файл(ПутьКСтат); -Ожидаем.Что(Файл_Стат.Существует(), СтрШаблон("Файл <%1> с результатами покрытия не существует!", Файл_Стат.ПолноеИмя)).ЭтоИстина(); +ФайлСтатистики = Новый Файл(ПутьКСтат); -ЧтениеТекста = Новый ЧтениеТекста(ПутьКСтат, КодировкаТекста.UTF8); +ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); -СтрокаJSON = ЧтениеТекста.Прочитать(); -ЧтениеТекста.Закрыть(); +ПроцессорГенерации.ОтносительныеПути() + .РабочийКаталог("build/coverage") + .КаталогИсходников(ТекущийКаталог()) + .ФайлСтатистики(ФайлСтатистики.ПолноеИмя) + .GenericCoverage() + .Cobertura() + .Сформировать(); -Парсер = Новый ПарсерJSON(); -ДанныеПокрытия = Парсер.ПрочитатьJSON(СтрокаJSON); - -ЗаписьXML = Новый ЗаписьXML; -ЗаписьXML.ОткрытьФайл("coverage/genericCoverage.xml"); -ЗаписьXML.ЗаписатьОбъявлениеXML(); -ЗаписьXML.ЗаписатьНачалоЭлемента("coverage"); -ЗаписьXML.ЗаписатьАтрибут("version", "1"); - -Для Каждого Файл Из ДанныеПокрытия Цикл - - ДанныеФайла = Файл.Значение; - - ЗаписьXML.ЗаписатьНачалоЭлемента("file"); - ЗаписьXML.ЗаписатьАтрибут("path", ДанныеФайла.Получить("#path")); - - Для Каждого КлючИЗначение Из ДанныеФайла Цикл - - Если КлючИЗначение.Ключ = "#path" Тогда - Продолжить; - КонецЕсли; - - ДанныеПроцедуры = КлючИЗначение.Значение; - Для Каждого ДанныеСтроки Из ДанныеПроцедуры Цикл - - ЗаписьXML.ЗаписатьНачалоЭлемента("lineToCover"); - - ЗаписьXML.ЗаписатьАтрибут("lineNumber", ДанныеСтроки.Ключ); - Покрыто = Число(ДанныеСтроки.Значение.Получить("count")) > 0; - ЗаписьXML.ЗаписатьАтрибут("covered", Формат(Покрыто, "БИ=true; БЛ=false")); - - ЗаписьXML.ЗаписатьКонецЭлемента(); // lineToCover - КонецЦикла; - КонецЦикла; - - ЗаписьXML.ЗаписатьКонецЭлемента(); // file - -КонецЦикла; - -ЗаписьXML.ЗаписатьКонецЭлемента(); // coverage -ЗаписьXML.Закрыть(); +ЗавершитьРаботу(КодВозврата); diff --git a/tasks/test.os b/tasks/test.os index d579d3a..43bba03 100644 --- a/tasks/test.os +++ b/tasks/test.os @@ -1,8 +1,45 @@ #Использовать 1testrunner +#Использовать fs -Тестер = Новый Тестер; +Функция ПрогнатьТесты() -ПутьКаталогТестов = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests"); -КаталогТестов = Новый Файл(ПутьКаталогТестов); + Тестер = Новый Тестер; + Тестер.УстановитьФорматЛогФайла(Тестер.ФорматыЛогФайла().GenericExec); + Тестер.ПодробныеОписанияОшибок(Истина); -Тестер.ТестироватьКаталог(КаталогТестов); + ПутьКТестам = "tests"; + ПутьКОтчетуJUnit = ОбъединитьПути("build", "testsResults"); + + ФС.ОбеспечитьПустойКаталог(ПутьКОтчетуJUnit); + + РезультатТестирования = Тестер.ТестироватьКаталог( + Новый Файл(ПутьКТестам), + Новый Файл(ПутьКОтчетуJUnit) + ); + + Успешно = РезультатТестирования = 0; + + Возврат Успешно; + +КонецФункции // ПрогнатьТесты() + +// основной код + +ТекКаталог = ТекущийКаталог(); + +Попытка + ТестыПрошли = ПрогнатьТесты(); +Исключение + ТестыПрошли = Ложь; + Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно + |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); +КонецПопытки; + +УстановитьТекущийКаталог(ТекКаталог); + +Если Не ТестыПрошли Тогда + ВызватьИсключение "Тестирование завершилось неудачно!"; +Иначе + Сообщить(СтрШаблон("Результат прогона тестов <%1> + |", ТестыПрошли)); +КонецЕсли; diff --git "a/tests/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" "b/tests/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" index 01c7c74..13899a8 100644 --- "a/tests/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" +++ "b/tests/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" @@ -1,34 +1,24 @@ #Использовать asserts #Использовать ".." -// основной метод для тестирования -Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт - - ВсеТесты = Новый Массив; - - ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекций"); - ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийЧерезПомощник"); - ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийИзСтрокиЧерезПомощник"); - ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийИзНабораЧерезПомощник"); - - - Возврат ВсеТесты; -КонецФункции - +&Тест Процедура ТестДолжен_ПроинициализироватьПроцессорКоллекций() Экспорт ПроцессорКоллекций = Новый ПроцессорКоллекций; КонецПроцедуры +&Тест Процедура ТестДолжен_ПроинициализироватьПроцессорКоллекцийЧерезПомощник() Экспорт ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(Новый Массив); Ожидаем.Что(ПроцессорКоллекций).ИмеетТип("ПроцессорКоллекций"); КонецПроцедуры +&Тест Процедура ТестДолжен_ПроинициализироватьПроцессорКоллекцийИзСтрокиЧерезПомощник() Экспорт ПроцессорКоллекций = ПроцессорыКоллекций.ИзСтроки(""); Ожидаем.Что(ПроцессорКоллекций).ИмеетТип("ПроцессорКоллекций"); КонецПроцедуры +&Тест Процедура ТестДолжен_ПроинициализироватьПроцессорКоллекцийИзНабораЧерезПомощник() Экспорт ПроцессорКоллекций = ПроцессорыКоллекций.ИзНабора(1, 2, 3); Ожидаем.Что(ПроцессорКоллекций).ИмеетТип("ПроцессорКоллекций"); diff --git "a/tests/\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\271\320\242\320\265\321\201\321\202.os" "b/tests/\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\271\320\242\320\265\321\201\321\202.os" index 39d2022..0564d00 100644 --- "a/tests/\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\271\320\242\320\265\321\201\321\202.os" +++ "b/tests/\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\271\320\242\320\265\321\201\321\202.os" @@ -6,24 +6,9 @@ Перем ФункцияСокращения; Перем ФункцияФильтрации; -// основной метод для тестирования -Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт - - ВсеТесты = Новый Массив; - - ВсеТесты.Добавить("ТестДолжен_1"); - ВсеТесты.Добавить("ТестДолжен_2"); - ВсеТесты.Добавить("ТестДолжен_3"); - ВсеТесты.Добавить("ТестДолжен_4"); - ВсеТесты.Добавить("ТестДолжен_5"); - ВсеТесты.Добавить("ТестДолжен_6"); - ВсеТесты.Добавить("ТестДолжен_7"); - ВсеТесты.Добавить("ТестДолжен_8"); - ВсеТесты.Добавить("ТестДолжен_9"); - - Возврат ВсеТесты; - -КонецФункции +Перем ДействиеОбработки; +Перем ДействиеСокращения; +Перем ДействиеФильтрации; Процедура ОбработчикФильтрации(Результат, ДополнительныеПараметры) Экспорт Элемент = ДополнительныеПараметры.Элемент; @@ -40,6 +25,18 @@ Результат = Результат + Элемент; КонецПроцедуры +Функция ДействиеФильтрации(Элемент) Экспорт + Возврат Элемент > 3; +КонецФункции + +Функция ДействиеОбработки(Элемент) Экспорт + Возврат Элемент + 1; +КонецФункции + +Функция ДействиеСокращения(Результат, Элемент) Экспорт + Возврат Результат + Элемент; +КонецФункции + Функция ПолучитьНачальныйМассив() Массив = Новый Массив; @@ -59,29 +56,42 @@ КонецФункции +&Тест Процедура ТестДолжен_1() Экспорт - ПроцессорКоллекций = Новый ПроцессорКоллекций; - ПроцессорКоллекций.УстановитьКоллекцию(ПолучитьНачальныйМассив()); + Результат = ПолучитьПроцессорКоллекций() + .Пропустить(2) + .Фильтровать(ФункцияФильтрации) + .Первые(2) + .Обработать(ФункцияОбработки) + .Получить(Тип("Массив")); - Результат = ПроцессорКоллекций - .Пропустить(2) - .Фильтровать(ФункцияФильтрации) - .Первые(2) - .Обработать(ФункцияОбработки) - .Получить(Тип("Массив")); + Ожидаем.Что(Результат[0]).Равно(8); + Ожидаем.Что(Результат[1]).Равно(6); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_1_1() Экспорт + + Результат = ПолучитьПроцессорКоллекций() + .Пропустить(2) + .Фильтровать(ДействиеФильтрации) + .Первые(2) + .Обработать(ДействиеОбработки) + .Получить(Тип("Массив")); Ожидаем.Что(Результат[0]).Равно(8); Ожидаем.Что(Результат[1]).Равно(6); КонецПроцедуры +&Тест Процедура ТестДолжен_2() Экспорт - ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(ПолучитьНачальныйМассив()); - Результат = ПроцессорКоллекций - .Сортировать() - .ВМассив(); + Результат = ПолучитьПроцессорКоллекций() + .Сортировать() + .ВМассив(); Ожидаем.Что(Результат[0]).Равно(0); Ожидаем.Что(Результат[1]).Равно(1); @@ -92,103 +102,175 @@ КонецПроцедуры +&Тест Процедура ТестДолжен_3() Экспорт - ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(ПолучитьНачальныйМассив()); - Результат = ПроцессорКоллекций - .Обработать(ФункцияОбработки) - .Сократить(ФункцияСокращения, 0); + Результат = ПолучитьПроцессорКоллекций() + .Обработать(ФункцияОбработки) + .Сократить(ФункцияСокращения, 0); + + Ожидаем.Что(Результат).Равно(26); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_3_1() Экспорт + + Результат = ПолучитьПроцессорКоллекций() + .Обработать(ДействиеОбработки) + .Сократить(ДействиеСокращения, 0); Ожидаем.Что(Результат).Равно(26); КонецПроцедуры +&Тест Процедура ТестДолжен_4() Экспорт // Результат должен различаться - Результат = ПроцессорыКоллекций - .ИзКоллекции(ПолучитьНачальныйМассив()) - .Сортировать() - .Первые(1) - .Получить("Массив"); + Результат = ПолучитьПроцессорКоллекций() + .Сортировать() + .Первые(1) + .Получить("Массив"); Ожидаем.Что(Результат[0]).Равно(0); Ожидаем.Что(ПолучитьНачальныйМассив()[0]).Равно(3); КонецПроцедуры +&Тест Процедура ТестДолжен_5() Экспорт + Строка = "ФЫВА"; - Результат = ПроцессорыКоллекций - .ИзСтроки(Строка) - .Сортировать() - .ВСтроку(); + Результат = ПроцессорыКоллекций.ИзСтроки(Строка) + .Сортировать() + .ВСтроку(); Ожидаем.Что(Результат).Равно("АВФЫ"); КонецПроцедуры +&Тест Процедура ТестДолжен_6() Экспорт Строка = "Я строка с пробелами"; - Результат = ПроцессорыКоллекций - .ИзСтроки(Строка, " ") - .ВСтроку(); + Результат = ПроцессорыКоллекций.ИзСтроки(Строка, " ") + .ВСтроку(); Ожидаем.Что(Результат).Равно("Ястрокаспробелами"); КонецПроцедуры +&Тест Процедура ТестДолжен_7() Экспорт - Строка = "Я - |строка - |многострочная"; + Строка = + "Я + |строка + |многострочная"; - Результат = ПроцессорыКоллекций - .ИзСтроки(Строка, Символы.ПС) + Результат = ПроцессорыКоллекций.ИзСтроки(Строка, Символы.ПС) .Сортировать() .ВСтроку(Символы.ПС); - Ожидаем.Что(Результат).Равно("Я - |многострочная - |строка"); + Ожидаем.Что(Результат).Равно( + "многострочная + |строка + |Я" + ); КонецПроцедуры +&Тест Процедура ТестДолжен_8() Экспорт - Строка = "Я - |строка - |многострочная"; + Строка = + "Я + |строка + |многострочная"; - Результат = ПроцессорыКоллекций - .ИзСтроки(Строка, Символы.ПС) - .Фильтровать("Результат = СтрДлина(Элемент) > 1") - .ВСтроку(Символы.ПС); + Результат = ПроцессорыКоллекций.ИзСтроки(Строка, Символы.ПС) + .Фильтровать("Результат = СтрДлина(Элемент) > 1") + .ВСтроку(Символы.ПС); - Ожидаем.Что(Результат).Равно("строка - |многострочная"); + Ожидаем.Что(Результат).Равно( + "строка + |многострочная" + ); КонецПроцедуры +&Тест +Процедура ТестДолжен_8_1() Экспорт + + Строка = + "Я + |строка + |многострочная"; + + Результат = ПроцессорыКоллекций.ИзСтроки(Строка, Символы.ПС) + .Фильтровать("Элемент -> СтрДлина(Элемент) > 1") + .ВСтроку(Символы.ПС); + + Ожидаем.Что(Результат).Равно( + "строка + |многострочная" + ); + +КонецПроцедуры + +&Тест Процедура ТестДолжен_9() Экспорт - Строка = "Я - |строка - |многострочная"; + Строка = + "Я + |строка + |многострочная"; - Результат = ПроцессорыКоллекций - .ИзСтроки(Строка, Символы.ПС) + Результат = ПроцессорыКоллекций.ИзСтроки(Строка, Символы.ПС) .Сортировать("Результат = ВРЕГ(Элемент1) > ВРЕГ(Элемент2)") .ВСтроку(Символы.ПС); - Ожидаем.Что(Результат).Равно("многострочная - |строка - |Я"); + Ожидаем.Что(Результат).Равно( + "многострочная + |строка + |Я" + ); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_9_1() Экспорт + + Строка = + "Я + |строка + |многострочная"; + + Результат = ПроцессорыКоллекций.ИзСтроки(Строка, Символы.ПС) + .Сортировать("Первый, Второй -> + | Если ВРЕГ(Первый) > ВРЕГ(Второй) Тогда + | Возврат 1; + | ИначеЕсли ВРЕГ(Второй) > ВРЕГ(Первый) Тогда + | Возврат -1; + | Иначе + | Возврат 0; + | КонецЕсли;" + ) + .ВСтроку(Символы.ПС); + + Ожидаем.Что(Результат).Равно( + "многострочная + |строка + |Я" + ); КонецПроцедуры ФункцияФильтрации = Новый ОписаниеОповещения("ОбработчикФильтрации", ЭтотОбъект); ФункцияОбработки = Новый ОписаниеОповещения("ОбработчикОбработки", ЭтотОбъект); ФункцияСокращения = Новый ОписаниеОповещения("ОбработчикСокращения", ЭтотОбъект); + +ДействиеФильтрации = Новый Действие(ЭтотОбъект, "ДействиеФильтрации"); +ДействиеСокращения = Новый Действие(ЭтотОбъект, "ДействиеСокращения"); +ДействиеОбработки = Новый Действие(ЭтотОбъект, "ДействиеОбработки"); diff --git "a/tests/\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" "b/tests/\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" index b303d46..ec6849b 100644 --- "a/tests/\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" +++ "b/tests/\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" @@ -24,33 +24,14 @@ Возврат ПроцессорыКоллекций.ИзКоллекции(Массив); КонецФункции -// основной метод для тестирования -Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт - - ВсеТесты = Новый Массив; - - ВсеТесты.Добавить("ТестДолжен_ПолучитьИзПроцессораКоллекцийМассив"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьПервыеНесколькоЭлементов"); - ВсеТесты.Добавить("ТестДолжен_ПропуститьНесколькоЭлементов"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьРазличныеЭлементы"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьУвеличитьВсеЭлементыНаЕдиницуЧерезОбработку"); - ВсеТесты.Добавить("ТестДолжен_СобратьДваПроцессораВОдин"); - ВсеТесты.Добавить("ТестДолжен_ОтфильтроватьЭлементыМеньшеДвух"); - ВсеТесты.Добавить("ТестДолжен_ОтсортироватьЭлементы"); - ВсеТесты.Добавить("ТестДолжен_ОтсортироватьТаблицуПоКолонке"); - - // ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийЧерезПомощник"); - - Возврат ВсеТесты; - -КонецФункции - +&Тест Процедура ТестДолжен_ПолучитьИзПроцессораКоллекцийМассив() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.ВМассив(); Ожидаем.Что(Результат).ИмеетТип("Массив").ИмеетДлину(ПолучитьДлинуИсходногоМассива()); КонецПроцедуры +&Тест Процедура ТестДолжен_ПолучитьПервыеНесколькоЭлементов() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Первые(2).ВМассив(); @@ -59,6 +40,7 @@ Ожидаем.Что(Результат[1]).Равно(1); КонецПроцедуры +&Тест Процедура ТестДолжен_ПропуститьНесколькоЭлементов() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Пропустить(3).ВМассив(); @@ -66,6 +48,7 @@ Ожидаем.Что(Результат[0]).Равно(1); КонецПроцедуры +&Тест Процедура ТестДолжен_ПолучитьРазличныеЭлементы() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Различные().ВМассив(); @@ -78,6 +61,7 @@ Ожидаем.Что(Результат[4]).Равно(3); КонецПроцедуры +&Тест Процедура ТестДолжен_ПолучитьУвеличитьВсеЭлементыНаЕдиницуЧерезОбработку() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Обработать("Результат = Элемент + 1").ВМассив(); @@ -87,6 +71,17 @@ КонецЦикла; КонецПроцедуры +&Тест +Процедура ТестДолжен_ПолучитьУвеличитьВсеЭлементыНаЕдиницуЧерезОбработку_Лямбда() Экспорт + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + Результат = ПроцессорКоллекций.Обработать("Элемент -> Элемент + 1").ВМассив(); + ИсходныйМассив = ПолучитьИсходныйМассив(); + Для сч = 0 По ИсходныйМассив.ВГраница() Цикл + Ожидаем.Что(Результат[сч]).Равно(ИсходныйМассив[сч] + 1); + КонецЦикла; +КонецПроцедуры + +&Тест Процедура ТестДолжен_СобратьДваПроцессораВОдин() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); @@ -102,6 +97,23 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_СобратьДваПроцессораВОдин_Лямбда() Экспорт + + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + Результат = ПроцессорКоллекций.Развернуть("Элемент -> + | Массив = Новый Массив; + | Массив.Добавить(Элемент); + | Массив.Добавить(Элемент + 1); + | Возврат ПроцессорыКоллекций.ИзКоллекции(Массив);" + ).Фильтровать("Элемент -> Элемент = 2") + .Количество(); + + Ожидаем.Что(Результат, "Процессоры коллекций должны сложиться и отфильтроваться").Равно(3); + +КонецПроцедуры + +&Тест Процедура ТестДолжен_ОтфильтроватьЭлементыМеньшеДвух() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Фильтровать("Результат = Элемент < 2").ВМассив(); @@ -110,6 +122,16 @@ КонецЦикла; КонецПроцедуры +&Тест +Процедура ТестДолжен_ОтфильтроватьЭлементыМеньшеДвух_Лямбда() Экспорт + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + Результат = ПроцессорКоллекций.Фильтровать("Элемент -> Элемент < 2").ВМассив(); + Для Каждого Элемент Из Результат Цикл + Ожидаем.Что(Элемент).Меньше(2); + КонецЦикла; +КонецПроцедуры + +&Тест Процедура ТестДолжен_ОтсортироватьЭлементы() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Сортировать().ВМассив(); @@ -120,6 +142,7 @@ КонецЦикла; КонецПроцедуры +&Тест Процедура ТестДолжен_ОтсортироватьТаблицуПоКолонке() Экспорт Таблица = Новый ТаблицаЗначений(); Таблица.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число")); diff --git "a/tests/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\321\202\321\200\320\276\320\272\320\270.os" "b/tests/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\321\202\321\200\320\276\320\272\320\270.os" index b0553e2..27e8af6 100644 --- "a/tests/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\321\202\321\200\320\276\320\272\320\270.os" +++ "b/tests/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\321\202\321\200\320\276\320\272\320\270.os" @@ -1,40 +1,28 @@ #Использовать asserts #Использовать ".." -// основной метод для тестирования -Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт - - ВсеТесты = Новый Массив; - - ВсеТесты.Добавить("ТестДолжен_ПолучитьПроцессорКоллекцииИзЗаполненнойСтроки"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьПроцессорКоллекцииИзЗаполненнойСтрокиСРазделителем"); - ВсеТесты.Добавить("ТестДолжен_ДолженВернутьСтрокуИзСтроки"); - ВсеТесты.Добавить("ТестДолжен_ДолженВернутьСтрокуСРазделителемИзСтроки"); - - // ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийЧерезПомощник"); - - Возврат ВсеТесты; - -КонецФункции - +&Тест Процедура ТестДолжен_ПолучитьПроцессорКоллекцииИзЗаполненнойСтроки() Экспорт ПроцессорКоллекций = ПроцессорыКоллекций.ИзСтроки("123"); Результат = ПроцессорКоллекций.ВМассив(); Ожидаем.Что(Результат).ИмеетДлину(3); КонецПроцедуры +&Тест Процедура ТестДолжен_ПолучитьПроцессорКоллекцииИзЗаполненнойСтрокиСРазделителем() Экспорт ПроцессорКоллекций = ПроцессорыКоллекций.ИзСтроки("1 2 3", " "); Результат = ПроцессорКоллекций.ВМассив(); Ожидаем.Что(Результат).ИмеетДлину(3); КонецПроцедуры +&Тест Процедура ТестДолжен_ДолженВернутьСтрокуИзСтроки() Экспорт ПроцессорКоллекций = ПроцессорыКоллекций.ИзСтроки("1 2 3", " "); Результат = ПроцессорКоллекций.ВСтроку(); Ожидаем.Что(Результат).ИмеетДлину(3); КонецПроцедуры +&Тест Процедура ТестДолжен_ДолженВернутьСтрокуСРазделителемИзСтроки() Экспорт ПроцессорКоллекций = ПроцессорыКоллекций.ИзСтроки("1 2 3", " "); Результат = ПроцессорКоллекций.ВСтроку(" "); diff --git "a/tests/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\236\320\277\320\276\320\262\320\265\321\211\320\265\320\275\320\270\321\217\320\274\320\270.os" "b/tests/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\236\320\277\320\276\320\262\320\265\321\211\320\265\320\275\320\270\321\217\320\274\320\270.os" deleted file mode 100644 index e69de29..0000000 diff --git "a/tests/\320\242\320\265\321\200\320\274\320\270\320\275\320\260\320\273\321\214\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" "b/tests/\320\242\320\265\321\200\320\274\320\270\320\275\320\260\320\273\321\214\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" index 8f0793d..5b24e88 100644 --- "a/tests/\320\242\320\265\321\200\320\274\320\270\320\275\320\260\320\273\321\214\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" +++ "b/tests/\320\242\320\265\321\200\320\274\320\270\320\275\320\260\320\273\321\214\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" @@ -2,6 +2,7 @@ #Использовать notify #Использовать ".." +Перем ВнешнийМассив; Функция ПолучитьНачальныйМассив() Массив = Новый Массив; @@ -25,60 +26,35 @@ Результат = ДополнительныеПараметры.ПроверяемыйПараметр; КонецПроцедуры -// основной метод для тестирования -Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт - - ВсеТесты = Новый Массив; - - ВсеТесты.Добавить("ТестДолжен_ПолучитьПервый"); - ВсеТесты.Добавить("ТестДолжен_ВернутьМассив"); - ВсеТесты.Добавить("ТестДолжен_ВернутьСтроку"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьКоличество"); - ВсеТесты.Добавить("ТестДолжен_ВыполнитьДляКаждого"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьМинимальныйЭлемент"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьМаксимальныйЭлемент"); - ВсеТесты.Добавить("ТестДолжен_ВыполнитьСокращение"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьМассив"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьТаблицуЗначений"); - ВсеТесты.Добавить("ТестДолжен_ПолучитьСписокЗначений"); - // ВсеТесты.Добавить("ТестДолжен_ПолучитьСтруктуру"); - // ВсеТесты.Добавить("ТестДолжен_ПолучитьСоответствие"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьЛюбойСоответствует"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьВсеСоответствуют"); - ВсеТесты.Добавить("ТестДолжен_ПроверитьВсеНеСоответствуют"); - - ВсеТесты.Добавить("ТестДолжен_ПроверитьПробросДополнительныхПараметровВОповещениеДляКаждого"); - - // ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийЧерезПомощник"); - - Возврат ВсеТесты; - -КонецФункции - +&Тест Процедура ТестДолжен_ПолучитьПервый() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.ПолучитьПервый(); Ожидаем.Что(Результат).ИмеетТип("Число").Равно(1); КонецПроцедуры +&Тест Процедура ТестДолжен_ВернутьМассив() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.ВМассив(); Ожидаем.Что(Результат).ИмеетТип("Массив").ИмеетДлину(6); КонецПроцедуры +&Тест Процедура ТестДолжен_ВернутьСтроку() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.ВСтроку(); Ожидаем.Что(Результат).ИмеетТип("Строка").ИмеетДлину(6); КонецПроцедуры +&Тест Процедура ТестДолжен_ПолучитьКоличество() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Количество(); Ожидаем.Что(Результат).Равно(6); КонецПроцедуры +&Тест Процедура ТестДолжен_ВыполнитьДляКаждого() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); НачальныйМассив = ПолучитьНачальныйМассив(); @@ -92,18 +68,49 @@ КонецЦикла; КонецПроцедуры +&Тест +Процедура ТестДолжен_ВыполнитьДляКаждого_Лямбда() Экспорт + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + НачальныйМассив = ПолучитьНачальныйМассив(); + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ВнешнийМассив", Новый Массив); + ПроцессорКоллекций.ДляКаждого("Элемент -> ВнешнийМассив.Добавить(Элемент + 1)", ДополнительныеПараметры); + Ожидаем.Что(ДополнительныеПараметры.ВнешнийМассив).ИмеетДлину(НачальныйМассив.Количество()); + Для сч = 0 По ДополнительныеПараметры.ВнешнийМассив.ВГраница() Цикл + Ожидаем.Что(ДополнительныеПараметры.ВнешнийМассив[сч]).Равно(НачальныйМассив[сч] + 1); + КонецЦикла; +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыполнитьДляКаждого_Захват() Экспорт + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + НачальныйМассив = ПолучитьНачальныйМассив(); + + ВнешнийМассив = Новый Массив; + + ПроцессорКоллекций.ДляКаждого("Элемент -> ВнешнийМассив.Добавить(Элемент + 1)", ЭтотОбъект); + Ожидаем.Что(ВнешнийМассив).ИмеетДлину(НачальныйМассив.Количество()); + Для сч = 0 По ВнешнийМассив.ВГраница() Цикл + Ожидаем.Что(ВнешнийМассив[сч]).Равно(НачальныйМассив[сч] + 1); + КонецЦикла; +КонецПроцедуры + +&Тест Процедура ТестДолжен_ПолучитьМинимальныйЭлемент() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Минимум(); Ожидаем.Что(Результат).Равно(0); КонецПроцедуры +&Тест Процедура ТестДолжен_ПолучитьМаксимальныйЭлемент() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Максимум(); Ожидаем.Что(Результат).Равно(3); КонецПроцедуры +&Тест Процедура ТестДолжен_ВыполнитьСокращение() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); @@ -111,6 +118,15 @@ Ожидаем.Что(Результат).Равно(10); КонецПроцедуры +&Тест +Процедура ТестДолжен_ВыполнитьСокращение_Лямбда() Экспорт + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + + Результат = ПроцессорКоллекций.Сократить("Результат, Элемент -> Результат + Элемент", 0); + Ожидаем.Что(Результат).Равно(10); +КонецПроцедуры + +&Тест Процедура ТестДолжен_ПолучитьМассив() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); НачальныйМассив = ПолучитьНачальныйМассив(); @@ -124,6 +140,7 @@ КонецПроцедуры +&Тест Процедура ТестДолжен_ПолучитьТаблицуЗначений() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); НачальныйМассив = ПолучитьНачальныйМассив(); @@ -137,6 +154,7 @@ КонецПроцедуры +&Тест Процедура ТестДолжен_ПолучитьСписокЗначений() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); НачальныйМассив = ПолучитьНачальныйМассив(); @@ -176,6 +194,7 @@ КонецПроцедуры +&Тест Процедура ТестДолжен_ПроверитьЛюбойСоответствует() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); @@ -186,6 +205,18 @@ Ожидаем.Что(Результат).ЭтоЛожь(); КонецПроцедуры +&Тест +Процедура ТестДолжен_ПроверитьЛюбойСоответствует_Лямбда() Экспорт + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + + Результат = ПроцессорКоллекций.ЛюбойСоответствует("Элемент -> Элемент > 1"); + Ожидаем.Что(Результат).ЭтоИстина(); + + Результат = ПроцессорКоллекций.ЛюбойСоответствует("Элемент -> Элемент < 0"); + Ожидаем.Что(Результат).ЭтоЛожь(); +КонецПроцедуры + +&Тест Процедура ТестДолжен_ПроверитьВсеСоответствуют() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); @@ -196,6 +227,18 @@ Ожидаем.Что(Результат).ЭтоЛожь(); КонецПроцедуры +&Тест +Процедура ТестДолжен_ПроверитьВсеСоответствуют_Лямбда() Экспорт + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + + Результат = ПроцессорКоллекций.ВсеСоответствуют("Элемент -> Элемент >= 0"); + Ожидаем.Что(Результат).ЭтоИстина(); + + Результат = ПроцессорКоллекций.ВсеСоответствуют("Элемент -> Элемент < 2"); + Ожидаем.Что(Результат).ЭтоЛожь(); +КонецПроцедуры + +&Тест Процедура ТестДолжен_ПроверитьВсеНеСоответствуют() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); @@ -206,6 +249,18 @@ Ожидаем.Что(Результат).ЭтоЛожь(); КонецПроцедуры +&Тест +Процедура ТестДолжен_ПроверитьВсеНеСоответствуют_Лямбда() Экспорт + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + + Результат = ПроцессорКоллекций.ВсеНеСоответствуют("Элемент -> Элемент < 0"); + Ожидаем.Что(Результат).ЭтоИстина(); + + Результат = ПроцессорКоллекций.ВсеНеСоответствуют("Элемент -> Элемент > 2"); + Ожидаем.Что(Результат).ЭтоЛожь(); +КонецПроцедуры + +&Тест Процедура ТестДолжен_ПроверитьПробросДополнительныхПараметровВОповещениеДляКаждого() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); From 1bfd381ea53e97c2862affb8c0ad3b851554dd55 Mon Sep 17 00:00:00 2001 From: sfaqer Date: Mon, 10 Apr 2023 17:04:52 +1000 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D1=91=D0=BD=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B1=D1=8B=D1=82=D1=8B=D0=B9=20=D0=B8=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" | 1 - 1 file changed, 1 deletion(-) diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\224\320\273\321\217\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\224\320\273\321\217\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" index 22e4804..092d94c 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\224\320\273\321\217\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\224\320\273\321\217\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" @@ -1,5 +1,4 @@ #Использовать lambdas -#Использовать notify Перем Действие; From 245ee867aba6b41724d18517b4c96d59528e4044 Mon Sep 17 00:00:00 2001 From: sfaqer Date: Mon, 10 Apr 2023 17:25:08 +1000 Subject: [PATCH 3/3] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20notify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\321\202\321\201\321\202\320\262\321\203\320\265\321\202.os" | 1 - ...0\320\260\320\261\320\276\321\202\320\260\321\202\321\214.os" | 1 - ...7\320\262\320\265\321\200\320\275\321\203\321\202\321\214.os" | 1 - ...0\320\267\320\273\320\270\321\207\320\275\321\213\320\265.os" | 1 - ...2\320\270\321\200\320\276\320\262\320\260\321\202\321\214.os" | 1 - ...4\321\202\321\200\320\276\320\262\320\260\321\202\321\214.os" | 1 - ...3\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" | 1 + ...6\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" | 1 - 8 files changed, 1 insertion(+), 7 deletions(-) diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\233\321\216\320\261\320\276\320\271\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\320\265\321\202.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\233\321\216\320\261\320\276\320\271\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\320\265\321\202.os" index 04b0efe..1d618f4 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\233\321\216\320\261\320\276\320\271\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\320\265\321\202.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\233\321\216\320\261\320\276\320\271\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\320\265\321\202.os" @@ -1,5 +1,4 @@ #Использовать lambdas -#Использовать notify Перем Действие; Перем ВозвращаемоеЗначение; diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\260\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\260\321\202\321\214.os" index 2b0ee82..32cb826 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\260\321\202\321\214.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\260\321\202\321\214.os" @@ -1,5 +1,4 @@ #Использовать lambdas -#Использовать notify Перем Действие; diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\262\320\265\321\200\320\275\321\203\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\262\320\265\321\200\320\275\321\203\321\202\321\214.os" index 3a3d8f5..b4906f8 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\262\320\265\321\200\320\275\321\203\321\202\321\214.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\262\320\265\321\200\320\275\321\203\321\202\321\214.os" @@ -1,5 +1,4 @@ #Использовать lambdas -#Использовать notify #Использовать asserts Перем Действие; diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\273\320\270\321\207\320\275\321\213\320\265.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\273\320\270\321\207\320\275\321\213\320\265.os" index b62c4f4..c07effa 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\273\320\270\321\207\320\275\321\213\320\265.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\240\320\260\320\267\320\273\320\270\321\207\320\275\321\213\320\265.os" @@ -1,5 +1,4 @@ #Использовать lambdas -#Использовать notify Перем ДействиеРавенство; Перем ПринятыеЭлементы; diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214.os" index 0c4ca70..f919a0f 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214.os" @@ -1,5 +1,4 @@ #Использовать lambdas -#Использовать notify #Использовать asserts Перем Действие; diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\244\320\270\320\273\321\214\321\202\321\200\320\276\320\262\320\260\321\202\321\214.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\244\320\270\320\273\321\214\321\202\321\200\320\276\320\262\320\260\321\202\321\214.os" index 8fad3b5..49a0408 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\244\320\270\320\273\321\214\321\202\321\200\320\276\320\262\320\260\321\202\321\214.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\260\320\244\320\270\320\273\321\214\321\202\321\200\320\276\320\262\320\260\321\202\321\214.os" @@ -1,5 +1,4 @@ #Использовать lambdas -#Использовать notify Перем Действие; diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" index a888bac..685da51 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" @@ -1,4 +1,5 @@ #Использовать lambdas +#Использовать notify Перем Лог; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" index 81217f0..a487e80 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" @@ -1,4 +1,3 @@ -#Использовать notify #Использовать logos #Использовать strings #Использовать tempfiles