Куда течет интерфейс?

03.02.25

Разработка - Работа с интерфейсом

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

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

Возможно, если вы сталкивались с автоматизированным тестированием в 1С или OneScript, вроде YaxUnit, xUnitFor1C, Vanessa-Add, Asserts и т.п., то слышали термин "текучие утверждения". Так вот это частный случай текучего интерфейса, когда с его помощью реализуются разнообразные проверки истинности утверждений - например, результатов тестирования:

 

Ожидаем.Что(НекийМассив.Количество()).Минимум(9);

 

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

 

ООП и 1С

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

 

...не реализует. Но выход есть - использовать модуль объекта обработки

Обработка - тоже своего рода класс на минималках. Он не может by design в наследование (создание одного класса от другого с наследованием полей и методов) и рыбополиморфизм (если проблему обработки функцией параметров разных типов вообще можно записать в существующие для языка с динамической типизацией). Но зато может в инкапсуляцию - ограничение доступа ко всякой небезопасной внутрянке благодаря экспортным/неэскпортным переменным и методам, а главное может вернуть саму себя в качестве результата функции чем мы и воспользуемся

 

Пишем код

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

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

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

 

Перем Значение Экспорт;

#Область ПрограммныйИнтерфейс

// Функция - Установить значение
//
// Параметры:
//  ЧисловоеЗначение - Число - Начальное значение
// 
// Возвращаемое значение:
//  ОбработкаОбъект.ТекучийКалькулятор - Этот объект
Функция УстановитьЗначение(Знач ЧисловоеЗначение) Экспорт
	
	Значение = ПривестиЧисло(ЧисловоеЗначение);	
	Возврат ЭтотОбъект;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ПривестиЧисло(Знач ЧисловоеЗначение) Экспорт
	
	ОТЧ = Новый ОписаниеТипов("Число");
	Возврат ОТЧ.ПривестиЗначение(ЧисловоеЗначение);

КонецФункции

#КонецОбласти

 

Не будем пока подробно на этом останавливаться, а сразу добавим еще две функции: пусть это будут сложение и вычитание.

 

// Функция - Прибавить
//
// Параметры:
//  ЧисловоеЗначение - Число - Значение для прибавления
// 
// Возвращаемое значение:
//  ОбработкаОбъект.ТекучийКалькулятор - Этот объект
Функция Прибавить(Знач ЧисловоеЗначение) Экспорт
	
	Значение = Значение + ПривестиЧисло(ЧисловоеЗначение);
	Возврат ЭтотОбъект;
	
КонецФункции

// Функция - Отнять
//
// Параметры:
//  ЧисловоеЗначение - Число - Значение для вычитания
// 
// Возвращаемое значение:
//   ОбработкаОбъект.ТекучийКалькулятор - Этот объект
Функция Отнять(Знач ЧисловоеЗначение) Экспорт
	
	Значение = Значение - ПривестиЧисло(ЧисловоеЗначение);
	Возврат ЭтотОбъект;
	
КонецФункции

 

Отлично - у нас есть некоторый базовый интерфейс. Рассмотрим его:

  • Первое, что бросается в глаза - все функции возвращают ЭтотОбъект. Это, как мы уже обсуждали, и позволяет делать цепочки вызовов
  • Второе - это переменная значение. Она служит для хранения результата между операциями и получения конечного значения

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

 

	ТекучийКалькулятор = Обработки.ТекучийКалькулятор.Создать();
	
	ТекучийКалькулятор.УстановитьЗначение(0)
		.Прибавить(20) // 20
		.Отнять(10)    // 10
		.Прибавить(5)  // 15
		.Отнять(3);    // 12
		
	Результат = ТекучийКалькулятор.Значение; // 12

 

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

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

 

Обработка ошибок

С самой базовой информацией мы разобрались. Теперь перейдем к другой немаловажной части - обработке ошибок.

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

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

  • В модуле обработки мы добавим еще одну переменную - Ошибка
  • В каждую нашу функцию добавим Возврат в том случае, если Ошибка заполнена

Вот как выглядит наш обновленный модуль:

 

Перем Значение Экспорт;
Перем Ошибка Экспорт;

#Область ПрограммныйИнтерфейс

// Функция - Установить значение
//
// Параметры:
//  ЧисловоеЗначение - Число - Начальное значение
// 
// Возвращаемое значение:
//  ОбработкаОбъект.ТекучийКалькулятор - Этот объект
Функция УстановитьЗначение(Знач ЧисловоеЗначение) Экспорт
	
	Если ЗначениеЗаполнено(Ошибка) Тогда Возврат ЭтотОбъект КонецЕсли;
	
	Значение = ПривестиЧисло(ЧисловоеЗначение);	
	Возврат ЭтотОбъект;
	
КонецФункции

// Функция - Прибавить
//
// Параметры:
//  ЧисловоеЗначение - Число - Значение для прибавления
// 
// Возвращаемое значение:
//  ОбработкаОбъект.ТекучийКалькулятор - Этот объект
Функция Прибавить(Знач ЧисловоеЗначение) Экспорт
	
	Если ЗначениеЗаполнено(Ошибка) Тогда Возврат ЭтотОбъект КонецЕсли;
	
	Значение = Значение + ПривестиЧисло(ЧисловоеЗначение);
	Возврат ЭтотОбъект;
	
КонецФункции

// Функция - Отнять
//
// Параметры:
//  ЧисловоеЗначение - Число - Значение для вычитания
// 
// Возвращаемое значение:
//   ОбработкаОбъект.ТекучийКалькулятор - Этот объект
Функция Отнять(Знач ЧисловоеЗначение) Экспорт
	
	Если ЗначениеЗаполнено(Ошибка) Тогда Возврат ЭтотОбъект КонецЕсли;
	
	Значение = Значение - ПривестиЧисло(ЧисловоеЗначение);
	Возврат ЭтотОбъект;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ПривестиЧисло(Знач ЧисловоеЗначение) Экспорт
	
	ОТЧ = Новый ОписаниеТипов("Число");
	Возврат ОТЧ.ПривестиЗначение(ЧисловоеЗначение);

КонецФункции

#КонецОбласти

 

Для проверки необходимо спровоцировать какое-нибудь исключение. Добавим для этого функцию деления:

 

// Функция - Разделить на
//
// Параметры:
//  ЧисловоеЗначение - Число - Делитель
// 
// Возвращаемое значение:
//   ОбработкаОбъект.ТекучийКалькулятор - Этот объект
Функция РазделитьНа(Знач ЧисловоеЗначение) Экспорт
	
	Если ЗначениеЗаполнено(Ошибка) Тогда Возврат ЭтотОбъект КонецЕсли;

	Делитель = ПривестиЧисло(ЧисловоеЗначение);
	
	Попытка
		Значение = Значение / Делитель;
	Исключение
		Ошибка = ОписаниеОшибки();
	КонецПопытки;
	
	Возврат ЭтотОбъект;
	
КонецФункции

 

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

 

	ТекучийКалькулятор = Обработки.ТекучийКалькулятор.Создать();
	
	ТекучийКалькулятор.УстановитьЗначение(0)
		.Прибавить(20)  // 20
		.Отнять(10)     // 10
		.Прибавить(5)   // 15
		.РазделитьНа(0) // Ошибка
		.Отнять(3);     
		
	Ошибка = ТекучийКалькулятор.Ошибка;
	
	Если ЗначениеЗаполнено(Ошибка) Тогда
		Результат = Ошибка;
	Иначе
		Результат = ТекучийКалькулятор.Значение;
	КонецЕсли;
	
	// Деление на 0
	Сообщить(Результат);

 

Таким же нехитрым образом, кроме текста ошибки, мы можем сохранить и другую информацию об исключении: например, добавить переменную для записи имени функции, которая привела к ошибке или счетчик, увеличивающийся на 1 после вызова каждой функции цепи, чтобы определить, какое "звено" было последним

 

Получение результата

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

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

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

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

 

// Функция - Получить результат
// 
// Возвращаемое значение:
//  Структура - Описание результата
//    * Ошибка - Булево       - Признак ошибки выполнения
//    * Данные - Строка,Число - Полученное значение или текст ошибки
Функция ПолучитьРезультат() Экспорт
	
	ЭтоОшибка = ЗначениеЗаполнено(Ошибка);
	
	Возврат Новый Структура("Ошибка,Данные"
		, ЭтоОшибка
		, ?(ЭтоОшибка, Ошибка, Значение));
	
КонецФункции

 

... и немного изменить вызов

 

	ТекучийКалькулятор = Обработки.ТекучийКалькулятор.Создать();
	
	// И никаких экспортных переменных :)
	Результат = ТекучийКалькулятор.УстановитьЗначение(0)
		.Прибавить(20)  
		.Отнять(10)     
		.Прибавить(5)   
		.РазделитьНа(0) 
		.Отнять(3)
		.ПолучитьРезультат();  

 

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

 

В заключение

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

 

 
 Текучий калькулятор

 

Спасибо за внимание!

 

 

Другие мои статьи:

Открытый пакет интеграций для популярных API: Telegram, VK, Viber, Bitrix24 и многих других 

Open-source набор библиотек интеграции с популярными сервисами: методы для 20-ти популярных API, поставка в виде расширения, OneScript-пакета и даже полноценного приложения для командной строки, подробная документация. И все это абсолютно бесплатно!

 

Автоматизация редактирования изображений в ImageMagick - это просто!

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

 

 

 Мой GitHub:    https://gitub.com/Bayselonarrend 
 OpenYellow:    https://openyellow.notion.site
 Лицензия MIT:  https://mit-license.org

 

разработка ООП fluent текучие утверждения текучий интерфейс

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55457    17    23    

43

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    19740    28    6    

44

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    36351    dsdred    76    

217

Механизмы платформы 1С Программист Платформа 1С v8.3 Россия Бесплатно (free)

При знакомстве с новой механикой работы с асинхронностью (обещание, ждать и асинх) делал пометки, которыми и хочу поделиться. Ничего сверхъестественного в них нет, просто небольшие примеры и некоторые всплывшие нюансы использования.

29.07.2022    74889    zeltyr    25    

215

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    7451    kalyaka    6    

32

Механизмы платформы 1С Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022    36781    Infostart    84    

250

WEB-интеграция Работа с интерфейсом Пользователь Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для конфигурации 1С:Розница 2.3.

3600 руб.

29.04.2022    14314    2    10    

13
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. deplatoon 7 03.02.25 13:20 Сейчас в теме
Отличная статья, вкину факт - большая часть стандартной библиотеки в 1С Элементе реализована для флюент апи из коробки, очень приятно использовать
koropo; bayselonarrend; +2 Ответить
2. dhurricane 03.02.25 14:20 Сейчас в теме
Обработко-ориентированное программирование. :) Жаль без извратов работает только на сервере.
9. alex_sayan 54 03.02.25 15:30 Сейчас в теме
Чутка подушню. Пример с калькулятором выглядит как-то уж совсем вырожденно. И даже вводит в заблуждение. Проще написать

Результат = 0 + 20 - 10 + 5 / 0 - 3;


чем

Результат = ТекучийКалькулятор.УстановитьЗначение(0)
		.Прибавить(20)  
		.Отнять(10)     
		.Прибавить(5)   
		.РазделитьНа(0) 
		.Отнять(3)
		.ПолучитьРезультат();


При правильном подходе, текучий интерфейс сокращает количество кода. Тут же получилось будто кода больше
11. bayselonarrend 2434 03.02.25 15:42 Сейчас в теме
(9) Да, это нереалистичный пример, но простой, чтобы было понятно
3. e9504100606 92 03.02.25 14:43 Сейчас в теме
Статья интересная, но есть же стандарты разработки 1С и еще корпоративные стандарты и собственная отечественная культура.
Писать код вот так - допустимо в маленькой задачке, где на чтение "чужого кода" и понимание функционала не требуется много времени.

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

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

Идея с ООП интересная, в профессионализме автора не сомневаюсь, но такой подход к написанию кода не поддерживаю.
asupsam; Трактор; bayselonarrend; Ks_83; Prometeus2011; Sashares; Brawler; borda4ev; +8 Ответить
6. alex_sayan 54 03.02.25 15:12 Сейчас в теме
(3) а какие сложности с чтением текучего интерфейса?
10. e9504100606 92 03.02.25 15:33 Сейчас в теме
(6) Это же очевидно
Sashares; +1 Ответить
15. alex_sayan 54 03.02.25 15:57 Сейчас в теме
(10) ну у меня, например, текучий интерфейс не вызывает абсолютно никаких сложностей с чтением
18. slknnk 77 03.02.25 16:47 Сейчас в теме
(15) Согласен. С чтением тут наоборот все более чем понятно.
7. bayselonarrend 2434 03.02.25 15:14 Сейчас в теме
(3) Такой подход чаще всего используют в готовых универсальных модулях. Те же фреймворки для автоматизированного тестирования используют его в 9/10 случаях для механизма проверки условий. Но такие инструменты обычно целиком обособленные от основной конфигурации и имеют докумментацию. Благодаря этому все это идет в плюс, а без этого действительно все может быть неочевидно
27. Ks_83 259 03.02.25 22:44 Сейчас в теме
(3) Абсолютно верно. Статься из серии вредных советов. Такой код код-ревью не пройдет. Выпендрежи и выкрутасы на крупных проектах категорически не приветствуются.
28. bayselonarrend 2434 03.02.25 23:01 Сейчас в теме
(27)

Такой код код-ревью не пройдет


У кого?

Выпендрежи и выкрутасы на крупных проектах категорически не приветствуются


Те же фреймворки для автоматизированного тестирования (используемые, кстати, чаще всего на крупных проектах) используют этот подход и никого это не смущает. В любом случае, я не имел ввиду, что это абсолютно универсальная вещь, которую необходимо использовать везде и везде она будет полезна
alex_sayan; sleemp; Трактор; +3 Ответить
4. acces969 366 03.02.25 14:59 Сейчас в теме
Какие преимущества дает такой способ написания кода?
5. bayselonarrend 2434 03.02.25 15:07 Сейчас в теме
(4) Ну этакий синтаксический сахар. Меньше кода, лаконично
8. alex_sayan 54 03.02.25 15:17 Сейчас в теме
(4) текучий интерфейс хорош для "конвейерного" кода. Это когда есть некоторый набор методов, которые могут вызываться в разной комбинации и/или в разном порядке порядке
bayselonarrend; +1 Ответить
33. acces969 366 04.02.25 07:10 Сейчас в теме
(8) Что то вроде функционального программирования получается?
12. starik-2005 3098 03.02.25 15:43 Сейчас в теме
Плюс. Не за саму статью, а за поднятие темы. Я так 30 лет назад писал, когда объекты были в виде таких библиотек, так TurboVision.
ЗЫ: В турбовижине используется несколько иной подход, когда в конструктор засовывается конструктор, в который засовывается конструктор, в который ... И так "одной строкой кода" рисуется форма целиком со всеми добавленными на нее полями.
ЗЫЗЫ: Ща такое повсеместно, по крайней мере во флаттере с этим вот прям беда была - я тупо путался, после какой запятой что рисовать.
13. SerVer1C 864 03.02.25 15:52 Сейчас в теме
Помню, что где-то уже видел аналогичную дичЪ
Конечно, лучше юзать общий модуль вместо объекта обработки.
Хотел бы я посмотреть на тех, кто в ж0лтом проде применяет подобные извраты ))
14. starik-2005 3098 03.02.25 15:54 Сейчас в теме
(13)
Хотел бы я посмотреть на тех, кто в проде применяет подобные извраты
Да весь джаваскрипт такой, если прилично асинхронить. Не знаю, дошло ли до питона, но точно местами не миновало...
16. alex_sayan 54 03.02.25 16:10 Сейчас в теме
(14) справедливости ради, код на жаваскрипте, работающий с CSS/HTML, выглядит в сто раз лаконичнее, чем если бы он был написал на 1с в привычном нам процедурном стиле. Код на 1с, собирающий HTML из кусочков, та ещё вырвиглазная лапша
17. SerVer1C 864 03.02.25 16:11 Сейчас в теме
(14) Про то не знаю, но Linq в шарпе отличная штука!
19. user1209971 76 03.02.25 17:24 Сейчас в теме
Cлишком ресурсозатратно:
1. Постоянный вызов одного и того же модуля и возврат к модулю из которого происходит вызов.
2. Постоянно возвращается объект (чтоб выполнить следующий вызов), если это ещё и тяжелый объект, то избыточный расход по памяти

Это не стоит того чтоб использовать. В редких случаях использовать очень осторожно. Всегда нужно следить за ресурсами, добавится у объекта реквизит с файлом в пару Гб и всё, будешь долго попрыгаешь через точку
23. JohnyDeath 302 03.02.25 19:25 Сейчас в теме
(19)
2. Постоянно возвращается объект (чтоб выполнить следующий вызов), если это ещё и тяжелый объект, то избыточный расход по памяти

Объект же не создается каждый раз новый. О каком расходе памяти идет речь?
Всё высосано из пальца и какая-то экономия на спичках.

Про первый пункт вообще не понял. Что плохого в вызове другого модуля? ) Это прям что-то новенькое в области оптимизации 1С! Давайте вернемся к 7.7, где был один глобальный модуль на всё! Сразу заживем и скорости возрастут ))
alex_sayan; sleemp; Evg-Lylyk; bayselonarrend; +4 Ответить
20. mszsuz 342 03.02.25 17:54 Сейчас в теме
Если кому интересно - вот практическое применение: https://infostart.ru/1c/tools/1161402/
alex_sayan; asupsam; JohnyDeath; +3 Ответить
21. miniogn 42 03.02.25 19:19 Сейчас в теме
Если 1С не поддерживает из коробки такие возможности, то лучше не использовать. Имеем дополнительный уровень вложенности, существенно усложняющий отладку.
Не спорю, в каких-то отдельных случаях может быть, но в целом нет.
22. bayselonarrend 2434 03.02.25 19:23 Сейчас в теме
(21) С одной стороны, я согласен, что это не универсальный метод, который нужно применять везде. С другой, я не очень понимаю, что значит "не поддерживает из коробки", если это написано на чистом 1С
24. bayselonarrend 2434 03.02.25 19:30 Сейчас в теме
(19)
1. Постоянный вызов одного и того же модуля и возврат к модулю из которого происходит вызов.
2. Постоянно возвращается объект (чтоб выполнить следующий вызов), если это ещё и тяжелый объект, то избыточный расход по памяти


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

добавится у объекта реквизит с файлом в пару Гб


Это было бы очень странно, если мы говорим об обработке. Думаю, в типичном сценарии это не будет отнимать каких-либо заметных ресурсов сверх того, что тратят обычные вызовы
29. dhurricane 03.02.25 23:27 Сейчас в теме
(21)
существенно усложняющий отладку
А Вы пробовали?
alex_sayan; +1 Ответить
25. VGHOST 168 03.02.25 21:51 Сейчас в теме
Ух-ты, тянучий интерфейс!
Всего 20 лет как американская жвачка пришла в Россию, а уже и до 1С добралась))

Вопиющее извращение ООП, вытянутое из левой ноздри (если кто не знает - там, за ноздрёй - мозг, а в нём - умные мысли!) каким-то скриптинг гаем.
И все как дети - подхватывают самое плохое, а элементарную логику и необходимый порядок - игнорируют. Потому что скучно, или просто - потому что...

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

Пусть будет ещё один костыль - код-то уже практически нечитаем...

Не в обиду автору - статья прикольная, и сама фишка.
Но непрактичная, как некоторые доистерические языки, в которых код состоял из одних скобок и операторов.
И да спасёт нас оператор With от подобной ереси, аминь!
26. bayselonarrend 2434 03.02.25 22:16 Сейчас в теме
(25) 1000 символов - 0 конкретики

Ух-ты, тянучий интерфейс!
Всего 20 лет как американская жвачка пришла в Россию, а уже и до 1С добралась))


Это можно было делать с тех пор, как в 1С появились обработки и я не первый это придумал


Вопиющее извращение ООП, вытянутое из левой ноздри (если кто не знает - там, за ноздрёй - мозг, а в нём - умные мысли!) каким-то скриптинг гаем.


Чистое имхо + словесный фарс: тысяча и одна технология в программировании использует этот подход для сокращения и улучшения читаемости кода. Видимо все кто делал и используют LINQ, jQuery, Pandas и Spring Boot извращенцы, которые не понимают, что это на самом деле плохо и неудобно

Впрочем, как тут и написано - в 1С нет ООП, как нет и элементарной логики


Единственный язык с чистым ООП - это Smalltalk. Все остальные языки имеют ООП той или иной степени этой чистоты. В 1С ООП очень слабое и действительно ООП языком его нельзя назвать, но как раз пример с обработкой о том, что отдельные части парадигмы выполняются. Иначе и нельзя было бы реализовать fluent api

Про логику это вообще какой-то холостой выстрел ни о чем

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


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

Но непрактичная, как некоторые доистерические языки, в которых код состоял из одних скобок и операторов


Как связаны старые языки с популярным способом организации методов в классах? Никак, очевидно, просто "непрактичная" и все
alex_sayan; koropo; +2 Ответить
30. VGHOST 168 03.02.25 23:53 Сейчас в теме
(26) То есть, неочевидная подмена естественного и интуитивно понятного возвращаемого методом значения ссылкой на объект ради того чтобы не писать "with" - это "популярный способ организации"? А ты сиди и чеши репу - это ты метод исходного объекта вызвал, или того ХЗ которое он вернул? Запоминать какие методы возвращают нормальное значение, а какие владельца? Это - "для сокращения и улучшения"?
Для сокращения - это точно. Но где тут читабельность? Ну прочитал это колбасу на пару страниц вправо, и тут же представил себе результат выполнения, ага.
А ошибки вылавливать из этого вот, особенно в нетипизированных языках? Рантайм план покажет?

Из-за таких вот (в) попу лярвных "технологий" компы сейчас выполняют на 80% больше (и это не предел, млин!) инструкций, чем необходимо для реализации конкретной задачи. То есть глючат, тупят, жрут Раму и греют воздух. И с каждым годом надо больше и больше аппаратной мощности, хотя существующая хорошо если на 20% эффективно используется.

Зато имеем целый выводок языков, созданных непонятно кем и непонятно зачем, и ни одного по настоящему качественного, проработанного на научной основе, генерирующего байт-код, пригодный для дальнейшей глубокой оптимизации под любую платформу (и этих бы выводок сократить, до одной!), а не просто для максимального упрощения конечного компилятора (Жаба).
Что-то реализовано в Си, что-то в Питоне, что-то Аде, что-то в Жабе, что-то в LLVM. Это долбанные лебедь, рак и щука. Никаких стандартов, зато широчайший выбор для желающих свихнуться при выборе и высокопроизводительных авторов говнокода! Капитализма, мать...

В 1С нужно завозить не сахар, а полный пересмотр архитектуры, включая язык, который два десятилетия не меняется.
Криворуких прикладников не убавится, но те немногие, которые способны и хотят писать качественно, а не "больше всех", получат возможность реализовать что-то полезное и долгоиграющее. Например, переделают мега-костыль БСП в нормальную библиотеку классов, и сделают одно мощное модульное строго стандартизованное решение вместо выводка убогих калек, которые кое-как продаются и кое-как удовлетворяют клиентов, да и то - потому что альтернативы не наблюдается.
Тогда, возможно, приложения 1С научатся потреблять больше 1% ЦПУ и меньше 100% РАМ, и чуток экономить дисковое пространство (в текущей реализации база 1С состоит на 2/3 из ссылок, из которых половина не нужна вовсе, а вторую можно поделить на 4+, если не совать ГУИДы в каждое ссылочное поле).
А мне не придётся сидеть ночами, отлавливая чужие баги в совершенно нечитаемом коде, или по полчаса ждать пока мастер настройки обмена вычитает и в сотый раз перегрузит в таблицы всю посылку оппонента после очередного нажатия что на ОК, что на Х.

Впрочем, о чём это я? 1С - КОММЕРЧЕСКОЕ приложение. А следовательно, не стоит ждать ни соли, ни сахара. Только расходов, и не только денежных.
А ведь, "системообразующее" предприятие... За страну обидно! И за логику. Внедряем импортное потреблядство, все живут как проще, а на выходе - всеобщий гемор, который неизбежно закончится всеобщей задницей. Будет весело!
Ничего, третья мировая генофонд прочистит, и торгашам достанется. Чуток осталось - лет 10-15, если у какого-нибудь идиота палец на кнопке не дрогнет. Жаль, организаторов этого бардака не достанет, как и в прошлую ядерную...
31. bayselonarrend 2434 04.02.25 00:24 Сейчас в теме
(30)
интуитивно понятного возвращаемого методом значения ссылкой на объект ради того чтобы не писать "with" - это "популярный способ организации"?


Да, это он и есть. То, что вы это так трактуете не означает, что это так на самом деле. Или вы всерьез считаете, что проблема в слове with

А ты сиди и чеши репу - это ты метод исходного объекта вызвал, или того ХЗ которое он вернул? Запоминать какие методы возвращают нормальное значение, а какие владельца? Это - "для сокращения и улучшения"?


Если класс реализует fluent api, то ВСЕ методы возвращают self. Проблема, которой не существует

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


Прекрасно представляю, потому что fluent надо использовать там, где он к месту, т.е. где последовательно выполняются манипуляции, завязанные на один объект. Как правило, речь идет о взаимодействии с какими-нибудь отдельными сторонними блоками или библиотеками

Из-за таких вот (в) попу лярвных "технологий" компы сейчас выполняют на 80% больше (и это не предел, млин!) инструкций, чем необходимо для реализации конкретной задачи.


Статистические данные сами собрали?

Зато имеем целый выводок языков, созданных непонятно кем и непонятно зачем, и ни одного по настоящему качественного, проработанного на научной основе, генерирующего байт-код, пригодный для дальнейшей глубокой оптимизации под любую платформу (и этих бы выводок сократить, до одной!), а не просто для максимального упрощения конечного компилятора (Жаба).
Что-то реализовано в Си, что-то в Питоне, что-то Аде, что-то в Жабе, что-то в LLVM. Это долбанные лебедь, рак и щука. Никаких стандартов, зато широчайший выбор для желающих свихнуться при выборе и высокопроизводительных авторов говнокода! Капитализма, мать...


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

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

Если даже вернуться к неоптимальности и "80%": да, мир устроен так, что кто программы платит, тот их и танцует. И если бизнес, который обычно и платит, видит, что цена ОЗУ меньше человекачаса программиста и риска простоя из-за ошибок при работе на низком уровне (для недопуска которых нужны более дорогие специалисты), то, внезапно, большая часть программистов будет писать на непроизводительных, но простых и безопасных языках. Очевидное невероятное

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

В 1С нужно завозить не сахар, а полный пересмотр архитектуры, включая язык, который два десятилетия не меняется.


Вы за это заплатите? Или может заплатит бизнес, который 10 лет автоматизировал все чтобы начать с нуля? Полиграф Полиграфович плачет, читая это

Остальное - просто какие-то абстрактные рассуждения на вольную тему, не представляю, зачем вы на меня их выливаете. Пожалеть вас, что мир не такой идеальный, как вам хотелось бы?
32. alex_sayan 54 04.02.25 01:11 Сейчас в теме
(30) слов много, но одна вода. Так-то в языках программирования ничего принципиально не меняется годов с 80-х. И вряд ли когда-то изменится. Растут вычислислительные мощности, развиваются фреймворки, но "стержень" у языков программирования всё тот же. Надо учиться писать понятный код, а не пенять на инструменты
Оставьте свое сообщение