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

28.06.21

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

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

Скачать файл

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

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

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

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

21.05.2024    21047    dimanich70    81    

145

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

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

1 стартмани

18.03.2024    4156    3    John_d    11    

57

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

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

12.02.2024    19339    atdonya    24    

58

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

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

30.11.2023    5599    ke.92@mail.ru    16    

65

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

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

28.08.2023    15094    YA_418728146    7    

169

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

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

2 стартмани

22.08.2023    3669    57    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 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    18619    172    sapervodichka    112    

135
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ip0593 20 28.06.21 12:11 Сейчас в теме
получается нужно будет вникать в этот "1С-ООП", когда увидишь сие доработки у кого-то? а если такие приемы еще и в типовые добавят...
Lancelot-2M; Рамзес; pbahushevich; rabid_otter; +4 Ответить
2. AntonProgma 48 28.06.21 12:17 Сейчас в теме
(1) Такова доля айтишника. Всё время во что-то вникаешь новое.
starik-2005; +1 Ответить
3. bulpi 217 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 48 28.06.21 12:19 Сейчас в теме
(3) интересно, почему? Вопрос без подколок.
79. artbear 1563 29.06.21 17:59 Сейчас в теме
(3) Такое себе решение.

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

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

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

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

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

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

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

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

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

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

нет ну так точно не нужно делать , в смысле смешивать код конфигурации и код хранящийся где то в справочнике. Внешний код (справочник) , на мой взгляд , удобно использовать для решения различных мелких задач (команды , регламенты , хранилище разнородной информации, быстрое прототипирование итп ) наподобие подключаемых обработок.
305. axelerleo 346 26.01.22 13:36 Сейчас в теме
(281) Увы, сами 1С в Документооборот такое делают - только в путь! Пользовательские обработчики бизнес-событий, проверка выполнения условий этапа бизнес-процесса, как пример :)
306. pm74 203 26.01.22 13:48 Сейчас в теме
(305) если это удобно , почему нет
16. Evil Beaver 8248 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 48 29.06.21 15:14 Сейчас в теме
(16) лапша - это то, чем у некоторых уши связаны в голове, чтобы не отваливались. Пост не про то, как с коллекциями работать.
18. Evil Beaver 8248 29.06.21 15:18 Сейчас в теме
(17) аа, ну тогда я спокоен )
19. AntonProgma 48 29.06.21 15:26 Сейчас в теме
(18) в любом случае я постараюсь создать продукт (концепцию) так хорошо, чтобы вы забыли про никсена навсегда!)
73. Evil Beaver 8248 29.06.21 17:41 Сейчас в теме
(19) А я смотрю вы недавно на сайте, да? Ну если Вы серьезно собираетесь переплюнуть по количеству полезных проектов меня или @nixel2007 - я только за! Сообществу нужно больше крутых инструментов.
ardn; axelerleo; Redokov; DJ_Codebase; Perfolenta; Yashazz; +6 Ответить
85. AntonProgma 48 29.06.21 19:46 Сейчас в теме
77. пользователь 29.06.21 17:50
Сообщение было скрыто модератором.
...
111. brr 184 30.06.21 10:15 Сейчас в теме
(16)Прикольно, она ещё и ленивая.
112. AntonProgma 48 30.06.21 10:23 Сейчас в теме
(111) только до вызова. Потом, как обычно.
125. brr 184 30.06.21 12:35 Сейчас в теме
(112) Не понял вашего комментария, я про библиотеку fluent, судя по коду она как раз ленивая. Все действия выполняются когда мы получаем результат.

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

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

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

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

Только вот это "своё место" вы пока не назвали.
35. AntonProgma 48 29.06.21 16:08 Сейчас в теме
(33)да вон же написаны примеры!
37. Yashazz 4794 29.06.21 16:11 Сейчас в теме
(35) Нет, я про реальную задачу. Бизнесовую. Прикладную. Кататься на велосипеде по канату дело красивое, но для единиц, а уметь водить такси в час пик - другое, для десятков тысяч.
40. AntonProgma 48 29.06.21 16:14 Сейчас в теме
(37) функция фильтрации не реальна?
45. Yashazz 4794 29.06.21 16:21 Сейчас в теме
(40) В таком общем виде - нет. Если мы говорим про анализ текста, так это другими способами лучше и проще делается, и почти все они в 1С доступны гораздо адекватнее, чем через "Выполнить".
86. AntonProgma 48 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 4794 02.07.21 12:20 Сейчас в теме
(141) У меня было наоборот. После чистого Си и не менее чистого Паскаля 5.0 (не путать со всякими там 5.5!), без турбо-среды ещё... Попадается мне эдакий макроязык формул Бухгалтерия 6.0, а затем его мощное супер-развитие в 7.0 и 7.5. И ничего, носом не крутил, мне даже больше нравилось. Возможно, засчёт IDE. А может, это свойства характера. Есть языки, где всё разрешено, что не запрещено - таковы многие современные, таким всегда был классический Бейсик, PL2 и многие другие. И есть наоборот, всё сурово и строго. Так вот, не исключаю, психологизм здесь иной - не только и не столько инерция "почерка" и восприятия, сколько именно личные наклонности в "границах свободы". Ну а всё остальное можно оправдать или обхаять, при наличии мотивации-то.
202. sashocq 193 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 48 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 4794 29.06.21 16:25 Сейчас в теме
(44) вот кстати да, вспоминаем KISS.
57. AntonProgma 48 29.06.21 16:35 Сейчас в теме
(44) реальнее, говорят, написать Forth.

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

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

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

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

Кому нужно? Я сталкивался, пожалуй, со всеми областями применения 1С, кроме мобильной сферы, и не придумал, где бы было нужно.
62. AntonProgma 48 29.06.21 16:45 Сейчас в теме
(58)я же анонсировал, что вторая публикация будет про упрощение и в чем оно выражается. Предвидел.
64. Yashazz 4794 29.06.21 16:47 Сейчас в теме
(62) а, т.е. надо сначала намутить нечитабельное для 90% одинэсников, спрятать под капот, обнаружить десятикратный проигрыш по скорости, нарваться на многое из перечисленного мной в (31), а потом начать упрощать? Мсье знает толк)
66. AntonProgma 48 29.06.21 16:52 Сейчас в теме
(64)любую вашу функцию можно при таком настрое объявить нечитабельной и замедляющей работу. Это вопрос адекватности. Как видите, нашлись люди, которые прочитали и поняли. Если хотите, могу вас использовать, как нижнюю границу, типа "сварливый олинэсник". Но ориентироваться на ваш взгляд на мир слишком тоскливо.
167. zfilin 2355 01.07.21 12:08 Сейчас в теме
(66) Известно, что Yashazz редкий зануда. Но тут я больше с ним согласен, чем нет.
Выглядит интересно, красиво, но практические применения приходится, скорее, специально придумывать, чем "о, боже, я давно хотел чтобы вот тут это было".
Cерый; +1