Лямбда-функции на встроенном языке 1С

28.06.21

Разработка - Универсальные функции

Анонимная функция средствами 1С. Пророчества грядущих функций первого класса и ООП. Другие смелые заявления.

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО

Наименование Скачано Бесплатно
Лямбда-функции на встроенном языке 1С:
.epf 11,23Kb ver:0.1
37 Скачать бесплатно

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

«Анонимные функции, функции как переменные, методы для структур и соответствий, классы/прототипы, наследование! Где это всё?!» — спросите вы меня. И я уверенно отвечу: «Здесь». В этой теме ключ ко всему. Решение небольшое, элегантное, исключительно на встроенном языке 1С и как прививка от коронавируса: молодое, обнадеживающее, многообещающее, но еще не протестированное на массах. Поэтому прошу пока воспринимать всё, как альфа-версию, или даже, как концепцию. Кстати, под словом "Функция" здесь и ниже понимаются и процедуры тоже. 


Имея опыт программирования на Python и JavaScript, страдаю, когда в 1С функция не может быть объектом первого класса. То есть, функцию нельзя поместить в переменную. Не результат выполнения функции, а саму функцию. Это лишает возможности передавать её, как параметр, в другие функции или программно создавать объекты c методами. Мы не можем ждать милости от 1С, и добавим нужные механизмы сами!

 

Материал будет разбит на несколько публикаций. Сегодня рассмотрим основу всей затеи — анонимную функцию.


Анонимные функции

Их еще называют лямбдами (λ). В отличие от привычных функций не имеют имен и определены непосредственно в месте вызова. В остальном точно такие же. Есть случаи, когда их удобнее использовать, чем именованные. Забегая вперед, покажу пару примеров.

//Каждое четное число в массиве умножить на 3
ForEach(Массив, "Если _1 % 2 = 0 Тогда Возврат _1 * 3; КонецЕсли;");

//Отобрать элементы, состоящие из заглавных букв:
НовыйМассив = Filter(Массив, "Возврат _1 = ВРЕГ(_1);");

ForEach и Filter — обычные функции. Как именно они написаны, покажу ниже. Сейчас важно отметить, что они обрабатывают массив с помощью анонимных функций (второй параметр). Это, во-первых, позволяет сократить код без потери читаемости, и, во-вторых, хранить и передавать тело анонимной функции куда нужно.

 

Пару дней назад я захотел в режиме предприятия написать произвольный код в поле ввода, нажать на кнопку, и чтобы этот код выполнился над списком отобранных объектов. Должен признаться, иногда я тайком использую команды Выполнить/Вычислить и в этот раз на них рассчитывал. Каково же было мое изумление, когда узнал, что эти конструкции не понимают таких важных вещей как: Возврат, Процедура, Функция! Тогда я создал функцию Lambda, которая умеет выполнять код с возвратами.

Lambda(Код, [Аргументы: _1, _2, … _n])

Суть такова. В эту функцию подается код в виде строки и аргументы по необходимости. К аргументам можно обращаться по номерам с подчеркиванием (например, _1). К сожалению, из-за особенности языка 1С максимальное количество аргументов определено заранее (в данных примерах — максимум 4). Все возвраты перед выполнением заменяются на конструкцию с использованием б-гомерзких (да будут они преданы забвению) операторов goto. Таким образом, результат возврата помещается в служебную переменную (ProgmaLambdaResult) и тут же осуществляется переход к концу функции Lambda, где происходит обычный возврат результата. В тексте переданного кода для повышения читаемости допускается заменять две двойные кавычки на символ ` (на клавиатуре, где Ё). Код считается "скомпилированным", если первый символ #.

//Пример использования:
// Lambda вызывается с тремя параметрами:
//   Код,
//   _1 = СписокОбъектов
//   _2 = "Слава Тьюрингу!"
// Результат (Истина или Ложь) вернется в переменную ЕстьПрославлениеТьюринга 
//
ЕстьПрославлениеТьюринга = Lambda("
    |СтрокаПоиска = ВРЕГ(_2);
    |Для каждого Значение из _1 Цикл
    |   Если Найти(ВРЕГ(Значение.Наименование), СтрокаПоиска) <> 0 Тогда
    |       Возврат Истина;
    |   КонецЕсли;
    |КонецЦикла;
    |Возврат Ложь;
    |", СписокОбъектов, "Слава Тьюрингу!"
);


Вот так это сейчас реализовано:

 

 

//Функция возвращает результат выполнения Кода. Нумерованные параметры можно использовать для передачи произвольных значений,
// необходимых для выполнени кода. Возвращает Null по умолчанию.
//
// !!! Команда "Возврат" всегда должна писаться с заглавной буквы и закрываться ";" (точкой с запятой)
// !!! В Коде не должно быть команд: Функция, Процедура и их концов. Только тело.
//
//Параметры:
//  Код - Строка - тело процедуры или функции
//  _1 - произвольное значение (то же самое для _2, _3 ... _n)
//
Функция Lambda(знач Код, _1=Неопределено, _2=Неопределено, _3=Неопределено, _4=Неопределено)
    ProgmaLambdaResult = null; // переменная, в которую вернется результат функции (если нужно)
    
    // Код, начинающийся с символа # считается уже скомпилированным
    Выполнить ?(Лев(Код, 1) = "#", Сред(Код, 2), CompileCode(Код));
    
    ~ProgmaLambdaReturn: // метка, к которой переходит алгоритм при возвратах
    Возврат ProgmaLambdaResult;
КонецФункции


//Функция подготавливает код для выполнения в Lambda()
// 
//Параметры:
//    Код - Строка - код на языке 1С.
//    Допускается для обозначений строк внутри кода вместо "" использовать ` (где ё).
//    Код, начинающийся с # считается уже скомпилированным.
//    Команда "Возврат" всегда должна писаться с заглавной буквы и закрываться ";" (точкой с запятой).
//    Все Возвраты вне строк заменяются на специальные метки, необходимые для функции Lambda().
//    В Коде не должно быть команд: Функция, Процедура и их концов. Только тело.
//
Функция CompileCode(знач Код)
    Если Лев(Код, 1) = "#" Тогда
        Возврат Код;    
    КонецЕсли;
    
    Код = toCode(Код);
    
    _Возврат = "Возврат";
    ДлинаСловаВозврат = СтрДлина(_Возврат);
    ПозицияВозврата = FindWithinCode(Код, _Возврат); 
    Пока ПозицияВозврата <> 0 Цикл
        КодДо = Лев(Код, ПозицияВозврата-1);
        КодПосле = Сред(Код, ПозицияВозврата + ДлинаСловаВозврат);
        
        КонецКоманды = FindWithinCode(КодПосле, ";");
        ЗначениеВозврата = Лев(КодПосле, КонецКоманды-1);
        
        Если ПустаяСтрока(ЗначениеВозврата) Тогда // Процедуры
            Код = КодДо + "Перейти ~ProgmaLambdaReturn" + КодПосле; 
        Иначе // Функции
            Код = КодДо + "ProgmaLambdaResult =" + ЗначениеВозврата 
                + "; Перейти ~ProgmaLambdaReturn;" + Сред(КодПосле, КонецКоманды+1); 
        КонецЕсли;
            
        ПозицияВозврата = FindWithinCode(Код, _Возврат); 
    КонецЦикла;
    
    Возврат Код;
КонецФункции


//Функция переводит Значение в вид, необходимый для выполнения в Lambda()
//
//Параметры:
//    Значение - произвольное значение
//
Функция toCode(знач Значение)
    Если Значение = Неопределено Тогда
        Возврат "Неопределено";
    КонецЕсли;
    
    Если ТипЗнч(Значение) = Тип("Строка") Тогда
        // Декодирование синтаксического сахара
        Возврат СтрЗаменить(СокрЛП(Значение), "`", """");
    КонецЕсли;
    
    Возврат Значение;
КонецФункции


//Аналог функции Найти, только игнорирует текст внутри кавычек "" и комментарии.
//
//Параметры:
//    Стр - Строка - Строка, в которой проводится поиск
//    Подстрока - Строка - Строка, которую нужно найти
//
Функция FindWithinCode(Стр, Подстрока)
	Накопитель = "";
	ДлинаНакопителя = 0;
	ДлинаПодстроки = СтрДлина(Подстрока);
	
	ВнутриКавычек = Ложь;
	ВнутриКомментрия = Ложь;
	
	Для i = 1 по СтрДлина(Стр) Цикл
		Символ = Сред(Стр, i, 1);
		Если ВнутриКомментрия Тогда
			Если Символ = Символы.ПС или Символ = Символы.ВК Тогда
				ВнутриКомментрия = Ложь;
			КонецЕсли;
		ИначеЕсли Символ = """" Тогда
			ВнутриКавычек = не ВнутриКавычек;
		ИначеЕсли ВнутриКавычек Тогда
			Продолжить;
		ИначеЕсли Символ = "/" и Сред(Стр, i+1, 1) = "/" Тогда
			ВнутриКомментрия = Истина;
			i = i + 1;
		Иначе
			Накопитель = Накопитель + Символ;
			ДлинаНакопителя = ДлинаНакопителя + 1;
			Если ДлинаНакопителя = ДлинаПодстроки и Накопитель = Подстрока Тогда
				Возврат i - ДлинаПодстроки + 1;
			ИначеЕсли Накопитель <> Лев(Подстрока, ДлинаНакопителя) Тогда	
				Накопитель = "";
				ДлинаНакопителя = 0;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат 0;
КонецФункции

Функции CompileCode и toCode выделены из Lambda, потому что будут нужны отдельно. Кроме этого используется вспомогательная функция FindWithinCode, которая работает как команда Найти, но игнорирует стрóки внутри строки и комментарии. Например, в возможной конструкции Возврат "Была выполнена команда Возврат;" при "компиляции" часть "Была выполнена команда Возврат;" должна остаться как есть.

 

Новые возможности

Используя функцию Lambda можно делать универсальные инструменты.

//Функция вызывает Код для каждого элемента Коллекции. Текущий элемент в Коде находится в переменной _1
//Если Код возвращает значение отличное от Null, в коллекции элемент заменяется.
//
//Например: 
//    Сообщить каждое значение: ForEach({Массив}, "Сообщить(_1)");
//    Умножить каждое четное значение на 3: ForEach({Массив}, "Если _1 % 2 = 0 Тогда Возврат _1 * 3; КонецЕсли;");
//Параметры:
//    Коллекция - Массив - пока только массив
//    Код - Строка - текущий элемент коллекции находится в переменной _1.
//        Возврат значения отличного от Null изменит элемент в коллекции
//    _2 - произвольное значение - ..._n Нумерованные параметры можно использовать в Коде
//
Функция ForEach(Коллекция, знач Код, _2=Неопределено, _3=Неопределено, _4=Неопределено)
    Код = "#" + CompileCode(Код);
    
    Для i = 0 по Коллекция.ВГраница() Цикл
        Значение = Lambda(Код, Коллекция[i], _2, _3, _4);
        Если Значение <> null Тогда
            Коллекция[i] = Значение;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Коллекция;
КонецФункции


//Функция возвращает коллекцию, состоящую из элементов Источника, которые удовлетворяют условию описанному в Коде.
//Текущий элемент в Коде находится в переменной _1
//
//Например: 
//    Отобрать четные числа: Filter({Массив}, "Возврат _1 % 2 = 0;");
//    Отобрать строки, набранные заглавными буквами: Filter({Массив}, "Возврат _1 = ВРЕГ(_1);");
//    Отобрать элементы, между параметрами _2 и _3 включительно: Filter({Массив}, "Возврат _2 <= _1 и _1 <= _3;", {Значение _2}, {Значение _3});
//
//Параметры:
//    Источник - Массив - пока только массив
//    Код - Строка - код должен возвращать значение, которое можно преобразовать в Булево
//    _2 - произвольное значение - ..._n Нумерованные параметры можно использовать в Коде
//
Функция Filter(Источник, знач Код, _2=Неопределено, _3=Неопределено, _4=Неопределено)
    Результат = новый Массив;
    Код = "#" + CompileCode(Код);
    
    Для каждого Элемент из Источник Цикл
        Если Булево(Lambda(Код, Элемент, _2, _3, _4)) Тогда
            Результат.Добавить(Элемент);
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

 

Цена

Заметно облегчая написание и чтение кода, данные анонимные функции, конечно, замедляют работу программы. Разница между вызовом классического кода и такого же, но командой Выполнить, минимум в 10 раз! На моих тестах замедление доходило почти до 25 раз. Но это всего лишь означает, что функции, созданные по данной технологии должны вызываться меньшее количество раз. Например, мою функцию ForEach можно переписать так, чтобы цикл был внутри лямбда-кода, тогда лишние сотые доли секунды, нужные директиве Выполнить на интерпретацию станут незаметными.

Отладка лямбда-кода затруднительна. Но анонимные функции не должны быть сложными.

«Боже! Боже! Это настолько нестандартно! Так на 1С не пишут! Кто нам позволит?» — скажут зануды. Вообще-то платформа 1С ценна не красотой и богатством синтаксиса, а распространенностью. А программирование само по себе подразумевает создание нужных абстракций, упрощающих работу. Я всего лишь планирую добавить десяток маленьких, но мощных функций, которые сильно увеличат возможности выражения мысли при кодировании. 

 

Перспектива

Головокружительная! Уже сейчас я закончил функции, которые позволяют создавать специальные структуры, которые можно поместить в переменные и вызвать в другом месте. Эти структуры-функции можно вставлять в другие универсальные коллекции и вызывать с доступом к самому объекту-носителю (как self в Python или this в JS). Таким образом остается написать инструменты, которые будут понимать, что делать со свойством "Prototype" у объекта, и здравствуй, ООП!

// Тестируемый сейчас вариант создания и вызова функций
// newFunction(Параметры, Код) - создает специальную структуру
// Call(Структура, [Параметры]) - вызывает переданную функцию либо функцию из свойства Структуры
 

// Можно создать "функцию" и поместить её в переменную. Обычный код был бы таким:
// Функция ПервыйВВыборке(Выборка, ЗначениеПоУмолчанию=Неопределено)
//     Возврат ?(Выборка.Следующий(), Выборка, ЗначениеПоУмолчанию);
// КонецФункции
//
ПервыйВВыборке = newFunction("Выборка, ЗначениеПоУмолчанию=Неопределено", // параметры функции
  "Возврат ?(Выборка.Следующий(), Выборка, ЗначениеПоУмолчанию);" // код функции
);
Выборка = КакойТоКодДляПолученияДанных();
Call(ПервыйВВыборке, Выборка);       // Данные выборки или Неопределено
Call(ПервыйВВыборке, Выборка, Ложь); // Данные выборки или Ложь


// Можно назначить структуре "метод"
_Объект = новый Структура("Имя, Фамилия, Представиться",
    "Anton",
    "Progma",
    newFunction("Начало=`Hello! `", "Сообщить(Начало + `My name is ` + _.Имя + ` ` + _.Фамилия);"
)
Call(_Объект, "Представиться", "Hi.");  // Hi.My name is Anton Progma
Call(_Объект, "Представиться");         // Hello! My name is Anton Progma

Пока этому всему пара суток отроду. Буду рад любым объективным мнениям. Прикрепил обработку для тестирования. Попрошу модераторов сделать её бесплатной для скачивания. Описание файла: обработка на управляемых формах с примером использования Lambda, ForEach и Filter (кнопки в командной панели формы). Слева — список элементов, который будут использовать ForEach и Filter. Посередине — область для лямбда-кода (оформляется по правилам 1С). Над областью кода — поле для списка параметров. Справа — лог, куда будет выводиться результат выполнения кода. Файл тестировался на платформе 8.3.16.1814

 

 

Планирую выпустить еще минимум 3 статьи по данной теме:

  1. Вспомогательные инструменты для упрощения кодирования и чтения.
  2. Функции первого класса, прототипы, наследование и, возможно, замыкания.
  3. Модули.

В перерывах жонглеры и фокусы! 

Вступайте в нашу телеграмм-группу Инфостарт

Лямбда Lambda Функция

См. также

Универсальные функции 1С 8.3 1С:Документооборот Россия Платные (руб)

ДО+ — расширение конфигурации, в котором собран постоянно пополняемый набор из 33 востребованных доработок для 1С:Документооборот КОРП 3.0: согласование задач прямо из мессенджеров MAX и Telegram, отзыв согласования и исполнения, гибкие повторные круги, эскалация с точностью до минут, контроль исполнительской дисциплины, выгрузка вложений в ZIP и склейка PDF, реестр документов в Excel, проверка дублей контрагентов и регистрационных номеров. Каждая возможность активируется отдельным флажком в режиме предприятия — включается только то, что нужно конкретной организации. Список функций расширяется с каждым релизом — текущая версия 2.1.0. Режим AddOn: типовая конфигурация не модифицируется, обновления ДО ставятся штатно, дополнительные лицензии и внешние компоненты не требуются. Внедрение силами администратора — около часа.

30000 руб.

09.07.2026    1411    1    0    

2

Загрузка и выгрузка в Excel Универсальные функции Разработчик 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    8754    Abysswalker    11    

49

Универсальные функции Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    14495    DeerCven    16    

66

Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    68778    dimanich70    87    

181

Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    9291    7    John_d    13    

59

Универсальные функции Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    85815    atdonya    31    

76

Универсальные функции Разработчик 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    13484    ke.92@mail.ru    18    

68
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ip0593 21 28.06.21 12:11 Сейчас в теме
получается нужно будет вникать в этот "1С-ООП", когда увидишь сие доработки у кого-то? а если такие приемы еще и в типовые добавят...
Lancelot-2M; Рамзес; pbahushevich; rabid_otter; +4 – Ответить
2. AntonProgma 50 28.06.21 12:17 Сейчас в теме
(1) Такова доля айтишника. Всё время во что-то вникаешь новое.
starik-2005; +1 – Ответить
3. bulpi 219 28.06.21 12:18 Сейчас в теме
Красиво, забавно. Но пользоваться этим, понятное дело , не буду.
Neuroproton; manuel; by_1Cnik; Рамзес; veretennikoff; gubanoff; GATTUSO; DrAku1a; zqzq; leobrn; pbahushevich; Lapitskiy; golovinaea; ArchLord42; mashinist; rabid_otter; Yashazz; Perfolenta; ABudnikov; paybaseme; DoctorRoza; JohnyDeath; Steelvan; +23 – Ответить
5. AntonProgma 50 28.06.21 12:19 Сейчас в теме
(3) интересно, почему? Вопрос без подколок.
79. artbear 1590 29.06.21 17:59 Сейчас в теме
(3) Такое себе решение.

Забавность есть, красоты не вижу (

ухудшение читаемости вижу.

(0) я люблю новое в разработке, упрощающее, но давный вариант очень тяжело кодить и сопровождать
Lancelot-2M; rabid_otter; unknown181538; Рамзес; fomaOp; ArchLord42; +6 – Ответить
82. AntonProgma 50 29.06.21 18:05 Сейчас в теме
(79) будет трудно - не используйте! Я за рациональный взгляд на вещи. Но что нечитаемого в функции Filter?
192. pbahushevich 01.07.21 15:51 Сейчас в теме
(82)
(79) будет трудно - не используйте! Я за рациональный взгляд на вещи. Но что нечитаемого в функции Filter?

в последнем примере как 1С нику - вообще непонятно что и куда вызывается и через какие дороги идет. С хелло ворлд да забавно, а когда расчет себестоимости в эту портянку завернут будет - мозг сломаешь.
Не надо самим себе усложнять жизнь
daho; Areal; +2 – Ответить
195. AntonProgma 50 01.07.21 16:01 Сейчас в теме
(192) обещаю не заворачивать в такие вызовы ничего сложного
4. bulpi 219 28.06.21 12:19 Сейчас в теме
(1)
В типовые не добавят, не бойся.
8. ip0593 21 28.06.21 12:31 Сейчас в теме
(4)ну а может в "групповое изменение реквизитов" добавят первым шагом... хотели ооп - получите
6. bulpi 219 28.06.21 12:22 Сейчас в теме
(5)
По ООП в 1с постоянно тоскуют программисты, которые начинали с языков, поддерживающих ООП. Я же начинал с Fortran , Pascal 5 и FoxPro. Я не тоскую :)
daho; lmm; dimao; gubanoff; Krasnyj; pbahushevich; mashinist; Yashazz; +8 – Ответить
7. AntonProgma 50 28.06.21 12:28 Сейчас в теме
(6) Ясно, спасибо! У меня похоже развивались события с JS: кодил себе спокойно, а потом узнал, что есть Proxy, и передо мной открылся новый мир!
9. Treaqq 29.06.21 11:03 Сейчас в теме
Возможно удобно, но это всё базируется на «Выполнить/Вычислить». Самому порой иногда не хватает, чтобы использовать саму функцию, как параметр. Вариант интересный и спорный. Автору однозначно плюс
daho; golovinaea; itoptimum; +3 – Ответить
10. AntonProgma 50 29.06.21 11:38 Сейчас в теме
(9)спасибо за оценку! Я и сам это ещё не пустил в работу. Хочется привести в порядок базовый механизм, а уже потом приступать к следующим шагам. Например, надо отличать Возврат (команда платформы) от РезультатВозврата (название переменной). Но слишком уж привлекательны анонимные функции и функции-объекты.
21. Yashazz 4931 29.06.21 15:52 Сейчас в теме
(9) Объясните, где вам не хватает функции как параметра?
Светлый ум; Krasnyj; +2 – Ответить
24. AntonProgma 50 29.06.21 15:55 Сейчас в теме
(21) как на счёт универсальных функций, приведённых в примерах?
26. Yashazz 4931 29.06.21 15:56 Сейчас в теме
(24) Давайте разберём один конкретный пример.
28. AntonProgma 50 29.06.21 16:00 Сейчас в теме
(26)ну выберите Filter или ForEach и разберите.
32. Yashazz 4931 29.06.21 16:05 Сейчас в теме
(28) Вы предложили - вы и разберите. У меня есть языковая конструкция, которая быстро, прозрачно и правильно делает, что мне надо. Нафига её заменять на ваши мудрствования? Обоснуйте выигрыш.
unknown181538; +1 – Ответить
38. AntonProgma 50 29.06.21 16:12 Сейчас в теме
(32)знаете сколько ещё будет людей, которые потребуют, чтобы им доказали, что им нужны анонимные функции? Я не доказываю, а предлагаю инструмент. С примерами использования. Если вы не представляете, что с ним делать, то увы.
42. Yashazz 4931 29.06.21 16:19 Сейчас в теме
(38) Слив засчитан. Вы предложили сферического коня в вакууме и вместо попытки обосновать его полезность, переходите на личности.
Neuroproton; yatec; pbahushevich; isMe; rabid_otter; +5 –2 Ответить
46. AntonProgma 50 29.06.21 16:22 Сейчас в теме
(42)ну я не планировал читать лекции о распространённых практиках мирового программирования. Примеры использования приведены. Вы отказываетесь в них верить. Я в тупике.
51. Yashazz 4931 29.06.21 16:27 Сейчас в теме
(46) Причём тут "верить"? Как только я смогу решить задачу работодателя/клиента с помощью ваших инструментов лучше, чем с помощью других - я готов их обсуждать и использовать. Мне глубоко пофиг всякие там мировые практики, у меня есть моя реальная жизнь, из задач которой исхожу.
sergey_fedorchuk_1978; Drivingblind; pbahushevich; Batman; +4 –1 Ответить
53. AntonProgma 50 29.06.21 16:29 Сейчас в теме
(51)хорошо, зайдём с другой стороны. Предложите другое универсальное решение функции Filter
56. Yashazz 4931 29.06.21 16:31 Сейчас в теме
(53) Зачем? Что делает описываемая "универсальная функция"?
pbahushevich; +1 –1 Ответить
61. AntonProgma 50 29.06.21 16:43 Сейчас в теме
(56)вопросы за гранью логики. Если я скопирую описание из текста статьи сюда, думаете, вам яснее станет?
194. pbahushevich 01.07.21 15:58 Сейчас в теме
(61) вопрос весьма логичный. Вы предлагаете инструмент которым должен пользоваться программист чтобы решать его дневные задачи. И вас спрашивают чем Ваш инструмент лучше того что уже есть в 1С-ке для решения задач 1С программиста? лепить сферические и абстрактные алгоритмы - этим можно прекрасно заниматься в том же Javascript, где сейчас для простого шаблона лендинга запускаешь npm install и он тянет 1200 библиотек у которых при этом более 100 конфликтов версий и т.д. Потому что куча творческих людей каждый раз любит придумать что-то новое.
196. AntonProgma 50 01.07.21 16:04 Сейчас в теме
(194) я рассчитывал, что расскажу о технологии, приведу примеры, а программисты сами решат, нужно это им или нет. Так в любом туториале.
antonio_i; user1910167; Светлый ум; Mechanist; +4 – Ответить
41. Treaqq 29.06.21 16:17 Сейчас в теме
(21)
Например передать функцию для сортировки в отдельный метод. Т.е. не «Если Тогда ИначеЕсли Тогда ИначеЕсли Тогда...», а просто применяется функция, которую передали параметром. Само собой можно и без переменной-функции, но с ней было бы проще. Что-то бы типа «ОписанияОповещения», только не CallBack'ом и для сервера
43. AntonProgma 50 29.06.21 16:20 Сейчас в теме
(41)надо только функцию быстрой сортировки создать, в которую передаётся параметром функция с условиями
47. Yashazz 4931 29.06.21 16:23 Сейчас в теме
(41) Функцию для сортировки? Это, простите, как? Вот есть массив данных, вот есть его подготовка к обработке, вот есть сортировка подготовленных данных. Каждый этап модульный, прозрачный, декомпозиция, отлаживаемость, возможность оптимизации. Чем плохо?
50. AntonProgma 50 29.06.21 16:26 Сейчас в теме
(47)плохо тем, что сортировать надо, допустим, не по значению элемента, а по его свойствам, или даже по результату применения какой-нибудь команды к этому элементу.
54. Yashazz 4931 29.06.21 16:29 Сейчас в теме
(50) Вооот. А вот теперь я вам, без апелляций к всяким умным теориям, скажу: если что-то надо сортировать по его свойствам, то следует подготовить сортируемое множество так, чтобы эти свойства там были. Это управляемо, отлаживаемо, объяснимо. Если нужен результат действия - то применяем действие, а потом сортируем. Без всяких лямбд, которые мгновенно превратят разработку в жутчайшую путаницу.
ardn; Krasnyj; +2 –1 Ответить
59. AntonProgma 50 29.06.21 16:40 Сейчас в теме
(54)и вообще нужно писать без абстракций потому что "наглядней". Тема сокращения кода не для вас)
user1910167; akocur; Dementor; +3 – Ответить
65. Treaqq 29.06.21 16:52 Сейчас в теме
(47) Суть поста - недоООП в 1С. Я не говорю, что способ поста хорош. Но это не проблема поста, а проблема 1С.
К примеру - пузырьковая сортировка массива структур. Это кроме как циклом с кучей условий - никак не сделать.

Задача: по кнопке сделать полностью типовую функцию, но с другой сортировкой в глубинах серверного модуля. В глубине типового, когда всё сортируется определенным образом, а нам надо по-другому.

Текущий способ единственный: вводим какой-нибудь «флаг» или дополнение (неважно), чтобы сортировка выполнялась с помощью другой функции. И собственно это нормальный рабочий вариант, не спорю. Но можно в самом начале кода (или как можно раньше) заменить вызываемую функцию на необходимую и она просто вызывается дальше. Т.е. суть не поменялась, но лезть глубже уже не надо. Абстракция как-никак. Например, типовые очень любят так делать с объектами оповещений: на форме создать оповещение «ПослеЧегоТоТам», в которое передаётся управление после девяти кругов ада по модулям конфигурации. Суть практически такая же
197. Darklight 38 01.07.21 17:36 Сейчас в теме
(21)Везде - 1С процедурный язык - но не поддерживает ссылки на процедуры как ВСЕ классические процедурные языки - кошмар!
Если бы поддержка была - то архитектуру кода можно было бы выразить намного более правильным, читаемым и более легко поддерживаемом виде. Даже без ООП. И применить хотя бы методологию "Внедрения зависимостей", а там уже и до полноценного Аспектно-ориентированного программирования рукой подать (но там всё-же уже лучше ООП - хотя вот сейчас элементы АОП реализуются в расширениях и без поддержки ООП). Так же это прямой путь к обработке данных с тиле LINQ - лучшее из псевдо декларативных решений что я видел для универсальной обработки данных без текстовых строк (хотя в данном решении, конечно без текстовых строк не обойтись)
313. native-api 30 18.09.24 14:51 Сейчас в теме
(21) На практике возникло: поиск по предикату (=произвольному условию над элементом коллекции) с контролем уникальности (=проверка, что условие выполняется только для одного элемента); удаление по предикату.
Без передачи своего кода и "Выполнить" требуется каждый раз писать отдельную функцию с циклом, дублируя логику обхода (там далеко не только цикл).
11. NikitaIvanchenko 341 29.06.21 14:25 Сейчас в теме
Прикольно, но отладкой понятно, там не полазить. Если от кого-нибудь такое в наследство придет.
13. AntonProgma 50 29.06.21 14:38 Сейчас в теме
(11) для этого планирую добавить пустую функцию для отладки, вставлять её вызов с интересующими переменными в нужные места, а точку останова ставить внутри этой пустой отладочной функции. Крайняя мера, но все же хоть что-то в отличие от запросов)
12. mvgfirst 6 29.06.21 14:27 Сейчас в теме
"Выполнить" - зло!
Хуже него только когда тексты запросов и когда хранятся в элементах спраовчниках в пердприятии.
И ты пытаясь разобраться в коде мечешься из конфигуратора в предприятие что бы понять как это все работает.
pbahushevich; rabid_otter; An-Aleksey; Yashazz; +4 – Ответить
14. AntonProgma 50 29.06.21 14:49 Сейчас в теме
(12) дьявольские операторы под капотом. В моем api с ними не столкнётся разработчик
23. Yashazz 4931 29.06.21 15:54 Сейчас в теме
(14) вот именно с этой фразы начинаются все фильмы ужасов про нашу каждодневную деятельность. Минус однозначно. За такой "сюрприз под капотом" с такими дикими извратами. Механика должна работать просто и надёжно, в продакшене вся эта жесть явно недопустима.
sergey_fedorchuk_1978; ardn; pbahushevich; +3 – Ответить
27. AntonProgma 50 29.06.21 15:59 Сейчас в теме
(23) вы не поверите, но, уверен, именно так и работает return, когда ваш "простой и надежный" выполняется платформой 1с. Вы, кажется, разработчикам платформы не доверяете. Сможете теперь жить спокойно?)
36. Yashazz 4931 29.06.21 16:09 Сейчас в теме
(27) Разумеется, не доверяю. У меня за сегодня платформа 2 раза падала, текстовый редактор конфигуратора в 8.3.19 глючит. Но так я могу сослаться на солидную фирму, а в обсуждаемом случае - только на "восторженные фантазии на тему". Несерьёзно.
84. AntonProgma 50 29.06.21 19:45 Сейчас в теме
(36) сослаться на солидную фирму, когда её продукт не работает? В чем разница-то, чей код не работает?
271. mvgfirst 6 02.07.21 17:37 Сейчас в теме
(84) Разница в том что когда ты используешь только стандартные функции описанные в СП - легче разбираться что сломалось чем когда приходится гадать не работает платформа или сторонний код с извратами. Который в свою очередь весь исполняется через "Выполнить".
И код который внутрь строкового литерала завернут - это ж уже не код, который может проверять контроль синтаксиса?
А это значит что ты вынужден ловить синтаксические ошибки - в предприятии.
Т.е. поиск очепяток по Ctrl+F7 - бесполезен.
274. AntonProgma 50 02.07.21 17:46 Сейчас в теме
(271) тут используются только функции, описанные в сп)

Я понимаю минусы. Но взять к примеру запросы. У них те же минусы. А из плюсов - конструктор запросов, но тоже с минусами. Это просто инструменты. Их можно не использовать, когда есть альтернатива. Может, у этой затеи тоже будут места применения.
193. pm74 208 01.07.21 15:54 Сейчас в теме
(12)
"Выполнить" - зло!
Хуже него только когда тексты запросов и когда хранятся в элементах спраовчниках в пердприятии.

таки нет , если их правильно приготовить
278. mvgfirst 6 02.07.21 17:57 Сейчас в теме
(193) Текст запроса хранится в реквизите справочника.
Ты в конфигураторе убиваешь объект (ну или меняешь навазние пары ревизитов).
Все проверил (в конфигураторе) ... запускаешь ... и через пару дней пользователи ловят ошибку компиляции запроса.

Потому что поиск по конфигурации - не дал результатов. А текст запроса лежит в недоступном из конфигуратора месте.

И что делать в таком случае?
279. AntonProgma 50 02.07.21 18:07 Сейчас в теме
(278) я сегодня в типовом полностью поддерживаемом (атлантами) коде отладчикиком полчаса искал место, где Отказ становится истиной. Потом минут 40 изучал запрос,приводящий к этому. И после этого по тексту ошибки нашлась причина. Так что маленькие, но читаемые функции в виде строки - не самая большая проблема.
native-api; brr; +2 – Ответить
281. pm74 208 02.07.21 21:00 Сейчас в теме
(278)
Текст запроса хранится в реквизите справочника.
Ты в конфигураторе убиваешь объект

нет ну так точно не нужно делать , в смысле смешивать код конфигурации и код хранящийся где то в справочнике. Внешний код (справочник) , на мой взгляд , удобно использовать для решения различных мелких задач (команды , регламенты , хранилище разнородной информации, быстрое прототипирование итп ) наподобие подключаемых обработок.
305. axelerleo 327 26.01.22 13:36 Сейчас в теме
(281) Увы, сами 1С в Документооборот такое делают - только в путь! Пользовательские обработчики бизнес-событий, проверка выполнения условий этапа бизнес-процесса, как пример :)
306. pm74 208 26.01.22 13:48 Сейчас в теме
(305) если это удобно , почему нет
16. Evil Beaver 8429 29.06.21 15:06 Сейчас в теме
Лапша какая-то. Несравненный nixel2007 сделал библиотеку fluent https://github.com/oscript-library/fluent которая намного лучше повернута лицом к людям

Массив = Новый Массив;
Массив.Добавить(3);
Массив.Добавить(4);
Массив.Добавить(7);
Массив.Добавить(5);
Массив.Добавить(1);
Массив.Добавить(0);

Результат = ПроцессорыКоллекций.ИзКоллекции(Массив)
	.Пропустить(1)
	.Фильтровать("Элемент >= 5")
	.Первые(2)
	.Обработать("Результат = Элемент + 1")
	.Получить(Тип("Массив"));
Показать
kote; daho; John_Davidson; ArchLord42; brr; mysm; rabid_otter; ktb; +8 – Ответить
17. AntonProgma 50 29.06.21 15:14 Сейчас в теме
(16) лапша - это то, чем у некоторых уши связаны в голове, чтобы не отваливались. Пост не про то, как с коллекциями работать.
18. Evil Beaver 8429 29.06.21 15:18 Сейчас в теме
(17) аа, ну тогда я спокоен )
19. AntonProgma 50 29.06.21 15:26 Сейчас в теме
(18) в любом случае я постараюсь создать продукт (концепцию) так хорошо, чтобы вы забыли про никсена навсегда!)
73. Evil Beaver 8429 29.06.21 17:41 Сейчас в теме
(19) А я смотрю вы недавно на сайте, да? Ну если Вы серьезно собираетесь переплюнуть по количеству полезных проектов меня или @nixel2007 - я только за! Сообществу нужно больше крутых инструментов.
ardn; axelerleo; Redokov; DJ_Codebase; Perfolenta; Yashazz; +6 – Ответить
85. AntonProgma 50 29.06.21 19:46 Сейчас в теме
(73) Я тоже так подумал
77. пользователь 29.06.21 17:50
Сообщение было скрыто модератором.
...
111. brr 184 30.06.21 10:15 Сейчас в теме
(16)Прикольно, она ещё и ленивая.
112. AntonProgma 50 30.06.21 10:23 Сейчас в теме
(111) только до вызова. Потом, как обычно.
125. brr 184 30.06.21 12:35 Сейчас в теме
(112) Не понял вашего комментария, я про библиотеку fluent, судя по коду она как раз ленивая. Все действия выполняются когда мы получаем результат.

За вашу разработку, спасибо! Есть над чём подумать.
126. AntonProgma 50 30.06.21 12:41 Сейчас в теме
(125) вам спасибо за спасибо) я подумал, вы имели в виду, что код, передабщийся в строке не выполняется, пока к нему не обратятся.
289. AntonProgma 50 04.07.21 17:42 Сейчас в теме
(16) Помогите, пожалуйста, разобраться. Как эту библиотеку использовать в платформе 1С? Хочется подключить и потестировать на данных.
290. Evil Beaver 8429 04.07.21 22:02 Сейчас в теме
(289) в 1С это не подключается, но стиль API и архитектурные решения можно там подсмотреть.
291. AntonProgma 50 04.07.21 22:28 Сейчас в теме
(290) спасибо. Пойду посмотрю, как сортировка делается)
292. kalyaka 1190 05.07.21 12:21 Сейчас в теме
(291) Вот здесь прекрасно изложены методы сортировки и есть реализация на 1С: Популярные алгоритмы сортировки массивов
293. AntonProgma 50 05.07.21 13:00 Сейчас в теме
(292) спасибо! Как-то выпало из поля зрения, что у списков значений есть возможность сортировки значений.
20. Yashazz 4931 29.06.21 15:42 Сейчас в теме
А, очередная поделка, эмулирующая ООП. Вот же людям неймётся.

Это просто не нужно в 95% случаев. В отличие от, скажем, нормальной асинхронности.

Внимательно прочитал. Не смог понять, зачем нужны такие жертвы. Вот просто ни одного живого примера в голову не пришло.

Вообще забавный психологический профессиональный выверт. Каждый тащит в новую среду то, к чему привык в старой. Я, помнится, ещё на 7.5 пытался делать, как на Дельфи. Даже эмулировал привычные конструкции. А потом допетрил, что не надо изобретать слова для обозначения пальмы в чукотском языке, и льда со снегом - в суахили.
gubanoff; ArchLord42; Артано; rabid_otter; +4 – Ответить
22. AntonProgma 50 29.06.21 15:53 Сейчас в теме
(20) честно говоря, ООП меня тоже не особо интересует. Это побочный эффект для тех 5%, когда это удобно. Мне нравится рассуждения Вирта, что ООП - это просто другое название для приемов программирования. А вот произвольные "методы" объектов и анонимные функции - вещь! Остальное все вытекает из природы функций первого класса.
25. Yashazz 4931 29.06.21 15:56 Сейчас в теме
(22) Я совершенно серьёзно не понимаю, где и зачем это нужно в мире 1С.
Ну некоторые приёмы ООП ещё да, пригодились бы, хотя и то, как показывает практика расширений, сие быстро превратилось бы в адъ и хаос. Но лямбда-функции?
30. AntonProgma 50 29.06.21 16:02 Сейчас в теме
(25) ваше непонимание, подозреваю, из-за отсутствия такой практики. На деле, это удобный инструмент, если на своём месте
akocur; pm74; brr; +3 – Ответить
33. Yashazz 4931 29.06.21 16:06 Сейчас в теме
(30)
На деле, это удобный инструмент, если на своём месте

Только вот это "своё место" вы пока не назвали.
35. AntonProgma 50 29.06.21 16:08 Сейчас в теме
(33)да вон же написаны примеры!
37. Yashazz 4931 29.06.21 16:11 Сейчас в теме
(35) Нет, я про реальную задачу. Бизнесовую. Прикладную. Кататься на велосипеде по канату дело красивое, но для единиц, а уметь водить такси в час пик - другое, для десятков тысяч.
40. AntonProgma 50 29.06.21 16:14 Сейчас в теме
(37) функция фильтрации не реальна?
45. Yashazz 4931 29.06.21 16:21 Сейчас в теме
(40) В таком общем виде - нет. Если мы говорим про анализ текста, так это другими способами лучше и проще делается, и почти все они в 1С доступны гораздо адекватнее, чем через "Выполнить".
86. AntonProgma 50 29.06.21 20:01 Сейчас в теме
(45) восхищаюсь таким навыком отказываться видеть не угодные сердцу вещи. Именно в общем определении и есть смысл функции Filter. Она универсальнее, чем аналоги, написанные "обычным" способом, потому что принимает код условия! Понимаете? Одна функция для перебора и применения команды. Имея её в арсенале, можно в месте, где нужно сделать отбор из массива по условию, вызвать одну эту функцию, указав, по какому условию нужно фильтровать. Очевидное упрощение в чтении и использовании. Большинство функций для этого и используются -- определить один раз код, в котором меняются только параметры, вместо того, чтобы писать много почти одинаковых участков.

Вы напоминаете человека, который говорит, что концепция степени числа не нужна в прикладной жизни, потому что есть умножение, а еще лучше -- сложение, которыми гораздо понятнее и подконтрольнее можно достичь того же результата. Мол, это математикам, может, и нужны степеня, а простым людям их не нать!
user1910167; akocur; nemec; Mechanist; +4 – Ответить
142. neikist 01.07.21 08:35 Сейчас в теме
(86) Да бесполезно это объяснять таким людям. Для них все что не от вендора - зло. А вот как только вендор добавит анонимные функции в язык (во что я правда вот вообще не верю) сразу будут говорить что вот этого то нам и не хватало, все правильно вендор делает. Чем то напоминает ситуацию у яблочников.
native-api; user1910167; akocur; Mechanist; +4 – Ответить
141. neikist 01.07.21 08:32 Сейчас в теме
(20) Когда то начинал именно с 1с, первый серьезный язык для меня был (с тех пор на инфостарт подписан и почитываю иногда почту). Про лямбды и ООП узнал заметно позже. И как только узнал понял насколько все в 1с с языком платформы печально. По вашей теории я после того как с 1с свалил должен был на котлине в стиле 1с писать, но не было такого. И да, без анонимных функций, статической типизации, ооп и подобного старую жизнь на 1с вспоминаю как кошмарный сон, насколько же это неудобно было.
native-api; akocur; Darklight; +3 – Ответить
211. Yashazz 4931 02.07.21 12:20 Сейчас в теме
(141) У меня было наоборот. После чистого Си и не менее чистого Паскаля 5.0 (не путать со всякими там 5.5!), без турбо-среды ещё... Попадается мне эдакий макроязык формул Бухгалтерия 6.0, а затем его мощное супер-развитие в 7.0 и 7.5. И ничего, носом не крутил, мне даже больше нравилось. Возможно, засчёт IDE. А может, это свойства характера. Есть языки, где всё разрешено, что не запрещено - таковы многие современные, таким всегда был классический Бейсик, PL2 и многие другие. И есть наоборот, всё сурово и строго. Так вот, не исключаю, психологизм здесь иной - не только и не столько инерция "почерка" и восприятия, сколько именно личные наклонности в "границах свободы". Ну а всё остальное можно оправдать или обхаять, при наличии мотивации-то.
202. sashocq 195 01.07.21 23:32 Сейчас в теме
(20)
Это просто не нужно в 95% случаев


Я согласен, что в языке должна быть нормальная поддержка лямбда-функций. Как вы и сказали, в 1 случае из 20 такое может пригодиться. У меня даже, наверное, чуть реже, но периодически бывают моменты, когда этого не хватает.

Но это всё мечты...
29. rabid_otter 134 29.06.21 16:02 Сейчас в теме
Прикольно, но зачем? Писать как в джавке? Но там то оно завязано на Consumer'ы, Supplier'ы и прочее, чего без интерфейсов в ЯП не реализовать.
По итогу - обычный синтаксический сахар через Выполнить.
Вместо того, чтобы изобретать такие велосипеды предлагаю автору писать сразу на https://msng.link/o/?platform_suggestions=tg
34. AntonProgma 50 29.06.21 16:07 Сейчас в теме
(29)все ли велосипеды одинаковые? Не всем нужны прогулочные или трёхколёсные. Некоторым - спортивные. Универсальность функций в примерах не приводит вас к мысли, что идея анонимных функций не зря существует?
44. rabid_otter 134 29.06.21 16:20 Сейчас в теме
(34) бла-бла-бла-бла-бла.
почему бы сразу не залепить в 1С свой лисп, кложур или ерланг. а как это нельзя, если на самом деле можно ))) ?

1. правильно ли я вас понял - вы написали кривоватый велосипед, а сейчас пытаетесь его защищать?
вы не можете ответить конкретно почему с вашим велосипедом код в 1С будет быстрее, лучше, понятнее.

2. где в типовых нужны анонимные функции, а главное - зачем?

3. зачем делать франкенштейна из ЯП, который для этого не имеет ни средств, ни назначения?
в дзен питона написано - простое, лучше чем сложное, это же кстати гласит принцип YAGNI, KISS и т д.
мои слова, подтверждает и тот факт, что в джаве, лямбды являются не более чем обертками над обычными коллекциями. можно писать и без них и будет быстрее.

Ваша ругань здесь не конструктивна, вас как обычно делают 1Серы - польют нечистотами, и ваша поделка дальше ИС никуда не пойдет. Более конструктивно и правильно - писать разработчикам платформы, правда они зададут те же вопросы, что и здесь.
sergey_fedorchuk_1978; Ks_83; +2 – Ответить
48. Yashazz 4931 29.06.21 16:25 Сейчас в теме
(44) вот кстати да, вспоминаем KISS.
57. AntonProgma 50 29.06.21 16:35 Сейчас в теме
(44) реальнее, говорят, написать Forth.

1. Я защищаю не свою поделку, а полезность анонимных функций.

2. В "типовых" это где? Предлагается идея для упрощения программирования.

3. Зачем делать то, чего нет? Потому что нужно. Возможно, не вам конкретно.
58. Yashazz 4931 29.06.21 16:40 Сейчас в теме
(57)
идея для упрощения программирования

Вот это вы точно шутите. Считайте, что я запостил тут кучу ржущих смайликов.
Потому что нужно

Кому нужно? Я сталкивался, пожалуй, со всеми областями применения 1С, кроме мобильной сферы, и не придумал, где бы было нужно.
62. AntonProgma 50 29.06.21 16:45 Сейчас в теме
(58)я же анонсировал, что вторая публикация будет про упрощение и в чем оно выражается. Предвидел.
64. Yashazz 4931 29.06.21 16:47 Сейчас в теме
(62) а, т.е. надо сначала намутить нечитабельное для 90% одинэсников, спрятать под капот, обнаружить десятикратный проигрыш по скорости, нарваться на многое из перечисленного мной в (31), а потом начать упрощать? Мсье знает толк)
66. AntonProgma 50 29.06.21 16:52 Сейчас в теме
(64)любую вашу функцию можно при таком настрое объявить нечитабельной и замедляющей работу. Это вопрос адекватности. Как видите, нашлись люди, которые прочитали и поняли. Если хотите, могу вас использовать, как нижнюю границу, типа "сварливый олинэсник". Но ориентироваться на ваш взгляд на мир слишком тоскливо.
167. zfilin 2384 01.07.21 12:08 Сейчас в теме
(66) Известно, что Yashazz редкий зануда. Но тут я больше с ним согласен, чем нет.
Выглядит интересно, красиво, но практические применения приходится, скорее, специально придумывать, чем "о, боже, я давно хотел чтобы вот тут это было".
Cерый; +1 – Ответить
171. AntonProgma 50 01.07.21 12:41 Сейчас в теме
(167) ну это первый шаг. Я рассчитываю, что дальше будет больше возможностей, когда функции станут объектами, и появятся модули. Хотя пока я абсолютно не уверен, что идея понадобится даже мне самому. Концепция само собой прекрасна. А вот реализация её в 1с потребует компромиссов, которые могут сделать использование не рентабелтным.
177. neikist 01.07.21 13:15 Сейчас в теме
(167) Не, с практическим применением все просто, постоянно использую анонимные функции и замыкания, но в тех языках на которых пишу они "из коробки" есть. А вот в такой реализации как у автора - это очень ограниченное в своей сфере использования решение которое нужно применять с оглядкой на безопасность и производительность.
63. rabid_otter 134 29.06.21 16:47 Сейчас в теме
(57)
1. Инструмент полезен, когда он сконструирован правильно, то есть посредством самого ЯП. А ваш вариант - самодельный, вы его слепили из того что было.
2. В типовых конфигурациях. Я сейчас работаю на самописках, и там тоже слава боженьке, никто не завез функциональщину в вашем виде, т. к. это преимущественно ваша инициатива, которая тех, кто дописывает код сбивала бы с толку.

То есть вот это по вашему читаемее?

Map<String, Item> items =
futures
.stream()
.map(f -> {
try {
return f.get();
} catch (Exception e) {
logger.error("Error executing refresh task", e);
return (List<Item>) (List) Lists.newArrayList();
}
})
.flatMap(List::stream)
.collect(
Collectors.toMap(
i -> i.getName(),
i -> i,
(i1, i2) -> i1));

Ну, кому как, знаете ли.

3. Ради бога - чем бы дитя не тешилось как говорится. Но, вы так и не объяснили конкретно чем ваши лямбды лучше встроенных в ЯП средств.
zqzq; isMe; МихаилМ; +3 – Ответить
67. AntonProgma 50 29.06.21 16:56 Сейчас в теме
(63)1. Всё инструменты кем-то "самописные". Это не критерий качества.

2. Доказывать несостоятельность моего кода на каком-то чужом из другого языка - тоже не адекватно. Я как раз предлагаю писать языком 1С,если вы не заметили. Просто даю дополнительные возможности использования этого языка.

3. Я объяснил с примерами. Предложите другое универсальное решение функции filter
Mechanist; brr; +2 –1 Ответить
68. rabid_otter 134 29.06.21 17:12 Сейчас в теме
(67)
1. да, но ваш инструмент - это детский велосипед, на который сверху натянули контактные педали. зачем? потому что хочу.
я уже понял, что это чисто ваша хотелка, поэтому в очередной раз предложил написать разрабам платформы.
вы теряете время.

2. почему нет? давайте переведу на русский в стиле 1С.
если вы проектируете какую-то возможность в ЯП, будьте готовы к тому, что будут попадаться личности, которым эти возможности очень понравятся и они будут пихать их везде.

Соответствие Элементы =
Результаты.ВПоток().Сопоставить(Результат -> 
Попытка
Возврат Результат.Получить();
Исключение
Сообщить("Ошибка при выполнении задачи обновления: " + ОписаниеОшибки());
Возврат Новый Массив;
КонецПопытки)
.Свернуть(Список.ВПоток)
.Собрать(ВСоответствие(
Элемент -> Элемент.Имя,
Элемент -> Элемент,
(Элемент1, Элемент2) -> Элемент1));
Показать


3. универсальное решение в 1С через выполнить, только надо ли оно кому-то, кроме вас?
это и есть самый главный вопрос.
69. AntonProgma 50 29.06.21 17:24 Сейчас в теме
(68) 1. Моему велосипеду несколько дней. Его, безусловно, придётся додумывать, менять, отлаживать и так далее. Как любой продукт.

2. Мне не нужно переводить. Нужно добавить логику вашим примерам. Что с помощью чужого кода вы пытались сказать мне? Я так же могу его вам прислать обратно и обвинить, что вы виноваты в его существовании. Пример с личностями, которые бессмысленно используют инструменты опять не в кассу. Это не проблема разработчика.

3. Может, нужно. Может нет. Я не настаиваю на использовании, а делюсь информацией. У вас же позиция из разряда "не должно быть ничего, что я не понимаю". Очень самонадеянно.
71. rabid_otter 134 29.06.21 17:33 Сейчас в теме
(69) 1. копайтесь, делайте, может быть кому-нибудь пригодится. нужно больше велосипедов с квадратными колесами.
2. логика в том, что если так могут написать, вам самому возможно придется в этом разбираться, что опять же говорит о целесообразности вашей поделки.
3. нет, логика в том - нужен ли велосипед, который работает через прослойку посредством выполнить, что добавляет лишний уровень абстракции и замедляет код. и замедление не стоит никому кроме вас не видного синтаксического сахара.

я знаю golang, java, python. писал что-то на javascript даже давненько. я понимаю инструменты, я не понимаю зачем лепить в 1С то, для чего он не предназначен.
75. AntonProgma 50 29.06.21 17:46 Сейчас в теме
(71)вы почему-то решили, что знаете вселенское предназначение языка 1с! Он предназначен для программирования. В моем примере используются только родные конструкции. Программисты делают на языках библиотеки, которые упрощают им жизнь. Лямбды в принципе полезны. Я хочу иметь возможность их использовать. Оптимизация кода на скорость или чтение - известная всем борьба противоположностей. Но человечество давно отказалось от ассемблера, как единственного самого быстрого способа выполнить команды. Питон, про который вы говорите, тоже абстракция над С. Он медленнее, но легче в освоении, написании и чтении. Это очень банальные вещи,которые известны каждому взрослому программисту. Единственное объяснение вашему упорству - вы считаете меня программистом, который не может сделать простой и удобный инструмент. С чего вы взяли?
78. rabid_otter 134 29.06.21 17:54 Сейчас в теме
(75)
вы почему-то решили, что знаете вселенское предназначение языка 1с! Он предназначен для программирования.

я не решал ничего, я слишком маленький для этого человек, я сужу по решениям, которые написаны на этом языке. и это очевидно как бы.
В моем примере используются только родные конструкции.

ха, в вашем примере используется эксплойт от 1С - возможность выполнить любой код без контроля перед компиляцией.
ваши лямбды это не javascript лямбды, а eval(что-то). не надо так делать.
Программисты делают на языках библиотеки, которые упрощают им жизнь

все верно.
Но человечество давно отказалось от ассемблера, как единственного самого быстрого способа выполнить команды.

знавал я одного PHP-программиста, который на каждое возражение архитектора расширял условия задачи таким образом, что задача становилась невыполнимой. кажется тут как раз ненужное преувеличение имеет место быть. спуститесь на землю - мы работаем на 1С.
Питон, про который вы говорите, тоже абстракция над С

Так это 1 уровень абстракции и для realtime приложений вряд ли подойдет питон. 1С - это абстракция над C++ и что дальше? а вот "Выполнить" в 1С - это уже 2 уровня абстракции.
Это очень банальные вещи,которые известны каждому взрослому программисту.

ок, я понял.
Единственное объяснение вашему упорству - вы считаете меня программистом, который не может сделать простой и удобный инструмент. С чего вы взяли?

тут был гомерический хохот. это типа "я обиделась"? я вас не знаю, как я могу о вас судить? я пожелал вам удачи с вашим великом.
80. AntonProgma 50 29.06.21 18:01 Сейчас в теме
(78)вы работает в 1с и вольны делать все что она позволяет, если вам это нужно. А не оглядываться на людей к коду которых у широкого числа аудитории есть вопросы. Уровень абстракции не важен. Если она удачная, значит нужна. Примите эти советы на прощанье
Mechanist; brr; +2 –1 Ответить
81. rabid_otter 134 29.06.21 18:04 Сейчас в теме
(80)

(78)вы работает в 1с и вольны делать все что она позволяет, если вам это нужно. А не оглядываться на людей к коду которых у широкого числа аудитории есть вопросы. Уровень абстракции не важен. Если она удачная, значит нужна. Примите эти советы на прощанье

ок. я вас понял.
кстати, про eval:
Использование «eval»
В современной разработке на JavaScript eval используется весьма редко. Есть даже известное выражение – «eval is evil» («eval – это зло»).

Причина такого отношения достаточно проста: давным-давно JavaScript был не очень развитым языком, и многие вещи можно было сделать только с помощью eval. Но та эпоха закончилась более десяти лет назад.
83. AntonProgma 50 29.06.21 18:07 Сейчас в теме
(81)кажется, вы ответили сами, почему без евала не получилось
143. neikist 01.07.21 08:37 Сейчас в теме
(44)
что в джаве, лямбды являются не более чем обертками над обычными коллекциями

Простите, но вы чушь несете. В старых версиях джавы лямбды в объекты анонимных классов заворачивались, в новых механизм получше уже. Но ни раньше ни сейчас они никак с коллекциями не были связаны вот вообще.
144. пользователь 01.07.21 09:02
Сообщение было скрыто модератором.
...
145. rabid_otter 134 01.07.21 09:40 Сейчас в теме
(143) да наплевать совсем как оно называется в джавке.
если мне не изменяет память, то лямбды - просто реализация анонимных классов, в идее можно даже превратить лямбду в реализацию функционального интерфейса.
коллекции не связаны с лямдами, это да. я тут ошибся. дальше что?
146. neikist 01.07.21 09:57 Сейчас в теме
(145) Ну во первых с новых версий jvm компилируются лямбды уже не в анонимные классы (начиная с 8 java), во вторых мне непонятна логика по которой вы приплели коллекции.
147. rabid_otter 134 01.07.21 10:00 Сейчас в теме
(146) я не обязан отчитываться перед ноунеймом в сети, если что. зачем вы решили докопаться до меня?
148. neikist 01.07.21 10:15 Сейчас в теме
(147) Затем что вы спорите при этом допуская фактические ошибки в аргументе. У вас весь аргумент завязан на то что в java лямбды это анонимные классы имеющие отношение к коллекциям, тогда как к коллекциям отношения не имеют и уже не анонимные классы. Ну и возвращаясь к аргументу собственно - непонятно зачем вы java вообще приплели при том что функции как объекты первого класса, и в частности лямбды существуют практически в любом современном языке (и во многих старых), и для 1с логичнее брать из какого нибудь питона/js, ибо тоже динамическая типизация.
150. rabid_otter 134 01.07.21 10:25 Сейчас в теме
(148) ок, берите лямбды откуда захотите, разрешаю ))) разве моя ошибка в связанности коллекций и лямбд в джаве влияет на тот факт, что лямбды реализованные через выполнить - зло? и опять же - как я говорил - есть тг бот для предложений к доработке платформы. на ИС бессмысленно ждать фидбека от разработчиков платформы.
151. AntonProgma 50 01.07.21 10:28 Сейчас в теме
(150) а почему через выполнить это однозначно зло?
Mechanist; pm74; +2 –1 Ответить
153. rabid_otter 134 01.07.21 10:32 Сейчас в теме
(151) сколько раз вам нужно написать одно и тоже?
155. AntonProgma 50 01.07.21 10:37 Сейчас в теме
(153)ещё разок, пожалуйста.
156. rabid_otter 134 01.07.21 10:37 Сейчас в теме
157. AntonProgma 50 01.07.21 11:00 Сейчас в теме
(156)ну вы просто несколько раз сказали, что не надо использовать выполнить / eval. Но почему, не объяснили, сославшись на js, до которого 1с, как до Китая. Так что, если ваш способ аргументации повторять слово "нельзя", то беседа зайдёт в тупик. Можете, хотя бы дать ссылку, где объясняется, почему выполнить никогда нельзя использовать? И тогда мы конструктивно сможем обсудить, почему в типовых решениях от фирмы 1с не стесняются это применять.
158. rabid_otter 134 01.07.21 11:22 Сейчас в теме
(157) ну ок, итерация № 100501, уже все написано в (78)
160. AntonProgma 50 01.07.21 11:34 Сейчас в теме
(158)про Выполнить там написано 2 вещи:

1. Что команда дает "возможность выполнить любой код без контроля перед компиляцией".

2. Что это абстракция загадочного 2го уровня.

Вы тут видите какое-то табу. Но я не улавливаю. Почему это всегда-всегда-всегда плохо? Я понимаю, что делает команда и пользуюсь ей именно поэтому. В этом смысл существования этой команды. Такова её природа. Даже самые педантичные в мире одинэсники из фирмы 1С не гнушаются. Так какие конкретные риски видите вы?
161. rabid_otter 134 01.07.21 11:42 Сейчас в теме
(160)
1. значит пишете потенциально опасный и неотлаживаемый код - вы и кто угодно через выполнить может обойти ту же синтаксическую проверку и сломать уже отлаженное, оттестированное решение, ошибившись запятой.
2. замедление - в моем универсальном парсере xml, написанном на 1С выполнить было самое медленное место, но этого требовала задача. я с радостью бы отказался от этого выполнить.
попробуйте в нагруженной среде свои лямбды.

матерые 1Сники используют этот выполнить только в тех задачах, где этого требует бизнесовая задача.
там, где можно обойтись без выполнить, они решают задачи средствами встроенного языка.
ваши недолямбды слава богу никто не догадался использовать.
т. к. там, где нет необходимости в усложнении, ее не делают.
я устал писать очевидные вещи.
170. AntonProgma 50 01.07.21 12:33 Сейчас в теме
(161) абсолютно весь код потенциально опасен. Неотлаживаемых вещей в 1с итак хватает. Это не аргумент однозначного запрета. Тут наш коллега ошибся в цифре и не мог это найти. Это же не значит, что не надо программировать, потому что можно сделать опечатку? Риски, конечно, повышаются без подсветки и прочего, но это все равно вопрос личного выбора, а не табу.

2. Ээээ. Вы использовали Выполнить в своём проекте. Согласились с потерей скорости ради удобства. А мне запрещает) и это все в одном комментарии.

3. Я как раз матёрый и использую Выполнить там, где без него не обойтись. То что вам не нужны возможности писать код с анонимным функциями никак не означает потенциального запрета на это.

Отсюда и моё не понимание ваших аргументов: "мне можно, а вам нельзя!" и "это никому не нужно в 1с". Вы не аргументируетн, а противоречит сами себе
172. rabid_otter 134 01.07.21 12:43 Сейчас в теме
(170) рукалицо... ок, я разрешаю писать код как вам хочется, главное обозначьте контору, в которую нельзя будет устраиваться, чтобы не переписывать ваши лямбды на костылях в обычные конструкции языка ))))

мои выполнить = этого требует задача и использование выполнить нельзя было заменить встроенными конструкциями языка.
ваши "лямбды" = можно заменить встроенными конструкциями языка.
173. AntonProgma 50 01.07.21 13:09 Сейчас в теме
(172) ну я тут не одобрения ищу, а объективные аргументы. Ваши только в том, что концепция для 1с не привычна. Если честно, мне тоже не нужны коллеги, которые с такой аргументацией не могут принять что-то типа Filter в коде.
175. rabid_otter 134 01.07.21 13:12 Сейчас в теме
(173) понимаете, если тут уже больше 100 комментариев о том, что это плохо. возможно, вы неправы.
178. AntonProgma 50 01.07.21 13:19 Сейчас в теме
(175) в основном, ваших) у вас слишком завышено самомнение. Я не могу быть не правым, когда говорю, что не хватает возможности передать функцию в другую. Я могу сделать плохую и не удобную реализацию этой идеи. Но пока есть что-то типа презентации, а не конечный продукт. Вы лично докапались до оператора, который сами же используете в случаях, когда по другому реализовать не получается. Почему вы не отказались от xml парсера с командой Выполнить? Или хотите сказать, что принципиально нельзя парсить xml другим способом?
179. Sashares 35 01.07.21 13:22 Сейчас в теме
(175)Зачем вы тратите свое время на "это"?
Забейте, как публикация бесполезная вещь, так и ТС не воспринимает никаких аргументов.
"В интернете кто-то не прав" - всех не переубедишь, да и смысла в этом нет.
Хочет ТС верить, что он делает что-то полезное, да флаг ему в руки.
rabid_otter; +1 – Ответить
181. AntonProgma 50 01.07.21 13:34 Сейчас в теме
(179) а то прям кто-то переубеждает! Критика на уровне "не хочу не буду". Как будто я кого-то заставляю. Соглашусь с вами, что не нужно тратить ни свое, ни моё время, если кроме эмоций выразить нечего.
182. rabid_otter 134 01.07.21 13:42 Сейчас в теме
(179) соглашусь с вами.
185. AntonProgma 50 01.07.21 13:49 Сейчас в теме
(182)я знаю, что вы все равно читаете и постепенно соглашаетесь)
186. rabid_otter 134 01.07.21 13:52 Сейчас в теме
(185) блаженны верующие
164. neikist 01.07.21 11:57 Сейчас в теме
(151) Потому что это банально небезопасно хотя бы. Плюс выполняется интерпретация написанного кода при каждом исполнении, тогда как в случае с обычным 1с кодом выполняется после первого прогона компиляция в собственный байткод. Ну и отсутствует нормальная проверка синтаксиса.
rabid_otter; +1 – Ответить
168. AntonProgma 50 01.07.21 12:10 Сейчас в теме
(164) не безопасно в каком смысле?

Запросы и обращение на сервер тоже замедляют работу. Это вопрос целесообразности использования. А не полный запрет. Когда время не критично, а удобство очевидно - почему надо отказаться от такого инструмента?

Проверка синтаксиса присутствует. Правда, только при исполнении.

Любой инструмент требует правильного обращения, чтобы не поаниться. Этот - необычный для 1с,поэтому под капотом у него хтоничечеие операторы. Но разве это отвечает на вопрос о необходимости принципиального отказа от всего кода, где есть Выполнить?
176. neikist 01.07.21 13:13 Сейчас в теме
(168) По возможности надо отказаться. Например какой нибудь "чайник" вывесит метод с такой лямбдой в общем модуле с разрешенным вызовом сервера, или в модуле формы сделает лямбдой вашей параметр метода с директивой &НаСервере и все, вы получили серьезную уязвимость, ибо клиент может любой произвольный код выполнить. И да, никто не дергает сервер с клиента в цикле, ибо это слишком замедляет работу. Одиночный вызов "Выполнить" производительность сильно не ухудшит, а вот в случае его вызова в цикле...
rabid_otter; +1 – Ответить
180. AntonProgma 50 01.07.21 13:29 Сейчас в теме
(176) проблема безопасности в том смысле, что код сам может быть опасен? Я исхожу из того, что это код. Если его написать обычным способом, он не станет от этого безопасным,когда выполнится. Об инъекциях опасного кода из инструментов, когда код вводится в режиме предприятия я думал, но это не проблема лямбда-концепции. Я хочу сказать, что дополнительного риска лямбды не превносят.

Про медоенную работу лямбды в цикле я писал. Данная реализация Filter нужна как можно проще для демонстрации идеи передачи инструкций между функциями.
183. neikist 01.07.21 13:43 Сейчас в теме
(180) Нет, речь о том что взломщик может получив креды вызвать на сервере метод который получает лямбду и передать туда произвольный код который позволит ему манипулировать любыми данными к которым имеет доступ пользователь чьи креды использованы почти как угодно. Это не про ввод кода в режим предприятия, а про вызов сервера 1с сторонними инструментами. То же самое как если бы сервер на ноде мог принять в качестве одного из параметров api метода строку js кода и выполнить ее. Это даже не SQL инъекция а уязвимость похлеще. Таким образом любое "Выполнить" и "Вычислить" всегда должны быть изолированы таким образом чтобы у клиента, которому по умолчанию никогда нет доверия, не было возможности передать им на выполнение произвольный код.
184. AntonProgma 50 01.07.21 13:47 Сейчас в теме
(183) извините, не понимаю. Может быть случай, когда некто может вызвать lambda, но не может просто написать нужный код обычным способом? Или может вызвать lambda, но не может воспользоваться Выполнить напрямую?
187. neikist 01.07.21 14:52 Сейчас в теме
(184) У вас есть метод с директивой &НаСервере в форме или в общем модуле с проставленным флагом "Вызов сервера" который принимает лямбду. Также у вас есть взломщик который имеет креды позволяющие ему обратиться к серверу 1с. Используя креды и такой "бекдор" взломщик может выполнить произвольный код на сервере. По сути выполнить инъекцию произвольного кода на сервер приложений. Речь не о штатной работе 1с, а именно о прямом вызове сервера взломщиком с нужными параметрами этого вызова.
189. AntonProgma 50 01.07.21 15:01 Сейчас в теме
(187) разрешите вас ещё не много помучить. Что такое "креды"?
190. neikist 01.07.21 15:06 Сейчас в теме
(189) Credentials. Логин+пароль, access token или аналогичная сущность позволяющая получить доступ к серверу представившись кем то.
212. Yashazz 4931 02.07.21 12:22 Сейчас в теме
191. AntonProgma 50 01.07.21 15:35 Сейчас в теме
(188) ну, что ж, задача, в принципе, облегчить программистам работу. А взломщики тоже программисты. Шутка.

Я изучу ссылку и отпишусь. Спасибо за важное уточнение!
213. Yashazz 4931 02.07.21 12:23 Сейчас в теме
(191) Я ж вам об этом же говорил, только без ссылки)))
Вы мне ещё ответили, мол, "не забываем")
218. AntonProgma 50 02.07.21 13:01 Сейчас в теме
(213)ну там много чего было перечислено) с этой ссылкой ознакомился. Её смысл в том, что важный код на сервере не должен вызываться напрямую с клиента, только через модули-посредники. Это, видимо, должно дать понять взломщику, что ничего серьёзного в базе с такой защитой не может храниться. Библиотека с лямбдой легко пройдёт аудит, если общему модулю запретить вызовы с клиента. Или этой галочки будет недостаточно?
221. kalyaka 1190 02.07.21 13:14 Сейчас в теме
(218) чтобы можно было использовать ваше решение на клиенте, общий модуль должен быть доступен и на клиенте.

Потенциальная угроза в виде программиста - ну так если он может изменить код конфигурации, то тут мы его никак не ограничим. Если вредоносное расширение или внешняя обработка - нужно ограничить право подключения. Если есть решение с вычисляемым кодом в формуле расчетного начисления - ограничить правом на изменение.

В общем угроза безопасности есть, но я не вижу как данное решение его увеличивает от имеющегося изначально.
223. AntonProgma 50 02.07.21 13:26 Сейчас в теме
(221) в случае общего модуля, у него будут стоять галочки Клиент и Сервер, а вызова сервера не будет. И код типа будет выполняться там, где его вызвали. Такой план.
244. neikist 02.07.21 14:51 Сейчас в теме
(218) Вы все же не поняли. Вообще нельзя чтобы никаким образом не было возможности передать "лямбду" с клиента на сервер. Иначе будет инъекция произвольного кода с клиента (любого, не только того что разработчик в конфе написал).
А ведь по любому найдется долбоящер что будет передавать "лямбду" на сервер.
(221) Речь о инъекциях произвольного кода от программы имитирующей "клиент 1с". Если есть возможность передачи лямбды с клиента на сервер - значит такая имитация клиента может передать любой произвольный код на выполнение на сервере. Так что угрозу безопасности увеличивает.
246. kalyaka 1190 02.07.21 15:00 Сейчас в теме
(244) так если вызов сервера не стоит, то как может произойти вызов сервера? :)
247. neikist 02.07.21 15:02 Сейчас в теме
(246) Так просто, разработчик в форме на клиенте передает в метод на сервере код а уже на сервере в форме вызыватся общий модуль который эту лямбду исполняет.
248. kalyaka 1190 02.07.21 15:22 Сейчас в теме
(247) от злостного разработчика, который имеет доступ к конфигурации, как можно уберечься? Или вы говорите про не злонамеренные ошибки программиста, имеющие фатальные последствия?
257. neikist 02.07.21 15:45 Сейчас в теме
(248) Именно про ошибки по невнимательности/незнанию. Впрочем и злонамеренно бекдор проще оставить таким образом, менее заметным будет.
259. kalyaka 1190 02.07.21 15:49 Сейчас в теме
(257) абстракции текут :), но и без них тоже плохо. Прямой связи предлагаемого решения и угрозы безопасности здесь я не вижу.
260. neikist 02.07.21 15:50 Сейчас в теме
(259) Если следить за собой и за кодом (а еще лучше линтеры натравить) то проблем можно избежать, да.
З.Ы. Текущие абстракции оно про чуть другое.
262. AntonProgma 50 02.07.21 15:58 Сейчас в теме
(259)ну имеется в виду, что с клиента ожидается функция для фильтра, а выполняется она на сервере. Тогда кто-то может написать функцию на клиенте, но не для фильтра, и передать её на сервер
249. kalyaka 1190 02.07.21 15:25 Сейчас в теме
(247) или вы имеете в виду какой то уж совсем адский сценарий: лямбды получили распространение и их уже разработчики стали сохранять в реквизитах формы, а код на стороне сервера их исполняет? :) (клиента при этом вскрыли и реквизиты подменили конечно)
251. AntonProgma 50 02.07.21 15:34 Сейчас в теме
(244) вы правы, надо будет это указать в описании технологии. Спасибо!
152. neikist 01.07.21 10:29 Сейчас в теме
(150)
лямбды реализованные через выполнить - зло

С этим даже не думал спорить. Обидно за jvm стало ибо последние 2.5 года на котлине пишу и лямбды постоянно использую.
154. rabid_otter 134 01.07.21 10:36 Сейчас в теме
(152) я на джавке пописываю всякое в течение года, накидал парсер на селениуме, и прицепил его к рест-сервису на спринге, теперь использую в связке с самописной базой 1С.
не сказать, чтобы я в восторге от джавы - на ней удобно строить космический корабль, т. к. она буквально заставляет писать на ООП с самого начала, понятно почему ее в ентерпрайз любят - куча фреймворков на любой вкус.
меня на котлин звали из 1С на те же деньги недавно, но я котлина не знаю совсем, поэтому пришлось отказаться :(
а так, по стилю мне больше нравится golang, чем java.
159. neikist 01.07.21 11:27 Сейчас в теме
(154) Ну джава довольно таки динозавр, и до современных языков ей далековато, несмотря на то что пытаются ее развивать. Потому многие и пишут на котлин/скала используя при этом всю мощь java инфраструктуры.
162. rabid_otter 134 01.07.21 11:51 Сейчас в теме
(159) это да. я не смог победить Netty при компиляции в нативный код через GraalVM Native Image в одном из своих пет прожектов, в итоге переписал пет-прожект на Golang. получилась нямка.
да, Java - многословный динозавр, но сильна обратной совместимостью, кучей фреймворков и кросс-платформенностью.
многословность частично решается lombok'ом.
пока что я вижу, что Java пытается догнать современные языки, но вот эта обратная совместимость мешает, даже обещают fiber-нити, типа не такие тяжеловесные как стандартные потоки ОС (привет, Golang, кстати)
163. neikist 01.07.21 11:56 Сейчас в теме
(162) Собственно котлин многое и решает. Очень выразительный, можно переиспользовать java код (и наоборот, из java котлин код вполне использовать можно почти весь). В т.ч. и что то подобное fiber планируемым есть в виде корутин, даже по названию почти горутины))
165. rabid_otter 134 01.07.21 12:01 Сейчас в теме
(163) да, коллега ушел в Java и ему тоже нравится больше Kotlin. кажется корутины еще в C# завезли, но точно не скажу.
166. neikist 01.07.21 12:04 Сейчас в теме
(165) В C# аналога ко/горутин нет насколько помню. Ну еще совсем недавно точно не было, может в последние пол года завезли
169. rabid_otter 134 01.07.21 12:13 Сейчас в теме
(166) это в Unity такое придумали, в C# такого нет.

Корутины представляют собой простые C# итераторы, возвращающие IEnumerator и использующие ключевое слово yield. В Unity корутины регистрируются и выполняются до первого yield с помощью метода StartCoroutine. Дальше Unity опрашивает зарегистрированные корутины после каждого вызова Update и перед вызовом LateUpdate, определяя по возвращаемому в yield значению, когда нужно переходить к следующему блоку кода.
174. neikist 01.07.21 13:10 Сейчас в теме
(169) Ну, до корутин в котлине заметно не дотягивает. Они в нем дают не только "легковесный аналог потоков", но и другие плюшки прикольные.
31. Yashazz 4931 29.06.21 16:03 Сейчас в теме
Не забываем про контекст - "Выполнить" и "Вычислить" видят только свой контекст, и то не полностью. Видимость и доступность переменных и модулей, программных абстракций и синглтонов. Не забываем про профили безопасности и защиту от опасных действий. Не забываем про условную и многослойную компиляцию, с учётом директив препроцессора и нескольких применённых расширений. Не забываем про разную компиляцию выражений для клиента и для сервера. Не забываем, наконец, про отсутствие вложенности перехвата ошибок, манеры Попытка-Исключение в транзакции, про любимый ВызватьИсключение.
Не забываем ведь?))
39. AntonProgma 50 29.06.21 16:12 Сейчас в теме
49. Yashazz 4931 29.06.21 16:25 Сейчас в теме
(39) Вообще это был сарказм.
52. AntonProgma 50 29.06.21 16:28 Сейчас в теме
(49)я так и знал, что вы не серьёзно!
55. Yashazz 4931 29.06.21 16:30 Сейчас в теме
(52) Да нет, это я к вопросу о том, почему предложенное вами решение не просто извратное, а почти неработоспособное.
60. AntonProgma 50 29.06.21 16:41 Сейчас в теме
(55)прогресс вас раздавит, но позже! Берегитесь!
Mechanist; +1 – Ответить
89. Yashazz 4931 29.06.21 20:56 Сейчас в теме
(60) Понятно. По существу возразить нечего, принялись паясничать.
rabid_otter; +1 – Ответить
91. AntonProgma 50 29.06.21 22:09 Сейчас в теме
(89) О каком существе речь?
93. пользователь 29.06.21 22:12
Сообщение было скрыто модератором.
...
149. neikist 01.07.21 10:16 Сейчас в теме
(31) Ну лямбда все же не обязана быть при этом замыканием. Хотя много где так и сделано.
70. Vladimir_D 124 29.06.21 17:28 Сейчас в теме
Не пойму вот чего. Как это функцию нельзя использовать как параметр? Легко.
КакаяТоПроцедура(КакаяТоФункция(КакойТоПараметр1,КакойТоПараметр2..КакойТоПараметрN),Еще параметры и функции);

Что не так?
72. AntonProgma 50 29.06.21 17:33 Сейчас в теме
(70)тут используется результат выполнения функции. А концепции функции-объекта позволит обращаться с функцией, как с обычным значением. Например, присвоить её свойства структуры и вызвать в другом месте с нужными параметрами.
76. пользователь 29.06.21 17:47
Сообщение было скрыто модератором.
...
94. Perfolenta 207 29.06.21 22:30 Сейчас в теме
(76) а мне нравится, как автор сражается за своё детище... может не надо его del... может какой-нибудь мягкий BackSpace вполне достаточен? :))
rabid_otter; brr; +2 – Ответить
95. Yashazz 4931 29.06.21 22:36 Сейчас в теме
(94) Никого не надо del. На то и Инфостарт, и накопление знаний.

Но когда предлагают такую нетривиальную штуку, надо быть готовым сразу - чтоб всякие тупорылые автоматизаторы почуяли выгоду. Иначе впустую. Не мы такие - рынок такой.
96. Perfolenta 207 29.06.21 22:41 Сейчас в теме
(95) пока пишешь свой комментарий, куда-то исчезает тот, на который отвечаешь... смысл написанного при этом так же исчезает... про del было написано в комментарии (76)...
99. AntonProgma 50 29.06.21 23:07 Сейчас в теме
(94) Я вовсе не за эту реализацию сражаюсь. А в общем-то за банальные удобства. Я просто не нашел ничего легче. Есть одна публикация за 2019, но там с примерно таким же приемом с интерпретацией кода, громоздко со всем остальным: регулярные выражения, обязательные обработки, многократное создание экземпляров этих обработок. А это решение обещает работать с минимальнми компромиссами к изменению приемов программирования.
Perfolenta; +1 – Ответить
101. Perfolenta 207 29.06.21 23:41 Сейчас в теме
(99) сражайтесь и совершенствуйтесь... главное не опускать руки... если посмотреть на стартапы, то выстреливает в самом лучшем случае один из десяти... так и идеи программистов далеко не все выстреливают... но если опустил руки и перестал эти самые идеи генерировать и отстаивать, то всё, сушите вёсла...
я вообще, целый новый язык программирования делаю, и мнений всяких наслушался вдоволь... была и убийственная критика, и приятные комментарии, и слова поддержки, и главное - пользователи... люди разные и мнений много... и надо сказать, что убийственная критика иногда позволяет взглянуть на свою работу под новым углом и что-то переделать...
верите в свою правоту - продолжайте делать, а там как получится... к сожалению, причины взлётов и падений часто случайны...
даже люди, которые вкладывают в маркетинг миллионы, иногда ошибаются, например, в киноиндустрии хороший фильм может провалиться в прокате т.к. зрители пошли на соседний, успеха которого ни кто не прогнозировал...
103. AntonProgma 50 30.06.21 00:51 Сейчас в теме
(101) спасибо на добром слове!
87. mysm 87 29.06.21 20:10 Сейчас в теме
Отличная статья. Интересно продолжение.
88. isMe 29.06.21 20:31 Сейчас в теме
Сомнительные упражнения ради саморазвлечения.
Из практических минусов:
- потеря времени выполнения;
- потеря отладчика;
- потеря проверки синтаксиса.
Как следствие уменьшение комфорта работы пользователя и удорожание разработки и сопровождения.
И все ради трех-четырех процедур с сомнительной ценностью. Не дай Бог на такое в чужом коде налететь.
А еще в вашем случае надо помнить, что ForEach меняет коллекцию, а Filter возвращает новую. В погоне за универсальностью и гибкостью Вы начинаете создавать монстра, который с каждым шагом становится все более неповоротливым и тяжелым. То есть ваш пример прекрасно увеличивает на 3 четные числа или возвращает строки с заглавной буквы, а если понадобится вернуть новый массив с четными элементами увеличенными в два раза, то вам придется писать новую обертку для вызова. В итоге от обертки останется только
Для Каждого ЭлементКоллекции Из Коллекция Цикл 
    Выполнить("ЧтоТо"); 
КонецЦикла; 

а это уже есть в платформе. Вот и выродилась идея.
Если вам в 1С не хватает Phiton или js, то либо возвращайтесь, либо привыкайте. Поверьте каждый из этих языков самодостаточен. Не надо в русский добавлять герундий или писать справа налево, просто привыкайте и будет легко и удобно.
Увы, но пока минус.
unknown181538; rabid_otter; Sashares; Yashazz; +4 – Ответить
90. AntonProgma 50 29.06.21 21:22 Сейчас в теме
(88) Согласен только с тем, что затея может "не окупиться". Это начало эксперимента. Все остальные рассуждения не обоснованы.

Потеря времени выполнения происходит при вызове команды Выполнить. Та же ситуация, что с запросами или обращениями на сервер -- каждый такой вызов занимает некое время сам по себе. Количество потерянного времени зависит от количества вызовов. Для ускорения нужно сокращать их количество, делая больше операций за раз. Но когда время не критично (доли секунды), можно, например, не в запросе делать преобразования значений, а в цикле по выборке из запроса. Это всё привычные компромиссы, и в данной теме замедление -- точно не главная проблема.

Механизм определения лямбда-функций нужен в основном, чтобы определять простой код. Если функция сложная, и её результат нужно отлаживать, то, само собой, выгоднее определить её обычным способом (и уже её вызывать в лямбде :) шучу). Я не предлагаю пользоваться лямбдами везде, но делюсь информацией, как можно не писать функции для каждой разновидности простого действия. То же самое касается и проверки синтаксиса.

Не понятно про комфорт пользователя и удорожание обслуживания. Вот 1С напишет запрос на 700 строк, который сложно осмыслить, вы же не откажетесь из-за этого от запросов в принципе. Я встречаю много незнакомого кода и типового, и не типового. Думал, у всех так же.

Это всё не ради 3-4 процедур. Это ради расширения возможностей. Приведенные примеры, как я думал, просты для понимания и распространены. Они служат для демонстрации технологии, и не являются конечным продуктом.

Я начинаю создавать библиотеку, как тысячи наших коллег. Обычная практика. Окажется ли результат монстром или конфеткой, не известно даже мне, а вам-то уж и подавно. Но я заинтересован, чтобы получилось как можно меньше букв и проще. Опыт программирования у меня есть, потому, есть и надежда. Тем более, что разработка публична, и меня поправят, когда допущу ошибку.

Единственное, что я добавляю в платформу, это анонимные функции. А вовсе не конкретную функцию Filter. Поэтому не вижу смысла сосредотачивать на ней внимание.

Очень смешно читать, что платформа и язык самодостаточны, когда они постоянно дополняются самим разработчиком. Очевидно, в 1С не считает, что достигли совершенства, а вы, значит, считаете. И я не добавляю ничего в язык. Всё написано на языке 1С, и технология предполагает использование языка 1С. Просто определение функций упрощается, когда это нужно.
92. Yashazz 4931 29.06.21 22:11 Сейчас в теме
(90) Ваша беда в том, что а) вы свято уверены в своей правоте и не слышите собеседников, б) вы ни черта не знаете специфику отрасли и области, куда пытаетесь влезть со своим уставом.
rabid_otter; +1 – Ответить
97. AntonProgma 50 29.06.21 23:00 Сейчас в теме
(92) Я вовсе не свято уверен. Я за выгоду. Считаю, что написать одну функцию, позволяющую сделать универсальный механизм, а потом её вызывать с параметром, в котором можно передать конкретные инструкции - это намного экономичнее, чем написать 10 разных готовых фильтров или каждый раз писать почти одинаковый код. А в отрасли я уже больше 10 лет, и точно осознаю, что делаю. Мои прием противоречит только вашим убеждениям, но ни логике, ни языку системы.
98. Yashazz 4931 29.06.21 23:06 Сейчас в теме
(92) Я погорячился. Насчёт знания специфики не мне судить.
100. AntonProgma 50 29.06.21 23:09 Сейчас в теме
(98) Я тоже погорячился, и буду избегать подколок. Мы же, в сущности, одно дело делаем. Я честно прислушиваюсь ко всей критике, просто на большую часть вопросов уже ответил в момент предварительного тестирования и создания базового синтаксиса, поэтому несколько уверен :)
102. isMe 30.06.21 00:28 Сейчас в теме
(90)
Вы перепутали слова "самодостаточен" и "совершенен". Я имел ввиду не то, что им некуда развиваться, а то, что у каждого из этих языков есть своя философия применения и развития. И они не нуждаются в портировании не свойственных им технологий. 1С в в своей эволюции, например, отказалась от сериализации формы клиентского приложения, запретив тем самым ее передачу с клиента на сервер и обратно, а Вы хотите к каждой переменной добавить ее личные функции, тем самым увеличить передаваемые объемы информации между сервером и клиентом. И хочу заметить, что функция будет хранится в переменной, не как ссылка на область памяти в куче, а как строка неопределенной длины, то есть при копировании переменной будут создаваться копии функции, а не ссылки на нее.
Для понимания нужности, можете привести хотя два прикладных примера где будет применение вашего приема (плевать на скорость выполнения) удобней, читабельней, короче ну в чем-то лучше типового примера на ванильном 1С?
104. AntonProgma 50 30.06.21 02:11 Сейчас в теме
(102) На сайте 1С, конечно, написано, что их язык призван использоваться в парадигме поп, но полагаю, это аббревиатура. Язык -- это инструмент. Он не может нуждаться или не нуждаться. А вот люди очень даже могут. И тогда они добавляют в язык новшества. Часто это заимствования удачных идей из других языков. Вы говорите, что ни вы, ни я, не можем развивать язык? Но каждая обобщенная функция, каждый модуль, и есть расширение конструкций языка.

Я не склонен воспринимать программистов из фирмы 1С, как богов, у которых есть четкий план и которые дают нам всё, что только может понадобиться. А что они, дескать, не дали, то табу. Отказавшись от сериализации формы, они еще попутно отказались от сериализации... таблиц значений. А их представление о философии СтрРазделить сильно отличаются от питоновских: в 1С разделитель - это набор символов, каждый из которых разделитель (какой первый попадется). И по-вашему, если мне понадобится разбить строку по последовательности из двух символов, я не имею права написать аналог питоновского Split? Ну чепуха же! По этой же логике я считаю возможным добавлять любой нужный мне функционал.

Про экономию места в памяти как-то больше на придирку похоже. Во-первых, подозреваю, что вы сами не верите, что нужно так фанатично экономить память на коротких строках. Во-вторых, если вы имели в виду, что строка с кодом копируется из-за оператора Знач в параметре функции, так я рассчитываю, что не используемые строки будут удаляться из памяти сборщиком мусора после копирования. А если вы имели в виду, что строки будут копироваться при передаче между клиентом и сервером, ну такова природа клиент-серверных приложений. Массивы тоже копируются, что же нам их не пересылать?

Вы попросили 2 прикладных примера. Именно столько я и привел (Filter и ForEach). Я не могу взять в толк, почему вам и некоторым другим кажется, что эти примеры нельзя применить на практике? Чем они вам кажутся не применимыми?
115. RocKeR_13 1490 30.06.21 10:54 Сейчас в теме
(104)
Я не могу взять в толк, почему вам и некоторым другим кажется, что эти примеры нельзя применить на практике?

Эти примеры не имеют никакой ценности в контексте того, что ради них придется использовать "100 строк библиотечного кода". В контексте только этих двух примеров использование анонимных функций ни разу не упрощает, а только усложняет как разработку, так и отладку.
116. AntonProgma 50 30.06.21 10:56 Сейчас в теме
(115) если не имеют ценности, я не настаиваю. Можно не использовать, а писать столько циклов, сколько понадобится. Просто, зачем? Из-за привычности?
117. RocKeR_13 1490 30.06.21 11:01 Сейчас в теме
(116) Не могу даже придумать пример, где и как это использовать) "Выделить из массива только четные числа" - это абстракция, это не практический пример. Обычно данные подготавливаются заранее и вычленять из массива другой массив по условию ни разу не доводилось. Проверить наличие значения в массиве - да, поиск строк в таблице - да, но для этого не требуются анонимные функции.
118. AntonProgma 50 30.06.21 11:17 Сейчас в теме
(117) вы мне предлагаете придумывать примеры, пока мы не наткнемся на что-то, лично вам интересное? У меня другие планы на день. Предложу только рассмотреть вариант, что идея фильтра, например, может быть доработана и включать другие типы источника.
119. RocKeR_13 1490 30.06.21 11:26 Сейчас в теме
(118)
пока мы не наткнемся на что-то, лично вам интересное

Все равно немного не понимаете суть "претензий". Повторюсь: все вышеприведенное - это теория, а 1С - это не про теорию, а больше про практику. Все ждут, грубо говоря, куска кода, где будет применен ваш подход в рамках какой-нибудь реальной задачи, которая не обязательно будет интересна лично мне. Вот тогда будет виден реальный контекст применения подхода и можно будет по-настоящему оценить пользу - вот это будет интересно мне и, думаю, всем остальным. Пока это все теория ради теории.
120. AntonProgma 50 30.06.21 11:38 Сейчас в теме
(119) я понимаю, что есть часть людей, не знающих, что делать с этой технологией. Сразу оговорюсь, у меня нет к ним никаких претензий, я не даю оценку их способностям и так далее. Это действительно первый шаг примера теории). Я сам пытаюсь найти применение на практике такое, чтобы разработчику стало заметно проще. Собираю информацию, тестирую, думаю над интерфейсом. Пока в основном сосредоточен на переписке)
121. RocKeR_13 1490 30.06.21 12:02 Сейчас в теме
(120)
Я сам пытаюсь найти применение на практике такое, чтобы разработчику стало заметно проще

Подход-то изначально чужд платформе, а данная реализация не вписывается в стандарты разработки, поэтому применение данного решения изначально сильно ограничено. Поэтому без реальных примеров и сравнительного анализа этих примеров с "классической" реализацией подавляющее большинство ограничится только знакомством с публикацией. Чего греха таить, я в том числе: новое-интересное люблю, но в данном случае отношусь пока скептически)
122. AntonProgma 50 30.06.21 12:17 Сейчас в теме
(121) платформе чуждо многое, что на самом деле необходимо. И программисты фирмы 1с вынуждены обходить недостатки собственной платформы. Не могу пообещать, что разобьюсь в лепешку, доказывая практичным скептикам, что концентрированный код лучше сильно разбавленного. Мне интересно узнать пределы темы, и всей полезной информацией я поделюсь. Даже если она будет во вред затее.
214. Yashazz 4931 02.07.21 12:32 Сейчас в теме
(119) Я уже пытался это объяснить, бесполезно. На разных языках говорим. Автор считает, что уже привёл пример. Нам с вами очевидно, что пример - это совершенно другое и им тут не пахнет, и придумать даже не выходит. Не тратьте время)
240. neikist 02.07.21 14:22 Сейчас в теме
(214) Автор привел нормальные примеры, проблема в самой реализации через "Выполнить/Вычислить". Плюс без поддержки вендора, как и все в 1с сообществе, этим никто не будет пользоваться, несмотря на то что без функций как объектов первого класса, без замыканий и без анонимных функций я себе современное программирование не представляю. Слишком много удобств они дают.
105. AseevAndrew 22 30.06.21 02:12 Сейчас в теме
На Java лямбда-выражения являются в некотором роде сокращенной формой внутренних анонимных классов. При компиляции в байт-коде нет разницы между лямбдой или анонимным классом. Всё это сделано для уменьшения количества кода и его понятности (лично для меня лямбда это не то, что я сразу понимаю при первом взгляде, может опыта мало). Но самое главное это реализовано на уровне языка. А тут получается лямбда, чтобы быть похожим на ООП язык программирования, но 1С ООП языком с натяжкой можно только назвать, по моему у 1С цель совсем другая. Но ход мыслей мне понравился.
106. AntonProgma 50 30.06.21 02:25 Сейчас в теме
(105) не знаком с Java, но об определениях нужно договариваться. Роза пахнет розой, хоть розой назови её, хоть нет.
107. isMe 30.06.21 03:47 Сейчас в теме
(104)
Давайте разберем примеры
Ваш код
//Каждое четное число в массиве умножить на 3
ForEach(Массив, "Если _1 % 2 = 0 Тогда Возврат _1 * 3; КонецЕсли;");

//Отобрать элементы, состоящие из заглавных букв:
НовыйМассив = Filter(Массив, "Возврат _1 = ВРЕГ(_1);"); 
плюс 100 строк вспомогательного кода

Классический код
//Каждое четное число в массиве умножить на 3
Для Каждого ТекущийЭлемент Из Коллекция Цикл
    Если ТекущийЭлемент % 2 = 0 Тогда
        ТекущийЭлемент = ТекущийЭлемент * 2;
    КонецЕсли;
КонецЦикла;

//Отобрать элементы, состоящие из заглавных букв:
НоваяКоллекция = Новый Массив;
Для Каждого ТекущийЭлемент Из Коллекция Цикл
    Если ТекущийЭлемент <> ВРег(ТекущийЭлемент)  Тогда
        Продолжить;
    КонецЕсли;
    НоваяКоллекция.Добавить(ТекущийЭлемент);
КонецЦикла;
Показать


Оригинальный код компилируется в момент обновления конфигурации или при загрузке внешней обработки, но только 1 раз, в вашем случае каждый раз выполняется проверка синтаксиса и компиляция. При этом Вы все равно используете именованные функции Фильтр(), ДляКаждого(), Лямбда(...), а не анонимную.
Теперь, как пример, нам нужно внести изменения, например, в первом случае вернуть новую коллекцию из увеличенных значений, а во втором случае попробуем получить новую коллекцию из массива не строк, а дат по условию - отобрать все вторники и четверги с начала второго квартала прошлого года до 28 августа 2020 года. Покажите как будет выглядеть функция Фильтр(...)? А я в ответ покажу как это сделать в классическом коде и сравним гибкость и простоту сопровождения.

Еще два маленьких вопроса на прямую не относящиеся к теме обсуждения:
1. Почему Вы переменные и функции именуете в перемешку на русском и английском, обычно такое не очень удобно сопровождать. Например EmployeesWithAWritOfExecution сложнее воспринимается, чем СотрудникиСИсполнительнымЛистом.
2. За что Вы так ненавидите оператор Перейти? Ведь этот оператор упрощает код, позволяя, например, выйти из вложенных циклов без дополнительных переменных-флагов и лишних условий.

p.s. Экономия места это не придирка. Я на самом деле считаю, что не нужно использовать памяти больше требуемого, а код лучше больше написать, чем больше исполнять.
unknown181538; kalyaka; artbear; rabid_otter; +4 – Ответить
110. AntonProgma 50 30.06.21 08:19 Сейчас в теме
(107) 100 строк вспомогательного кода я считаю библиотечными. Их не предполагается копипастить в каждом модуле. Тогда получается, что в рабочем коде в моем варианте будет 2 строки, против ваших 12ти. То есть, написание и чтение кода уменьшается в разы. И таких сокращений будет столько, сколько понадобится совершить операций отбора или действий над элементами списка. Это же азы распределения кода - вынести повторяющиеся конструкции в специальное место, дать ему имя и вызывать с нужными параметрами. Просто параметр может быть инструкциями, если это необходимо программисту. А когда дело дойдет до сортировки массива, то вообще не обойтись без анонимной функции, если условия сортировки отличны от заложенных фирмой 1С.

Попробуйте мыслить в обратном порядке: вот есть Filter и ForEach. Стоит ли писать в 6 раз больше кода, если можно вызвать одну команду? Для меня ответ очевиден. Даже на этих 12 строчках вы умудрились сделать ошибку. А всё потому, что чем больше пишешь, тем больше ошибаешься чисто статистически.

Как будет выглядеть инструкция: "вторники и четверги с начала второго квартала прошлого года до 28 августа 2020 года" писать не буду. Это не имеет смысла и сожрет лишние калории. Очевидно, что так же, как и обычный 1С код, просто он будет внутри строки. Есть случаи, когда я посчитаю, что удобнее написать вызов функций из примера. А есть -- когда я сам решу, что так не удобно. Это просто инструмент. Не будет никаких клятв его использования минимум в 50% случаев! По желанию.

С русским и английским языком -- согласен, что не удобно переключаться. Сделать надо двуязычный интерфейс. На данный момент выделение имен английским языком удобно для разделения измерений. Типа, вот это платформа 1С (на русском), а вот это библиотека (на английском). В обычной практике я так не делаю.

Оператор перейти (признан не желательным оператором на территории 1С) должен сидеть в клетке, если уж кто-то его заводит. К нам пришел "стажер" старшего поколения, который вообще не понимал концепцию циклов, прерываний. Перейти во все поля! Я по возможности стараюсь не отходить от стандартов использования кода.
108. itoptimum 24 30.06.21 06:34 Сейчас в теме
Как идея - замечательно. Не понимаю критики, ведь зачастую воплотить "не реализуемое" одна из интереснейших задач программиста, аналитика. Да, на практике решение через выполнить все портит, но такова жизнь))).
Dementor; brr; +2 – Ответить
109. AntonProgma 50 30.06.21 07:30 Сейчас в теме
(108) на практике просто забываешь, что там внутри библиотеки, а просто пользуешься её API )
113. RocKeR_13 1490 30.06.21 10:47 Сейчас в теме
Идея в принципе понятна, но существенный минус публикации - отсутствие реальных примеров практического применения. Приведенные примеры - это исключительно теория, "сферический конь в вакууме", как писали. Анонимные функции все равно придется где-то определять и каждый раз следить за контекстом исполнения, доверяя при этом сторонней "библиотеке" с кучей goto, Выполнить и Вычислить...сомнительное удовольствие. Без реальных, практически значимых примеров данный подход не будет иметь особой популярности. Как минимум такая библиотека точно не пройдет во Fresh и в тиражные решения, которые захотят получить сертификат "Совместимо".
114. AntonProgma 50 30.06.21 10:54 Сейчас в теме
(113) вот объяснит мне кто-нибудь, почему примеры двух функций кажутся чем-то нереальным? Это вполне рабочие примеры. Написанные самым простым способом, чтобы передать идею, но реальные. Неужели ситуация с отбором из массива настолько редкое событие?
215. Yashazz 4931 02.07.21 12:37 Сейчас в теме
(114) Объясняю. Они не то чтоб нереальны. Они просто не показательны. Нужен пример. Живой, настоящий пример. Поиск дублей ИНН контрагентов. Взаимодействие с сайтом ОФД. Расчёт себестоимости при закрытии периода. Пересчёт НДС с авансов. Интеграция с инет-витриной. Вот когда вы возьмёте любую настоящую задачу, решите её предложенным способом, сравните показатели по основным критериям и предоставите - вот только тогда мантра про "Filter и ForEach" перестанет быть голословной.

А про отбор и сортировку массива я уже сказал.
Сортировка: а) делаем получение свойств, по которым требуется сортировка, исходя из массива. б) делаем сортировку.
Отбор: а) делаем получение свойств, по которым требуется отбор, исходя из массива. б) делаем отбор.
Просто, прозрачно, управляемо, декомпозируемо.
219. AntonProgma 50 02.07.21 13:06 Сейчас в теме
(215) я не сомневался, что до этой темы можно было написать код для обработки массивов. Здесь поднимается тема, что можно написать функцию, которая получит и выполнит инструкции. Это другой способ сделать обычные вещи. Просто сделать в одну строку, а не в 6.
123. Климов Сергей 30.06.21 12:26 Сейчас в теме
Занятно! Буквально вчера сожалел о невозможности передать функцию в качестве параметра процедуры. Это сильно упростило и сократило бы мой код. Но подобные вещи должны реализовываться на уровне платформы.
AseevAndrew; +1 – Ответить
124. AntonProgma 50 30.06.21 12:31 Сейчас в теме
(123)не могли бы вы объяснить суть той ситуации? Почему функция, как параметр была бы удобна? Это в рамках сбора информации о таких случаях.
127. Климов Сергей 30.06.21 12:55 Сейчас в теме
(124) Есть сторонний веб-сервис, имеющий несколько методов. Мне нужно загружать в него информацию, источником которой является набор взаимосвязанных документов. Набор этот для всех методов почти один и тот-же. Тот или иной метод нужно вызывать в зависимости от значения одного реквизита документа.
Написана процедура, получающая в качестве параметра выгружаемый документ. В ней развесистый case примерно такого вида:
Если Документ.ВидОперации = Перечисления.ВидыОпераций.Вид1 Тогда
    ДокументXDTO = ОбработатьВид1(Документ);
    ВызватьМетод1(ДокументXDTO);
ИначеЕсли Документ.ВидОперации = Перечисления.ВидыОпераций.Вид2 Тогда
    ДокументXDTO = ОбработатьВид2(Документ);
    ВызватьМетод2(ДокументXDTO);
... и так далее, 8 раз подряд. Функции ОбработатьВид1() ... ОбработатьВид8() имеют такую структуру:
1. Подготовительные действия;
2. Выборка данных и формирование ДокументXDTO;
3. Завершающие действия.
Пункт 1 повторяется во всех функциях с отличием только в имени типа XDTO, п 3 повторяется во всех функциях без отличий.
Если бы была возможность передавать функцию в качестве параметра, то вместо 8 функций ОбработатьВидN() я бы написал одну, передавая в неё в качестве параметра функцию реализующую только выборку данных и формирование объекта XDTO. А п.1 и 3 присутствовали бы в коде только 1 раз. Да, функций выборки осталось бы 8, но они были бы компактными, легко читаемыми и без повторов.
128. AntonProgma 50 30.06.21 13:07 Сейчас в теме
(127) спасибо! Зафиксирую ситуацию для будущих примеров.
135. isMe 30.06.21 14:12 Сейчас в теме
(110)
Вы опять не поняли или сделали вид. У Вас есть две функции и библиотека. Первая функция изменят элементы коллекции, вторая отбирает их. Очень, скажем, узкий функционал. Вот я и предлагаю чуть-чуть усложнить задачу и изменить отобранные значения. Придется дополнять библиотеку? То есть полезем в 100 строк кода? Было интересно, получится ли у Вас с первого раза засунуть в константную строку кода проверку на фиксированную дату.
Я не пытаюсь сказать, что, то, что Вы делаете - плохо. Я только пытаюсь донести, что конструкция получается тяжелее, чем классическая реализация. Если это делается ради задачи из постановочной части статьи, то проще использовать обработку "Групповое изменение объектов" БСП. Она умеет выполнять произвольный алгоритм над коллекцией прикладных объектов "из коробки".
Кстати, не покажите мне мою ошибку?
136. AntonProgma 50 30.06.21 14:25 Сейчас в теме
(135) функции Filter и ForEach не являются частью библиотеки. По крайней мере в таком виде. Они нужны только, чтобы передать идею. Но при этом они рабочие, то есть, делают то, что описано. Главная же функция в этой теме - lambda. Ради неё написано все остальное. Что-то как её часть, что-то как результат её использования. Filter - простой Пример использования lambda, а не продукт, о котором я говорю. Но даже этот простой пример позволит сократить обычный код в несколько раз.

Напишите строку кода с датой типа '20210101' , потом поставьте по бокам кавычки - получится лямбда-код. В чем эксперимент?

Ваша ошибка не в синтаксисе, а в данных. Видите, как нелегко сориентироваться, когда букв много.
137. isMe 30.06.21 14:46 Сейчас в теме
(136)
То есть, у Вас все таки не 2 строчки, а 2 строчки и 2 функции, которые не в библиотеке, а в прикладной части. Против 12 строчек кода в одном месте.
И все таки в каких данных у меня ошибка?
138. AntonProgma 50 30.06.21 15:09 Сейчас в теме
(137) вам не хватает фантазии. В этой теме у Filter и ForEach есть роль - они демонстрируют, как можно создавать и вызывать функции с лямбда. Но если такие функции будут существовать, то их логично поместить в библиотеку. Можно рядом с лямбдой, можно в отдельную. Как угодно.

Если вы не видите разницы между тем, что написали и что хотели написать, то я рекомендую все-таки подумать о пользе сокращения кода. Это реально помогает с разработкой и поддержкой. Лучше вызов одной незнакомой в первый раз функции, чем 6 команд обычного кода.

Я с трудом верю, что мы так долго спорим о пользе выноса повторяющегося кода в функцию.
129. Климов Сергей 30.06.21 13:14 Сейчас в теме
Я бы хотел видеть примерно такой код:
Если Документ.ВидОперации = Перечисления.ВидыОпераций.Вид1 Тогда
    ДокументXDTO = Обработать(Документ, ТипXDTO1, ФункцияВыборки1());
    ВызватьМетод1(ДокументXDTO);
ИначеЕсли Документ.ВидОперации = Перечисления.ВидыОпераций.Вид2 Тогда
    ДокументXDTO = Обработать(Документ, ТипXDTO2, ФункцияВыборки2());
    ВызватьМетод1(ДокументXDTO);
...
КонецЕсли;

Функция Обработать(Документ, ТипXDTO, ФункцияВыборки())
    // Подготовительные действия, используется ТипXDTO
...
    ФункцияВыборки(Документ, ДокументXDTO);
    // Завершающие действия
...
    Возврат(ДокументXDTO)
КонецФункции
Показать

И 8 штук ФункцияВыборкиN(), компактных, в пределах 40 строк.
131. avryanovalexey 82 30.06.21 13:28 Сейчас в теме
А можно было бы вообще обойтись без Если...Иначе...

ФункцииОбработки = Новый Соответствие;
ФункцииОбработки.Вставить(Перечисления.ВидыОпераций.Вид1, ФункцияВыборки1);
ФункцииОбработки.Вставить(Перечисления.ВидыОпераций.Вид2, ФункцияВыборки2);
ФункцииОбработки.Вставить(Перечисления.ВидыОпераций.Вид3, ФункцияВыборки3);
...

ДокументXDTO = Обработать(Документ, ТипXDTO1, ФункцииОбработки.Получить(Документ.ВидОперации))
Показать


Естественно ФункцияВыборки1 здесь - это где-то выше описанные функции, которые здесь просто передаются в другую функцию "Обработать" как параметр и будут вызываться где-то внутри по типу:

...
Результат = ФункцияВыборки1(Документ, КакойТоПараметр1, КакойТоПараметр2)
...
133. AntonProgma 50 30.06.21 13:32 Сейчас в теме
(131) а ещё говорят, я не по адресу тему поднял)
134. Климов Сергей 30.06.21 13:39 Сейчас в теме
(131) Можно, да, согласен. Поленился здесь писать :)
217. Yashazz 4931 02.07.21 12:47 Сейчас в теме
(131) Может, я тупой кодер, но управляющей переменной такие вещи решаются легче и правильнее.
Обработать(Документ, ТипХДТО)
// где внутри написано
Режим=Документ.ВидОперации;
Если Режим=Перечисления.ВидыОпераций.Вид1 Тогда
ФункцияВыборки1
ИначеЕсли Режим=Перечисления.ВидыОпераций.Вид2 Тогда
ФункцияВыборки2
//итд.
Показать


Ну вот не вижу смысла городить огород. Я долго отучал себя от красивостей в пользу простоты, читабельности и управляемости.
225. avryanovalexey 82 02.07.21 13:38 Сейчас в теме
(131) Главное код стал бы более компактным, читабельным.
(217)Еще раз. Можно и так и будет работать. Но выразительнее и компактнее без двух десятков Если...Иначе
В мире 1С конечно нам так привычнее, мы по другому не можем. И любые "придумки" как у автора воспринимаются дурным тоном.

Но в других языках, где это можно и прогерам это привычно, этим пользуются. Это удобнее, нагляднее.
Но опять же не обязательно. Не хочешь, не пользуешься, пишешь 20 штук if...else... Только там уже такой вариант считается дурным тоном )) Дуальность ))

Опять же без нативной реализации внутри языка 1С, мне тоже эта затея кажется сомнительной с точки зрения практической реализации. Автор видимо считает иначе, поэтому посмотрим на развитие сей затеи.
226. avryanovalexey 82 02.07.21 13:41 Сейчас в теме
(225) хотя когда-то и на разрабов onescript смотрели как на странных гиков. Зато сегодня многие активно пользуются и куча библиотек полезных появилось на его основе. Может и здесь что-то "вырастет" ))
227. AntonProgma 50 02.07.21 13:44 Сейчас в теме
(226) вот, я, кстати, хотел узнать, эти скрипты как-то работают с платформой 1с или просто использую диалект языка, но живут своей жизнью?
avryanovalexey; +1 – Ответить
228. avryanovalexey 82 02.07.21 13:48 Сейчас в теме
(227) своей. ими решаются около 1С-ные задачи, все что связано с администрированием, DEvOps, и т.д. Это отдельная библиотека на C# написанная использует в качестве языка синтаксис едентичный синтаксису 1С. Ну и дополнять ее можно. Опять же я не глубокий спец в этом. Использовал кое-где для своих нужных по инструкциям разработчиков.

А тебе реализовать такой функционал сбоку не получится. Даже внешней компонентной. Тебе же туда передавать надо не примитивные данные а ссылки и доступ из твоих функций должен быть к данным 1С. поэтому максимум, что ты можешь сделать - это библиотеку на языке 1С внутри конфигурации. С точки зрения производительности - это всегда будет проигрывать. Но где производительность не важна, будет прикольно. Ну и куча хейта тоже обеспечено
230. AntonProgma 50 02.07.21 13:51 Сейчас в теме
(228)мне просто их библиотеку для работы с коллекциями в пример привели, хочу для примера похожу на лямбдах сделать.
242. avryanovalexey 82 02.07.21 14:26 Сейчас в теме
(230) гуглите )) тут полно статей про Onescript. И в инете полно материалов.
235. Yashazz 4931 02.07.21 14:03 Сейчас в теме
(225) Компактнее? Ну может быть. Выразительнее? Нифига, наоборот, труднее для восприятия. А если вам ИначеЕсли кажется неудобной, так настройте свёртку группировок в редакторе, пользуйтесь разметкой областей, и выйдет вам щастье. Чисто в типовой.

Я вам сейчас пример приведу. Я пишу код, не ставя пробелы вокруг операндов и порой после запятых тоже. Код - компактный. На маленьком мониторе чудо как удобно. Но разве удобно людям после меня иметь дело с таким моим стилем написания? Да ни разу.
241. avryanovalexey 82 02.07.21 14:24 Сейчас в теме
(235)можете еще переменные однобуквенные сделать, чего мелочиться. будет супер-компактно.

Повторю, 1с-нику непривычно. И воспринимается "злом". Но это вопрос привычки.
Для 99% 1С-ников это будет "чудо странное". Но другом языке выглядело бы вполне обычно.

В 1С когда-то не было асинхронных вызовов. Сейчас вся конфы ими утыканы. Когда-то писали без разделения на клиент и сервер. Сейчас такое трудно встретить.

Поэтому выразительность - это не только вопрос возможностей и ограничений языка, но и принятых практик в сообществе. В 1С сейчас они такие, но мир не стоит на месте.
250. Yashazz 4931 02.07.21 15:32 Сейчас в теме
(241)
можете еще переменные однобуквенные сделать, чего мелочиться. будет супер-компактно

Ага, во многих языках это норма. Но при этом зачастую страдает качество решения задач в целом - думаю, очевидно, почему. И, увы, правы те, кто ругает однобуквенные переменные.
243. neikist 02.07.21 14:44 Сейчас в теме
(217)
Пример на котлин:

fun List<Document>.filterAndProcessForOperationKinds(kinds: Set<OperationKinds>, processLambda: Document.()->Unit): List<Document> = filter { it.operationKind in kinds}
.apply {
forEach(processLambda)
}
Фильтруем только по переданным видам документов, выполняем какое то действие переданное извне в лямбде (провести, пометить на удаление, распровести, поменять значение поля и сохранить, что угодно, вариантов много) список документов для дальнейшей работы возвращаем.
Примеры использования функции

val filteredDocs = documents.filterAndProcessForOperationKinds(setOf(OperationKinds.Kind1, OperationKinds.Kind2)) {
deleteMark = false
someField = someValue
save()
}
Для документов с определенным видом операции снимаем пометку удаления, устанавливаем значение какого то поля в одно значение для всех отфильтрованных документов, сохраняем. Код в фигурных скобках естественно может быть любым абсолютно, в одном месте конфигурации нужно одно действие для отфильтрованных документов, в другом другое.
И это очень простой пример, применений можно сколько угодно придумать. Это же азы программирования обобщать и абстрагировать.
252. Yashazz 4931 02.07.21 15:35 Сейчас в теме
(243) И это полный капец. Потому что этапов фильтрации и обработки может быть много. Потому что сегодня фильтр единообразен, а завтра кастомизирован по подмножествам кейсов, потому что обработка вдруг тоже становится условной. Потому, что это сегодня одновременно, а завтра разнесено на разные фоновые задания, или между клиентом и сервером пошинковано. И всё ваше элегантное решение - коту ректально.
256. avryanovalexey 82 02.07.21 15:45 Сейчас в теме
(252) вам капец потому что к синтаксису к такому не привычно. Любому котлиновцу это как "два пальца...", базовый навык. И код получается зачастую более универсальный и для них он более наглядный.
261. Yashazz 4931 02.07.21 15:57 Сейчас в теме
(256) Вы не поняли. Я не про код. Я про перспективы его доработки принятыми в 1С практиками согласно встречающимся в 1С случаям.
263. Yashazz 4931 02.07.21 16:32 Сейчас в теме
(256) Так вы мне расскажите, куда денется вся универсальность и наглядность, буде случатся приведённые мной кейсы?
265. AntonProgma 50 02.07.21 16:44 Сейчас в теме
(263) не ведаю. но лямбда это не волшебная палочка, а инструмент для простейших действий. Её обычное предназначение быть простой инструкцией. И когда встречается некое простое, повторяющиеся с действие с некоторыми вариациями (например, перебор массива с разными условиями отбора), то такие участки можно заменить на вызов функции, куда передаётся меняющийся участок кода.
267. Yashazz 4931 02.07.21 16:47 Сейчас в теме
(265) Вооот. А в 1С не бывает "простейших действий". Постоянная перекомпоновка - наша реальность. Постоянный реинжиниринг и рефакторинг кода - наша обыденность. Ваше простое решение сперва перестанет быть простым, потом вырастет в монстра, которого никто не будет понимать и уметь изменить, а потом его выкинут. Кто в 1С давно, те знают, как это бывает)))
rabid_otter; +1 – Ответить
268. AntonProgma 50 02.07.21 16:53 Сейчас в теме
(267) значит, показалось
269. avryanovalexey 82 02.07.21 17:06 Сейчас в теме
(267) шутите?
я же не говорю удалить все СКД и заменить на простые инструкции.
В алгоритмах у вас не бывает, где нужно обойти что-то в цикле и сделать какие-то манипуляции с условиями?
Если не бывает, значит не ваша реальность. У меня бывает.

Ту же сумму и налоги в табличной части по всем строкам пересчитать.
Выше вам коллега писал, что у него несколько типов документов на входе и ему надо обработать каждый индивидуальной функцией
258. neikist 02.07.21 15:47 Сейчас в теме
(252) Ну мыслите блин абстрактно. Почему то применяю лямбды и замыкания каждый день и с ужасом вспоминаю те тонны кода что приходилось на 1с писать каждый раз для простейших вещей. А не наоборот.
266. Yashazz 4931 02.07.21 16:44 Сейчас в теме
(258) А я с ужасом вспоминаю те тонны кода, которые я писал на Дельфи для вещей, на 1С делаемых элементарно. И что? Вот понадобилось СЛУ решать, так их быстренько в платформу добавили. А нет - значит, и нужды нет, а есть лишь завиральные красивости.

Вот вы "тонны кода" в рамках какой задачи, простите, писали?
275. neikist 02.07.21 17:46 Сейчас в теме
(266) На делфи да, я бы тоже ни за что не писал при наличии современных языков. К тому же странно сравнивать RAD с языками. Язык в делфи так то паскаль был.
Когда я с 1с работал - писали в франче несколько своих конфигураций отраслевых.
132. AntonProgma 50 30.06.21 13:31 Сейчас в теме
(129) если патерн действий повторяется, то и его можно попробовать сделать частью функции, в которой будет вызов нужной получения выборки. И в неком соответствии, где ключи - вид операции, определить в качестве значения - обработчик.

Для себя запишу, реализовать пример функции Case
130. avryanovalexey 82 30.06.21 13:18 Сейчас в теме
Идея классная. В Python, например, много сахара, который был бы удобен в разработке на 1С, делал бы код более простым и читабельным: анонимные функции, передача параметров в функции по имени, а не по позиции, срезы, возврат нескольких результов функциями и др.

Да, без них можно. Но с ними было бы изящнее. Можно было бы писать более кратко, более ёмко.

Увидел в статье автора попытку именно посмотреть как было бы удобно, если бы были анонимные функции. И попытку реализовать прототип такой концепции. Конечно, в массовом продакшене без реализации в ЯП 1С это вряд ли применимо. Причины описалы выше: производительность, неудобство отладки. Но в некоторых небольших решениях, как эксперимент было бы интересно.

Может 1С, когда-нибудь и реализует это в языке
Mechanist; AseevAndrew; Климов Сергей; +3 – Ответить
139. isMe 30.06.21 19:14 Сейчас в теме
(138)
сверлить отверстия болгаркой это не фантазия - это порно странное занятие. Вам очень хочется доказать состоятельность своей поделки, даже не обращая внимание на здравый смысл. При этом Вы пытаетесь доказать, что
ForEach(Массив, "Если _1 % 2 = 0 Тогда Возврат _1 * 3; КонецЕсли;");

Функция ForEach(Коллекция, знач Код, _2=Неопределено, _3=Неопределено, _4=Неопределено)
    Код = "#" + CompileCode(Код);
    
    Для i = 0 по Коллекция.ВГраница() Цикл
        Значение = Lambda(Код, Коллекция[i], _2, _3, _4);
        Если Значение <> null Тогда
            Коллекция[i] = Значение;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Коллекция;
КонецФункции
Показать
и еще где-то библиотека существующая на клиенте и сервере лучше и меньше чем
//Отобрать элементы, состоящие из заглавных букв:
НоваяКоллекция = Новый Массив;
Для Каждого ТекущийЭлемент Из Коллекция Цикл
    Если ТекущийЭлемент <> ВРег(ТекущийЭлемент)  Тогда
        Продолжить;
    КонецЕсли;
    НоваяКоллекция.Добавить(ТекущийЭлемент);
КонецЦикла;
Показать

по сути Вы пытаетесь сделать обертку на обычный цикл, инкапсулируя его в свою функцию, которую каждый раз придется писать так как она не входит в неизменяемую часть кода, которую громко именуете библиотекой. Которая, кстати, по своей сути является парсером для переданной строки. Количество строк можете посчитать сами. И Вы так и не объяснили где ошибка в данных, которые я даже не приводил.
Полностью с Вами согласен, что наш диалог несколько затянулся. Поэтому больше не буду отвлекать Вас. Тем более, что Вы ни разу не ответили на прямо поставленный вопрос, а только обвинили в ошибках и отсутствии фантазии.
Yashazz; rabid_otter; +2 – Ответить
140. AntonProgma 50 30.06.21 21:35 Сейчас в теме
(139) Вам нужно принять несколько фактов:

1. Пост предлагает рассмотреть возможность использования в 1С инструментов, которые широко применяются в мире, но не реализованы в 1С. Это анонимные функции.

2. Это первый пост, посвященный краеугольному камню всей задумки -- АНОНИМНЫМ ФУНКЦИЯМ. Внимание! Только анонимным функциям.

3. Приведенные примеры Filter и ForEach хоть и выполняют заявленную для них работу, но представлены в очень простом виде. Функция Filter является классическим инструментом для использования других функций, как параметра. На ней легко показать пример такого взаимодействия между функциями. Только за этим Filter в публикации. С ней бесполезно бороться, потому что смысл поста вообще не в этой функции (а в анонимных функциях). Я не собираюсь её использовать в такой реализации (может быть, её аналог, но не этот конкретный Filter). Перестаньте её кусать, она и так неживая! Я предлагал и предлагаю сосредоточиться на самой идее передачи в качестве параметра программных инструкций! Чтобы потом сокращать код анонимными функциями, где это целесообразно.

4. Я использую слово "Библиотека" потому что оно нейтральное и передает суть. Слово "модуль" в 1С подразумевает конкретные сущности. А сейчас я понятия не имею, куда лучше сложить этот код. И это не важно. Речь о технологии работы с анонимными функциями.

5. Я не пытаюсь доказать, что представленная реализация использования анонимных функций единственно верная и должна повсеместно использоваться. Мне нужен инструмент. Если он появится в платформе или кто-то сделает лучше я буду только рад.

6. Сейчас спор между нами идет в двух измерениях. Я говорю, что сокращение повторяющегося кода через вынос его в отдельные функции - это всем известное благо, и если делать вот так, то можно в качестве параметра передавать алгоритмы, а не только данные! Вы же говорите, что вам не нравится Filter. И мне, как рабочий инструмент, он не нравится, но как простой пример использования анонимных функций - зашибись.

7. Вы мне подарили отличную иллюстрацию утверждению, что чем меньше кода, тем легче сопровождать и разрабатывать. До последнего вы настаиваете, что нет никаких проблем, написать лишний цикл с условием. Это, мол, привычно и легко всеми воспринимается. Но при этом вы сами не способны увидеть маленькую опечатку в собственном коде, про ошибку в котором вам сказали. Код менее чем в 20 строк. Он элементарный, он написан вами в самом удобном для вас виде. И вы полдня не можете найти, что желая умножать четные числа на 3 (это в моем примере, который вы транслировали, и у вас в комментарии), умножаете их на 2. Я понимаю, что ваш пример был о другом, но когда речь зашла о том, что в этом коде ошибка, вы не смогли её увидеть! Поэтому я и настаиваю, что уменьшение количества кода за счет использования универсальных функций - важно. А лишние доли секунды на компиляцию и лишние байты на хранение кода -- это несущественная капля в море.

8. Цель публикации не в продаже идеи. А в призыве публично её обсудить, найти изъяны, прикинуть перспективы. А вы отвлекаете внимание и тратите силы на вопросы, которые где-то сбоку. Я пытаюсь вернуть вас в русло.
Dementor; avryanovalexey; +2 – Ответить
198. Darklight 38 01.07.21 17:54 Сейчас в теме
Отличный проект. Давно мечтал сам сделать такое. Пусть хеётеры хейтят - применение найдётся. Хотя не Вы первый тут предлагаете сделать функции высшего порядка в 1С.
Только пара замечаний:
1. Не используйте оператор "Выполнить" - всегда используйте встроенную функцию "Вычислить"- т.к. "Выполнить" не работает в WEB-клиенте и на мобильном клиенте.
2. Функция "Вычислить" не работает и под iOS вообще - вот тут лямбда функции никак не прикрутить. Но можно ограничено прикрутить передачу ссылок на готовые функции через "ОписаниеОповещения" и вызов через встроенную функцию "ВыполнитьОбработкуОповещения" - но это очень ограниченное применение получается (см синтаксис-помощник), но будет работать на iOS

P.S.
Но сам пришёл в выводу, что расширять язык 1С типовыми путями почти бесполезно. Нужно расширять компилятор 1С. Но.... байткод доступен для ограниченных мест метаданных - значит нужна кодогенерация - в общем та ещё ...опа! Связываться тоже пока не хочется. Хотя идея перенести язык Kotlin в платформу 1С Предприятие 8 меня пока не покидает
Mechanist; +1 – Ответить
200. AntonProgma 50 01.07.21 18:16 Сейчас в теме
(198) спасибо за советы! Подумаю, как их применить.
231. Yashazz 4931 02.07.21 13:55 Сейчас в теме
(198) Кстати, клиентские действия я именно на описаниях оповещений и делаю, плюс цепляю обработчики ошибок описаний и при нужде делаю raise с передачей аргумента) Ничо так способ)
199. sertak 330 01.07.21 17:59 Сейчас в теме
1. Любые подобные эксперименты всегда достойны уважения. Что-то кем-то применится, что-то нет, но это вторично. Не все же обработки инфостарта пользуются спросом. А первичен интеллектуальный труд. И он всегда достоин уважения.

2. Что касаемо применимости для себя: если бы я подумывал начать пользоваться при разработке изложенными здесь идеями и механизмами, первое, что остановило бы меня - проблемы при отладке. Как инженер, использующий произвольный код, как доставшийся в наследство, так и внесенный мной, предполагаю, что высока вероятность, что польза от применения пусть самых божественных абстракций, взятых из лучших практик идеальных языков программирования и прочее, могут перекрыться ухудшением читаемости кода и увеличением затрат на отладку. Ну, и порог входа на обслуживание этого кода увеличивается, но это до кучи уже.
Всё или почти всё это коллеги уже писали выше, просто еще одно скромное мнение.

3. Если я заподозрен в каком-то скепсисе, критике или типа того - см. пункт 1.
201. AntonProgma 50 01.07.21 18:21 Сейчас в теме
(199) спасибо за мнение. Мне как автору, конечно, приятны любые слова поддержки, но скепсис и критика важны не менее. Хочу сохранить трезвый взгляд, но выжать из идеи всё возможное. Морально с самого начала готов, что в итоге может получиться пшик. Но вдруг что-то полезное выйдет!
203. kalyaka 1190 02.07.21 10:30 Сейчас в теме
Если выделить для результата функции предопределенную переменную Результат, то не нужно заморочек с компиляцией.

Если использовать нормальную функцию, то будет еще и отладка :)

Несмотря на то, что в статье указано на использование оператора Вычислить, в коде я его не увидел. Между тем, в отличии от Выполнить, Вычислить работает везде: в вебе, в мобильных (iOS, Android).

Хотелось бы увидеть примеры, где автору реально помогла такая абстракция. Что-нибудь в виде, вот задача, которая решается обычным алгоритмом вот так, а при применении Лямбда все становится проще :)

Хотя автор и утверждает, что объяснение полезности - это не цель статьи, мол в других языках и в общедоступной практике программирования это уже давно признанный факт, - применительно к 1С это все-таки может быть не так. Слишком чуждое в среде 1С решение, какое бы полезное не было в других местах, может оказаться на практике громоздким и неуклюжим на 1С :)
204. AntonProgma 50 02.07.21 10:56 Сейчас в теме
(203) спасибо за ответ!

Если использовать предопределенную переменную, то код не может быть универсальным. А если написать обычную функцию, то её нельзя передать.

Про полезность, надеюсь, станет понятно в дальнейшем развитии темы.
205. kalyaka 1190 02.07.21 11:02 Сейчас в теме
(204)
если написать обычную функцию, то её нельзя передать
Почему же нельзя - также по имени. Возможно потребуется еще передать контекст.
код не может быть универсальным
чем то можно пожертвовать, если это дает больше преимуществ.

Жду продолжения темы :)
206. AntonProgma 50 02.07.21 11:15 Сейчас в теме
(205) а как вы передадите функцию в другую функцию?
207. kalyaka 1190 02.07.21 11:32 Сейчас в теме
(206) Наверное я бы запаковал описание Лямбды в структуру типа Лямбда = Новый Структура("ИмяФункции, Контекст, Данные", "СделатьЧтоТо", ЭтотОбъект, СписокОбъектов) и передавал уже ее.
208. AntonProgma 50 02.07.21 11:41 Сейчас в теме
(207) это следующий этап) я уже все немного переписал. Но принцип пока тот же - есть ядро, которое умеет выполнять код с использованием параметров. Над ней конструктор похожих на ваш пример структур. Следующий этап - модуль таких функций. ООП не уверен, что нужен, но ради теста реализуют.
232. Yashazz 4931 02.07.21 13:57 Сейчас в теме
(207) Для этого достаточно, чтобы ОписаниеОповещения заработало на сервер и нормально сериализовалось. Ну и чтоб идентификаторы модулей были сериализуемы. И тогда всё, ничего изобретать не нужно.
209. van_za 333 02.07.21 11:44 Сейчас в теме
Круть!!!
Не пробовал но одобряю!!!
ForEach(Массив, "Если _1 % 2 = 0 Тогда Возврат _1 * 3; КонецЕсли;"); - может изменить имя фнкции ForEach -> map...
редко кто то замахивается на концептуальные идеи!!!
210. AntonProgma 50 02.07.21 11:54 Сейчас в теме
(209)спасибо! Я хочу в виде примера реализовать стандартные функции работы с массивом. ForEach может вообще не нужен. Это был аналог одноимённого цикла из js.
kalyaka; van_za; +2 – Ответить
273. van_za 333 02.07.21 17:45 Сейчас в теме
(210)
я однозначно хочу попробовать в своем проекте ваш подход работы с коллекциями
277. AntonProgma 50 02.07.21 17:48 Сейчас в теме
(273)ого! Сделаю все от меня зависящее!
216. profiprog1c 260 02.07.21 12:39 Сейчас в теме
Адская дискуссия)) Как по мне, изобретение топикстартера чем-то напоминает "монументальную" вещь Михаила Калимулина (он есть или был на инфостарте) со своим Блокчейном в 1С. Ему там тоже писали, что теоретически все красиво, на практике нельзя использовать, потому что работать не будет. У него даже была поделка под названием Визуальное программирование, точно не помню, название, но тоже из той же серии. Ну так и эти лямбды. Практической пользы от них никакой, зато топикстартер таки смог реализовать чего нет в 1С))
220. AntonProgma 50 02.07.21 13:12 Сейчас в теме
(216) а сокращение записи банальных вещей (например, обработки коллекций) вас не привлекает?
222. profiprog1c 260 02.07.21 13:26 Сейчас в теме
(220) Как тут писали уже многие, так и я напишу, теоретически вроде бы и красиво, но на практике я не вижу реального применения. Повторюсь, тут уже это писали, это изобретение велосипеда заново. И еще добавлю кое-что. Понимаете, 1С - это программирование для учета хозяйственной деятельности. Больше ни для чего другого 1С не годится на практике. В 1С и так куча всяких инструментов, которые периодически меняются, за этим нужно успевать следить. А ваша поделка, это программирование ради программирование, типа посмотрите, вот как я могу. И отлично, но практического применения мало, либо вообще нет
rabid_otter; +1 – Ответить
224. AntonProgma 50 02.07.21 13:29 Сейчас в теме
(222) массивы абстрактны. Им все равно, в рамках какой задачи использоваться. Следовательно, код работы с ними тоже не зависит от конфигурации.
229. profiprog1c 260 02.07.21 13:51 Сейчас в теме
(224) Не поверите, вы как Михаил Калимулин, как с ним, так и с вами спорить бесполезно. Тот тоже пел про абстракции и спорил по посинения, что его Блокчейн "взлетит", но не взлетел. Так и ваши лямбды. Выбирать нечетное число, ах какая сложная задача, которая требует именно отдельной библиотеки. Очень полезно и практично. Поверьте, это глупо))
233. AntonProgma 50 02.07.21 13:57 Сейчас в теме
(229) а мне кажется глупым для программиста упускать их вида, что отбор нечетного числа - это инструкция, передающаяся в отдельную библиотеку. Понимаете? Можно другую инструкцию передать, и та же библиотека справится. Это тривиальные в прикладном программировании вещи. Не обязательные, но удобные.
234. profiprog1c 260 02.07.21 14:02 Сейчас в теме
(233) Хорошо. Я вам привожу примеры, то с чем реально я недавно работал в 1С, делал для конкретных заказчиков. Заказ №1 - Автоматизировать управленческую зарплату и управленческий табель, обязательно так, как мы раньше считали в экселе, с такой расцветкой, с такими печатными формами, чтобы все было красиво. Заказ №2 - сделать, чтобы при реализации товара в расходной накладной при включенных красных остатках, можно выбирать нужный склад, чтобы на него красные остатки не работали. Вот два конкретных примера, где мне в них пригодятся ваши лямбды? И да, основное пожелания заказчика, сделать побыстрее, потому что им нужно это было еще вчера.
unknown181538; rabid_otter; Yashazz; +3 – Ответить
236. AntonProgma 50 02.07.21 14:07 Сейчас в теме
(234) у вас где-нибудь есть обход коллекции с каким-нибудь действием над элементами?
237. profiprog1c 260 02.07.21 14:09 Сейчас в теме
(236) А вы сами подумайте)
238. AntonProgma 50 02.07.21 14:12 Сейчас в теме
(237) подумал, выводы не утешительные напрашиваются. Боюсь, не смогу вам помочь.
239. profiprog1c 260 02.07.21 14:13 Сейчас в теме
(236) Мы с вами разговариваем на разных языках. Вы пытаетесь придумывать велосипед, потому что вам просто делать нечего у вас нет реальных задач. Я же занимаюсь противоположным, выполняю заказы клиентов, у меня нет времени изобретать велосипеды, а тем более вникать в велосипеды других. Ваш велосипед, никому кроме вас не нужен. Да и вы сами, через какое-то время поймете, что это все детский сад. А пока вам кажется, какой вы крутой изобретатель придумали как через одно место искать нечетные числа.
rabid_otter; mvgfirst; +2 – Ответить
245. neikist 02.07.21 14:57 Сейчас в теме
Вообще офигиваю с многих комментариев в этой теме, как все эти люди без абстрактного мышления в программисты то попали? Почему для механизма низкоуровневой организации кода, который по сути вроде циклов и условных операторов просят примеров решения прикладных задач? Это все равно что просить примеров решения задач на циклах, ведь цикл можно получить используя Перейти и Если совместно. Так зачем нам циклы? Давайте пример расчета себестоимости на циклах а не Перейти, иначе циклы ваши не нужны.
253. AntonProgma 50 02.07.21 15:37 Сейчас в теме
(245) я так когда-то делал. Расчёт себестоимости в реальном времени методом fifo. С обходом по очереди документов и накопления информации в дереве. Коллекция)
254. Yashazz 4931 02.07.21 15:37 Сейчас в теме
(253) вот с этого места подробнее. Можете описать, как лямбда-функция упрощает такую задачу?
255. AntonProgma 50 02.07.21 15:40 Сейчас в теме
(254) я попозже набросаю алгоритм и вместе разберёмся!
264. Yashazz 4931 02.07.21 16:40 Сейчас в теме
(245) Товарисч, вы всех-то огульно в идиоты не записывайте, ага. Если на улице пробка, и я иду дворами пешком, то это не значит, что я не умею водить и удостоверения нет.
Дело не в абстрактном мышлении. Дело в условиях задач и их практике - наработанной, проверенной, испытанной - практике. Вот, к примеру, не нравится мне, что у 1С конструктор массива не умеет сразу пихнуть в него нужные данные, как это есть для структуры. И что? Я могу поизвращаться, но большинство прикола не поймёт и право будет.

Да, я до сих пор не понимаю, зачем нужны отдельные операторы цикла. Та же логика, та же степень сложности написания, только ещё ограничений больше. Мне хватало goto/gosub и всяких прочих. А цикл... То шаг жёстко задан, то направление, то надо учитывать, с последней итерацией он или нет, то пост-условие нормально не пропишешь, то значение итератора не трожь, ибо сглючит... Ну нафиг.
Имхо, половина утверждений о кошмарности таких подходов базируется на неумении их правильно готовить.
276. neikist 02.07.21 17:47 Сейчас в теме
(264) Гм, после второй части вашего сообщения спорить смысла не вижу. Хорошо что мы вместе никогда не будем работать, не хотел бы ваш код поддерживать.
isMe; starik-2005; +2 – Ответить
280. Yashazz 4931 02.07.21 19:20 Сейчас в теме
(276) И опять вас подводит восприятие) Если я не понимаю, зачем что-то нужно, это не значит, что я не пользуюсь и не владею.
Настоятельно советую вам, без обид, поработать над восприятием действительности, а не мнимых представлений о словах и действиях окружающих. А то, знаете, я вам пишу "а", а вы видите "б" и обобщаете уже вовсе некорректно)
283. starik-2005 3309 03.07.21 08:20 Сейчас в теме
(264) Вы серьезно про го то или щутите? Или просто черта характера выползла из темных переулков сознания, ища очередную жертву в приступе маниакальной социопатии?
288. Yashazz 4931 03.07.21 22:25 Сейчас в теме
(283) Конечно второе)) Только это не просто социопатия, это злобный наглый троллинг изрядной толщины)
270. mixsture 02.07.21 17:22 Сейчас в теме
Без поддержки платформой, имхо, толку от всего этого немного. Вот как отлаживать анонимную функцию? Думаю, это все заиграет другими красками, если такие функции над коллекциями можно будет параллелить без снижения компактности - а это опять же очень глубокая поддержка на уровне платформы. Ну и нормально отлаживать. Но ничего подобного пока не видно.
272. AntonProgma 50 02.07.21 17:38 Сейчас в теме
(270) ну как бы да, толку может и не быть. Просто основная задача придти к модулям и объектам с методами, и уже там поискать больше смысла. Но без этой базовой функции никуда дальше не попасть.
282. starik-2005 3309 03.07.21 08:14 Сейчас в теме
Однозначно правильное движение в сторону декларативного программирования. Жду, когда в 1С появятся функции высшего порядка - это решило бы массу проблем.

Лично я применяю подобный подход в рекурсивных обработках деревьев и прочих подобных конструкций (допустим, десереализованных структур и соответствий из JSON - а как их еще обрабатывать?), когда терминальное условие задается кодом, также кодом задается эффективное вычисление. В итоге одна функция рекурсивного обхода решает множество подобных задач.

Вообще, умные существа это все придумали для того, чтобы максимальное количество кода использовалось повторно, чтобы костыли и велосипеды были максимально управляемы и имели минимальное количество экземпляров, ожидая, когда же придет архитектор, который положит конец этому конкретному костылю и велосипеду.

В общем, афтор, не обращай внимание на 1С-негов, которые наколотили тебе минусов - это проблема старения профессии, ибо даже в 35 лет уже становится сложно учиться, тем более ближе к полтиннику, а куча "матерых" 1с-негов уже дышат в эту отметку, а кто-то ее даже преодолел.

ЗЫ: на днях столкнулся с челом, который топил за обычные формы (меня только от привязок этих передергивает), при этом не мог обойти структуру, сериализованнуи из JSON и попросил вытащить ее в дерево. Я после этого понял, на сколько может быть 1С-нег примитивен в своем разумении. А чел конфы с нуля пишет, не понимаю только, почему он их на 8-ке рисует, а не на 7.7 - там то вообще всех этих проблем не было)))
284. AntonProgma 50 03.07.21 08:25 Сейчас в теме
(282) спасибо! Вчера, кстати, замерял возможности 1с на рекурсию. На 1000 вложений ещё работает. На 2000 программа падает. И скорость вызова функций сама по себе медленная. Вызвать создание массива на 100к чисел занимает 1-2 секунды на моем ноуте. А 100 раз рекурсивно посчитать до 1к - - 32 секунды.
285. starik-2005 3309 03.07.21 08:27 Сейчас в теме
(284) я смотрел как-то глубину стека 1С - было 1748 вроде бы.

В действительности, 99% рекурсивных функций весьма неглубокие - ну максимум 10 (тот же обход каталогов или групп товаров).
286. AntonProgma 50 03.07.21 08:34 Сейчас в теме
(285) Я задумался, не означает ли это, что обычный вызов функции в коде 1с заметно тормозит работу программы. То есть, можно ли в случаях, когда сильно нужна производительность, написать весь код как одну функцию - с дублированиями, плохо читаемую, но с производительность в 15-30 раз быстрее?
287. starik-2005 3309 03.07.21 09:47 Сейчас в теме
(286) в 1С производительность сильно зависит от количества строк. Если все написать в одну строку, то будет существенно быстрее. А вызов функции увеличивает количество строк, т.к. добавляется количество строк функции. Поэтому если функция маленькая (типа return x * x), то, конечно, лучше сразу написать "а = х * х" , а не "а = foo(х)".

С другой стороны, что такое время? Я, конечно, много писал на 1С того, чему стоило бы работать как можно быстрее, но ускорить можно не только количеством строк, но и алгоритмом. Вот, например, недействительные паспорта. Можно загрузить их в БД для проверки - в 1С-ный регистр сведений загрузка легко займет 10 часов (если многопоточно, то пять, т.к. после загрузки в регистр 20кк записей параллельная запись будет сталкиваться с огромным количеством взаимных блокировок даже на очень хорошем железе). Если же просто в файлы с номером серии выгрузить список номеров - это уже 40 минут. При том проверка вместо минуты займет три, но мы же сэкономили 9 часов времени - можем три минуты подождать. А если вспомнить дискретную математику, то загрузка начинает занимать 10 минут, проверка - пару секунд. И ни одна таблица СУБД не пострадает от этой одноразовой информации, ибо все дело в алгоритме (на С загрузка файла без разархивации занимает вообще 2 секунды - сравните с 10-ю минутами на 1С в одну строку).

В общем, если ищите скорости - 1С тут нервно курит в углу даже по сравнению с Питоном. При том в Питоне итератор по генератору работает быстрее, чем обычный цикл (т.е. "For i in range(1,1000)" работает быстрее, чем "For (i=0;i<1000;i++)" ), но кому это интересно, да?
AseevAndrew; Yashazz; +2 – Ответить
294. BaldKiwi 08.07.21 02:59 Сейчас в теме
в ООП языках, анонимные функции облегчают работу, в 1с это не облегчает, а затрудняет работу с сложными рассчетами и т.д.

Итог: Молодец. Но в 1с это собственно не нужно, 1с не будет ООП языком.
295. AntonProgma 50 08.07.21 07:49 Сейчас в теме
(294) интересный пример нелогичных рассуждений, приводящий к уверенному вердикту)

Анонимные функции не связаны с ООП. Если они затрудняют работу со "сложными расчетами", то с простыми - могут упрощать. И т.д.
296. genayo 08.07.21 08:27 Сейчас в теме
Даже абстрагируясь от сути, эта статья набрала рекордное количество комментов для технической статьи за последние несколько лет. Респект автору.
unknown181538; +1 – Ответить
297. AntonProgma 50 08.07.21 08:47 Сейчас в теме
(296) в основном, моих комментов). Для следующей не менее спорной темы я подготовил пару приемов по снижению затрат сил на бесполезные ветки обсуждения!
298. genayo 08.07.21 15:00 Сейчас в теме
(297) Так это не монолог был с вашей стороны, вас спрашивали, вы отвечали. В общем, нормально получилось. А практически я тоже не вижу смысла ваши наработки применять.
299. slavawashere 20.07.21 10:43 Сейчас в теме
Программируя меньше всего хочется постоянно переключаться между раскладками, поэтому не понимаю зачем сама 1С вводит методы типа "ЧтениеJSON"

Может быть вместо ForEach и Filter использовать русские названия? ДляКаждого , Фильтр и т.д.?

Исключительно ради уменьшения необходимости переключения раскладки
300. AntonProgma 50 20.07.21 10:58 Сейчас в теме
(299) согласен, раздражает. Здесь английский служит для подчеркивания инородности отделения системы от стандартного 1с. Ради удобства восприятия. До рабочей версии ещё предстоит дойти.
301. matytsin_new 21 02.11.21 12:10 Сейчас в теме
Полностью поддерживаю идею автора.
Грустно, что энтузиазм автора оценивается как призыв делать всё через анонимные функции. Может лучше подумать, а как вообще возникли такие идеи у человека, ограниченного языком платформы? Неужели всё так просто, и это только желание автора реализовать любимое ООП в платформе? Мне кажется, для того, чтобы начать это придумывать всегда нужен какой-то дополнительный толчок, что-то, что мешает полностью принять ограничения платформы.
Сомневаюсь, что в процентном соотношении тех, кто знает почему платформа устроена именно так и без ООП наберется хотя бы пятая часть.
Однако, хочу отметить, что хоть автор и думает о реализации ООП, средства, которые он реализует, по большей части есть средства функционального программирования.
Давайте на время забудем про рекомендации по методике разработки. Автор предлагает воспользоваться одними из самых мощных на сегодняшний день концепций разработки, в силу известных причин, не реализованных в платформе напрямую.
Эти концепции: Closure (лямбда-прототипы их основа), For_Each, Filter, Map, Reduce.
Хорошая корректная реализация этих концепций используется в масштабируемых распределенных вычислениях. Ведущие ИТ-компании сделали ставку на эти концепции и не прогадали.
Да, в рамках простого сопровождения, или написания рутинного кода отчетов и обработок такие инструменты могут выглядеть избыточно и монстроузно. Реализация этих концепций средствами платформы получается перегруженной кодом компиляции и т.п., но это работает.
Думаю, что простое знание того, что такие инструменты могут быть реализованы средствами платформы, и понимание спектра задач, которые стоит в рамках платформы решать такими средствами позволяет четче планировать архитектуру будущего приложения.
И заметьте, это я еще нигде не говорил о том, что это реально стоит применять. (Фактическое применение методик из статьи автора действительно должно быть обоснованно)
Однако умение представлять решение в терминах таких концепций позволяет на начальных этапах проектирования видеть, какие возможности приложения не укладываются в эти концепции и заранее принять меры по обеспечению масштабируемости.
Лично у меня случился некий качественный скачок мыслей, который и побудил меня высказаться:
На входе - статья автора с рабочим примером, с конкретикой, в которую обычно упирается мышление человека, привыкшего к декларативному программированию, и незнакомого или поверхностно знакомого с функциональным. (Это реальный барьер, мне известны разработчики, которые ну никак не могут принять идеи функционального программирования)
На выходе - идеи, как организовать проектирование новых решений.
Возможно я недостаточно понятно перешел от статьи автора к концепциям функционального программирования и от них к масштабируемости, но тут кратко изложить не получится. Может лучше получится объяснить ход моих мыслей если посмотреть описания файловых систем Hadoop и Google File System, где связка map-reduce является существенной частью системы.
Вы можете возразить, что указанные файловые системы далеки от задач, решаемых (в общей массе) в системах учета компаний, использующих решения на платформе "1С: Предприятие".
Соглашусь - далеки. Но дело не в самом перечне задач, а в методике проектирования решения. Если ваше решение легко формулируется в рамках map-reduce, то все, что лежит ниже уровня реализации map-reduce можно считать черным ящиком, а все, что выше может быть реализовано в масштабируемой гетерогенной среде, главным требованием которой являются только одинаковое понимание map-reduce частями системы. И тогда проектируемое решение уже точно становится масштабируемым до уровня вышеозначенных файловых систем, а это ценное преимущество.
Это лирика. Мое предложение автору такое: можно реализовать оптимизацию выполнения кода за счет кэширования. Для каждого исходного текста можно построить маркировку быстрыми ключами. Аналогичную маркировку для откомпилированного текста. Кроме того, завести дерево включения кода (когда в компилируемом коде тоже находятся объявления лямбд и т.д. в глубину). Это даст возможность осуществлять перекомпиляцию исходного текста только тогда, когда на этапе выполнения какой-то блок внутри кода был динамически перестроен.
Если к этому добавить менеджер контекста и стек возврата, то можно будет использовать оптимизацию выполнения итераторов за счет разворачивания хвостовой рекурсии в плоские циклы, что дает защиту от переполнения стека и существенное ускорение выполнения кода, поскольку основной код всегда будет выполняться циклом до опустошения стека возврата (вернее до опустошения менеджера контекстов).
PS. Первое применение для такого механизма я увидел в реализации универсального кода доступа к данным по структуре метаданных. Т.е., например, на входе таблица регистра, и набор полей и индивидуальных условий, по которым необходимо сложным образом отфильтровать данные. Можно построить такие лямбда-выражения, которые позволят формировать текст запроса к специфическим полям регистра. Причем у лямбд, генерирующих запрос к полю регистра на входе лямбды условий отбора. Может получиться красивый инструмент с визуальным конструктором, значительно ускоряющий разработку запросов.
302. AntonProgma 50 08.11.21 20:27 Сейчас в теме
(301) Большое спасибо за комментарий! Только я не имею цели реализовать ООП в 1С. Его появление (или его имитация) - всего лишь следствие возможности помещать функции в переменные и свойства структур. Но можно обойтись и процедурным подходом.

Основная же цель, как я сейчас вижу - динамическая загрузка текстовых модулей или отдельных функций с возможностью автоматического получения их обновленных версий из репозитория (например, с github). Тут, конечно, не обойтись без компилятора со стеком. Им я и занимаюсь в свободное время.

А при наличии компилятора можно даже улучшить синтаксис и семантику языка 1С. Вплоть до того, чтобы программисты смогли писать на чем-то близком к javascript или python в системе 1с. Это полезнее, чем выносить примитивный язык 1С вовне.
303. matytsin_new 21 09.11.21 09:31 Сейчас в теме
(302) По поводу улучшения языка, я имея некоторый опыт разработки компиляторов скорее пессимистичен. Мой личный опыт говорит о том, что это неплохо в рамках некоего узкого круга, до тех пор, пока не начинается поставка решений, с примененной технологией. А дальше начинается ад версий анализаторов, интерпретаторов, компиляторов, языковых семантик и, как следствие существенные расходы на обновление кода. Поэтому расширение языка должно модерироваться злостными консерваторами.

Но вот динамическая загрузка текстовых модулей, генерация штатного исполняемого кода по неким правилам может существенно упроститься от ввода предложенных конструкций. Несколько лет назад я реализовал подобный проект в рамках коммерческого решения, и он до сих пор успешно работает, и сокращает время выполнения алгоритмов за счет генерации эквивалентного плоского кода взамен рекурсивного. Т.е. на входе алгоритм в виде рекурсивных функций, а на выходе циклический с разверткой хвостовой рекурсии. Там очень активно используется Выполнить() и Вычислить(), и за счет ухода от рекурсии и вложенных запросов было достигнуто ускорение 100х и линейная зависимость от объема входных данных вместо экспоненциальной. Заказчик готов мириться с любыми сложностями в поддержке этого продукта за достигнутое ускорение и гибкость настройки. К сожалению публиковать его не могу, т.к. такой был уговор с заказчиком.
Если без подробностей, то там я анализирую код функций/процедур с рекурсивными вызовами, выделяю циклы и условные операторы, и те конструкции, которые содержат внутри себя вызовы других процедур или функций из определенного перечня преобразую в линейный код с метками, для прохода по коду в состоянии ДО вызова вложенной процедуры/ и, соответственно, после.. Развернутый код посещается циклом управления дважды для каждого вложенного вызова, один раз с признаком подготовки вложенного вызова, другой с признаком подготовки возврата из вложенного вызова. Этапы подготовки заменяются на помещение в стек нового контекста в рамках того же цикла управления. А возврат - освобождение стека и заполнение данными возврата переменной вызывающего контекста, если это была функция с присваиванием. Дальше происходит магия, когда строится суперпозиция всех полученных таким образом циклов управления в одну общую конструкцию. Тут без дерева разбора никак.
Т.е. по сути строится автомат плоского циклического алгоритма эквивалентного рекурсивному и затем превращается в код 1С. А дальше получается готовый код функции. Этот код мы уже тестируем и помещаем в продакшн. Но и он в процессе работы динамически подгружает линейные участки в зависимости от настроек выполнения.

Этот пример я привел к тому, что в нем активно используется аналог предложенного вами решения, но только для генерации текста модулей и для выполнения плоских вставок заказчика.
304. AntonProgma 50 09.11.21 11:06 Сейчас в теме
(303) я пока не дошёл до стека. Модуль у меня в виде структуры, где ключи - имена функций и глобальных переменных. Разбираю текст на лексемы (токены), заменяю вызовы внутренних функций модуля на их код. Первые шаги, так сказать.

Но планирую переделать на плоский код с метками и стеком, чтобы были разные точки входа в API модуля. Насколько я понимаю от классических циклов тоже придётся избавиться, потому что в них нельзя переместить курсор выполнения программы.
307. ActionBlog 15.02.22 16:49 Сейчас в теме
Вопрос к автору - какие принципиально не решаемые обычными методами задачи можно решить при помощи лямбда функций? Привносят ли они что-то полезное в разработку?
308. AntonProgma 50 15.02.22 17:03 Сейчас в теме
(307) большой вопрос - что считать обычными инструментами разработки. Обычные для 1с или вообще?
309. ActionBlog 16.02.22 09:17 Сейчас в теме
(308) Да, обычными для 1С. Какие принципиально не решаемые обычными для 1С методами задачи можно решить при помощи лямбда функций? Привносят ли они что-то полезное в разработку на 1С?
310. AntonProgma 50 16.02.22 10:26 Сейчас в теме
(309)
Разумеется, принципиально можно обойтись и без лямбд, тем более, реализованных на том же языке. Но также принципиально можно обойтись и без таблиц значений, однако их наличие в ряде случаев помогает решать некоторые задачи значительно проще, чем без таблиц. Примеры использования лямбд, как объектов первого класса приведены в статье. Но данную реализацию я сам не использую в работе и другим не рекомендую.
311. ActionBlog 16.02.22 14:16 Сейчас в теме
(310) Я хотя бы узнал, что есть вообще такое понятие, как лямбда функции! :)
312. Lancelot-2M 116 15.06.22 00:06 Сейчас в теме
То что мертво умереть не может (с)
Для отправки сообщения требуется регистрация/авторизация