gifts2017

1С с "плюсами"

Опубликовал IntelInside (G) (IntelInside) в раздел Программирование - Внешние компоненты

- Разработана методика подключения внешней компоненты, снимающая ограничения на типы данных аргументов и возвращаемого значения.
- Проведено документирование основных типов данных (объектов, интерфейсов) платформы.
- Разработан объект «Делегат» для реализации функциональных объектов (указатель-на-функцию).
- Разработана концепция итератора произвольного доступа для основных контейнеров платформы с целью сопряжения со стандартной C++ библиотекой.
- В процессе разработки механизм 1С классов (наследование, интерфейсы) для возможности использования парадигм объектно-ориентированного программирования на уровне кода.

 

 И еще, тезисно:

- Файлов к скачиванию здесь пока не будет. Все еще весьма сыро. Основной целью публикации является дискуссия.

- Тесты проводились для win32::v8.3.4.365 - v 8.3.6.2237. Для win64, lin32, lin64 и для v8.2.19.130 только оценена возможность – работать будет при минимальных изменениях.

- В процессе экспериментов ни один проприетарный байт не пострадал. Т.е. оригинальные бинарники 1С я не патчу ни на диске, ни в памяти.

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

- 1С начал изучать вплотную недавно, много еще не знаю. До этого VB++C/C++. Целью работ был перенос части возможностей VB в 1С.

- Также заранее прошу прощения за стиль изложения – эпистолярный жанр не мой конек.

 

 Итак...

            Решаем простейшую задачу: Есть ТаблицаЗначений и в ней колонки [количество] и [цена]. Нужно вычислить СУММА([количество] * [цена]).

Здесь и далее время выполнения алгоритма засекается через ::GetTickCount(), т.е. является относительной величиной.

Код 1С:

Функция СчитатьТаблицу(Котейнер)
	перем элем;
	перем итого;                    
	итого = 0;
	для каждого элем из Котейнер цикл
		итого = итого + элем[1] * элем[2];
	КонецЦикла;
	возврат итого;
КонецФункции

Код Си (иллюстративно):

...
cRows = pITable->getRowCount();
for (iRow = 0; iRow < cRows; iRow++)
{
    if (pITable->getValueAt(iRow, 1).getIValue()->getNumeric(numQty) && 
                      pITable->getValueAt(iRow, 2).getIValue()->getNumeric(numPri))
    {
        numTot += numQty * numPri;
    }
}
pOutRetValValue->assign(numTot);
... 

 

Результаты:

*----------- сумма произведений по ТаблицеЗначений ---------------

* строк = 100 000

* посчитано СУММА([кол]*[цена]) в Си: результат = 333 328 333 350 000, время = 94

* посчитано СУММА([кол]*[цена]) в 1С: результат = 333 328 333 350 000, время = 547

* ИТОГ: подсчет в Си быстрее чем в 1С в 5,8 раз.

*----------- ------------------------------------- ---------------

Обратите внимание, что я работаю методами платформы с типами данных платформы и разница не на ...%, а в ...раз.

 

Сортируем..

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

1С:

Процедура СортироватьМассивВставкамиВозр(М)
   перем колво;
   перем к;
   перем к_этот;
   перем к_пред;
   перем елмЭтот;
   перем елмПред;
   колво = М.Количество();
   для к = 1 по колво - 1 цикл
       к_этот = к;
       пока к_этот >0цикл
          к_пред = к_этот -1;
          елмЭтот = М[к_этот];
          елмПред = М[к_пред];
          если елмЭтот < елмПред тогда
              М[к_этот]= елмПред;
              М[к_пред]= елмЭтот;
          иначе
              Прервать;
          КонецЕсли;
          к_этот = к_пред;
       КонецЦикла;
   КонецЦикла;
КонецПроцедуры

Си:

...
	for(int i = 1; i < iSize; i++){
		for(int j = i; j > 0; j--){
			mValThis = pParaArrIArr->getAt(j);
			mValPrev = pParaArrIArr->getAt(j - 1);
			if( mValThis < mValPrev){
				pParaArrIArr->setAt(j - 1, mValThis);
				pParaArrIArr->setAt(j, mValPrev);
			}
			else{
				break;
			}
		} 
	}
...

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

 

С++:

...
        v8com_array_iterator _First(pParaArrIArr, 0);
        v8com_array_iterator _Last(pParaArrIArr, pParaArrIArr->size());
        std::sort(_First, _Last);
...

 

1С с предикатом:

процедура СортироватьМассивВставкамиПред(М, Предикат)
   перем колво;
   перем к;
   перем к_этот;
   перем к_пред;
   перем елмЭтот;
   перем елмПред;
   перем елмЭтотМеньшеПред;
   колво = М.Количество();
   для к =1по колво -1цикл
         к_этот = к;
         пока к_этот >0цикл
              к_пред = к_этот -1;
              елмЭтот = М[к_этот];
              елмПред = М[к_пред];
              выполнить("елмЭтотМеньшеПред = " + Предикат + "(елмЭтот, елмПред)");
              если елмЭтотМеньшеПредтогда
                   М[к_этот]= елмПред;
                   М[к_пред]= елмЭтот;
              иначе
                   Прервать;
              КонецЕсли;
              к_этот = к_пред;
         КонецЦикла;
   КонецЦикла;
КонецПроцедуры

В параметр предикат передаем "МодТест.СравнитьЗначенияНаМеньше"

Функция СравнитьЗначенияНаМеньше(знач знач1, знач знач2) экспорт
        возврат ?(знач1 < знач2, истина, ложь);
КонецФункции

Для компоненты с предикатом посложнее... Делаем объект «Делегат»:

перем<делегат>;
<делегат> = <компонент>.СоздатьДелегат(<объект>[.ЭтотОбъект],“<имя-метода>”);
<делегат>.Вызвать(<список-параметров-метода>);

Т.е. создаем в компоненте объект инициализируемый ссылкой на объект (модуль) платформы и строкой с указанием, какой из методов (функций или процедур) вызвать с переданными при вызове параметрами. У этого объекта-делегата единственное назначение – передать параметры и управление в указанный метод объекта платформы (и вернуть результат, если это функция). Платформа не поддерживает конструкции вида <имя-переменной>(...), поэтому, после некоторых раздумий, я решил не фиксировать какой-либо определенный синтаксис. Делегат можно .Вызвать(...), .Выполнить(...), .Обработать(...), хоть .СделайМнеОоЛаЛа(...), в зависимости от семантики.

Процедура ТестДелегата()
   сообщить("*---------- ТестДелегата -----------");
   хДел = СПП.СоздатьДелегат(МодТест,"ТестДелегата_Функция");
   хРез = хДел.Вызвать(202);
   сообщить("* Делегат вызван, результат: " + хРез);
   сообщить("*---------- ------------ -----------");
КонецПроцедуры
Функция ТестДелегата_Функция(пара)экспорт
   сообщить("* вызов делегата, аргумент = "+ пара);
   возврат пара +1;
КонецФункции

 

*---------- ТестДелегата -----------

* вызов делегата, аргумент = 202

* Делегат вызван, результат: 203

*---------- ------------ -----------

 

С учетом этого код сортировки плюсами c предикатом выглядит как то так:

...
        v8com_array_iterator _First(pParaArrIArr, 0);
        v8com_array_iterator _Last(pParaArrIArr, pParaArrIArr->size());
        v8com_compare_callback _Comp(pParaIDelegat);

        std::sort(_First, _Last, _Comp);
...

 

Результаты:

*-------------------- сортировка массива ---------------------

*Количество элементов массива: 1 500          

*{802, 974, 846, 95, 355, 377, 933, 222, 968, 64, 198, 395, 966, ..., 136, 611, 161}

* сортировка 1С  вставками, возр.  ==  3 078

* сортировка Си  вставками, возр.  ==    329

* сортировка С++ вставками, возр.  ==    235

* сортировка С++ std::sort, возр.  ==     17

* С++ std::sort с предикатом, возр. ==     94

* Си вставками с предикатом, возр. ==  2 064

* 1С  вставками с предикатом:       == 56 969

*

*Проверка массививов: ОК

*{1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, ..., 992, 993, 994, 996, 996, 997, 997, 999}

*

* С вставками быстрее, чем 1С вставками в 9,4 раз

* С++ вставками быстрее, чем 1С вставками в 13,1 раз

* С вставками быстрее, чем С++ вставками в 0,7 раз

* С++ сорт быстрее, чем 1С вставками в 181,1 раз

* С++ сорт быстрее, чем С вставками в 19,4 раз

* С++ сорт быстрее, чем С++ вставками в 13,8 раз

* С++ сорт быстрее, чем С++ сорт с предикатом в 5,5 раз

* С++ сорт с предикатом быстрее, чем 1С сорт вставками в 32,7 раз

* С сорт вставками с предикатом быстрее, чем 1С сорт вставками в 1,5 раз

* 1С вставками с предикатом медленнее, чем 1С  сорт вставками в 18,5 раз

* 1С вставками с предикатом медленнее, чем Си  вставками с предикатом в 27,6 раз

* 1С вставками с предикатом медленнее, чем С++ сорт с предикатом в 606,1 раз

*-------------------- ------------------ ---------------------

Замечу, что количество элементов массива подобрано для получения некоторых характерных значений. Если их порядка 300, то с std::sort сравнить не получается – там просто 0. Если порядка 5000, то ждать пока 1С отсортирует с предикатом приходится неприемлемо долго. Графики в зависимости от количества элементов массива, конечно, были бы любопытны. Также интересно поведение std::_Insertion_sort(), влияние InterlockExhangeXXX, сравнение с контейнером над тривиальными типами данных, сравнение разных компиляторов, поведение в режиме отладки, т.д., т.п. При наличии времени и интереса это все, конечно, можно сделать.

Общие выводы:

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

2)      Любой простенький алгоритм, написанный на языке 1С, несравнимо проигрывает вылизанному алгоритму из существующей С/С++ библиотеки, коих миллион.

 

Ну и в заключение, коль скоро у нас есть Делегат, можно похулиганить с полиморфизмом:

// Зоопарк делегатов
процедура ТестДелегатовЗоо()  экспорт
   перем мойЗоопарк;
   мойЗоопарк =новый Массив;
   мойЗоопарк.Добавить(СоздатьСтруктуруЖивотное_Кошка("Мурка"));
   мойЗоопарк.Добавить(СоздатьСтруктуруЖивотное_Собака("Шарик"));
   ТестДелегатовЗоо_ОпроситьЗоопарк(мойЗоопарк);
КонецПроцедуры
Функция СоздатьСтруктуруЖивотное_Собака(Имя)
   возврат СоздатьСтруктуруЖивотное(Имя, СоздатьДелегат(МодТест,"ЖивотноеСобака_Голос"));
КонецФункции
Функция СоздатьСтруктуруЖивотное_Кошка(Имя)
   возврат СоздатьСтруктуруЖивотное(Имя, СоздатьДелегат(МодТест,"ЖивотноеКошка_Голос"));
КонецФункции
Функция СоздатьСтруктуруЖивотное(Имя, Голос)
   возвратновый ФиксированнаяСтруктура("Имя, Голос", Имя, Голос);
конецфункции
Функция ЖивотноеКошка_Голос()           экспорт
   возврат"Мяу";
КонецФункции
Функция ЖивотноеСобака_Голос()         экспорт
   возврат"Гав";
КонецФункции
процедура ТестДелегатовЗоо_ОпроситьЗоопарк(З)
   перем Ж;
   сообщить("*");
   сообщить("*------- Перекличка в зоопарке делегатов -----------");
   длякаждого Ж из З цикл
                 Сообщить("* Животное '" + Ж.Имя + "' отозвалось '" + Ж.Голос.Вызвать() + "'");
   КонецЦикла;
   сообщить("*------- ------------------------------- -----------");
   сообщить("*");
КонецПроцедуры

*------- Перекличка в зоопарке делегатов -----------

* Животное 'Мурка' отозвалось 'Мяу'

* Животное 'Шарик' отозвалось 'Гав'

*------- ------------------------------- -----------

 

Все-таки структура с Делегатом это не совсем класс. Все равно опять .Вызвать() да .Выполнить(). Хочется полноценных интерфейсов, наследования, виртуальных методов и т.д. и т.п.

//Зоопарк классов
функция ПолучитьОписательКлассаЖивотное()
   перем К;
   К = СоздатьОписательКласса("КлассЖивотное");
   К.ДобавитьПоле("Имя");
   К.ДобавитьПоле("м_ВремяРождения");
   К.ДобавитьМетод("ДайВозраст", МодТест,"КлассЖивотное_ДайВозраст");
   К.ДобавитьАбстрактныйМетод("ДайГолос");
   возврат К;
КонецФункции
функция ПолучитьОписательКлассаЖивотноеКошка()
   перем К;
   К = ПолучитьОписательКлассаЖивотное();
   К.ПереопределитьМетод("ДайГолос", МодТест,"КлассЖивотноеКошка_Голос");
   возврат К;
КонецФункции
функция ПолучитьОписательКлассаЖивотноеСобака()
   перем К;
   К = ПолучитьОписательКлассаЖивотное();
   К.ПереопределитьМетод("ДайГолос", МодТест,"КлассЖивотноеСобака_Голос");
   возврат К;
КонецФункции
функция КонструкторЖивотного(Класс, Имя, ВремяРождения)
   Класс.Имя = Имя;
   Класс.м_ВремяРождения = ВремяРождения;
   возврат Класс;         
КонецФункции
функция СоздатьКлассЖивотное_Собака(Имя)
   //туду: возврат ПолучитьОписательКласса("ЖивотноеСобака").Конструкторы[..].Вызвать(<список-параметров>);
   //                     => .Вызвать(<класс-интерфейфейс-конструктора>, <параметры>)
   возврат КонструкторЖивотного(СоздатьКлассПоОписателю(ПолучитьОписательКлассаЖивотноеСобака()), Имя, ДайТики()-456);
КонецФункции
функция СоздатьКлассЖивотное_Кошка(Имя)
   возврат КонструкторЖивотного(СоздатьКлассПоОписателю(ПолучитьОписательКлассаЖивотноеКошка()), Имя, ДайТики()-567);
КонецФункции
функция КлассЖивотное_ДайВозраст(Класс, Еденицы)                               экспорт
   перем х;
   х = ДайТики()- Класс.м_ВремяРождения;
   возврат Окр(?(Еденицы = ТипЕдиницыШкалыВремени.Минута, х/60, х),1);      //чё-то для теста
КонецФункции
функция КлассЖивотноеКошка_Голос(Класс)                                        экспорт
   возврат"Мур-Мяу";
КонецФункции
функция КлассЖивотноеСобака_Голос(Класс)                                       экспорт
   возврат"Гав-Гав";
КонецФункции
процедура ТестКлассовЗоо()  экспорт
   перем мойЗоопарк;
   мойЗоопарк =новый Массив;
   мойЗоопарк.Добавить(СоздатьКлассЖивотное_Кошка("Мурка"));
   мойЗоопарк.Добавить(СоздатьКлассЖивотное_Собака("Шарик"));
   ТестКлассовЗоо_ОпроситьЗоопарк(мойЗоопарк);
КонецПроцедуры
процедура ТестКлассовЗоо_ОпроситьЗоопарк(З)
   перем Ж;
   сообщить("*");
   сообщить("*------- Перекличка в зоопарке классов -----------");
   длякаждого Ж из З цикл
       Сообщить("* Животное '"+ Ж.Имя +"', возраст = "+ Ж.ДайВозраст(ТипЕдиницыШкалыВремени.Минута)+", отозвалось '"+ Ж.ДайГолос()+"'");
   КонецЦикла;
   сообщить("*------- ----------------------------- -----------");
   сообщить("*");
КонецПроцедуры

*------- Перекличка в зоопарке классов -----------

* Животное 'Мурка', возраст = 9,5, отозвалось 'Мур-Мяу'

* Животное 'Шарик', возраст = 7,9, отозвалось 'Гав-Гав'

*------- ----------------------------- -----------

 

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

- о множественном наследовании думать или как все, кроме плюсов?

- и вообще Класс он НАСЛЕДУЕТСЯ ОТ ?, РАСШИРЯЕТ ?

- class <name> : private <base-class> - такое надо?

- this, me, self- как? В текущей реализации это просто переменная. Пишу Класс, будут конфликты можно переименовать. Но все же...

- private - ЧАСТНЫЙ? ВНУТРЕННИЙ?

- mustoverride – ПЕРЕОПРЕДЕЛЯЕМЫЙ ОБЯЗАТЕЛЬНО?

- ...

И Особенно смущает вопрос, почему 1С это все скрывает, ведь все эти возможности есть у платформы с рождения.

У кого какие мысли?

 

Спасибо.

 

 

 

 <необходимое дополнение>

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

 

 

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергѣй Батанов (baton_pk) 14.10.15 00:15
Ну, добро пожаловать в мир 1С. Не буду ругать и ставить минус, многие через ЭТО проходят на каком-то этапе освоения 1С. :-)
boggonzikov; denis_aka_wolf; Ta_Da; dabu-dabu; Evil Beaver; artbear; lena8push; shalimski; sorb; zqzq; +10 Ответить 1
2. Евгений Мартыненков (JohnyDeath) 14.10.15 00:27
(1) А за что ругать?

(0) Умеет наследоваться от классов-метаданных, например от Документ.ПриходныйКассовыйОрдер ?
3. script Мальчинко (script) 14.10.15 01:39
Дык а когда можно будет хоть что нибудь пощупать?
Созинов; sorb; artbear; marsohod; CSiER; kuntashov; +6 Ответить
4. Сергѣй Батанов (baton_pk) 14.10.15 08:06
(2) JohnyDeath,
А за что ругать? 

за то что, опять вот это вот: "язык 1С медленный", "язык 1С корявый" и тому подобные. и почему объектно-ориентироанная модель, а не прототипная, как в javascript?
ещё и пощупать нечего :(
5. Дмитрий Шерстобитов (DitriX) 14.10.15 08:26
Просто в 1с - очень редко бывают случаи когда надо сделать то, о чем ваы говорите, в основном - такие объемы данных и расчеты выполнются на стороне SQL серверов, т.е. вытягиваются запросами.
Вы немного путаете подходы. Это тоже самое, что и сравнивать разгон от 0 до 100 у болида и у полноценного джипа, т.е. - да, болид выйграет, тут вопросов нет, но вот только с нашими дорогами - эти сферические кони в вакууме (я о полученных цифрах) - даром не нужны.

Как то так.
logarifm; awk; badboychik; Liris; denis_aka_wolf; Sheff; ProgrammistC; DimaBab; bulpi; opx; herfis; DrAku1a; mindcannon; Ta_Da; Evil Beaver; gubanoff; dabu-dabu; zqzq; ya.Avoronov; lena8push; shalimski; sorb; nihfalck; baton_pk; +24 Ответить 1
6. Роман Сюзев (sorb) 14.10.15 08:36
(2) JohnyDeath, куча народу, начиная работать с 1С, идут в монастырь со своим уставом пытаются натянуть свои представления о том, как все должно быть устроено, вместо того, чтобы изучать местную методику разработки. Приведенные примеры - сферические кони, за которые в продакшне обычно увольняют. Сортировать массив - это круто, но знание существующих УКЗ в 1С позволит не заниматься такой ерундой. Перебирать строки для вычисления суммы? Ну как-бы это вообще с точки зрения 1С ошибка проектирования. Скомпилированный код выполняется быстрее интерпретируемого? Спасибо, кэп. Наследование? Давайте разбирать конкретные сценарии применения - обычно при обсуждении проблем с поддержкой и развитием больше, чем выгод.
Ну и про отладку, обработку исключений тактично опущено, спишем на то, что пока речь о сырье.

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

В общем, ругать не хочется, хочется следить за развитием событий :)
davydoff; denis_aka_wolf; Sheff; white_sochi; bulpi; dj_serega; biz-intel; ekaruk; mindcannon; Созинов; BorovikSV; +11 1 Ответить
7. Артур Аюханов (artbear) 14.10.15 09:07
Тема интересная, но без демки и/или кода выглядит слабовато.
ЗЫ я занимался аналогичными проблемами в компоненте 1С++ для 1С 7.7 12 лет назад :)
8. Сергей Рудаков (fishca) 14.10.15 09:30
Все эти порядки, которые выигрываются кодом на С++, съедаются медленным получением данных из СУБД.
Но смысл продолжать конечно есть, быстрая обработка никогда и никому еще не мешала.
В идеале хотелось бы видеть 1С++ для 8.х.
И да, даешь демку, хотя бы и сырую, будем высушивать общими усилиями.
invertercant; djam_arttek; Созинов; Evil Beaver; +4 Ответить
9. Андрей Овсянкин (Evil Beaver) 14.10.15 09:37
Ого как, 1С++ добрался и до восьмерки! Простите, но мы не узнаём вас в гриме... Откуда вы?
nSpirit2; +1 Ответить
10. Иван Устьянцев (nSpirit2) 14.10.15 09:59
Ну все примеры хороши проблема в том что они совершенно не жизненны.
Я не знаю как у остальных господ но у меня задачи сортировки массивов последний раз были в институте. В реальной разработке на 1с где большая часть данных получается запросами получение не сортированных данных из базы очень редкий случай.
Но разработка несомненно очень интересная будем ждать того что можно пощупать
denis_aka_wolf; BorovikSV; +2 Ответить
11. Андрей Овсянкин (Evil Beaver) 14.10.15 10:04
Кстати, по существу:

ООП в 1С - в чистом виде - не надо. Почему - дискутировали уже много, не буду повторяться.
Но раз уж пошла такая пьянка, то:

- о множественном наследовании думать или как все, кроме плюсов?

Не надо. От такого отказались в яве, шарпе и остальных.
- и вообще Класс он НАСЛЕДУЕТСЯ ОТ ?, РАСШИРЯЕТ ?

Он НАСЛЕДУЕТ (но и РАСШИРЯЕТ тоже, почему нет)
- class <name> : private <base-class> - такое надо?

Зачееем??
- this, me, self- как? В текущей реализации это просто переменная. Пишу Класс, будут конфликты можно переименовать. Но все же...

У 1С-ников это называется "ЭтотОбъект"
- private - ЧАСТНЫЙ? ВНУТРЕННИЙ?

Зачем тащить синтаксис C++ в 1С? У 1С уже есть свои лексические конструкции для инкапсуляции.
- mustoverride – ПЕРЕОПРЕДЕЛЯЕМЫЙ ОБЯЗАТЕЛЬНО

Ваще сотона! не надо этого. Для начала дайте что-то пощупать, чтобы мы поняли о чем речь.

А вообще - очень клево! Мы тут все любим всякие такие штуки, даже если они просто экспериментальные. Удачи вам!
RomanRomans; fishca; sorb; +3 Ответить
12. Сергей Пшеничников (Зеленоград) 14.10.15 10:17
Автор, вам плохо а медленном языке с русской нотацией и сложными объектами?

Это ДРУГОЙ язык. Не для embedded, не для realtime - но для быстрого создания прототипов открытых учётных систем специалистом любой квалификации с большим количеством готового кода среднего качества с фрагментарной документацией.
bulpi; biz-intel; Evil Beaver; +3 Ответить 1
13. Иван Устьянцев (nSpirit2) 14.10.15 10:21
(12) Зеленоград,
фрагментарной документацией

Хорошо что с этим потихоньку начали бороться :D
14. Сергей Боровик (BorovikSV) 14.10.15 10:35
(0) Автор а можете уточнить каков тип у переменных numTot, numQty,numPri? (Из первого примера на Си)
А то как то представили кусок кода, скрыв самое интересное )
16. Алексей 1 (AlX0id) 14.10.15 11:31
(5) DitriX,
А как же РАУЗ с миллионами операций? В общем-то, там бы сильно не помешало ускорить вычислительный процесс.. Вынести на SQL сложные запросы да еще и так, чтобы они там более-менее оптимально выполнялись - возможно далеко не всегда.

А статье, конечно, не хватает "чего пощупать" )
invertercant; jan27; +2 Ответить
17. kiruha Дронов (kiruha) 14.10.15 12:57
Здорово конечно, но почему столько публикаций пытается оптимизировать код 1С, который в общих затратах на вывод отчета 0.5% ?
18. Вячеслав Гилёв (Gilev.Vyacheslav) 14.10.15 14:51
предлагаю автору сходить трудоустроиться в саму 1С, если талант, то дадут реализоваться, а если шапкозакидатель, то быстро всплывет....
logarifm; HiKS; dj_serega; IntelInside; sorb; +5 Ответить
19. Андрей Овсянкин (Evil Beaver) 14.10.15 15:34
Не, ну чего вы накинулись на человека? Вдруг там действительно что-то интересное? Надо же счупать а потом уже обсуждать. Афтар - пешы есчо!
sorb; fishca; kuntashov; +3 Ответить 1
20. Андрей Овсянкин (Evil Beaver) 14.10.15 15:41
(14) BorovikSV, ну судя по фрагменту кода, автор получил доступ к реализации объектов внутри 1С, например, к ТаблицеЗначений и IValue. И дергает похоже родную реализацию таких вещей, как getRowCount и IValue::getNumeric.

Другое дело, непонятно зачем он пытается сравнивать скриптовый код и код на C++. Еще и цифры приводит. Можно подумать, кто-то сомневается, что машинный код быстрее....
21. Сергей Боровик (BorovikSV) 14.10.15 16:03
(20) Evil Beaver,
numTot += numQty * numPri;
где там объектами пахнет? Просто умножение и сложение.
Сдается мне что numTot, numQty,numPri имеют тип DOUBLE.
22. Сергѣй Батанов (baton_pk) 14.10.15 16:07
(21) BorovikSV, может, у него операторы переопределены для Numeric-ов
23. Андрей Овсянкин (Evil Beaver) 14.10.15 16:16
(22) baton_pk, он получает некий Numeric из "родного" IValue методом getNumeric. Я сильно подозреваю, что тип значения - это внутренний тип Number/Число, реализованный внутри платформы. С операторами тогда получается интереснее. Он не только нашел, где внутри dll перегружен operator*(V8Numeric,V8Numeric), но и прописал это объявление в своих *.h И сколько таких еще вещей нужно было раскопать и описать. Иными словами, там проделана немалая работа (если это не фейк). Хочется посмотреть.
24. Роман С (Dach) 14.10.15 16:24
Будет реализация дополнительных плюшек к объекту Запрос, а особенно возможность управлять текстом, из которого запрос 1С трансформируется в запрос к СУБД?

Хочется всех возможностей T-SQL, которых нет в 1С, например явного указания как делать джойн (nested loops, merge...)
25. Сергей Боровик (BorovikSV) 14.10.15 17:15
(23) Evil Beaver,
Некий getNumeric может называться и ExtractAsDouble, это ничего не меняет и не объясняет. Ведь мы не можем делать выводы о типах из названия метода.
Сомневаюсь что человек перегружал арифметические операторы для встроенного некого гипотетического INumeric. На это указывает крайне скудное описание возможностей. Отсутствие демо.
Ведь на кой черт заниматься "фантиками", если рабочего прототипа который можно показать еще нет?

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

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

Предположим что заголовки для INumeric уже имеются на 100%, и даже пусть это на 100% совпадает с заголовками у 1С.

Так а дальше то что?
Засунуть в отдельный поток вычисления - вряд ли возможно, ведь без патчинга платформы ты не заставишь ее синхронизироваться с тобой.
Выполнять в том же потоке? подключить компоненту, откуда то вытащить модуль на VB (или C++) , на лету скомпилировать, запустить и если все прошло штатно сэкономить десяток другой миллисекунд?
И первый же запрос к БД, нивелирует повышение производительности, которое досталось таким трудом.

Я уж не говорю и том, что это хрен запустишь в продакшн, какие модуля на VB (C++) напишут средненькие 1С-ники, и наконец что случится при переходе на 8.4
26. Андрей Овсянкин (Evil Beaver) 14.10.15 17:28
(25) BorovikSV, возможно и double, однозначных выводов сделать нельзя. Просто при взгляде на то, как вызывается API, мне кажется, что там платформенные numerics. Однако, если так, то получается, что автор должен был прописать все сигнатуры в h-файлах и каким-то образом залинковать их с платформой. А если там даже и double, то все равно pValueTable->getRowsCount() он обязан был где-то прописать, чтобы это компилировалось.

Итого, у меня есть несколько вариантов:
1. Найден способ доступа к API платформы, который позволяет сгенерировать еще и h-файлы классов.
2. Этот код не реальный C++ код, а гипотетический. Никаких headers и вызовов в стиле pValueTable->getRowsCount() еще нет.
3. Это вообще фейк
4. Автор реально запилил все header-s для всех классов платформы. И не просто запилил, а нашел все перегруженные операторы и адреса реализаций внутри dll.
4.1 Ник автора кажется мне очень любопытным.
27. IntelInside (G) (IntelInside) 14.10.15 17:38
Сразу отвечу всем. Большое спасибо за проявленный интерес к моей разработке. И отдельно за поддержку, в которой я остро нуждаюсь.
Сравнения по быстродействию проводятся с совершенно понятной иллюстративной целью. Я прекрасно знаю, что эффективность решения в целом практически как никак не зависит от быстродействия одного отдельно взятого алгоритма. Я прекрасно знаю парадигму, по которой обработкой массивов данных должен заниматься сервер. Даже более того. Я прекрасно знаю, что не только система учета, а и вся ИТ-инфраструктура организации это всего лишь один из управленческих инструментов, а на той кухне вообще другая аксиоматика и правила игры. В первоначальных вариантах публикации у меня были абзацы, рассматривающие эти вопросы. В окончательном варианте я их убрал, посчитав отвлекающими от сути. Все эти вопросы бесконечно дискутируемы, и, в лучшем случае позволяют понять собеседникам с какой стороны каждый из них ощупывает предмет дискуссии. Впрочем, у меня есть заготовки типа «О быстродействии, или ресурсы всегда ограничены», «О сервере, или где мои данные и крутятся ли они», «Об ООП, или программист это профессия или образ мышления», «1С 2025, или мой начальник – компьютер. Хороший. Многоядерный», «О Девятке, сложности систем и что Тик-Такает у Интела». Из каждой страница, а то и больше текста выйдет. Только основных тезисов и обоснования. Наверно буду готовить, но я так тяжело пишу...

Меня вот все больше волнует, что у меня в зоопарке кошка да собака. Это нелогично, и поэтому, требует внимания в первую очередь.

1С Прекрасная машинка! Иначи бы этим не занялся. Архитектура – просто хрустальный дворец, снимаю шляпу. Лидеры рынка. Успешная корпорация. ВМ? Да нормальная ВМ. Мне конечно видны нюансики, которые за кодом невидно... Но в целом прелесть, просто прелесть.

О Пощупать.
Для меня стала очевидна необходимость разбить проект на две части «классы» и «плюсы». Не в последнюю очередь ввиду см.<добровольные обязательства> к публикации. Срок для «классы» не ранее очередного релиза 1С, а скорее даже через один. Мы все во власти Создателя, и, в зависимости от его реакции (или отсутствия таковой) будет видно как кодить, что кодить и кодить ли вообще.
По «плюсам» ничего сказать не могу. Вероятно, в виде СДК его в публичном доступе не будет никогда. Это, конечно, не мешает выпустить библиотеку с АПИ по перемалыванию кортежей или еще какими полезняшками. Но опять – же, если реакция Создателя буде крайне негативной, то и полезность такой библиотеки сомнительна. Будем посмотреть. Тем более (отдаю должное проницательности <sorb>), в ексепшенах еще конь не валялся. И не только. Тут просто специфика своя. Не делать лишнего, т.к. не знаешь заранее принципиальную возможность положительного результата. Будут ексепшены, за вполне себе линейное время.
В любом случае, для «классы» сначала БНФ и спецификация. Для меня здесь важна дискуссия. Я действительно не мыслю как «1С-овец».
Уже спасибо за:
- ЭтотКласс – <Evil Beaver>, ЭтотОбъект не пойдет – конфликт имен, а ЭтотКласс в самый раз.
- КЛАСС <мой-класс> : НАСЛЕДУЕТ Метадата.ЧегоТоТам
К сожалению возможно, и, как минимум в первой версии будет запрещено. По позже распишу подробнее. Наследоваться можно будет только от своих классов. Иначе я не смогу гарантировать стабильность.

- MustOverride, NotOverridable, Overridable, Overrides нужно переводить. Вы просто по олицетворяйте себя с разработчиком на каждом уровне иерархии. Будет, наверное ОБЯЗАТЕЛЬНО ПЕРЕГРУЖАЕМАЯ. Ничего в голову не лезет.

- Кстати в БНФ нужно оставлять место для типизации. Назовем это чуйкой.

О себе. Развиртуализироваться пока не буду. Хоть в гриме, хоть без грима все равно не узнаете. Если коротко, то Б3-34, Квантовая механика, Практическая психология и конспекты MBA для меня не пустые звуки. Географически Харьков (но ветра нынче северные, пора в Питер, к Маме:).

Да! И не надо вопросов какой тип у mNumTot и прочего. Не корректно и все равно не отвечу. Я и так, наверное, слишком много сказал. Да.. Учитывайте еще гадая, что у плюсов есть дефайны и тайпдефы.

Нужно еще как-то потереть с oneScript и Снегопат. «Классы» в 1С так или иначе все равно будут. И им нужен будет визуальный построитель. (Tфу… прости господи).

Спасибо.
Evil Beaver; fishca; +2 Ответить 3
28. Андрей Овсянкин (Evil Beaver) 14.10.15 17:45
(27) IntelInside, Спасибо за ответы. Интересно. Ну про OneScript можете тереть свободно. baton_pk и я уже отметились в топике.
29. Сергей Рудаков (fishca) 14.10.15 17:49
(27) IntelInside, ничего не понял, но интригуешь классно, жду.
30. Роман Сюзев (sorb) 14.10.15 19:03
(19) Evil Beaver, да никто его не обижает - лично я испытал энтузазим, идет бурление хомячков и волнения мозга, что и наблюдается по обилию взволнованных комментов :)
31. Александр Орефков (orefkov) 14.10.15 19:27
Проблемы дёргать методы объектов напрямую - давно уже нет.
Что через IContext - универсальный 1Сный интерфейс, что у некоторых типов объектов (ТЗ, ДЗ и тп) - их спецефичными интерфейсами.
Если в snegopat.reborn просмотреть внимательно папки engine и v8api - всё это найдётся и видно для пытливого ума.
Однако автор рискует наступить на те же грабли, что и снегопат в свое время - релизозависимость от 1С.
Достаточно 1С немного изменить интерфейсы, "потроха" объектов - и С++ный адаптер перестает работать, пока автор не отразит эти изменения.

Как это было, когда 1С при переходе с 8.2 на 8.3 изменило внутренности своего объекта wstring, что сделать универсальный адаптер на С++ оказалось настолько сложно, что пришлось делать два отдельных snegopat.dll и snegopat83.dll.

Вот к примеру "блуждания" прямого вызова "Предупреждения":
// Предупреждение
#if ver >= 8.3.7
	21
#elif ver >= 8.3.6
    20
#elif ver >= 8.3.5
    19
#else
    18
#endif
#if ver < 8.3
    save int messageBox(const v8string&in text, uint type=0, uint timeout=0, uint caption=0, HWND parent=uint(-1), mbp& param=mbp(), int i1=0, int i2=0, int i3=0)
#else
    save int messageBox(const v8string&in text, uint type=0, uint timeout=0, uint caption=0, HWND parent=uint(-1), mbp& param=mbp(), int i1=0, int i2=0, int i3=0, int i4=0, int i5=0)
#endif
...Показать Скрыть

от релиза к релизу меняется как номер виртуальной функции, так и сигнатура вызова.

Возможно, то, что автор уже накопал - относительно стабильно, но это просто говорит о том, что накопано не так и много.

Ну и самое главное - замеры сортировки вставками на С++ надо сравнивать не с реализацией этого алгоритма на 1С, а с тз.Сортировать();
То есть использование этой компоненты для увеличения скорости работы - лукавство. Скорость работы интерпретатора 1С никогда не была "бутылочным горлышком", в которое упиралась производительность.
zarius; artbear; Ta_Da; dgolovanov; nSpirit2; herfis; Magister; kuntashov; sorb; +9 Ответить 1
32. Александр Орефков (orefkov) 14.10.15 19:52
(23) Evil Beaver, ну, за Numeric могу сказать только то, что его внутренняя реализация не менялась с 7.7. Да-да, этот класс 1С полностью перетащила из 7.7 в 8ку, только название изменила с CNumeric на Numeric. Особо искать его методы не приходится - торчат наружу из core8x.dll. Пока автору просто - можно напрямую линковаться к core83.dll, так как 8.2 в списке поддерживаемых не значится. А в 8.4 возможно надо будет линковаться уже к core84.dll.
33. Андрей Акулов (DrAku1a) 15.10.15 03:17
(0), Замерь производительность суммирования и сортировки на "Цикле в одну стоку"
34. IntelInside (G) (IntelInside) 15.10.15 11:03
(31) orefkov,

Ждал Вашего комментария, Саша. Спасибо. Я, естественно, смотрел и Снегопат и Опенконф и 1С++ еще много, много работ уважаемых <ников>. Я вообще заниматься всем этим начал с тоски, что Снегопата под 8.3 нет. Не вру. Поставил платформу. Того нет, этого, пятого, десятого. Снегопат замерз. Тоска. Начал копать че-то зачем-то, уже не помню. Потом втянулся, интересно стало, что-то получаться началось. Как-то так.
В общем "чего я злой такой был - у меня Снегопата не было"(с).

Разница работы в design-time (у Вас) и в run-time (у меня) в первую очередь заключается в см. .<добровольные обязательства> к публикации. Я уже более чем уверен, что в какую-нибудь «чугунную» уже голову закралась мысль: «Я у них драйвер ЭККА куплю и поставлю, а он у меня все клиентскую базу выкачает». Безопасники они такие. Это их работа. И не такие уж они и чугунные. У меня у одного знакомого безопасника второе высшее экономическое образование. Высшее. Экономическое. Второе. У безопасника. А стоимость данных на серверах клиентов 1С существенная. А 1С дает определенные гарантии. Поэтому сейчас ничего существенного планировать (кодить) нельзя. Нужно ждать реакции Создателя. Это его мир. Мы лишь жалкие черви, которым Он позволил плодиться и размножаться. Если в следующем релизе все будет закрыто, перемешано, зашифровано, прикрыто пакером – это одна история. Если нее-а, и будет объявлено о сертификации производителей драйверов оборудования и прочих разработчиков компонент (ессно за денюжку), с изменением АПИ загрузки – другая. Если просто пройдет утечка, что де, скоро ожидается очередная 1С v9 с ООП, триггерами, с преферансом и поэтессами, и, в том числе с существенно усиленной безопасностью – третья. Ждем..с. Если чё (вариант 1), прошу прощения...
В случае существенного злонамеренного изменения АБИ я сливаюсь и иду читать Радченко (ну или таксовать). Наверное. Бороться с Создателем – это не для моей печени. Хотя и жаль. Да 8.3.6.ххх уже очень неплохая лошадка. Ну в общем есть варианты.

Охват кода у меня действительно небольшой. Мне много не надо. Я намеренно стараюсь не лазить дальше коре и не глубже интерфейса. Интерфейс – это контракт. На случаи текущего изменения АПИ/АБИ... Ну что ж. Это жисть. Определенную надежду дает только достаточная стабильность документированного АПИ, неспешность 1С-ников в обновлении версий, ну и с десяток тысяч строк .idc файла. Как говориться «с помощью доброго слова и пистолета...». Тоже сыренько, но и говорить о продакшене пока рано. Еще раз. Я пытаюсь сжиться с платформой, а не воевать с ней. Ну например. Я не нашел глобального контекста. Вернее я знаю как он формируется, нашел место, где по моему мнению, он живет, но добыть его оттуда функций нет. Я знаю как там устроено, за интерфейсом, но туда не лезу. Нет функции – значит так надо. Обхожусь явной передачей контекста. Может я плохо искал, может он самой платформе просто не нужен, может там какие нюансы в маршалинге. Нах. Платформа не дает и я не даю. Мне Ваше решение с коллективным тестированием через AS не подойдет. У меня runtime. Оно либо должно работать как часы, либо... Нету либо.

О сортировке. Это скоро станет смешным. Я начну искать задачу где мать всех языков сущих буде уступать 1С. Я уже не рад что оно быстрее. Шутка. Моя мысль в том, что метод .Сортировать() есть тольку у ТЗ. И без предиката. У других контейнеров его просто нет. Относительно ТЗ.Сортировать() я даже не проверял, но уверен что он будет быстрее, чем я могу сделать при работе через интерфейс. Ну обязан просто. Контейнеры 1С non-swap-compatable и мне на каждом шаге приходится зависать на InterLock…, несмотря на то что другим потоком рядом и близко не пахнет. А у других контейнеров .Сортировать() вообще нет. Ни с предикатом ни без. И ЧастичноСортировать() нет и count_if и seach_n нет и индексирования бинарным деревом нет, только hashmap for general purposes. И объединять\разъединять\транспонировать нет. И еще мноого чего нет. И правильно. И не должно быть. Я перед их Архитектором, в том числе, и за это снимаю шляпу. При увеличении радиуса в два раза объем растет в квадрате, кубе, и дальше. Каждая фича платформы это увеличение радиуса, а объем это затраты на сопровождение, согласование, тестирование и пр. всех этих фич. А измерений проблемы у них тоже дай бог сколько. И не надо все тащить в платформу. Она и так перегружена. Архитектурные ограничения. «Назначение границ» у Высоцкого... Граница это воображаемая линия нарисованная кровью. Это не для детей.
А вот возможность подключить must have, если знаешь что делаешь. Засяду наверное за литературщину вместо БНФ. Все равно делать пока нечего.

И ЕЩЕ РАЗ ВСЕМ. ХВАТИТ ОБСУЖДАТЬ ABI ПЛАТФОРМЫ В ОТКРЫТУЮ. То что для нас по-приколу, для других «Обнаружена возможность исполнения неподписанного кода». Это закончится просто тем, что 1С прихлопнет лавочку удобным для нее способом и пойдем все читать Радченко v9.

И да.. Саша, мне Снегопат купить можно? Я посчитал неэтичным делать это анонимно и до этой публикации. Вам я не конкурент (по многим причинам), но местами могу быть полезен. Мне же он по любому нужен. Их монструозное творение на Эклипсе у меня просто не запустилось.

И еще раз! Основной вопрос всех времен и народов:
ПОЧЕМУ 1С ЭТОГО НЕ СДЕЛАЛА? Вы, естественно, понимаете, что я ничего конгениального не сделал. О платформе и ее эволюции Вы знаете больше всех нас вместе взятых.
Каково Ваше мнение?

Спасибо.
35. bulpi bulpi (bulpi) 15.10.15 12:51
1с этого не сделала, потому, что 97% 1с-ников не поняли НИЧЕГО из того, что Вы написали . И я среди них :) А рынок 3% не формируют.
36. Alexei Zhovner (jan27) 15.10.15 12:57
(35) такое чувство, что вы этим гордитесь, не надо говорить за всех
CyberCerber; artbear; baton_pk; +3 Ответить
37. Сергей Рудаков (fishca) 15.10.15 13:12
То что для нас по-приколу, для других «Обнаружена возможность исполнения неподписанного кода». Это закончится просто тем, что 1С прихлопнет лавочку удобным для нее способом и пойдем все читать Радченко v9

Существует ведь 8.3z, так что если бы хотели прикрыть, то прикрыли давно.
38. Иван Устьянцев (nSpirit2) 15.10.15 13:20
(37) fishca, А откуда она :D Кажется Z версия есть только 8.2 платформы 8.3 не сертифицирована еще.
(34) IntelInside,
1С v9 с ООП, триггерами, с преферансом

Вот это к сожалению очень мало вероятно. Я еще глупо надеюсь что 1с когда нибудь откажется от обратной совместимости с обычными формами.
39. IntelInside (G) (IntelInside) 15.10.15 15:52
(33) DrAku1a,
относительно цикла-в-строку

Я выполнил Вашу просьбу (платформа 8.3.6.2237):
Код в строку:
Функция СчитатьТаблицуЦиклВСроку(Котейнер)
	перем элем;	перем итого; итого = 0; для каждого элем из Котейнер цикл	итого = итого + элем[1] * элем[2]; КонецЦикла;	возврат итого;
КонецФункции
...Показать Скрыть


(по сравнению с тем, что в статье)

Отладка:
*----------- сумма произведений по ТаблицеЗначений ---------------
* строк = 100 000
* посчитано СУММА([кол]*[цена]) в С++: результат = 333 328 333 350 000, время = 94
* посчитано СУММА([кол]*[цена]) в 1С 'по-людски' : результат = 333 328 333 350 000, время = 1 453
* посчитано СУММА([кол]*[цена]) в 1С 'в-строку' : результат = 333 328 333 350 000, время = 484
* ИТОГ: подсчет в С++ быстрее чем в 1С в 15,3 раз.
* : подсчет в 'в-строку' быстрее чем 'по-людски' в 3 раз.
*----------- ------------------------------------- ---------------
Рантайм:
*----------- сумма произведений по ТаблицеЗначений ---------------
* строк = 100 000
* посчитано СУММА([кол]*[цена]) в С++: результат = 333 328 333 350 000, время = 94
* посчитано СУММА([кол]*[цена]) в 1С : результат = 333 328 333 350 000, время = 547
* посчитано СУММА([кол]*[цена]) в 1С 'в-строку' : результат = 333 328 333 350 000, время = 484
* ИТОГ: подсчет в С++ быстрее чем в 1С в 5,8 раз.
* : подсчет в 'в-строку' быстрее чем 'по-людски' в 1,1 раз.
*----------- ------------------------------------- ---------------

Все то-же. В режиме отладки все медленнее в ~3 раза. В рантайме практически нос-к-носу. Очевидная очевидность. Возможно для версии 8.2... были какие-то нюансы. Именно по этому на первом месте всегда должна быть читабельность и сопровождаемость кода. Всегда. В платформе все уже давно все поменялось, а Ваш ‘в-строку’ так и продолжает глаз резать. Написанное пером не вырубишь топором. Если не хватает быстродействия и алгоритмически все нормально, то, для алгоритма завязанного на БД, нужно менять структуру данных. Нормализовать, денормализовать, индексировать, материализовать, etc. Обычно там все черти сидят. Это самое сложное и самое верное. Второе – это как раз то, что я предлагаю. Внешняя библиотека на более быстром языке, а 1С не дает. Но там опять же все ‘по-людски’: по возможности стандартный алгоритм, а не велосипед. И все аккуратно, читабельно и сопровождаемо. Далее, а Вы уже в плюсах, там шире выбор алгоритмов, ну и на совсем худой МПО, уже наработанные методики и по разворачиванию циклов, и оптимизации под конвеер процессора, многопотоковость и еще бог-пойми-чё. Но опять-же отдавая отчет что и как, и главное зачем, Вы делаете.
Естественно все при условии, что железо в порядке и каких еще глупостей нет.

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

PS: На моей версии платфомы код содержащий оператор ВЫПОЛНИТЬ наоборот в отладке выполняется быстрее, чем в рантайме в те-же 3 раза. Я на это уже обращал внимание. Это, вероятно, курьез. Не стоит из этого выводить новую парадигму программирования.

Спасибо.
djam_arttek; baton_pk; +2 Ответить 1
40. Александр Шакмаев (shakmaev) 15.10.15 16:08
(27) (34) (39) IntelInside, Вы пишете:
Наверно буду готовить, но я так тяжело пишу...

Судя по длине и содержанию Ваших комментариев - писать Вам не так уж и тяжело. Так что ждем.
kuntashov; +1 Ответить
41. Сергей Жемойтель (djam_arttek) 16.10.15 12:07
42. Андрей Торопчин (fjay69) 16.10.15 15:08
Из всего обсуждения я извлёк одну мысль: наступает момент, когда быстродействием кода приходится жертвовать в пользу читаемости кода. Перефразирую: можно написать очень быстрый код, но посторонний человек в нём ни черта не разберёт. Можно написать не очень быстрый код, но который легко сопровождается. Писать легко читаемый быстрый код дано только избранным.
43. IntelInside (G) (IntelInside) 19.10.15 13:11
(33) DrAku1a, я опять к Вам. Прошу прощения, но Ваша статья просто кладезь решений пытливого ума зажатого рамками системы. Это не ирония, это с уважением.

Рассмотрю пример со строкой. В статье разбирается работа функции РазложитьСтрокуВМассивПодстрок() и предлагаются различные варианты алгоритма. Я сначала немного расширю проблематику, а затем вернусь к split. Не переключайтесь.

Данная задача относится к классу задач обработки текстовой информации. Таких задач великое множество. Несчетно. Т.е. практически бесконечно в прямом математическом понимании слова. Сказать обработать строку это все равно, что сказать обработать «данные». Т.е. ничего не сказать. Или сказать все. Так уж случилось, что наша цивилизация отсчитывает свой срок от момента зарождения письменности и любая сущность и\или явление мира данного нам в ощущение имеют свое текстовое представление. Конечно на нынешнем этапе развития технологий обработки информации (и особенно учитывая тенденции) это утверждение можно расширить до «... вербальное представление», но это отдельная тема. Поэтому и количество алгоритмов обработки строк и библиотек этих алгоритмов, наверное, в точности равно количеству пермутаций от количества всех программистов. Ну это как когда у двух юристов всегда не менее трех мнений: мнение первого, мнение второго и одно их общее. И естественно, видя это безобразие, Великие решили эту задачу и дали нам это решение в пользование. Имя этому решению РегулярныеВыражения. Примеров приводить не буду. Все о них слышали, многие пользовались, и как в любой популяции, некоторые даже получают удовольствие от этого (садо)мазохизма. По сути РегулярныеВыражения это некоторый такой <процессор> обработки текстовых данных, которому вы ставите задачу на понятном ему языке и он выполняет ее оптимальным для данной задачи образом. Совсем как SQL сервер: у него там где то как то лежат и еще крутятся нужные нам данные, мы ему пишем запрос на его языке, и он выполняет его оптимальным с его точки зрения образом. Только в случае с Регекспами, Великие, решив задачу в-общем потеряли к ней интерес и язык запросов (.т.е. так называемый язык-регулярных-выражений) представляет собой какую то маловразумительную мешанину скобочек и закорючек. Где то видел мнение, что если регексп длиннее строки, то понять как он работает можно, только переписав его заново. В самой платформе библиотека регекспов присутствует. Кое где используется. Орефков предпринимал попытку вытащить их из недр платформы и добавить в виде объекта, чтобы можно было пользоваться через НОВЫЙ <>. Некоторые подключают реализацию от MS как com-объект. Но в общем и целом Регексп-От-1С отсутствует. Попытаюсь предположить почему. В том виде, в котором они сейчас существуют это совершенно не читабельный и не сопровождаемый код. Нельзя от одного нормального человека требовать, чтобы он написал нормальный регексп, а от другого нормального человека требовать, чтобы он его прочитал, и еще не дай бог подправил. На данном этапе регексп это Всерьез, но не доступно. Это не 1С-Way. Ведь, насколько я понимаю, этот слоган не разработчикам адресован. Он адресован Людям Принимающим Решения. Информационная среда организации это такая же собственность организации как, например, здание. И те кто принимает решение просто обязаны знать (хотя чаще они такие вещи просто чуют), что за каждой Собственностью стоит Стоимость Владения.
Вот если бы формализовать язык регекспов по типу SQL, чтобы можно было писать что-то типа:
строкаРегексп = “НАЙТИ [ДА ЗАМЕНИТЬ] СОВПАДЕНИЯ В <> ГДЕ ЭЛЕМЕНТ <ЕЛ> ...”; // Ну Вы поняли
объектРегексп = НОВЫЙ РегулярноеВыражение(строкаРегексп);
резульРегексп = объектРегексп.Обработать(<строка>);
<работа с результатом>
Плюс к этому визуальный построитель. Отладчик. Отразить в документации и методической литературе. Добавить блок вопросов в экзаменационные билеты. Аттестация, курсы углубленного изучения, отдельный сертификат 1С-Профи-В-Регекспах. Вот тогда в блестящем, монолитном и архитектурно совершенном дворце 1С появится такая же прекрасная и совершенная восточная башенка, чудесно дополняющая весь архитектурный ансамбль. (Простите, не удержался – дитё сейчас 3D-пазл «Храм Спаса-на-крови» собирает.)
Вот тогда 1С может гарантировать своим Клиентам, что предлагаемый ею продукт решает их задачи наилучшим и наиоптимальнейшим образом. Доступно и Всерьёз.

Но на грешной земле за каждой розовой мечтой стоят расходы, расходы и еще раз расходы. Как хорошо иметь у себя в жилище еще одну комнату. Но ее надо построить, подсоединить коммуникации, ремонтировать и, о боже, прибирать хотя бы еженедельно. Жизнь сурова. Если доходы не окупают затраты – ты труп. Если расходы мы можем себе еще как то представить, то можно ли заранее как то оценить доходы от такой штуки как Регекспы. Сомнительно. Тем более что регексп вроде как и не очень-то нужен. Пока. И уж точно не всем.

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

Нужны просто правила игры и контроль их соблюдения.

1С это целый мир. Достаточно четко очерченный своим кругом задач, люди, его населяющие, свой язык и, если хотите, своя религия. Функция Создателя – генерировать правила. Самостоятельная реализация это опционально. Примеров такого подхода вокруг масса.

Собственно вот что в моем понимании «классы», интерфейсы, компоненты, модульность архитектуры и «плюсы».
Почему 1С этого не делает?


И про split(). Собственно говоря, к регекспам этот алгоритм отношения не имеет....
Тяжело я пишу, тяжело, но пишу... Думал, на выходные закончу, но у жены свои планы...
Скоро будет.

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

PPS. Всем. Судя по характеру комментариев, при подготовке публикации «плюсы» сыграли со мной злую шутку. Там не зря не конкретизируется class <name> : <ba se> - это НАСЛЕДУЕТ или РАСШИРЯЕТ. ‘:’ - и все, а остальное Ваш мыслеобраз уместный в данном контексте. Вот и я суть оставил, а остальное опустил. Не уверен, что и в этом опусе я соблюдаю баланс. В любом случае с радостью принимаю кирпичи со всех сторон и обещаю постараться донести их до алтаря мироздания.
Спасибо
44. Brr (brr) 19.10.15 14:08
(43) не пойдет создатель на контакт, во время 7.7 не шёл и сейчас не пойдет
45. IntelInside (G) (IntelInside) 19.10.15 17:06
(44) brr,
Спасибо. Я в общем и не рассчитывал (вру). Значит 1С STD не будет. Пространство для маневра сужается до 1С boost или dealwithfire.dll. Жду релиза.
46. Александр Хомяк (logarifm) 10.12.15 22:08
Не ну отлично человек начал изучать 1С. Правда обычно это люди делают с другой стороны, ну вот он начала залазить с выхлопной трубы, начал классы переписывать.
47. Александр Рудницкий (info1i) 16.12.15 02:42
Давно эту статью прочел, возможность понравилась. Только тогда я еще тоже не знал, куда можно применить эту возможность. Но когда вспомнил про парсинг сайтов, регулярные выражения и сложные математические вычисления, то сразу вспомнил о необходимости использования не1Совского быстрого языка с мгновенным получением(записью) данных в 1С-базе. Думаю, использование этой связки будет лучшим способом решения сложных задач интеграции и математики.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа