Алгоритм определения вхождения точки в полигон

Публикация № 164095 28.11.12

Приемы и методы разработки - Математика и алгоритмы

Нередко встает необходимость ведения аналитики по территориальному признаку. Вручную, человеческими руками определить к какому региону относится контрагент, адрес доставки, розничная точка или ещё что-либо проблем не составляет. А если этих точек необходимо обрабатывать 500 в день или даже больше? Задача становится трудоемкой и её решение таким образом не рационально. Можно ли это сделать автоматически?

Недавно возник вопрос, как можно определить входит ли точка в произвольный полигон. Различных решений в интернетах море, но, как ни странно, никто не реализовывал эту задачу под 1С. Многие решения были достаточно громоздки, использовали тригонометрические функции, что приводило к довольно длительным вычислениям на больших массивах данных. Я выбрал алгоритм из http://habrahabr.ru/post/125356/ как отрабатывающий за время кратное количеству вершин в полигоне и требующий на каждую вершину лишь: 2 сложения, 4 вычитания, 1 умножение, 1 деление и одну операция взятия знака числа. Конечно, интерпретатор 1С далёк от лаконичности, но стало интересно в какие сроки этот алгоритм будет работать на реальных данных. Расчет реализован с помощью функции, принимающей на входе 2 параметра: массив структур, содержащих координаты вершин полигона и структуру, содержащую координаты точек. На выходе функция возвращает "Истина" если точка входит в полигон и "Ложь" в ином случае.

С теорией по работе алгоритма можно ознакомиться по следующей ссылке: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf или из pdf во вложенном файле.

Код функции следующий:

//Полигон - Массив структур{Х,У} //Точка - Структура{Х,У}

Функция ПроверитьТочку(Знач Полигон,Знач Точка) Экспорт  

Перем Результат;    

Если Полигон.Количество() < 3 Тогда   

Возврат Ложь;  

КонецЕсли;  

Результат = 0;  

Шаблон = Новый Массив;  

Строка1 = Новый Массив;  

Строка1.Добавить(0);  

Строка1.Добавить(1);  

Шаблон.Добавить(Строка1);  

Строка2 = Новый Массив;  

Строка2.Добавить(3);  

Строка2.Добавить(2);  

Шаблон.Добавить(Строка2);    

Размер = Полигон.Количество()-1;  

Конец = Полигон[Размер];  

ПредыдущаяТочка = Новый Структура("Х,У",Полигон[Размер],Полигон[Размер]);  

ПредыдущаяТочка.Х = ПредыдущаяТочка.Х - Точка.Х;  

ПредыдущаяТочка.У = ПредыдущаяТочка.У - Точка.У;  

Если ПредыдущаяТочка.У < 0 Тогда   

Х = 1;  

Иначе   

Х = 0;  

КонецЕсли;    

Если ПредыдущаяТочка.Х < 0 Тогда   

У = 1;  

Иначе   

У = 0;  

КонецЕсли;  

Пред_КУ = Шаблон[Х][У];  

Для Сч = 0 По Размер Цикл   

ТекТочка = Новый Структура("Х,У",Полигон[Сч].Х,Полигон[Сч].У);   

ТекТочка.Х = ТекТочка.Х - Точка.Х;   

ТекТочка.У = ТекТочка.У - Точка.У;   

Если ТекТочка.У < 0 Тогда    

Х = 1;   

Иначе    

Х = 0;   

КонецЕсли;      

Если ТекТочка.Х < 0 Тогда    

У = 1;   

Иначе    

У = 0;   

КонецЕсли;   

Ку = Шаблон[Х][У];   

ДельтаКу = Ку - Пред_Ку;   

Если ДельтаКу = -3 Тогда    

Результат = Результат + 1;   

ИначеЕсли ДельтаКу = 3 Тогда    

Результат = Результат - 1;   

ИначеЕсли ДельтаКу = -2 Тогда    

Если ПредыдущаяТочка.Х*ТекТочка.У >= ПредыдущаяТочка.У*ТекТочка.Х Тогда     

Результат = Результат + 1;    

КонецЕсли;   

ИначеЕсли ДельтаКу = 2 Тогда    

Если НЕ (ПредыдущаяТочка.Х*ТекТочка.У >= ПредыдущаяТочка.У*ТекТочка.Х) Тогда     

Результат = Результат - 1;    

КонецЕсли;   

КонецЕсли;   

ПредыдущаяТочка = ТекТочка;   

Пред_КУ = Ку;  

КонецЦикла;  

Возврат  НЕ(Результат = 0);

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

 

 

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

Наименование Файл Версия Размер
Обработка проверки вхождения точки в полигон

.epf 9,37Kb
44
.epf 9,37Kb 44 Скачать
Теория

.pdf 241,15Kb
7
.pdf 241,15Kb 7 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Serj1C 480 28.11.12 14:02 Сейчас в теме
(0) > но стало интересно в какие сроки этот алгоритм будет работать на реальных данных
Какие выводы? быстро ли? правильно?
2. logos 201 28.11.12 14:29 Сейчас в теме
(1) Serj1C, Ну, конечно не быстро, не идеально, но: обсчет 400 точек на вхождение в 50 зон по 5-87 точек в каждой проходит за 30 секунд. Тут нужно смотреть, что будет более ресурсоемко: работать с накладными расходами на транслятор языка 1С или с накладными расходами на COM или взаимодействие между процессами в каком-либо другом виде. Считаю, что для больших объемов данных будет более целесообразно сделать внешнюю компоненту, которая будет брать на входе 2 массива: точек и полигонов и возвращать массив результатов. В моём случае такой необходимости не было, не те объемы данных.
19. kuzz 02.07.19 17:19 Сейчас в теме
(2) Спасибо за публикацию! Отлично работает!
3. Serj1C 480 02.12.12 22:07 Сейчас в теме
Тема заинтересовала. Посидел на выходных, в теории не особо разобрался, но удалось оптимизировать код. Обошел транслятор и интерпретатор 1С тем, что вывел все вычисления в запрос. Вычисления выполняются на стороне "сервера". Вот код и пример обработки:
//Полигон	ТаблицаЗначений: НомерСтроки, Х, У
//Точки		ТаблицаЗначений: НомерСтроки, Х, У
Функция ПроверитьТочкиЗапросом(Полигон, Точки) Экспорт
	Если Полигон.Количество() < 3 Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Полигон", Полигон);
	Запрос.УстановитьПараметр("РазмерПолигона", Полигон.Количество());
	Запрос.УстановитьПараметр("Точки", Точки);
	Запрос.Текст =
		"ВЫБРАТЬ
		|	Полигон.НомерСтроки КАК НомерТочкиПолигона,
		|	Полигон.Х,
		|	Полигон.У
		|ПОМЕСТИТЬ Полигон
		|ИЗ
		|	&Полигон КАК Полигон
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	Точки.НомерСтроки КАК НаименованиеТочки,
		|	Точки.Х КАК Х,
		|	Точки.У КАК У
		|ПОМЕСТИТЬ Точки
		|ИЗ
		|	&Точки КАК Точки
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	Точки.НаименованиеТочки,
		|	Точки.Х КАК Точка_Х,
		|	Точки.У КАК Точка_У,
		|	Полигон.НомерТочкиПолигона,
		|	Полигон.Х КАК Полигон_Х,
		|	Полигон.У КАК Полигон_У,
		|	Полигон.Х - Точки.Х КАК Разница_Х,
		|	Полигон.У - Точки.У КАК Разница_У,
		|	ВЫБОР
		|		КОГДА Полигон.Х - Точки.Х < 0
		|				И Полигон.У - Точки.У < 0
		|			ТОГДА 2
		|		КОГДА Полигон.Х - Точки.Х < 0
		|				И Полигон.У - Точки.У >= 0
		|			ТОГДА 1
		|		КОГДА Полигон.Х - Точки.Х >= 0
		|				И Полигон.У - Точки.У < 0
		|			ТОГДА 3
		|		КОГДА Полигон.Х - Точки.Х >= 0
		|				И Полигон.У - Точки.У >= 0
		|			ТОГДА 0
		|	КОНЕЦ КАК К
		|ПОМЕСТИТЬ Таб
		|ИЗ
		|	Точки КАК Точки,
		|	Полигон КАК Полигон
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Точки.НаименованиеТочки,
		|	Полигон.НомерТочкиПолигона
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	Таб.НаименованиеТочки,
		|	Таб.Точка_Х,
		|	Таб.Точка_У,
		|	Таб.НомерТочкиПолигона,
		|	Таб.Полигон_Х,
		|	Таб.Полигон_У,
		|	Таб.К КАК К,
		|	ТабПред.К КАК ПредК,
		|	Таб.К - ТабПред.К КАК ДельтаКу,
		|	ВЫБОР
		|		КОГДА Таб.К - ТабПред.К = -3
		|			ТОГДА 1
		|		КОГДА Таб.К - ТабПред.К = 3
		|			ТОГДА -1
		|		КОГДА Таб.К - ТабПред.К = -2
		|				И ТабПред.Разница_Х * Таб.Разница_У >= ТабПред.Разница_У * Таб.Разница_Х
		|			ТОГДА 1
		|		КОГДА Таб.К - ТабПред.К = 2
		|				И НЕ ТабПред.Разница_Х * Таб.Разница_У >= ТабПред.Разница_У * Таб.Разница_Х
		|			ТОГДА -1
		|		ИНАЧЕ 0
		|	КОНЕЦ КАК Результат
		|ПОМЕСТИТЬ Развернуто
		|ИЗ
		|	Таб КАК Таб
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб КАК ТабПред
		|		ПО Таб.НаименованиеТочки = ТабПред.НаименованиеТочки
		|			И (Таб.НомерТочкиПолигона = ТабПред.НомерТочкиПолигона + 1
		|				ИЛИ Таб.НомерТочкиПолигона = 1
		|					И ТабПред.НомерТочкиПолигона = &РазмерПолигона)
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	Развернуто.НаименованиеТочки,
		|	Развернуто.Точка_Х КАК Х,
		|	Развернуто.Точка_У КАК У,
		|	ВЫБОР
		|		КОГДА СУММА(Развернуто.Результат) = 0
		|			ТОГДА ЛОЖЬ
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ КАК Результат
		|ИЗ
		|	Развернуто КАК Развернуто
		|
		|СГРУППИРОВАТЬ ПО
		|	Развернуто.НаименованиеТочки,
		|	Развернуто.Точка_Х,
		|	Развернуто.Точка_У";
	Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Показать


Мой слабенький нетбук на исходных данных считает алгоритмически 93 секунды, а запросом - 27.
frkbvfnjh; nomadon; Rudakov_D; vadimlp77; smit1c; logos; +6 Ответить
4. Serj1C 480 02.12.12 22:09 Сейчас в теме
(3) Serj1C, Файл с обработкой не могу приложить - в комментариях кнопочки нет(
5. logos 201 03.12.12 13:34 Сейчас в теме
(4) Serj1C, Интересно, хотя это всё полумеры и по делу нужно выносить вычисления в библиотеку.
15. DanilaDru 262 01.11.17 10:52 Сейчас в теме
(3)
| КОГДА СУММА(Развернуто.Результат) = 0


Со временем использования не возникало вопроса что сумму надо проверять на > 0 для Истина ?

Столкнулся с тем что в выборку попадают противоположные относительно друг друга полигоны. Так как у одного из них результат = -1, а у другого 1.
user779781; +1 Ответить
29. MAKint16 03.03.21 20:40 Сейчас в теме
(3)
Вдруг кому пригодится....Форматирование входящих координат до четырёх-пяти знаков после запятой значительно улучшает точность ответа функции
6. CagoBHuK 32 06.12.12 10:01 Сейчас в теме
Все работает для проскости. Но если полигон располагается на северном полюсе и представляет собой плоскость 200км на 200км? Необходимо добавить расчет кривизны земной поверхности.
7. logos 201 06.12.12 10:21 Сейчас в теме
(6) CagoBHuK, Да, безусловно, Вы правы. Но в этом случае для описания поверхности потребуется другая модель определения попадания точки в область. Необходимо будет определять множество полигонов, видимо треугольных, как минимально допустимая плоскость, это множество должно будет описывать все неровности рельефа. Вы же не забыли, что точка может находиться выше или ниже полигона? В этом случае задача вырождается в определение, попадает ли точка в треугольник или нет для каждого треугольника из множества описывающего поверхность, являющуюся нашей областью.
vadimlp77; +1 Ответить
21. kuzz 02.07.19 17:24 Сейчас в теме
(7) Скажите пожалуйста, а каково Ваше мнение по поводу перевода координат на плоскость? Нужно ли этим заниматься если задача стоит в определении принадлежности точек к областям среднестатистического города нашей страны? С точки зрения увеличения точности
8. CagoBHuK 32 06.12.12 14:08 Сейчас в теме
Если говорить о гуглокартах (а это, несомненно, они изображены на спойлере), то вполне хватит простого перевода изгиба поверхности планеты в плоскость через тригонометрическую функцию sin(широта). Почему я клоню в эту сторону? Да потому, что уже решал подобные задачи, а выложить на Инфостарт не додумался. Поэтому я направляю Вас в правильном направлении, чтобы не наступать на те же грабли, что и я.
10. tav13 6 07.08.14 11:59 Сейчас в теме
(8) CagoBHuK, почитав вас сделал обработку перевода координат на плоскость http://infostart.ru/public/295388/
cleaner_it; +1 Ответить
27. Dilovar9 55 21.04.20 21:23 Сейчас в теме
Нашел еще более короткую функцию:


	ПолигонХ = Новый Массив;
	ПолигонУ = Новый Массив;
	
	ПолигонХ.Добавить(10);
	ПолигонУ.Добавить(10);	
	
	ПолигонХ.Добавить(-10);
	ПолигонУ.Добавить(10);
	
	ПолигонХ.Добавить(1);
	ПолигонУ.Добавить(1);
	
	ПолигонХ.Добавить(10);
	ПолигонУ.Добавить(0);  		
	
	Результат = ПроверитьПринадлежностьКПолигону(5,6,ПолигонХ, ПолигонУ));

......

Функция ПроверитьПринадлежностьКПолигону(x,y,ПолигонХ,ПолигонУ)
	
	Результат = Ложь;	
	j = ПолигонХ.ВГраница();	
	Для i=0 по j Цикл
		Если (ПолигонУ[i]<y И ПолигонУ[j]>=y  ИЛИ  ПолигонУ[j]<y И ПолигонУ[i]>=y) И 
			(ПолигонХ[i]+(y-ПолигонУ[i])/(ПолигонУ[j]-ПолигонУ[i])*(ПолигонХ[j]-ПолигонХ[i])<x) Тогда			
			Результат=НЕ Результат; 						
		КонецЕсли;
		j=i; 	
	КонецЦикла;
	Возврат Результат;
	
Конецфункции

Показать
tormozit; +1 Ответить
9. SunShinne 629 09.01.14 22:56 Сейчас в теме
Автору огромное спасибо! Однозначно +. Единственное есть два нюанса - во первых в коде закралась ошибка (путаница между латинскими X Y и кириллическими Х У), во вторых алгоритм работает на вхождение именно внутри полигона, но вот если точка на границе полигона то алгоритм выдает отрицательный результат. Но это вопрос спорный, однако отметить стоит. Еще раз спасибо - помогло!
11. frkbvfnjh 691 05.03.15 11:41 Сейчас в теме
По крайней мере с координатами Google карты не работает. Спер алгоритм на JS, там все вхождения четко определил а этот какую то ерунду выдает, я так понял, что координаты еще предварительно нужно обработать обработкой http://infostart.ru/public/295388/ что ли, что бы этот алгоритм заработал?
20. kuzz 02.07.19 17:20 Сейчас в теме
(11) У нас все работает на ура
12. frkbvfnjh 691 05.03.15 11:48 Сейчас в теме
я так понимаю широта это X долгота это Y, или нет?
13. ildarovich 7509 05.03.15 12:18 Сейчас в теме
Я бы попробовал применить в этой задаче готовый объект "ГеографическаяСхема". Там есть метод "ПроверитьПоРасположению". По описанию делает как раз то, что надо.
16. Жолтокнижниг 254 14.11.18 17:31 Сейчас в теме
(13) К сожалению этот вариант работает не корректно
17. vs84 13.01.19 10:50 Сейчас в теме
(16) Проверяли, заработало, но некорректно определяет вхождение? Планировали использовать этот метод для аналогичной задачи (предполагаем, что он определяет с учетом сферичности поверхности), но смутил ваш комментарий.
18. Жолтокнижниг 254 16.01.19 15:51 Сейчас в теме
(17) Сейчас не помню в чем конкретно были проблемы, но нам не подошел этот метод.
Возможно вообще плохо определял попадания, точно не скажу, потратив день на разбор пришли к выводу что не пригодно.

В итоге использую алгоритм статьи и http://infostart.ru/public/295388/ с небольшой шлифовкой. Работает на ура.
22. frkbvfnjh 691 15.07.19 10:24 Сейчас в теме
(18) А с какой небольшой шлифовкой? Может сделаете статью уже с окончательным вариантом алгоритма, который 100% работает, а то сколько не читаю статей в сети, везде потом в конце пишут, что нужно допилить
23. Жолтокнижниг 254 15.07.19 22:32 Сейчас в теме
(22) К сожалению не могу предоставить код, вот примерный алгоритм

Вводная
1. Используется проекция UTM.
2. Используются небольшие геозоны.
Алгоритм
1. Для перевода координат необходимо определить UTM зону (реквизит Zome из обработки https://infostart.ru/public/295388/)
2. Зона определялась, кажется, по медианной долготе (код определения зоны по координатам есть в обработке)
3. Используя алгоритм обработки и зону переводим геозону в полигон
4. По алгоритму из этой статьи определяем вхождение

Поток геоданных небольшой, поэтому оптимизаций не делали.

ПС: работу с геоданными поддерживают СУБД(MS и PostgreSQL) при больших объемах данных лучше использовать их.
25. frkbvfnjh 691 16.07.19 06:13 Сейчас в теме
14. Sergius79 03.09.15 07:38 Сейчас в теме
Спасибо, за решение. В благодарность прикладываю эту же функцию для 1С 7.7
// ======================================
Функция ГлПроверитьТочку(СписПолигонов,ТочкаХ,ТочкаУ) Экспорт  
Перем Результат, ШаблонКоординат;
	
	Результат = 0;  
	Для Инд=1 по СписПолигонов.РазмерСписка() Цикл
		Результат = 0;  
		Полигон=СписПолигонов.ПолучитьЗначение(Инд);
		Размер=Полигон.КоличествоСтрок();
		Если  Размер< 3 Тогда   
			Возврат 0;  
		КонецЕсли;  
		ШаблонКоординат=СоздатьОбъект("ТаблицаЗначений");
		ШаблонКоординат.НоваяКолонка("У","Число");
		ШаблонКоординат.НоваяКолонка("У1","Число");
		
		ШаблонКоординат.НоваяСтрока();
		ШаблонКоординат.У = 0;
		ШаблонКоординат.У1 = 1;
		ШаблонКоординат.НоваяСтрока();
		ШаблонКоординат.У = 3;
		ШаблонКоординат.У1 = 2;
	
		
		Полигон.ПолучитьСтрокуПоНомеру(Размер);
		Конец = Полигон;  
		
		ПредыдущаяТочкаХ = Полигон.Х;
		ПредыдущаяТочкаУ = Полигон.У;  
		
		ПредыдущаяТочкаХ = ПредыдущаяТочкаХ - ТочкаХ;  
		
		ПредыдущаяТочкаУ = ПредыдущаяТочкаУ - ТочкаУ;  
		
		Если ПредыдущаяТочкаУ < 0 Тогда   
			Х = 1;  
		Иначе   
			Х = 0;  
		КонецЕсли;    
		
		Если ПредыдущаяТочкаХ < 0 Тогда   
			У = 1;  
		Иначе   
			У = 0;  
		КонецЕсли;  
		
		Пред_КУ = ШаблонКоординат.ПолучитьЗначение(Х+1,У+1);
		
		Полигон.ВыбратьСтроки();
		Пока Полигон.ПолучитьСтроку()=1 Цикл
			ТекТочкаХ = Полигон.Х;
			ТекТочкаУ = Полигон.У;  

			ТекТочкаХ = ТекТочкаХ - ТочкаХ;   
			ТекТочкаУ = ТекТочкаУ - ТочкаУ;   
			
			Если ТекТочкаУ < 0 Тогда    
				Х = 1;   
			Иначе    
				Х = 0;   
			КонецЕсли;      
			
			Если ТекТочкаХ < 0 Тогда    
				У = 1;   
			Иначе    
				У = 0;   
			КонецЕсли;   
			
			Ку = ШаблонКоординат.ПолучитьЗначение(Х+1,У+1);
			
			ДельтаКу = Ку - Пред_Ку;   
			
			Если ДельтаКу = -3 Тогда    
				Результат = Результат + 1;   
			ИначеЕсли ДельтаКу = 3 Тогда    
				Результат = Результат - 1;   
			ИначеЕсли ДельтаКу = -2 Тогда    
				Если ПредыдущаяТочкаХ*ТекТочкаУ >= ПредыдущаяТочкаУ*ТекТочкаХ Тогда     
					Результат = Результат + 1;    
				КонецЕсли;   
			ИначеЕсли ДельтаКу = 2 Тогда    
				Если НЕ (ПредыдущаяТочкаХ*ТекТочкаУ >= ПредыдущаяТочкаУ*ТекТочкаХ) Тогда     
					Результат = Результат - 1;    
				КонецЕсли;   
			КонецЕсли;   
			
			ПредыдущаяТочкаХ = ТекТочкаХ;
			ПредыдущаяТочкаУ = ТекТочкаУ;
			Пред_КУ = Ку;  
		КонецЦикла; 
		Если Результат <>  0 Тогда
			Возврат 1;
		КонецЕсли;
	КонецЦикла;
	Возврат  ?(Результат = 0,0,1);
КонецФункции 
Показать
24. acanta 15.07.19 22:56 Сейчас в теме
Можно подробнее про геоданные в СУБД ?
Никогда не слышала об этом.
28. пользователь 05.08.20 06:01
Сообщение было скрыто модератором.
...
26. Sangre1999 41 27.12.19 14:26 Сейчас в теме
Отлично, без проблем стартануло!))
30. scaramouche 19.03.21 12:45 Сейчас в теме
Спасибо, пока работает. Навешал логов на прод-сервер - посмотрим как на больших объемах. Если не забуду - отпишу результаты.
Оставьте свое сообщение

См. также

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

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

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

1 стартмани

09.08.2013    74898    ildarovich    117    

Работа с абстрактным массивом

Математика и алгоритмы Универсальные функции v8 Россия Абонемент ($m)

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

1 стартмани

07.07.2021    4744    kalyaka    57    

10 способов получить модуль числа (а может, и больше)

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

Пишем функцию вычисления модуля числа. Сколько способов существует? Давайте посчитаем!

1 стартмани

11.07.2019    18882    sam441    35    

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

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

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

1 стартмани

28.09.2016    42970    ildarovich    22    

Собственный алгоритм нумерации документов определенного вида

Математика и алгоритмы v8 БП3.0 Россия Абонемент ($m)

Создание собственного, отличного от платформенного алгоритма нумерации документов определенного вида.

1 стартмани

11.04.2019    5482    xan333    12    

Основы компьютерной графики (Часть 2)

Математика и алгоритмы Работа с интерфейсом v8::УФ 1cv8.cf Россия Абонемент ($m)

Статья является продолжением публикации "Основы компьютерной графики". Во второй части будут рассмотрены следующие темы: 1. Преобразования в трехмерном пространстве. 2. Ортографическая проекция трехмерного изображения на экран. 3. Определение, какой поверхностью (лицевой/задней) проецируется грань на экран. 4. Перспективная проекция.

1 стартмани

03.08.2018    6497    HAMMER_59    13    

Основы компьютерной графики

Математика и алгоритмы Работа с интерфейсом v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

30.07.2018    8361    HAMMER_59    39    

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

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

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

1 стартмани

01.02.2018    39862    rpgshnik    60    

Любое число больше 7 можно разложить на сумму троек и пятерок

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

Наткнулся в интернете на школьную задачу: "Докажите, что любое число больше 7 можно представить в качестве суммы чисел 3 и 5". Представляю решение на 1С. (есть рекурсия, пример работы с событием ИзменениеТекстаРедактирования).

1 стартмани

06.07.2018    6743    Eskimos    6    

Итераторы выборки

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

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

1 стартмани

16.05.2018    9822    kalyaka    10    

Строим "фасады" в 1С

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

Как реализовать функционал, чтобы не было “мучительно больно” при расширении требований.

1 стартмани

04.05.2018    18416    ktb    41    

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

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

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

1 стартмани

09.09.2013    88544    ildarovich    57    

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

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

Объект ГенераторСлучайныхЧисел удобно выдает случайные числа в заданном интервале значений. Исследование особенностей, рассуждения на тему случайных чисел, практика применения. Увлекательно в игровой форме можно исследовать работу генератора случайных чисел.

1 стартмани

20.01.2018    48900    Ликреонский    60    

Черпаем простые числа решетом Аткина

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

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

1 стартмани

09.01.2018    9479    scientes    7    

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

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

Задача преобразовать массив некоторых структур в дерево значений возникла, когда я получил JSON от сервиса о структуре папок пользователя. А именно строка JSON была получена через API Google Drive, когда пользователю предлагается выбрать одну из его папок. При преобразовании JSON у меня получился массив структур, в которых есть некоторый ключ уникальности и ключ родителя-структуры. Предлагаю ознакомиться с алгоритмом не использующую рекурсию, который достаточно быстро создает дерево значений, для последующего показа пользователю.

1 стартмани

07.11.2017    13679    Arxxximed    15    

Опять двойка! Промо

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

Продолжение тем, связанных с использованием степеней двойки «Порождающий запрос» [http://infostart.ru/public/90367/], «Транзитивное замыкание запросом» [http://infostart.ru/public/158512/]. На этот раз речь пойдет об операциях со строками.

1 стартмани

26.11.2012    31976    ildarovich    31    

Github и 1С. Пошаговая инструкция на конкретном примере

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

Статья для тех, у кого есть неудержимое желание программировать и хочется доработать какую-то конфигурацию (или проект на 1С), выложенный на Github, но останавливают незнакомые слова Git, Github, Fork, Commit, Pull request, Merge, Issue.

1 стартмани

26.10.2017    52735    BlizD    55    

Сборка автомата (с примерами)

Математика и алгоритмы v8 1cv8.cf Россия Абонемент ($m)

Посмотрим, нужен ли 1снику автомат, как его собрать и где это может пригодиться.

1 стартмани

19.09.2017    14786    pm74    45    

Степень сходства двух наименований справочника

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

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

1 стартмани

25.02.2015    22619    etmarket    43    

INFOSTART EVENT 2012: разбор решений конкурса разработчиков Промо

Математика и алгоритмы Запросы v8 1cv8.cf Абонемент ($m)

В статье проводится разбор присланных решений на конкурс разработчиков от компании "Первый БИТ". Приводятся планы выполнения запросов и сравниваются показатели быстродействия и оптимизации.

1 стартмани

25.12.2012    15805    krolya    49    

Загадка возвращамого значения ЗначениеВСтрокуВнутр()

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

ЗначениеВСтрокуВнутр(Значение); Из синтаксис помощника: Получает системное строковое представление переданного значения. Что же такое "системное строковое представление"? точнее из чего оно состоит?

1 стартмани

05.08.2013    26989    vitalya24    10    

АЦРК: Многовариантный автоматический запрет редактирования (для конфигурации УТ 10.3)

Закрытие периода Математика и алгоритмы Инструменты администратора БД v8 УТ10 Абонемент ($m)

В этой статье описывается усовершенствованная технология автоматической установки даты запрета редактирования Во-первых, можно определить несколько стратегий запрета редактирования с разными параметрами. Например, запрет в днях, запрет доступа в предыдущие месяцы кварталы и т.п., с указанием отступа от текущей даты. То есть для некоторых пользователей (рядовых менеджеров) при входе в базе будет устанавливаться запрет по вчерашний день, для других (старших менеджеров) на 5 дней назад, для третьих (администраторов базы или руководителей отдела) - запрет предыдущего месяца с отступом в 10 дней.. Во-вторых, запрет будет устанавливаться для ВСЕХ без исключения пользователей базы данных. Для самых привилегированных это будет максимальная глубина, но запрет будет установлен. Управление этой системой осуществляется через механизм дополнительных прав пользователей. При необходимости пользователь с полными правами может открыть для себя закрытый период, но только на текущий сеанс работы.

1 стартмани

22.07.2013    21350    acrk    9    

Разработка многоязычной системы

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

В статье затронуты некоторые аспекты многоязычности системы с точки зрения их технической реализации

1 стартмани

20.06.2013    22119    obemgyorik    54    

115 полезностей от Буравова Андрея по курсу СКД Евгения Гилёва Промо

Математика и алгоритмы v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

08.04.2012    43069    Flashill    70    

Передача аргумента, полученного по ComConnector, на сервер

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

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

1 стартмани

20.03.2013    6593    asved.ru    3    

Теория поиска ошибок :)

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

Соображения о поисках ошибок

1 стартмани

14.12.2012    22993    Ягг    56    

Объектно-ориентированный взгляд на программирование в 1С

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

Рассматриваем программирование в 1С как работу с объектами и классами.

1 стартмани

18.04.2012    33410    BorisMor    241    

Проектирование (параллельной) обработки данных.

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

Если нужно обрабатывать разнородные информационные потоки...

1 стартмани

14.11.2011    16691    Арчибальд    15    

Использование нарастающих итогов в партионном учете и не только

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

Данный материал является иллюстрацией способов работы с запросами, использующими методику вычисления «нарастающих итогов». Также в данной статье рассматриваются вопросы практического использования запросов такого рода при партионном учете и расчете задолженностей. Фактически в данной статье рассматриваются альтернативы запросам, приведенным в статьях http://infostart.ru/public/61295/ и http://infostart.ru/public/68225/. Полный текст статьи можно также найти на http://nashe1c.ru/materials-view.jsp?id=383.

1 стартмани

25.08.2011    14590    y-str    107    

Модуль менеджера или статические методы класса?

Математика и алгоритмы v8 1cv8.cf Россия Абонемент ($m)

Зачем в платформе 8.2 добавили модуль менеджера объекта, как его использовать? Попробуем разобраться.

1 стартмани

02.07.2010    66164    zfilin    97    

Как я победил блокировки (deadlock)

Математика и алгоритмы v8 1cv8.cf Россия Абонемент ($m)

Статья о том, как сделать работу нормальной, комфортной для пользователей, в большой базе с большим количеством пользователей.

1 стартмани

28.09.2009    22190    Minotavrik    64