В 1000 раз быстрее

Публикация № 1096524

Разработка - Практика программирования

Изображения tinyraytracer Трассировка лучей Перфолента randraytracer

Реализация алгоритма трассировки лучей на новом языке программирования "Перфолента"

 

Предлагаю на время отвлечься от задач автоматизации, и погрузиться в загадочный и увлекательный мир 3D моделирования. Дочитавшим до конца - сюрприз)

 

Предыстория

Изначально программа для отрисовки сцен при помощи алгоритма трассировки лучей tinyraytracer была написана на языке C++ (статья на Хабре).
 
Потом на язык OneScript программу перевел Michael Rybakin (проект на GitHub).
 

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

Забегая вперёд, скажу, что труды Mr-Rm не пропали даром, и его программа засияла новыми красками. Мной была проделана работа по адаптации этой программы под новый язык "Перфолента" Сергея Рогаткина.

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

 
Программа
 
Процесс адаптации программ не сложный, но требует внимательности и терпения) Надеюсь, что в будущем эту задачу удастся автоматизировать.
Итак, мы получили работающий код на языке "Перфолента".
 
Текст программы без оптимизации:
 
 
Хм, программа хоть и стала работать быстрее, но не намного - где-то раза в 2,5. Но ещё рано унывать! Вспоминаем про тяжелые структуры данных, и заменим их на более оптимальные классы.
 
Текст программы с классами:

//Код, оптимизированный под возможности Перфоленты

#ИспользоватьСтандартнуюБиблиотеку

//В процессе экспериментов выяснилось, 
//что Вектор лучше делать Структурой
//а Материал, Свет и Сферу классами, тогда производительность возрастает 
//примерно на 25 процентов по сравнению с вариантом когда только структуры
//и примерно на 8 процентов по сравнению с вариантом, когда только классы


// ------------------
Структура Вектор
    &ВидноВсем Поле x тип ДВещ
    &ВидноВсем Поле y тип ДВещ
    &ВидноВсем Поле z тип ДВещ
    //---------------------------
    &ВидноВсем 
    Конструктор(px тип ДВещ, py тип ДВещ, pz тип ДВещ) 
        x = px
        y = py
        z = pz
    КонецКонструктора

#Область ПереопределениеОператоровВектора    

    //Переопределим для теста операторы сложения, вычитания, умножения и скалярного произведения векторов
    //проверим в функции Отражение()
    
    //---------------------------
    &ВидноВсем, ОбщийДляКласса 
    Оператор +(В1 тип Вектор, В2 тип Вектор) тип Вектор 
        возврат Новый Вектор( В1.x+В2.x, В1.y+В2.y, в1.z+В2.z );
    КонецОператора   

    //---------------------------
    &ВидноВсем, ОбщийДляКласса 
    Оператор -(В1 тип Вектор, В2 тип Вектор) тип Вектор 
        возврат Новый Вектор( В1.x-В2.x, В1.y-В2.y, В1.z-В2.z );
    КонецОператора   

    //---------------------------
    &ВидноВсем, ОбщийДляКласса 
    Оператор *(В1 тип Вектор, ч тип ДВещ) тип Вектор 
        возврат Новый Вектор( В1.x*ч, В1.y*ч, В1.z*ч );
    КонецОператора   

    //---------------------------
    &ВидноВсем, ОбщийДляКласса 
    Оператор *(В1 тип Вектор, В2 тип Вектор) тип ДВещ
        возврат В1.x*В2.x + В1.y*В2.y + В1.z*В2.z;
    КонецОператора   

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

    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Процедура Печать( В1 тип Вектор )
        ВыводСтроки "("+В1.x+","+В1.y+","+В1.z+")";
    КонецПроцедуры    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Минус( В1 тип Вектор ) тип Вектор 
        возврат Новый Вектор( -В1.x, -В1.y, -В1.z );
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Сумма( В1 тип Вектор, В2 тип Вектор ) тип Вектор
        возврат Новый Вектор( В1.x+В2.x, В1.y+В2.y, в1.z+В2.z );
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Разность( В1 тип Вектор, В2 тип Вектор ) тип Вектор
        возврат Новый Вектор( В1.x-В2.x, В1.y-В2.y, В1.z-В2.z );
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Умножить( В1 тип Вектор, ч тип ДВещ) тип Вектор
        возврат Новый Вектор( В1.x*ч, В1.y*ч, В1.z*ч );
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция СкалярноеПр( В1 тип Вектор, В2 тип Вектор ) тип ДВещ
        возврат В1.x*В2.x + В1.y*В2.y + В1.z*В2.z;
    КонецФункции    
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Норма( В1 тип Вектор ) тип ДВещ
        возврат Sqrt( В1.x*В1.x+В1.y*В1.y+В1.z*В1.z );
    КонецФункции
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция КвНормы( В1 тип Вектор ) тип ДВещ
        возврат В1.x*В1.x+В1.y*В1.y+В1.z*В1.z;
    КонецФункции
    
    //---------------------------
    &ВидноВсем,ОбщийДляКласса 
    Функция Нормализация( В1 тип Вектор ) тип Вектор
        норма=Вектор.Норма( В1 );
        В1.x = В1.x/норма;
        В1.y = В1.y/норма;
        В1.z = В1.z/норма;
        возврат В1;
    КонецФункции
КонецСтруктуры


//***************************
Программа tiny

	//---------------------------
	Поле МАКС_Число тип ДВещ;
	Поле ГЛУБИНА_РЕКУРСИИ тип Целое;
	
	Поле НулевойВектор тип Вектор;
	Поле ЕдиничныйВектор тип Вектор;
	Поле ЕдиничныйВекторX тип Вектор;
	Поле ЕдиничныйВекторY тип Вектор;
	Поле ЕдиничныйВекторZ тип Вектор;
	
	Поле ЦветФона тип Вектор;
	Поле ЦветБелый тип Вектор;
	Поле ЦветЖелтый тип Вектор;
	
	Поле ПлиткаБелая тип Материал;
	Поле ПлиткаЖелтая тип Материал;
	
	Поле Сферы тип Сфера[];
	Поле Освещение тип Свет[];
	Поле Ширина тип Целое;
	Поле Высота тип Целое;
	Поле УголЗрения тип ДВещ;
	Поле Кадр тип Вектор[];
	
	
	Функция Норм_Цвет(знач цв тип ДВещ) тип ДВещ
		возврат Цел(255*Макс(0, Мин(1,цв)));
	КонецФункции    
	
	
	// ------------------
	
	Функция Сфера_Пересечение(Сф тип Сфера,Исх тип Вектор, Напр тип Вектор, ссыл Расст тип ДВещ) тип Булево
		
		КЦентру = Вектор.Разность( Сф.Центр, Исх );
		перем пр тип ДВещ = Вектор.СкалярноеПр( КЦентру, Напр );
		перем д2 тип ДВещ = Вектор.КвНормы( КЦентру ) - пр*пр;
		перем р2 тип ДВещ = Сф.Радиус*Сф.Радиус; 
		если д2 > р2 тогда
			возврат Ложь;
		КонецЕсли;
		
		р = Sqrt( р2 - д2 ); 
		Расст = пр - р;
		
		если Расст < 0 тогда
			Расст = пр + р;
			если Расст < 0 тогда
				возврат Ложь;
			КонецЕсли;
		КонецЕсли;
		
		возврат Истина;
		
	КонецФункции    
	
	Функция НайтиПересечения( Исх тип Вектор, Напр тип Вектор, ссыл Точка тип Вектор, ссыл Нормаль тип Вектор, ссыл Материал тип Материал ) тип Булево 
		Перем Расст тип ДВещ = 0;
		МинРасст = МАКС_Число;
		Для Каждого Сф из Сферы Цикл
			если (Сфера_Пересечение( Сф,Исх,Напр, Расст )) и (Расст < МинРасст) тогда
				МинРасст = Расст;
				Точка = Вектор.Сумма( Исх, Вектор.Умножить( Напр, Расст ) );
				Нормаль = Вектор.Нормализация( Вектор.Разность( Точка, Сф.Центр ) );
				Материал = Сф.Материал;
			конецесли;    
		КонецЦикла;
		
		// квадрат (-10,-10,-4) - (10,-30,-4)
		Если Напр.y < -0.001 Тогда
			р = -(Исх.y+4)/Напр.y;
			Если 0<р и р<МинРасст Тогда
				Т = Вектор.Умножить(Напр,р);
				Т = Вектор.Сумма(Т,Исх);
				Если Abs(Т.x)<10 и -30<Т.z и Т.z<(-10) Тогда
					МинРасст = р;
					Точка = Т;
					Нормаль = ЕдиничныйВекторY;
					Материал = ?( (Цел(0.5*Точка.x+1000)+Цел(0.5*Точка.z))%2=1, ПлиткаБелая, ПлиткаЖелтая );
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		возврат МинРасст < 1000;
	КонецФункции
	
	// return I - N*2.f*(I*N);
	Функция Отражение( Луч тип Вектор, Норм тип Вектор ) тип Вектор
        
        //возврат Вектор.Разность( Луч, Вектор.Умножить( Норм, 2*Вектор.СкалярноеПр(Луч, Норм) ) );
        
        //воспользуемся переопределенными операторами для Вектора
        возврат Луч - Норм * 2д * (Луч * Норм) 
        
	КонецФункции
	
	Функция Преломление( Луч тип Вектор, Норм тип Вектор , КоэфПр тип ДВещ  ) тип Вектор
		Если КоэфПр=1 Тогда 
			Возврат Луч;
		КонецЕсли;  
		
		CosI = -Макс( -1, Мин( 1, Вектор.СкалярноеПр(Луч, Норм)));
		Если CosI>=0 Тогда
			_1; = 1/КоэфПр;
			Н = Норм;
		Иначе
			CosI = -CosI;
			_1; = КоэфПр;
			Н = Вектор.Минус(Норм);
		КонецЕсли;    
		К = 1 - _1;*_1;*(1-CosI*CosI);
		Если К<0 Тогда
			возврат ЕдиничныйВекторX;
		КонецЕсли;
		
		возврат Вектор.Сумма( Вектор.Умножить(Луч,_1;), Вектор.Умножить(Н,_1;*CosI-Sqrt(К)) );
	КонецФункции
	
	Функция ТрассироватьЛуч( Исх тип Вектор, Напр тип Вектор, Глубина тип Целое = 0 ) тип Вектор
		Перем Точка тип Вектор = Неопределено;
		Перем Нормаль тип Вектор = Неопределено;
		Перем Материал тип Материал = Неопределено;
		
		Перем ТеньТочка тип Вектор = Неопределено;
		Перем ТеньНормаль тип Вектор = Неопределено;
		Перем ВремМатериал тип Материал = Неопределено;
		
		если Глубина>ГЛУБИНА_РЕКУРСИИ или НЕ НайтиПересечения( Исх,Напр, Точка,Нормаль,Материал ) тогда
			возврат ЦветФона;
		конецесли;    
		
		СдвигПоНормали = Вектор.Умножить( Нормаль, 0.001 );
		
		ОтражНапр = Отражение(Напр,Нормаль); // нормализовано
		ОтражИсх = ?( Вектор.СкалярноеПр(ОтражНапр, Нормаль)<0, Вектор.Разность(Точка,СдвигПоНормали), Вектор.Сумма(Точка,СдвигПоНормали) );
		ОтражЦвет = ТрассироватьЛуч( ОтражИсх, ОтражНапр, Глубина+1 );
		
		ПреломНапр = Вектор.Нормализация(Преломление(Напр,Нормаль,Материал.КПрелом));
		ПреломИсх = ?( Вектор.СкалярноеПр(ПреломНапр, Нормаль)<0, Вектор.Разность(Точка,СдвигПоНормали), Вектор.Сумма(Точка,СдвигПоНормали) );
		ПреломЦвет = ТрассироватьЛуч( ПреломИсх, ПреломНапр, Глубина+1 );
		
		перем Яркость тип ДВещ = 0;
		перем Блик тип ДВещ = 0;
		Для Каждого Свет из Освещение цикл
			НапрКСвету = Вектор.Нормализация(Вектор.Разность(Свет.Поз, Точка));
			
			РасстДоСвета = Вектор.КвНормы(Вектор.Разность(Свет.Поз, Точка));
			ТеньИсх = ?( Вектор.СкалярноеПр(НапрКСвету, Нормаль)<0, Вектор.Разность(Точка,СдвигПоНормали), Вектор.Сумма(Точка,СдвигПоНормали) );
			
			если НайтиПересечения( ТеньИсх,НапрКСвету, ТеньТочка,ТеньНормаль,ВремМатериал ) 
				и Вектор.КвНормы(Вектор.Разность(ТеньТочка, ТеньИсх))<РасстДоСвета  тогда
				Продолжить;
			конецесли;    
			
			Яркость = Яркость + Свет.Ярк * Макс( 0, Вектор.СкалярноеПр( НапрКСвету, Нормаль ));
			
			//powf(std::max(0.f, -reflect(-light_dir, N)*dir), material.specular_exponent)*lights[i].intensity;
			Блик = Блик + Свет.Ярк * Pow(Макс(0, Вектор.СкалярноеПр(Отражение(НапрКСвету, Нормаль),Напр) ), Материал.ЭкспОтраж);
		КонецЦикла;
		
		возврат Вектор.Сумма(Вектор.Сумма(Вектор.Сумма( Вектор.Умножить( Материал.Цвет, Яркость*Материал.Альб0 ), Вектор.Умножить( ЕдиничныйВектор, Блик*Материал.Альб1 )),Вектор.Умножить( ОтражЦвет, Материал.Альб2 )),Вектор.Умножить( ПреломЦвет, Материал.Альб3 ));
	КонецФункции
	
	Процедура Рендер()
		
		Камера = Новый Вектор(0,0,0);
		Напр_Z =-Высота/(2*Tan(УголЗрения/2));
		Для верт=0 по Высота-1 Цикл
			линия = верт*Ширина;
			Напр_Y = -(верт+0.5д)+Высота/2д;
			Для гор=0 по Ширина-1 Цикл
				Напр_X = (гор+0.5д)-Ширина/2д;
				Направление = Вектор.Нормализация( Новый Вектор(Напр_X,Напр_Y,Напр_Z) );
				Кадр[линия+гор] = ТрассироватьЛуч( Камера, Направление );
			КонецЦикла;
		КонецЦикла;
		
	КонецПроцедуры
	
	Процедура СохранитьКадр( ИмяФайла тип Строка)
		файл=Новый ТекстовыйДокумент;
		
		файл.ДобавитьСтроку("P3");
		файл.ДобавитьСтроку(""+Ширина+" "+Высота);
		файл.ДобавитьСтроку("255");
		
	        //Для п=0 по Высота*Ширина-1 Цикл
	        Для Инд тип Целое = 0 по Высота*Ширина-1 Цикл //делаем переменную цикла целой!
	            Пиксел = Кадр[Инд];
	            перем м1 тип ДВещ = Пиксел.x; 
	            перем м2 тип ДВещ = Пиксел.y; 
	            перем м3 тип ДВещ = Пиксел.z; 
	            МаксИнт = Макс( м1, Макс(м2,м3) );
	            Если МаксИнт>1 Тогда
	                МаксИнт = 1/МаксИнт; 
	                Пиксел.x = Пиксел.x * МаксИнт;
	                Пиксел.y = Пиксел.y * МаксИнт;
	                Пиксел.z = Пиксел.z * МаксИнт;
	            КонецЕсли;
	            файл.ДобавитьСтроку( ""+Норм_Цвет(Пиксел.x)+" "+Норм_Цвет(Пиксел.y)+" "+Норм_Цвет(Пиксел.z) ); 
        	КонецЦикла;
        
	        ВыводСтроки ИмяФайла
		
		файл.Записать(ИмяФайла,КодировкаТекста.ANSI);
		
		
	КонецПроцедуры
	
	
	Процедура Старт
		
		Пи = 3.14159265359;
		МАКС_Число = 999999999999999;
		ГЛУБИНА_РЕКУРСИИ = 4;
		
		НулевойВектор=Новый Вектор(0, 0, 0);
		ЕдиничныйВектор=Новый Вектор(1, 1, 1);
		ЕдиничныйВекторX=Новый Вектор(1, 0, 0);
		ЕдиничныйВекторY=Новый Вектор(0, 1, 0);
		ЕдиничныйВекторZ=Новый Вектор(0, 0, 1);
		
		ЦветБелый=ЕдиничныйВектор;
		ЦветЖелтый=Новый Вектор(1, 0.7, 0.3);
		
		Ширина=1024;
		Высота=768;
		УголЗрения = Пи/3;
		Кадр = Новый Вектор[Ширина*Высота]
		
		ЦветФона=Новый Вектор(0.2, 0.7, 0.8);
		
		Серый =   Новый Материал( Новый Вектор( 0.4, 0.4, 0.3 ), 0.6, 0.3,0.1,0,    50,1 );
		Стекло =  Новый Материал( Новый Вектор( 0.6, 0.7, 0.8 ), 0,   0.5,0.1,0.8, 125,1.5 );
		Красный = Новый Материал( Новый Вектор( 0.3, 0.1, 0.1 ), 0.9, 0.1,0.0,0,    10,1 );
		Зеркало = Новый Материал( Новый Вектор( 1.0, 1.0, 1.0 ), 0,  10.0,0.8,0,  1425,1 );
		
		ПлиткаБелая =  Новый Материал( Вектор.Умножить(ЦветБелый,0.3),  1,0,0,0, 0,1 );
		ПлиткаЖелтая = Новый Материал( Вектор.Умножить(ЦветЖелтый,0.3), 1,0,0,0, 0,1 );
		
		Сферы = Новый Сфера[3]
		Сферы[0]=Новый Сфера(Новый Вектор(-3,   0,  -16), 2, Серый )
		Сферы[1]=Новый Сфера(Новый Вектор(-1.0,-1.5,-12), 2, Стекло )
		Сферы[2]=Новый Сфера(Новый Вектор( 1.5,-0.5,-18), 3, Красный )
		Сферы[3]=Новый Сфера(Новый Вектор( 7,   5,  -18), 4, Зеркало )
		
		Освещение = Новый Свет[2]
		Освещение[0]=Новый Свет(Новый Вектор(-20, 20,  20), 1.5)
		Освещение[1]=Новый Свет(Новый Вектор( 30, 50, -25), 1.8)
		Освещение[2]=Новый Свет(Новый Вектор( 30, 20,  30), 1.7)
		
		т0=ТекущаяУниверсальнаяДатаВМиллисекундах();
		Рендер();
		т1=ТекущаяУниверсальнаяДатаВМиллисекундах();
		ВыводСтроки("~"+ Цел(т1-т0) );
		
		СохранитьКадр(ЭтаПрограмма.Каталог+"out.ppm");
		
		Консоль.Пауза
		
	КонецПроцедуры
	
КонецПрограммы


// ------------------
Класс Материал 
    &ВидноВсем Поле Цвет тип Вектор
    &ВидноВсем Поле Альб0 тип ДВещ
    &ВидноВсем Поле Альб1 тип ДВещ
    &ВидноВсем Поле Альб2 тип ДВещ
    &ВидноВсем Поле Альб3 тип ДВещ
    &ВидноВсем Поле ЭкспОтраж тип ДВещ
    &ВидноВсем Поле КПрелом тип ДВещ
    //---------------------------
    &ВидноВсем 
    Конструктор(пЦвет тип Вектор, пАльб0 тип ДВещ, пАльб1 тип ДВещ, пАльб2 тип ДВещ, пАльб3 тип ДВещ, пЭкспОтраж тип ДВещ, пКПрелом тип ДВещ)  
        Цвет = пЦвет
        Альб0 = пАльб0
        Альб1 = пАльб1
        Альб2 = пАльб2
        Альб3 = пАльб3
        ЭкспОтраж = пЭкспОтраж
        КПрелом = пКПрелом
    КонецКонструктора
КонецКласса


// ------------------
Класс Свет 
    &ВидноВсем Поле Поз тип Вектор
    &ВидноВсем Поле Ярк тип ДВещ
    //---------------------------
    &ВидноВсем 
    Конструктор(пПоз тип Вектор, пЯрк тип ДВещ)  
        Поз=пПоз
        Ярк=пЯрк
    КонецКонструктора
КонецКласса

// ------------------
Класс Сфера 
    &ВидноВсем Поле Центр тип Вектор
    &ВидноВсем Поле Радиус тип ДВещ
    &ВидноВсем Поле Материал тип Материал
    //---------------------------
    &ВидноВсем 
    Конструктор( пЦентр тип Вектор, пРадиус тип ДВещ, пМатериал тип Материал )  
        Центр=пЦентр
        Радиус=пРадиус
        Материал=пМатериал
    КонецКонструктора
КонецКласса


 

Как видите, классы очень органично легли в программу, и это не удивительно, потому что они были в исходной версии на С++.

Что же теперь со скоростью? Это невероятно! Программа стала выполняться быстрее в 500 раз! Это конечно не так быстро как в C++, но учитывая гораздо более простой процесс разработки, результат более чем достойный.

 
Что еще можно предпринять для ускорения программы? Добавим в программу параллельности.
 
Текст изменений:

//1) добавляем поля

    //переменные для параллельного цикла
    Поле Камера тип Вектор;
    Поле линия тип ДВещ;
    Поле Напр_Y тип ДВещ;
    Поле Напр_Z тип ДВещ;

//2) изменяем процедуру Рендер

    Процедура Рендер()
        
        Камера = Новый Вектор(0,0,0);
        Напр_Z =-Высота/(2*Tan(УголЗрения/2));
        Для верт=0 по Высота-1 Цикл
            линия = верт*Ширина;
            Напр_Y = -(верт+0.5д)+Высота/2д;
            
            //распараллелим
            ПараллельныеДействия.Для(0, Ширина-1, ПолучитьДелегат(,ТелоЦикла,"ДействиеПроц<Целое>"))

        КонецЦикла;
        
    КонецПроцедуры
   

//3) добавляем тело параллельного цикла

   
    //---------------------------
    //тело параллельного цикла 
    Процедура ТелоЦикла(гор тип Целое)
        Напр_X = (гор+0.5д)-Ширина/2д;
        Направление = Вектор.Нормализация( Новый Вектор(Напр_X,Напр_Y,Напр_Z) );
        Кадр[линия+гор] = ТрассироватьЛуч( Камера, Направление );
    КонецПроцедуры    

 

Производительность возрастает кратно количеству имеющихся физических ядер процессора.
Все современные компьютеры оснащены минимум двух-ядерными процессорами, поэтому заявленный в заголовке прирост производительности в 1000 раз вам обеспечен. А если у вас есть еще и мощный сервер, то грех ему простаивать)
 
randraytracer
 
Теперь уже можно полноценно пользоваться программой. Давайте её немного усовершенствуем. Сделаем так, чтобы программа случайным образом размещала свет и объекты, а мы будем выбирать самые удачные кадры.
 

Вот что у меня получилось:

 
 
Ещё немного:
 

 

И ещё

 

 

И всё

 

 

Слабые варианты (определяются по малому времени рендеринга) программа пропускает сама. Еще программа берет параметры (из имени файла) уже существующих в папке изображений, для построения на их основе новых. Так что можно сказать, что программа учитывает ваши предпочтения. Богатый материал для психодиагностики)
 
Для скачивания доступны две программы:
randraytracer1 генерирует случайные изображения небольшого разрешения для отбора удачных вариантов.
randraytracer2 увеличивает разрешение и глубину рекурсии выбранных изображений.
Для их запуска потребуется установить дистрибутив языка "Перфолента"

 

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

Наименование Файл Версия Размер
randraytracer1.pfl

.pfl 23,81Kb
0
.pfl 23,81Kb Скачать
randraytracer2.pfl

.pfl 23,46Kb
0
.pfl 23,46Kb Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 356 24.07.19 15:21 Сейчас в теме
Сравнивать IL под .Net платформу с псевдобайткодом стековой машины 1с, думаю, не уместно, т. к. последний в алгоритмических задачах, мягко сказать, просаживается по производительности в сотни раз.
blackhole321; +1 Ответить
3. Perfolenta 191 24.07.19 15:52 Сейчас в теме
(1) зато хороший пример того, что иногда производительность имеет значение...
пользоваться программой до переделки совершенно не возможно...
а еще, показывает, что при необходимости критичный код перевести на Перфоленту не трудно...
и картинки красивые получились, хоть на рабочий стол ставь :)
2. vasvl123 102 24.07.19 15:37 Сейчас в теме
Цель статьи наглядно продемонстрировать возможности нового языка. Ранее недоступные.
Jeka44; chebser; Soloist; fancy; Fox-trot; Perfolenta; +6 Ответить
4. Perfolenta 191 24.07.19 15:57 Сейчас в теме
(2) кстати, да, интересный ход, пропускать слабые кадры по времени рендеринга... если шары расположились кучкой друг за другом, то картинка вряд-ли будет интересной!
5. shard 257 24.07.19 16:30 Сейчас в теме
генератор картинок на рабочий стол, стандартные обои кубунты некоторых релизов напомнило)
6. Perfolenta 191 31.07.19 19:40 Сейчас в теме
Отрендерил в 4К и посмотрел на большом телевизоре.. гораздо интереснее выглядит, чем сжатые кадры маленького разрешения, которые тут в скриншотах показаны...
vasvl123; +1 Ответить
Оставьте свое сообщение

См. также

Безопасная работа с транзакциями во встроенном языке Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    37158    tormozit    54    

Cбор и анализ ошибок при помощи Sentry, или как упростить жизнь себе и пользователям

Практика программирования Интеграция v8 Абонемент ($m)

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

1 стартмани

09.10.2020    3326    hexhoc    12    

Программная корректировка при выводе отчета СКД

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

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

1 стартмани

08.10.2020    4225    dabu-dabu    10    

Библиотека программного изменения формы (УФ)

Инструментарий разработчика Работа с интерфейсом Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

07.08.2020    4857    BuriyLesha    17    

План подготовки к аттестации на 1С: Специалиста по платформе (+ Ссылки на материалы) Промо

Решение задач на 1С:Специалист v8 Россия Абонемент ($m)

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

1 стартмани

23.12.2017    23584    tmn72.1C    39    

Telegram bot API - разбор документации с примерами

WEB v8 Абонемент ($m)

Перевод документации на язык 1С.

1 стартмани

06.04.2020    43994    leongl    49    

Методика обновления формы объекта данных при изменении объекта

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

09.03.2020    9861    tormozit    14    

Конвертация данных 2. Использование исходящих и входящих данных. Свойство "Получить из входящих данных"

Обмен данными 1С Перенос данных из 1C8 в 1C8 v8 КД Абонемент ($m)

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

17.02.2020    17626    Drivingblind    31    

Как выполнить отчет на СКД через COM и получить данные отчета? Промо

Практика программирования v8 УПП1 Россия Абонемент ($m)

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    27391    wowik    3    

Вывод сообщений в HTML поле средствами 1С

Практика программирования v8 v8::УФ Абонемент ($m)

Пример использования вывода большого количества сообщений в поле HTML. С возможностью открывать ссылочные объекты и создавать новые объекты передавая параметры прямо из HTML поля. Протестировано на релизах 8.3.12 и 8.3.15+

2 стартмани

31.01.2020    6324    burni4    16    

Как в 1С создать паутинку "как на Инфостарте"

Практика программирования v8::УФ 1cv8.cf Россия Абонемент ($m)

Добрый день, уважаемы коллеги! В этой статье я расскажу, как в 1С создать отчет - "паутинку" на примере отчета по компетенциям сотрудника (разрабатывала на платформе 1С:Предприятие 8.3 (8.3.13.1865).

1 стартмани

15.01.2020    9265    user660153_aleks.pisanets    17    

Краткое руководство по внесению изменений в конфигурацию

Практика программирования v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.01.2020    18453    sapervodichka    41    

Программное создание динамического списка на управляемой форме. (Динамическое создание динамического списка). Готовая процедура + обработка - демонстрационный пример Промо

Практика программирования Универсальные функции v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

19.01.2018    60703    rpgshnik    31    

Разбираемся с web-kit в 1С, на примере интеграции TinyMCE в управляемую форму в УТ 11.4. Допиливаем обмен с сайтом в УТ 11.4

Обмен данными 1С Интеграция Адаптация типовых решений v8 v8::УФ УТ11 Абонемент ($m)

Многие уже знают, что в релизе платформы 8.3.14.1565, браузер Internet Explorer был заменен на Web-Kit, это на самом деле большой шаг вперед, но я уверен, многим, как и мне, пока не совсем понятно, что к чему. Возник опыт использования web-kit в 1С, вызова JS из 1С и вызова 1С из JS. Давайте вместе попробуем понять, чем одно отличается от другого, и заодно сделаем, что-нибудь полезное. Да и наверняка многим придется переписывать свои подобные поделки после обновления на новую платформу, так что надеюсь мой опыт окажется полезным.

2 стартмани

08.12.2019    8709    Бэнни    25    

"Живые" картинки со Snap.SVG

Практика программирования WEB Работа с интерфейсом v8 Абонемент ($m)

В статье рассмотрен пример использования http-сервисов для визуализации данных

1 стартмани

24.10.2019    13986    blackhole321    7    

Вебхук. Путь Телеграма

Внешние источники данных Интеграция v8 Абонемент ($m)

Долгое (на самом деле нет) и нелегкое путешествие телеграма к неведомым (из за РКН) конфигурациям 1С. Памятка себе.

1 стартмани

03.10.2019    19246    platonov.e    26    

Как нарисовать граф на 1С Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

09.08.2013    71065    ildarovich    117    

Что умеет Русский Фокс?

Языки и среды Россия Абонемент ($m)

Краткий обзор русскоязычного объектно ориентированного 1С подобного языка программирования Русский Фокс.

1 стартмани

30.09.2019    3672    andreosh    21    

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

Практика программирования Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа. Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

1 стартмани

06.09.2019    20090    Dementor    30    

Удобный просмотр результата запроса с большим количеством временных таблиц

Практика программирования v8 Абонемент ($m)

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

1 стартмани

27.08.2019    11285    ids79    22    

Простой способ индексирования интервалов Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

28.09.2016    40114    ildarovich    22    

Обмен большими данными между клиентом и сервером

Внешние источники данных v8 Абонемент ($m)

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

1 стартмани

27.08.2019    14117    logos    32    

Простая выгрузка данных в универсальном формате Enterprise Data

Обмен через XML v8::УФ Розница УНФ ERP2 ЗКГУ3.0 БП3.0 УТ11 КА2 ЗУП3.x Абонемент ($m)

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

2 стартмани

26.08.2019    12787    Iyar    3    

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

Практика программирования v8 1cv8.cf Абонемент ($m)

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

2 стартмани

24.08.2019    12056    BenGunn    22    

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    35597    rpgshnik    49    

Использование HTTP-сервиса для создания "фронтенда" HTML/CSS/jQuery с кэшированием

WEB v8 1cv8.cf Абонемент ($m)

В статье описан способ создания "фронтенда" на HTML/CSS/jQuery и скрипт кеширования AJAX запросов на PHP.

1 стартмани

06.08.2019    14160    Sedaiko    25    

Упражнения на Перфоленте. Парсим технологический журнал 1С

Сервисные утилиты Инструментарий разработчика Практика программирования Разработка Абонемент ($m)

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

1 стартмани

31.07.2019    7484    Perfolenta    62    

Процедура ПриКомпоновкеРезультата

Практика программирования v8 1cv8.cf Абонемент ($m)

Коллекция кода

1 стартмани

26.07.2019    43322    vasilev2015    64    

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному Промо

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

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    46443    dsdred    43    

"Убер на складе": динамический расчет маршрутов с учетом реальных расстояний

Учет ТМЦ Практика программирования Учет ТМЦ v8 УУ Абонемент ($m)

Представляю методику и инструмент для динамического расчета маршрутов отбора на высоконагруженных складах для максимального повышения эффективности склада, ускорения проходимости и, как следствие, экономии денег. Это методика и обработка для интеграции в WMS решения. Тестировалось на 1С 8.3.14.1565.

3 стартмани

24.06.2019    17392    informa1555    17    

1С:Ассемблер. Немного летнего веселья!

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

21.06.2019    30391    Evil Beaver    134    

Простые примеры сложных отчетов на СКД

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

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

1 стартмани

12.06.2019    31322    Hatson    31    

Некоторая работа с данными через COM Промо

Практика программирования v8 Абонемент ($m)

В статье приведены примеры работы с Платформой 8.X через COM (точнее, через объект COMConnector). Примеры кода были использованы при реализации прикладных задач в процессе трудовой деятельности.

2 стартмани

05.12.2012    58150    wowik    32    

XDTO для чайников

Обмен через XML v8 1cv8.cf Абонемент ($m)

Пример использования XDTO пакетов для выгрузки документа с табличной частью.

1 стартмани

29.05.2019    32106    HAMMER_59    39    

Программное формирование картинки в 1С:Предприятие 8.3.9 (ПотокВПамяти / ЗаписьДанных)

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

В статье представлен код программного формирования картинки (двоичные данные) без всяких внешних компонент, без формирования строки Base64, используя лишь встроенные механизмы 1С предприятие 8.3.9 (объекты ПотокВПамяти и ЗаписьДанных). Сам по себе код формирования картинки не несёт ничего нового. Всё описано в википедии. Захотелось попробовать новые методы, но никак не доходитили руки. В приложении обработка практически с этим же кодом.

1 стартмани

16.05.2019    9757    yku    10    

Ops средствами 1С:Предприятие

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

В статье описан программный пакет "Автоматизация ИТ-процессов" (АИТП), позволяющий автоматизировать задачи по администрированию, управлению и обслуживанию ИТ-инфраструктуры.

1 стартмани

23.04.2019    17701    blackhole321    28    

Работа со схемой запроса Промо

Инструментарий разработчика Практика программирования v8 v8::Запросы Абонемент ($m)

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

1 стартмани

24.04.2018    45476    kalyaka    35    

1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки

Практика программирования Внешние источники данных Обмен через XML WEB Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

22.04.2019    34990    riposte    66    

Аутентификация на внешних сервисах посредством OAuth

Информационная безопасность Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

Пример подключения к сервисам Google из 1С с помощью протокола OAuth и получения данных с внешнего сервиса.

1 стартмани

03.04.2019    21677    binx    126    

Программное создание реквизита управляемой формы с помощью механизма расширений

Практика программирования Разработка v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

12.03.2019    40050    ni_cola    31    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов Промо

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

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    49667    DarkAn    86    

Баг или фича? Неожиданное поведение платформы

Практика программирования Тестирование и исправление Разработка v8 1cv8.cf Абонемент ($m)

Рассмотрим несколько случаев неожиданного поведения платформы 1С, а также что с этим можно cделать.

18.02.2019    23418    YPermitin    89    

Универсальное расширение 1С для Google Таблиц и Документов

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Эта статья для тех, кто использует G Suite и 1С. Готовое решение для выгрузки отчетов и печатных форм из баз 1С в Google Диск в формате Google Таблиц и Google Документов. Информация по его внедрению. Описание создания и настройки проекта в GCP.

1 стартмани

31.01.2019    17241    Maria18    33    

Внешние компоненты мобильной платформы 1С для ОС Андроид

Разработка внешних компонент Мобильная разработка v8::Mobile Абонемент ($m)

На трех простых примерах описана процедура разработки внешних компонент для Андроид. Статья написана по мотивам доклада на конференции INFOSTART 2018 EDUCATION.

31.01.2019    17379    IgorKissil    25    

Агрегатное суммирование строк в запросе – сложно, но не невозможно Промо

Математика и алгоритмы v8 Абонемент ($m)

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

1 стартмани

09.09.2013    79921    ildarovich    54    

HTML в новой версии 8.3.14 на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX

Универсальные обработки Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

Тестируем возможности HTML в новой версии 8.3.14 платформы на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX.

1 стартмани

29.01.2019    29290    Synoecium    46    

Разработка и сценарное тестирование с Vanessa-ADD. Практические примеры сценариев. Шаги встроенной библиотеки

Практика программирования Vanessa Automation v8 Абонемент ($m)

Третья часть цикла публикаций, посвященных Vanessa-ADD и автоматизации тестирования. Переходим к практике.

1 стартмани

28.01.2019    21567    Vladimir Litvinenko    43    

1c + kafka.apache

Практика программирования v8 Россия Абонемент ($m)

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

1 стартмани

27.01.2019    15252    dmarenin    70    

Новый запрос и новая таблица значений как функции Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

27.11.2012    45510    ildarovich    46    

Обмен без правил. От простого к сложному

Перенос данных из 1C8 в 1C8 v8 1cv8.cf Абонемент ($m)

Пишем обмен с нуля, разбираемя с разными способами сериализации, учимся редактировать XML документы, создаем XDTO и Web service, осваиваем Script variant - English.

1 стартмани

16.01.2019    25429    nbeliaev    26    

Реализация простого http-сервиса "Просмотр карточки номенклатуры(товара) в браузере"

Практика программирования v8 1cv8.cf Абонемент ($m)

Практический пример реализации простого http-сервиса средствами 1С Предприятие 8.3. Обеспечивает просмотр списка товаров и просмотр данных товара в браузере.

1 стартмани

07.12.2018    23470    dmitry1975    32    

Разработка внешних компонент на ассемблере goAsm

Практика программирования Абонемент ($m)

Создание внешней компоненты по технологии Com "с нуля", используя ассемблер goAsm.

1 стартмани

26.11.2018    11072    chessman    41