Алгоритмы

Расстояние между 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));

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

Радиусы земли:

Ссылки

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);
КонецЦикла;
Возврат Результат
КонецФункции

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

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Источник: 20 , 29

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

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

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

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

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

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

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

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

 

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

Формула:

X_{{n+1}}=(aX_{n}+c)~~{\bmod  ~}~m,

Примеры аргументов

Source m множитель a слагаемое c используемые биты
Numerical Recipes[9] 232 1664525 1013904223  
Borland C/C++ 232 22695477 1 bits 30..16 in rand(), 30..0 in lrand()
glibc (used by GCC)[10] 231 1103515245 12345 bits 30..0
ANSI CWatcomDigital MarsCodeWarriorIBM VisualAge C/C++[11] 231 1103515245 12345 bits 30..16
C99C11: Suggestion in the ISO/IEC 9899[12] 232 1103515245 12345 bits 30..16
Borland DelphiVirtual Pascal 232 134775813 1 bits 63..32 of (seed * L)
Microsoft Visual/Quick C/C++ 232 214013 (343FD16) 2531011 (269EC316) bits 30..16
Microsoft Visual Basic (6 and earlier)[13] 224 1140671485 (43FD43FD16) 12820163 (C39EC316)  
RtlUniform from Native API[14] 231 − 1 2147483629 (7FFFFFED16) 2147483587 (7FFFFFC316)  
Apple CarbonLibC++11's minstd_rand0[15] 231 − 1 16807 0 see MINSTD
C++11's minstd_rand[15] 231 − 1 48271 0 see MINSTD
MMIX by Donald Knuth 264 6364136223846793005 1442695040888963407  
Newlib 264 6364136223846793005 1 bits 63…32
VAX's MTH$RANDOM,[16] old versions of glibc 232 69069 1  
Java 248 25214903917 11 bits 47…16
Ранее во многих компиляторах:
RANDU 231   65539 0

Ссылки

https://habr.com/ru/post/132217/

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

#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;
}