Лямбда-функции на встроенном языке 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
17
.epf 0.1 11,23Kb 17 Скачать бесплатно

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Только вот это "своё место" вы пока не назвали.
35. AntonProgma 28 29.06.21 16:08 Сейчас в теме
(33)да вон же написаны примеры!
37. Yashazz 3878 29.06.21 16:11 Сейчас в теме
(35) Нет, я про реальную задачу. Бизнесовую. Прикладную. Кататься на велосипеде по канату дело красивое, но для единиц, а уметь водить такси в час пик - другое, для десятков тысяч.
40. AntonProgma 28 29.06.21 16:14 Сейчас в теме
(37) функция фильтрации не реальна?
45. Yashazz 3878 29.06.21 16:21 Сейчас в теме
(40) В таком общем виде - нет. Если мы говорим про анализ текста, так это другими способами лучше и проще делается, и почти все они в 1С доступны гораздо адекватнее, чем через "Выполнить".
86. AntonProgma 28 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 3878 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 148 29.06.21 16:02 Сейчас в теме
Прикольно, но зачем? Писать как в джавке? Но там то оно завязано на Consumer'ы, Supplier'ы и прочее, чего без интерфейсов в ЯП не реализовать.
По итогу - обычный синтаксический сахар через Выполнить.
Вместо того, чтобы изобретать такие велосипеды предлагаю автору писать сразу на https://msng.link/o/?platform_suggestions=tg
34. AntonProgma 28 29.06.21 16:07 Сейчас в теме
(29)все ли велосипеды одинаковые? Не всем нужны прогулочные или трёхколёсные. Некоторым - спортивные. Универсальность функций в примерах не приводит вас к мысли, что идея анонимных функций не зря существует?
44. oleganatolievich 148 29.06.21 16:20 Сейчас в теме
(34) бла-бла-бла-бла-бла.
почему бы сразу не залепить в 1С свой лисп, кложур или ерланг. а как это нельзя, если на самом деле можно ))) ?

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

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

27.01.2016    82613    Serginio    113    

Алгоритмы распределения сумм (наивная методика, Алгоритм Кэхэна)

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

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

08.07.2021    1331    con-men    28    

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

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

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

21.06.2021    1326    kalyaka    5    

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

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

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

30.03.2021    9647    Neti    19    

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

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

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

16.03.2021    5245    velemir    31    

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

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

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

25.03.2021    27576    rayastar    49    

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

Практика программирования Методология управления разработкой Бесплатно (free)

Учебный курс по теории и практике программирования. Бесплатно. В виде структурированного текста. Статья 4. Эта статья посвящена причинам возникновения проблем с качеством кода и методикам их преодоления.

22.03.2021    1300    Артано    5    

Telegram бот на PHP

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

Сделаем простого Telegram бота на PHP.

01.03.2021    7409    John_d    10    

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

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

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

28.12.2020    6989    comol    31    

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

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

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

10.08.2020    3678    hobi    49    

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

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

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

29.06.2020    12050    WildHare    33    

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

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

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

22.06.2020    12337    WildHare    23    

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

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

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

10.12.2016    39739    unichkin    74    

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

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

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

15.06.2020    18920    WildHare    34    

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

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

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

24.04.2020    4317    zhichkin    6    

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

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

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

22.04.2020    5060    mkalimulin    111    

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

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

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

15.10.2018    34371    tormozit    106    

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

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

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

25.02.2020    4767    Repich    9    

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

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

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

18.02.2020    7731    Repich    17    

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

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

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

27.01.2020    54065    ids79    26    

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

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

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

20.09.2012    81281    tormozit    131    

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

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

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

15.01.2020    37946    John_d    22    

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

Практика программирования Инструментарий разработчика Бесплатно (free)

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

13.01.2020    8839    Scorpion4eg    8    

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

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

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

30.12.2019    30029    kuzyara    38    

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

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

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

11.07.2007    52422    tormozit    51    

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

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

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

07.10.2019    36878    HostHost    41    

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

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

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

01.10.2019    48031    Yashazz    55    

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

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

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

25.09.2019    29588    YPermitin    54    

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

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

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

10.09.2017    49048    tormozit    74    

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

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

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

18.09.2019    21119    YPermitin    36    

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

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

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

18.09.2019    19367    feva    43    

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

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

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

06.09.2019    86237    rpgshnik    71    

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

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

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

17.10.2018    24821    pashamak    64    

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

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

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

05.09.2019    69077    ids79    55    

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

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

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

05.09.2019    40741    YPermitin    25    

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

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

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

03.09.2019    28869    YPermitin    81    

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

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

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

25.04.2019    17045    m-rv    3    

Приватный блокчейн и 1С популярно

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

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

02.09.2019    6773    mkalimulin    140    

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

Практика программирования Инструментарий разработчика Бесплатно (free)

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

26.08.2019    9464    kirovsbis    28    

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

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

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

17.08.2019    41603    ids79    19    

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

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

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

08.12.2018    11223    moolex    26    

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

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

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

08.08.2019    132397    ids79    75    

Фоновое выполнение кода в 1С - это просто

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

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    53729    avalakh    26    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

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

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    93458    ids79    15    

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

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    22091    m-rv    17    

Как проводятся документы в типовых конфигурациях от 1С

Математика и алгоритмы Практика программирования Разработка v8::ОУ ERP2 УТ11 Россия УУ Бесплатно (free)

В свое время, когда только начинал шаги в 1С и изучал, как проводятся документы в конфигурациях на платформе 1С по книге "Разработка управляемого интерфейса" (Хрусталева Е.Ю.), и там были представлены примеры совсем далекие от того, как сейчас проводятся документы в современных конфигурациях от 1С.

24.07.2019    33853    skv_79    35    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

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

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    44492    ids79    27    

Интеграция сценарного тестирования в процесс разработки

Практика программирования Инструментарий разработчика Бесплатно (free)

Разработчик системы «Тестер» Дмитрий Решитко в своем докладе на конференции INFOSTART EVENT 2018 EDUCATION показывает, что процесс тестирования можно очень плотно интегрировать в процесс разработки, что внедрение тестирования – это возможность развития программиста как такового, позволяющая ему упорядочивать ход мыслей и оставаться «в фокусе». Навыки построения процесса кодирования на стыке с тестированием сокращают время на концентрацию, освобождают от страха перед изменениями и улучшают память разработчика.

08.07.2019    10050    grumagargler    7    

Как сделать запрос на изменение данных Промо

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

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    34865    m-rv    22    

"Меньше копипаста!", или как Вася универсальную процедуру писал

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

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    21458    SeiOkami    52    

Создание отчетов с помощью СКД - основные понятия и элементы

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

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    69556    ids79    27