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

28.06.21

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

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

Скачать исходный код

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

«Анонимные функции, функции как переменные, методы для структур и соответствий, классы/прототипы, наследование! Где это всё?!» — спросите вы меня. И я уверенно отвечу: «Здесь». В этой теме ключ ко всему. Решение небольшое, элегантное, исключительно на встроенном языке 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.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    2915    2    John_d    11    

56

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

12.02.2024    5138    atdonya    22    

52

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    4129    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9480    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2274    26    progmaster    8    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16392    143    sapervodichka    112    

130

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7370    quazare    8    

110
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
75. AntonProgma 46 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 46 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 46 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 46 01.07.21 10:28 Сейчас в теме
(150) а почему через выполнить это однозначно зло?
Mechanist; pm74; +2 1 Ответить
153. rabid_otter 134 01.07.21 10:32 Сейчас в теме
(151) сколько раз вам нужно написать одно и тоже?
155. AntonProgma 46 01.07.21 10:37 Сейчас в теме
(153)ещё разок, пожалуйста.
156. rabid_otter 134 01.07.21 10:37 Сейчас в теме
157. AntonProgma 46 01.07.21 11:00 Сейчас в теме
(156)ну вы просто несколько раз сказали, что не надо использовать выполнить / eval. Но почему, не объяснили, сославшись на js, до которого 1с, как до Китая. Так что, если ваш способ аргументации повторять слово "нельзя", то беседа зайдёт в тупик. Можете, хотя бы дать ссылку, где объясняется, почему выполнить никогда нельзя использовать? И тогда мы конструктивно сможем обсудить, почему в типовых решениях от фирмы 1с не стесняются это применять.
158. rabid_otter 134 01.07.21 11:22 Сейчас в теме
(157) ну ок, итерация № 100501, уже все написано в (78)
160. AntonProgma 46 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 46 01.07.21 12:33 Сейчас в теме
(161) абсолютно весь код потенциально опасен. Неотлаживаемых вещей в 1с итак хватает. Это не аргумент однозначного запрета. Тут наш коллега ошибся в цифре и не мог это найти. Это же не значит, что не надо программировать, потому что можно сделать опечатку? Риски, конечно, повышаются без подсветки и прочего, но это все равно вопрос личного выбора, а не табу.

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

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

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

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

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

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

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

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

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

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

В общем угроза безопасности есть, но я не вижу как данное решение его увеличивает от имеющегося изначально.
223. AntonProgma 46 02.07.21 13:26 Сейчас в теме
(221) в случае общего модуля, у него будут стоять галочки Клиент и Сервер, а вызова сервера не будет. И код типа будет выполняться там, где его вызвали. Такой план.
244. neikist 02.07.21 14:51 Сейчас в теме
(218) Вы все же не поняли. Вообще нельзя чтобы никаким образом не было возможности передать "лямбду" с клиента на сервер. Иначе будет инъекция произвольного кода с клиента (любого, не только того что разработчик в конфе написал).
А ведь по любому найдется долбоящер что будет передавать "лямбду" на сервер.
(221) Речь о инъекциях произвольного кода от программы имитирующей "клиент 1с". Если есть возможность передачи лямбды с клиента на сервер - значит такая имитация клиента может передать любой произвольный код на выполнение на сервере. Так что угрозу безопасности увеличивает.
246. kalyaka 1065 02.07.21 15:00 Сейчас в теме
(244) так если вызов сервера не стоит, то как может произойти вызов сервера? :)
247. neikist 02.07.21 15:02 Сейчас в теме
(246) Так просто, разработчик в форме на клиенте передает в метод на сервере код а уже на сервере в форме вызыватся общий модуль который эту лямбду исполняет.
248. kalyaka 1065 02.07.21 15:22 Сейчас в теме
(247) от злостного разработчика, который имеет доступ к конфигурации, как можно уберечься? Или вы говорите про не злонамеренные ошибки программиста, имеющие фатальные последствия?
257. neikist 02.07.21 15:45 Сейчас в теме
(248) Именно про ошибки по невнимательности/незнанию. Впрочем и злонамеренно бекдор проще оставить таким образом, менее заметным будет.
259. kalyaka 1065 02.07.21 15:49 Сейчас в теме
(257) абстракции текут :), но и без них тоже плохо. Прямой связи предлагаемого решения и угрозы безопасности здесь я не вижу.
260. neikist 02.07.21 15:50 Сейчас в теме
(259) Если следить за собой и за кодом (а еще лучше линтеры натравить) то проблем можно избежать, да.
З.Ы. Текущие абстракции оно про чуть другое.
262. AntonProgma 46 02.07.21 15:58 Сейчас в теме
(259)ну имеется в виду, что с клиента ожидается функция для фильтра, а выполняется она на сервере. Тогда кто-то может написать функцию на клиенте, но не для фильтра, и передать её на сервер
249. kalyaka 1065 02.07.21 15:25 Сейчас в теме
(247) или вы имеете в виду какой то уж совсем адский сценарий: лямбды получили распространение и их уже разработчики стали сохранять в реквизитах формы, а код на стороне сервера их исполняет? :) (клиента при этом вскрыли и реквизиты подменили конечно)
251. AntonProgma 46 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 4725 29.06.21 16:03 Сейчас в теме
Не забываем про контекст - "Выполнить" и "Вычислить" видят только свой контекст, и то не полностью. Видимость и доступность переменных и модулей, программных абстракций и синглтонов. Не забываем про профили безопасности и защиту от опасных действий. Не забываем про условную и многослойную компиляцию, с учётом директив препроцессора и нескольких применённых расширений. Не забываем про разную компиляцию выражений для клиента и для сервера. Не забываем, наконец, про отсутствие вложенности перехвата ошибок, манеры Попытка-Исключение в транзакции, про любимый ВызватьИсключение.
Не забываем ведь?))
39. AntonProgma 46 29.06.21 16:12 Сейчас в теме
49. Yashazz 4725 29.06.21 16:25 Сейчас в теме
(39) Вообще это был сарказм.
52. AntonProgma 46 29.06.21 16:28 Сейчас в теме
(49)я так и знал, что вы не серьёзно!
55. Yashazz 4725 29.06.21 16:30 Сейчас в теме
(52) Да нет, это я к вопросу о том, почему предложенное вами решение не просто извратное, а почти неработоспособное.
60. AntonProgma 46 29.06.21 16:41 Сейчас в теме
(55)прогресс вас раздавит, но позже! Берегитесь!
Mechanist; +1 Ответить
89. Yashazz 4725 29.06.21 20:56 Сейчас в теме
(60) Понятно. По существу возразить нечего, принялись паясничать.
rabid_otter; +1 Ответить
91. AntonProgma 46 29.06.21 22:09 Сейчас в теме
(89) О каком существе речь?
93. пользователь 29.06.21 22:12
Сообщение было скрыто модератором.
...
149. neikist 01.07.21 10:16 Сейчас в теме
(31) Ну лямбда все же не обязана быть при этом замыканием. Хотя много где так и сделано.
70. Vladimir_D 119 29.06.21 17:28 Сейчас в теме
Не пойму вот чего. Как это функцию нельзя использовать как параметр? Легко.
КакаяТоПроцедура(КакаяТоФункция(КакойТоПараметр1,КакойТоПараметр2..КакойТоПараметрN),Еще параметры и функции);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Подход-то изначально чужд платформе, а данная реализация не вписывается в стандарты разработки, поэтому применение данного решения изначально сильно ограничено. Поэтому без реальных примеров и сравнительного анализа этих примеров с "классической" реализацией подавляющее большинство ограничится только знакомством с публикацией. Чего греха таить, я в том числе: новое-интересное люблю, но в данном случае отношусь пока скептически)
Оставьте свое сообщение