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

Публикация № 1465926 28.06.21

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

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

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

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

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

Скачать файлы

Наименование Файл Версия Размер
Лямбда-функции на встроенном языке 1С:

.epf 11,23Kb
24
.epf 0.1 11,23Kb 24 Скачать бесплатно

Специальные предложения

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

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

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

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

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

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

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

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

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

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

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

нет ну так точно не нужно делать , в смысле смешивать код конфигурации и код хранящийся где то в справочнике. Внешний код (справочник) , на мой взгляд , удобно использовать для решения различных мелких задач (команды , регламенты , хранилище разнородной информации, быстрое прототипирование итп ) наподобие подключаемых обработок.
16. Evil Beaver 7212 29.06.21 15:06 Сейчас в теме
Лапша какая-то. Несравненный nixel2007 сделал библиотеку fluent https://github.com/oscript-library/fluent которая намного лучше повернута лицом к людям

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

См. также

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо

Практика программирования v8 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    5153    Eugen-S    24    

Стек технологий для 1С

Практика программирования Бесплатно (free)

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

29.11.2021    11806    mrXoxot    73    

saby v8unpack

Практика программирования Бесплатно (free)

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

09.10.2021    2030    Businka76    34    

Замена символов русской раскладки на английские в штрихкоде

Сканер штрих-кода Универсальные функции 1cv8.cf Бесплатно (free)

Берешь такой сканер, сканируешь, а у тебя русская раскладка. И началось - переключи, опять отскань... Простое решение, которое можно доделать под себя.

29.08.2021    614    Mi11er    0    

Использование классов .Net в 1С для новичков Промо

Разработка внешних компонент Универсальные функции Практика программирования v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    86664    Serginio    116    

Девопсы в 1С: микросервис распознавания штрихкодов

WEB Git (GitHub, GitLab, BitBucket) DevOps Практика программирования Бесплатно (free)

Распознавание штрихкода из сканированного документа в PDF.

09.08.2021    1694    alexey_kurdyukov    8    

Снежинка для запроса

Практика программирования Россия Бесплатно (free)

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

21.06.2021    1835    kalyaka    5    

Звуковое управление в 1С 8.3 Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    7621    velemir    33    

Полезные примеры СКД, ч.2

Практика программирования v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    11754    Neti    8    

Полезные примеры СКД, ч.1

Практика программирования v8::СКД Бесплатно (free)

Подборка видео по решению различных задач в отчетах на СКД.

30.03.2021    14778    Neti    21    

Обзор полезных методов БСП 3.1.4

БСП (Библиотека стандартных подсистем) Практика программирования v8 1cv8.cf Бесплатно (free)

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

25.03.2021    46720    rayastar    53    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

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

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    9371    comol    31    

«Варп-двигатель» для «среза последних»

Практика программирования Бесплатно (free)

Решение, позволяющее получить данные, аналогичные "срезу последних" на два порядка быстрее.

10.08.2020    4052    hobi    49    

Не спеша, эффективно и правильно – путь разработки. Часть 3. Практика

Практика программирования Бесплатно (free)

Черновой вариант книги Никиты Зайцева, a.k.a.WildHare. Разработкой на платформе 1С автор занимается с 1996-го года, специализация — большие и по-хорошему страшные системы. Квалификация “Эксперт”, несколько успешных проектов класса “сверхтяжелая”. Успешные проекты ЦКТП. Четыре года работал в самой “1С”, из них два с половиной архитектором и ведущим разработчиком облачной Технологии 1cFresh. Ну — и так далее. Не хвастовства ради, а понимания для. Текст написан не фантазером-теоретиком, а экспертом, у которого за плечами почти двадцать три года инженерной практики на больших проектах.

29.06.2020    13300    WildHare    33    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    41347    unichkin    74    

Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория

Практика программирования Бесплатно (free)

Черновой вариант книги Никиты Зайцева, a.k.a.WildHare. Разработкой на платформе 1С автор занимается с 1996-го года, специализация — большие и по-хорошему страшные системы. Квалификация “Эксперт”, несколько успешных проектов класса “сверхтяжелая”. Успешные проекты ЦКТП. Четыре года работал в самой “1С”, из них два с половиной архитектором и ведущим разработчиком облачной Технологии 1cFresh. Ну — и так далее. Не хвастовства ради, а понимания для. Текст написан не фантазером-теоретиком, а экспертом, у которого за плечами почти двадцать три года инженерной практики на больших проектах.

22.06.2020    13578    WildHare    24    

Не спеша, эффективно и правильно – путь разработки. Часть 1. Парадигма

Практика программирования Бесплатно (free)

Черновой вариант книги Никиты Зайцева, a.k.a.WildHare. Разработкой на платформе 1С автор занимается с 1996-го года, специализация — большие и по-хорошему страшные системы. Квалификация “Эксперт”, несколько успешных проектов класса “сверхтяжелая”. Успешные проекты ЦКТП. Четыре года работал в самой “1С”, из них два с половиной архитектором и ведущим разработчиком облачной Технологии 1cFresh. Ну — и так далее. Не хвастовства ради, а понимания для. Текст написан не фантазером-теоретиком, а экспертом, у которого за плечами почти двадцать три года инженерной практики на больших проектах.

15.06.2020    20589    WildHare    35    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    88308    user5300    28    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    36609    tormozit    106    

JSON в запросах DaJet QL

Практика программирования Бесплатно (free)

Практические примеры работы с JSON непосредственно в языке запросов. Перенос курсов валют между УТ и БП. Требуется SQL Server 2016 и выше.

24.04.2020    4576    zhichkin    6    

Визионное программирование

Практика программирования Бесплатно (free)

Новый способ программирования и его практическая демонстрация.

22.04.2020    5507    mkalimulin    111    

Использование машинного обучения для решения инцидентов. Практическое применение

Практика программирования Бесплатно (free)

Продолжаю (и заканчиваю) тему с автоматическим решением инцидентов. Перейдем от теории к практике.

25.02.2020    5036    Repich    9    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    83180    tormozit    131    

Использование машинного обучения для решения инцидентов

Практика программирования Бесплатно (free)

История о том, как я с помощью машинного обучения сокращал затраты на техподдержку.

18.02.2020    8226    Repich    17    

Основные алгоритмы снабжения на простом примере

Практика программирования Бесплатно (free)

Надо же что-то полезное иногда писать

13.02.2020    6127    1c-intelligence    36    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    70059    ids79    27    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    55096    tormozit    51    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    45754    John_d    22    

Часовой на страже логов

Практика программирования Бесплатно (free)

При поддержке решений, которые установлены у большого количества пользователей на различных системах, очень важно вовремя получать подробную информацию о возникших проблемах. О том, как собирать логи и анализировать полученные данные в трекере ошибок Sentry на конференции Infostart Event 2019 Inception рассказал Андрей Крапивин.

13.01.2020    10032    Scorpion4eg    8    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    37674    kuzyara    38    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    51856    tormozit    74    

Шпаргалка (БСП). Добавление в новый документ механизма печати дополнительных печатных форм

Практика программирования v8 1cv8.cf Бесплатно (free)

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

10.10.2019    32490    John_d    21    

Полезные процедуры и функции для программиста

Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

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

07.10.2019    40814    HostHost    41    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    55336    Yashazz    56    

Развитие 1С программиста Промо

Мотивация, лидерство и личная эффективность Практика программирования Бесплатно (free)

Делюсь своим опытом и видением развития 1С программиста.

17.10.2018    29285    pashamak    64    

СКД. Отчеты с картинками

Работа с интерфейсом Практика программирования v8::СКД 1cv8.cf Бесплатно (free)

Решение популярных кейсов с картинками в отчетах на СКД.

25.09.2019    34467    YPermitin    58    

СКД не только для отчетов

Практика программирования v8::СКД 1cv8.cf Бесплатно (free)

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

18.09.2019    22237    YPermitin    36    

Оповещения боту из 1С за 31 минуту

Интеграция с сервисами Практика программирования v8::УФ 1cv8.cf Бесплатно (free)

Поделюсь опытом, как быстро сделать бота с оповещениями в Телеграмм из 1С без лишних затрат.

18.09.2019    20511    feva    44    

Выгрузка документа по условию Промо

Практика программирования v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    18162    m-rv    3    

[Шпаргалка] Программное создание элементов формы

Работа с интерфейсом Практика программирования v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    110599    rpgshnik    77    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    81574    ids79    56    

Регистры бухгалтерии. Общая информация

Математика и алгоритмы Практика программирования v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    48711    YPermitin    27    

Подмена заголовка 1С Промо

Универсальные функции Работа с интерфейсом Россия Бесплатно (free)

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

08.12.2018    11734    moolex    26    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    30608    YPermitin    81    

Кодогенерация и метагенерация в 1С

Практика программирования Бесплатно (free)

В своем докладе на конференции INFOSTART EVENT 2018 EDUCATION Дмитрий Белозеров рассказал о разработке инструмента, позволяющего программно работать с метаданными 1С и писать скрипты для выполнения тех же действий, которые выполняет разработчик в конфигураторе –  с какими сложностями и нюансами пришлось столкнуться, и что получилось в итоге.

26.08.2019    9723    kirovsbis    28    

Отслеживание выполнения фонового задания

Практика программирования v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    46477    ids79    22    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования v8 Бесплатно (free)

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

16.04.2019    23584    m-rv    18    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    161406    ids79    77