# Алгоритмы

# Расстояние между 2-мя точками по координатам

```
// Код на 1С
Pi = 3.1415926535897932;
rlat1 = lat1 * Pi / 180;
rlon1 = lon1 * Pi / 180;
rlat2 = lat2 * Pi / 180;
rlon2 = lon2 * Pi / 180;
EarthRradius = 6371000; // по другим данным - 6372,795
Distance = EarthRradius * 2 * ASin(Sqrt((1 - Cos(rlat1 - rlat2))/2 + Cos(rlat1) * Cos(rlat2) * (1-Cos(rlon1-rlon2))/2));
```

Формула для расчета:

<figure class="wp-block-image size-full" id="bkmrk-">![](https://1chub.ru/wp-content/uploads/2023/07/image-5.png)</figure><figure class="wp-block-image size-full" id="bkmrk--1">![](https://1chub.ru/wp-content/uploads/2023/07/image-2.png)</figure><figure class="wp-block-image size-full" id="bkmrk--2">![](https://1chub.ru/wp-content/uploads/2023/07/image-6.png)</figure><figure class="wp-block-image size-full" id="bkmrk--3">![](https://1chub.ru/wp-content/uploads/2023/07/image-1.png)</figure><figure class="wp-block-image size-full" id="bkmrk--4">![](https://1chub.ru/wp-content/uploads/2023/07/image-7.png)</figure>Радиусы земли:

<figure class="wp-block-image size-full" id="bkmrk--5">![](https://1chub.ru/wp-content/uploads/2023/07/image-3.png)</figure>Ссылки

<div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-layout-1 wp-block-group-is-layout-flex" id="bkmrk-%D0%A0%D0%B5%D0%B4%D0%BA%D0%BE-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D0%BC%D1%8B%D0%B5-%D1%82">- [Редко используемые тригонометрические функции](https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B4%D0%BA%D0%BE_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D0%BC%D1%8B%D0%B5_%D1%82%D1%80%D0%B8%D0%B3%D0%BE%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8)
- [Haversine\_formula](https://en.wikipedia.org/wiki/Haversine_formula)
- [Вычисляем ближайшие объекты по координатам](https://habr.com/ru/articles/566474/)
- [Great-circle\_distance](https://en.wikipedia.org/wiki/Great-circle_distance) ([вариант на русском](https://ru.wikibrief.org/wiki/Great-circle_distance))
- [Расчет среднего радиуса земли](https://ru.wikibrief.org/wiki/Earth_radius#Mean_radius)
- [Центральный угол](https://en.wikipedia.org/wiki/Central_angle)

</div>P.S. Тонкости перевода: **Right angle**(правильный угол; по русски – прямой) = 90 degrees, **Straight angle**(прямой угол; по-русски – развернутый) = 180 degrees

# Асинхронный “cинхронный” вопрос

```
&НаКлиенте
Асинх Процедура СинхронныййВызовНовый(Команда)

	Ответы = Новый СписокЗначений;
	Ответы.Добавить("Ответ1");
	Ответы.Добавить("Ответ2");
	
	Ответ = Ждать ВопросАсинх("Ваш ответ?", Ответы);
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
	
	Если Ответ = "Ответ2" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
	Иначе
		ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
	КонецЕсли;	
	
КонецПроцедуры

```

# Формирование текста для поля составного типа в запросе по списку типов

В качестве оптимизации запроса при выборе в запросе поля составного типа или типа, включающего ВСЕ ссылки (например, ДокументСсылка) исходя из логики запроса можно наложить на поле ограничение по типам:

`ВЫБОР КОГДА Регистратор ССЫЛКА Документ.ОтчетПроизводстваЗаСмену ТОГДА ВЫРАЗИТЬ(Регистратор КАК Документ.ОтчетПроизводстваЗаСмену))`.

Это может дать существенный прирост по производительности запроса.

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

```
//ДоступныеТипы = Метаданные.РегистрыБухгалтерии.Хозрасчетный.СтандартныеРеквизиты.Регистратор.Тип.Типы();
ДоступныеТипы = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей().Отбор.Регистратор.ТипЗначения.Типы();

ПутьКПолю        = "Регистратор";
РазделительПолей = "";
ТекстСПолем      = "";
Для Каждого Тип Из ДоступныеТипы Цикл

	ДокументСсылка = Новый(Тип);
	ИмяТипа = "Документ." + ДокументСсылка.Метаданные().Имя;
	ТекстСПолем = ТекстСПолем + РазделительПолей + СтрШаблон("ВЫБОР КОГДА %1 ССЫЛКА %2 
		|	ТОГДА ВЫРАЗИТЬ(%1 КАК %2)", ПутьКПолю, ИмяТипа);
	
	РазделительПолей = Символы.ПС;	
КонецЦикла;

Если ЗначениеЗаполнено(ТекстСПолем) Тогда
	ТекстСПолем = СтрШаблон("%1%2КОНЕЦ", ТекстСПолем, Символы.ПС);
КонецЕсли;
```

# Как определить новый элемент при открытии управляемой формы?

```
&НаСервере 
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)	
	Если Параметры.Ключ.Пустая() Тогда ... 
	КонецЕсли; 
КонецПроцедуры
```

# Програмное получение места на диске

```
fso = Новый COMОбъект("scripting.fileSystemObject");
Сообщить(Окр(Число(fso.getDrive(fso.GetDriveName("d:\")).freeSpace())/1024/1024, 2));
```

# Использование RegExp в 1С

```
&НаКлиентеНаСервереБезКонтекста
Функция РазобратьТекст(ИсходныйТекст, Шаблон)
Попытка
RegExp = Новый COMОбъект(«VBScript.RegExp»);
Исключение
Возврат Новый Массив;
КонецПопытки;
RegExp.Multiline  = Истина;
RegExp.Global     = Истина;
RegExp.IgnoreCase = Истина;
RegExp.Pattern    = Шаблон;
РезультатРазбора = RegExp.Execute(ИсходныйТекст);
Результат        = Новый Массив;
Для каждого Item Из РезультатРазбора Цикл
Результат.Добавить(Item.Value);
КонецЦикла;
Возврат Результат
КонецФункции

```

# Как установить цвет авто программно

[Источник](https://forum.infostart.ru/forum9/topic228836/)

```
// вариант 1
ЭлементыФормы.Номенклатура.ЦветФонаПоля = ЦветаСтиля.ЦветФонаПоля;
// вариант 2
ЭлементыФормы.Номенклатура.ЦветФонаПоля = Новый Цвет();
```

# Параллельное выполнение кода в 1С

```
&НаСервере
Процедура ВыполнитьПаралельноНаСервере()

	МассивЗаданий = Новый Массив;
	Для Каждого ТекСтрока ИЗ ТЗСклады Цикл

		НаборПараметров = Новый Массив;
		НаборПараметров.Добавить("%ЗначениеПараметра1%");
		НаборПараметров.Добавить("%ЗначениеПараметраN%");

		// запуск фонового задания
		Задание = ФоновыеЗадания.Выполнить("%ОбщийСерверныйМодуль%.%Имяпроцедуры%", НаборПараметров);

		// добавляем задание в массив, что бы потом отследить выполнение
		МассивЗаданий.Добавить(Задание);
		
	КонецЦикла;

	// проверим результат выполнения фоновых заданий	
	Если МассивЗаданий.Количество() > 0 Тогда
		Попытка
			ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
		Исключение
			// действия в случае ошибки
		КонецПопытки;        
	КонецЕсли;
	
КонецПроцедуры // ВыполнитьПаралельно()

```

# Разработка регламентного задания

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

```
```
ИмяСобытияЖР = КонстантыМодуля("ИмяСобытияЖР");
ТекстСообщенияБлокировкаРаботыСвнешнимиРесурсами = КонстантыМодуля("ТекстСообщенияБлокировкаРаботыСвнешнимиРесурсами");
ТекстСообщенияНеВыполнена = КонстантыМодуля("ТекстСообщенияНеВыполнена");

Если БлокировкаРаботыСВнешнимиРесурсами.РаботаСВнешнимиРесурсамиЗаблокирована() Тогда 
	ОписаниеОшибки = ТекстСообщенияНеВыполнена + " " + ТекстСообщенияБлокировкаРаботыСвнешнимиРесурсами;
	#ЕСЛИ НаКлиенте ТОГДА
		Сообщить(ОписаниеОшибки);
	#КОНЕЦЕСЛИ
	ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Информация,,, ОписаниеОшибки);
	
	Возврат;
КонецЕсли;
```

Функция КонстантыМодуля(ИмяКонстанты)
	
	Если ИмяКонстанты = "ИмяСобытияЖР" Тогда 
		Возврат %ИмяСобытияЖР%
	ИначеЕсли ИмяКонстанты = "ТекстСообщенияБлокировкаРаботыСвнешнимиРесурсами" Тогда 
		Возврат "Работа с внешними ресурсами заблокирована."
	ИначеЕсли ИмяКонстанты = "ТекстСообщенияНеВыполнена" Тогда 
		Возврат "Регламентное задание прервано."
	КонецЕсли;
	
	ВызватьИсключение СтрШаблон("Константа %1 не определена", ИмяКонстанты);
	
КонецФункции // КонстантыМодуля()
```

# Проверка существования реквизита формы в 1С (и не только)

```
// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным.
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, Имяреквизита) Экспорт
	
	Ключуникальности = Новый Уникальныйидентификатор;
	СтруктураРеквизита = Новый Структура (ИмяРеквизита, КлючУникальности);
	ЗаполнитьЗначенияСвойств (СтруктураРеквизита, Объект);
	
	Возврат СтруктураРеквизита[ИмяРеквизита] <> Ключуникальности;
	
Конецфункции
```

Пример использования

```
Результат = ЕстьРеквизитИлиСвойствоОбъекта(Форма, "ИмяИскомогоРеквизита");
```

# Работа с метаданными

```
Функция МенеджерОбъектаПоСсылке(Ссылка) Экспорт

   ТипСсылки = ТипЗнч(Ссылка);
   XMLИмяТипа = XMLТип(ТипСсылки).ИмяТипа;
   Возврат Новый(СтрЗаменить(XMLИмяТипа, "Ref.", "Manager."));

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

Функция ЭтоСсылочныйТип(имяТипаXML) Экспорт
   фрагменты = СтрРазделить(имяТипаXML, ".", Ложь);
   Возврат Прав(фрагменты[0], 3) = "Ref";
КонецФункции
```

# Как отловить события Удаление / Добавление / Изменения регистра в 1С ?

Источник: [20](https://forum.infostart.ru/forum9/topic182981/#20) , [29](https://forum.infostart.ru/forum9/topic182981/#29)

Добавление новой записи:

```
<strong>НаборЗаписей.Количество() > 0 НаборЗаписей.Модифицированность() = Истина</strong>
```

Изменение записи:

```
<strong>НаборЗаписей.Количество() = 0 НаборЗаписей.Модифицированность() = Ложь</strong>
<strong>НаборЗаписей.Количество() > 0 НаборЗаписей.Модифицированность() = Истина</strong>
```

Удаление записи:

```
<strong>НаборЗаписей.Количество() = 0 НаборЗаписей.Модифицированность() = Истина</strong>
```

# Удалить текущую строку таблицы значений (управляемые формы)

```
Таблица = <<ТаблицаЗначений>>;
ТекущаяСтрока = Элементы.<<ТаблицаЗначений>>.ТекущаяСтрока;
Таблица.Удалить(Таблица.НайтиПоИдентификатору(ТекущаяСтрока));
```

# Генерация псевдослучайных чисел (линейный конгруэнтный метод)

Формула:

<figure class="wp-block-image" id="bkmrk--2">![X_{{n+1}}=(aX_{n}+c)~~{\bmod  ~}~m,](https://wikimedia.org/api/rest_v1/media/math/render/svg/e8ac4b3f0d4461a1706da6bcb103e7185ea71d4e)</figure>Примеры аргументов

<figure class="wp-block-table" id="bkmrk-source-m-%D0%BC%D0%BD%D0%BE%D0%B6%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%C2%A0a"><table><tbody><tr><th>Source</th><th>*m*</th><th>множитель *a*</th><th>слагаемое *c*</th><th>используемые биты</th></tr><tr><td>*[Numerical Recipes](https://ru.wikipedia.org/w/index.php?title=Numerical_Recipes&action=edit&redlink=1)*<sup>[\[9\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-9)</sup></td><td>2<sup>32</sup></td><td>1664525</td><td>1013904223</td><td> </td></tr><tr><td>[Borland](https://ru.wikipedia.org/wiki/Borland) C/C++</td><td>2<sup>32</sup></td><td>22695477</td><td>1</td><td>bits 30..16 in *rand()*, 30..0 in *lrand()*</td></tr><tr><td>[glibc](https://ru.wikipedia.org/wiki/Glibc) (used by [GCC](https://ru.wikipedia.org/wiki/GNU_Compiler_Collection))<sup>[\[10\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-10)</sup></td><td>2<sup>31</sup></td><td>1103515245</td><td>12345</td><td>bits 30..0</td></tr><tr><td>[ANSI C](https://ru.wikipedia.org/wiki/ANSI_C): [Watcom](https://ru.wikipedia.org/wiki/Watcom_C_compiler), [Digital Mars](https://ru.wikipedia.org/w/index.php?title=Digital_Mars&action=edit&redlink=1), [CodeWarrior](https://ru.wikipedia.org/wiki/CodeWarrior), [IBM VisualAge](https://ru.wikipedia.org/wiki/IBM_VisualAge) C/C++<sup>[\[11\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-11)</sup></td><td>2<sup>31</sup></td><td>1103515245</td><td>12345</td><td>bits 30..16</td></tr><tr><td>[C99](https://ru.wikipedia.org/wiki/C99), [C11](https://ru.wikipedia.org/wiki/C11): Suggestion in the ISO/IEC 9899<sup>[\[12\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-12)</sup></td><td>2<sup>32</sup></td><td>1103515245</td><td>12345</td><td>bits 30..16</td></tr><tr><td>[Borland Delphi](https://ru.wikipedia.org/wiki/Borland_Delphi), [Virtual Pascal](https://ru.wikipedia.org/wiki/Virtual_Pascal)</td><td>2<sup>32</sup></td><td>134775813</td><td>1</td><td>bits 63..32 of *(seed \* L)*</td></tr><tr><td>[Microsoft Visual/Quick C/C++](https://ru.wikipedia.org/wiki/Visual_C%2B%2B)</td><td>2<sup>32</sup></td><td>214013 (343FD<sub>16</sub>)</td><td>2531011 (269EC3<sub>16</sub>)</td><td>bits 30..16</td></tr><tr><td>[Microsoft Visual Basic](https://ru.wikipedia.org/wiki/Visual_Basic) (6 and earlier)<sup>[\[13\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-13)</sup></td><td>2<sup>24</sup></td><td>1140671485 (43FD43FD<sub>16</sub>)</td><td>12820163 (C39EC3<sub>16</sub>)</td><td> </td></tr><tr><td>RtlUniform from [Native API](https://ru.wikipedia.org/wiki/Native_API)<sup>[\[14\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-14)</sup></td><td>2<sup>31</sup> − 1</td><td>2147483629 (7FFFFFED<sub>16</sub>)</td><td>2147483587 (7FFFFFC3<sub>16</sub>)</td><td> </td></tr><tr><td>[Apple CarbonLib](https://ru.wikipedia.org/w/index.php?title=CarbonLib&action=edit&redlink=1), [C++11](https://ru.wikipedia.org/wiki/C%2B%2B11)'s `minstd_rand0`<sup>[\[15\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-cpp11-15)</sup></td><td>2<sup>31</sup> − 1</td><td>16807</td><td>0</td><td>see [MINSTD](https://ru.wikipedia.org/w/index.php?title=MINSTD&action=edit&redlink=1)</td></tr><tr><td>[C++11](https://ru.wikipedia.org/wiki/C%2B%2B11)'s `minstd_rand`<sup>[\[15\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-cpp11-15)</sup></td><td>2<sup>31</sup> − 1</td><td>48271</td><td>0</td><td>see [MINSTD](https://ru.wikipedia.org/w/index.php?title=MINSTD&action=edit&redlink=1)</td></tr><tr><td>[MMIX](https://ru.wikipedia.org/wiki/MMIX) by [Donald Knuth](https://ru.wikipedia.org/wiki/%D0%9A%D0%BD%D1%83%D1%82,_%D0%94%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%B4_%D0%AD%D1%80%D0%B2%D0%B8%D0%BD)</td><td>2<sup>64</sup></td><td>6364136223846793005</td><td>1442695040888963407</td><td> </td></tr><tr><td>[Newlib](https://ru.wikipedia.org/wiki/Newlib)</td><td>2<sup>64</sup></td><td>6364136223846793005</td><td>1</td><td>bits 63…32</td></tr><tr><td>[VAX](https://ru.wikipedia.org/wiki/VAX)'s **MTH$RANDOM**,<sup>[\[16\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-16)</sup> old versions of [glibc](https://ru.wikipedia.org/wiki/Glibc)</td><td>2<sup>32</sup></td><td>69069</td><td>1</td><td> </td></tr><tr><td>[Java](https://ru.wikipedia.org/wiki/Java)</td><td>2<sup>48</sup></td><td>25214903917</td><td>11</td><td>bits 47…16</td></tr><tr><td colspan="5">**Ранее во многих компиляторах:**</td></tr><tr><td>[RANDU](https://ru.wikipedia.org/wiki/RANDU)</td><td>2<sup>31</sup></td><td> 65539</td><td>0</td></tr></tbody></table>

</figure>Ссылки

[https://habr.com/ru/post/132217/](https://habr.com/ru/post/132217/)

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube.com/embed/-qLMTB61ZSs" width="560"></iframe>

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

```
#include <stdio.h>

unsigned long int seed = 1;
unsigned int lcg() {
    int a = 433494438;
    unsigned int m = 99999989;
    seed = seed * a % m; 
    
    return seed;
}   

int main() {
    unsigned int r = lcg(); 
    unsigned int n = 1; 
    while (lcg () != 433494438) { 
        n++;
    }
    printf("%d\n", n);
    
    return 0;
}

```