1с: Еще раз о сортировке массива структур

Уже не однократно поднимал в своём блоге вопрос о методе сортировки массива структур по какому то ключу. В конце концов остановился на самом медленном, но зато самом менее трудоёмком методе. Для нескольких тысяч записей пойдет. Для нескольких десятков тысяч записей уже нет, ибо памяти не хватит. Общая методика такова:

  1. Преобразуем массив структур в таблицу значений
  2. Отсортируем штатными средствами таблицу значений по ключевому полю
  3. Далее используем еже не массив структур, а именно таблицу значений, чтобы уменьшить накладные расходы на обратные преобразования
Функция ПреобразованиеМассивВТаблицуЗначений(Массив) экспорт
   ТЗ = Новый ТаблицаЗначений;
   Для Каждого СтрокаМассива Из Массив Цикл
       Если ТЗ.Колонки.Количество() = 0 Тогда
           Для Каждого ЭлементМассива Из СтрокаМассива Цикл
               ТЗ.Колонки.Добавить(ЭлементМассива.Ключ);
           КонецЦикла;
       КонецЕсли;

       НоваяСтрока = ТЗ.Добавить();
       Для Каждого ЭлементМассива Из СтрокаМассива Цикл
           НоваяСтрока[ЭлементМассива.Ключ] = ЭлементМассива.Значение;
       КонецЦикла;
   КонецЦикла;
   Возврат ТЗ;
КонецФункции

Использование:

ТЗ_ЛС=ПреобразованиеМассивВТаблицуЗначений(список_лс.result.responseObject);
ТЗ_ЛС.Сортировать("room Возр");
...
для каждого стр из ТЗ_ЛС цикл
....
конеццикла

Консоль администрирования 1С под Linux

Перейдя с Windows на Linux, теряется возможность управлять сервером 1С Предприятие через консоль администрирования, через оснастку. Но! оказывается довольно давно уже в платформе зашита подобная же утилита, которая доступна через «Функции для технического специалиста»: Стандартные -> Управление серверами.

При запуске будет практически аналогичная функциональность доступная ранее через консоль:

1С: Фоновые задания внутри фоновых заданий

Задача: распаралелить медленную вставку записей в БД 1С, при чтении файла Excel

Как ни странно, но такая возможность есть и работает начиная с версии платформы 8.3.8. Т.е. можно запустить фоновое задание внутри фонового задания….ну например по вставке в БД большого количества записей, которая выполняется весьма медленно. Полноценно этот процесс распаралелить можно например как-то так:

Функция СделатьЗаписьвБДПДЗФоново(парам) экспорт
	...
    // делаем медленную запись в БД
	...
конецфункции	

// Просматриваем массив с идентификаторами фоновых заданий и удаляем те которые завершились
Функция ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий) экспорт
		для каждого ФЗМ из МассивФоновыхЗаданий цикл
			ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФЗМ);
			если ФЗ.Состояние<>СостояниеФоновогоЗадания.Активно тогда
				МассивФоновыхЗаданий.Удалить(МассивФоновыхЗаданий.Найти(ФЗМ));
			конецесли;	
		конеццикла;		
	возврат МассивФоновыхЗаданий;
конецфункции		

// выполняем загрузку построчно файла Excel, запуская запись данных в БД
// отдельным потоком. Количество потоков ограничивам 10 штуками
Функция ВыполнитьЗагрузку(парам) экспорт
	МассивФоновыхЗаданий=Новый Массив();
	МаксимумЗаданий=10;
...
    Для	 нСтрокаТФ = 2 ПО КолВоСтрокФайла Цикл  
        ....
			МассивПараметров = Новый Массив;
			Параметры=Новый Структура("aa,bb,cc",
				1,
				2,
				3,
            );
			МассивПараметров.Добавить(Параметры);
			ФЗ = ФоновыеЗадания.Выполнить("ДлительныеОперации.СделатьЗаписьвБДПДЗФоново",МассивПараметров);	
			МассивФоновыхЗаданий.Добавить(ФЗ.УникальныйИдентификатор);											
			МассивФоновыхЗаданий=ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий);
			// ждём пока завершаться запущеные потоки, если их больше 10
			пока МассивФоновыхЗаданий.Количество()>МаксимумЗаданий цикл
				МассивФоновыхЗаданий=ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий);
			конеццикла;	        
        ....
   конеццикла;
конецфункции	   

В ниже приведённом каркасе кода, фоново выполняется функция ВыполнитьЗагрузку(), которая читает большой файл Excel, затем каждый цикл вставки записи в БД запускает в свою очередь фоново, ограничивая в данном случае количество фоновых заданий 10 штуками.

Сложение с null в запросе

Иногда удаётся найти подводные камни там, где совсем не ждешь от 1С. Оказывается в запросах 1С, сложение столбцов а+б даёт в сумме null, если одно из значений равно null. даже если чётко укажешь преобразовать значение в строку, например так:

строка(geo_coors_public_regions.name)+строка(geo_coors_public_areas.name)

Не прокатывает (с). Приходится городить код вида:

ВЫБОР
		КОГДА geo_coors_public_regions.name ЕСТЬ NULL
			ТОГДА ""
		ИНАЧЕ geo_coors_public_regions.name
	КОНЕЦ + "," + ВЫБОР
		КОГДА geo_coors_public_areas.name ЕСТЬ NULL
			ТОГДА ""
		ИНАЧЕ geo_coors_public_areas.name
	КОНЕЦ + "," + ВЫБОР
		КОГДА geo_coors_public_cities.name ЕСТЬ NULL
			ТОГДА ""
		ИНАЧЕ geo_coors_public_cities.name
	КОНЕЦ + "," + ВЫБОР
		КОГДА geo_coors_public_settlers.name ЕСТЬ NULL
			ТОГДА ""
		ИНАЧЕ geo_coors_public_settlers.name
	КОНЕЦ
ИЗ
...

1С: Получить название и код региона по почтовому индексу

Может пригодится кому, если у кого как у меня не получается воспользоваться стандартным функционалом БСП:

АдресныйКлассификаторСлужебный.ОпределитьРегионПоИндексу

Лично у меня например конфигурация ругается в 211 строчке, что «Регион.Сокращение» нет такого параметра:

Посему навелосипедил свой вариант:

&НаСервере
Функция ПолучитьРегионПоИндексу(индекс) экспорт	
		Регионы=Новый Массив();
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",01,"Республика Адыгея (Адыгея)","385"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",02,"Республика Башкортостан","450-453"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",03,"Республика Бурятия","670-671"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",04,"Республика Алтай","649"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",05,"Республика Дагестан","367-368"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",06,"Республика Ингушетия","386"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",07,"Кабардино-Балкарская Республика","360-367"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",08,"Республика Калмыкия","358-359"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",09,"Карачаево-Черкесская Республика","369"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",10,"Республика Карелия","185-186"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",11,"Республика Коми","167-169"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",12,"Республика Марий Эл","424-425"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",13,"Республика Мордовия","430-431"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",14,"Республика Саха (Якутия)","677-678"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",15,"Республика Северная Осетия - Алания","362-363"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",16,"Республика Татарстан (Татарстан)","420-423"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",17,"Республика Тыва","667-668"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",18,"Удмуртская Республика","426-427"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",19,"Республика Хакасия","655"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",20,"Чеченская Республика","364-366"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",21,"Чувашская республика - Чувашия","428-429"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",22,"Алтайский край","656-659"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",23,"Краснодарский край","350-354"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",24,"Красноярский край","660-663,647-648"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",25,"Приморский край","690-692"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",26,"Ставропольский край","355-357"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",27,"Хабаровский край","680-682"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",28,"Амурская область","675-676"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",29,"Архангельская область","163-165"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",30,"Астраханская область","414-416"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",31,"Белгородская область","308-309"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",32,"Брянская область","241-243"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",33,"Владимирская область","600-602"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",34,"Волгоградская область","400-404"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",35,"Вологодская область","160-162"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",36,"Воронежская область","394-397"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",37,"Ивановская область","153-155"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",38,"Иркутская область","664-668,669"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",39,"Калининградская область","236-238"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",40,"Калужская область","248-249"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",41,"Камчатский край","683-684,688"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",42,"Кемеровская область - Кузбасс","650-654"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",43,"Кировская область","610-613"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",44,"Костромская область","156-157"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",45,"Курганская область","640-641"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",46,"Курская область","305-307"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",47,"Ленинградская область","187-188"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",48,"Липецкая область","398-399"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",49,"Магаданская область","685-686"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",50,"Московская область","140-144"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",51,"Мурманская область","183-184"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",52,"Нижегородская область","603-607"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",53,"Новгородская область","173-175"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",54,"Новосибирская область","630-633"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",55,"Омская область","644-646"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",56,"Оренбургская область","460-462"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",57,"Орловская область","302-303"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",58,"Пензенская область","440-442"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",59,"Пермский край","614-619"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",60,"Псковская область","180-182"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",61,"Ростовская область","344-347"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",62,"Рязанская область","390-391"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",63,"Самарская область","443-446"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",64,"Саратовская область","410-413"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",65,"Сахалинская область","693-694"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",66,"Свердловская область","620-624"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",67,"Смоленская область","214-216"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",68,"Тамбовская область","392-393"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",69,"Тверская область","170-172"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",70,"Томская область","634-636"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",71,"Тульская область","300-301"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",72,"Тюменская область","625-627"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",73,"Ульяновская область","432-433"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",74,"Челябинская область","454-457"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",75,"Забайкальский край","672-674,687"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",76,"Ярославская область","150-152"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",77,"Город Москва","101-135"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",78,"Город Санкт-Петербург","190-199"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",79,"Еврейская автономная область","679"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",83,"Ненецкий автономный округ","166"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",86,"Ханты-Мансийский автономный округ - Югра","628"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",87,"Чукотский автономный округ","689"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",89,"Ямало-Ненецкий автономный округ","629"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",90,"Запорожская область",""));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",91,"Республика Крым","295-298"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",92,"Город Севастополь","299"));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",93,"Донецкая Народная Республика",""));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",94,"Луганская Народная Республика",""));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",95,"Херсонская область",""));
		Регионы.Добавить(Новый Структура("Код,Наименование,Диапазоны",99,"Город Байконур","468"));
		ПервыйТриЦифрыИндекса = Число(Лев(Индекс, 3));
		для каждого стр из Регионы цикл
			диапазон=СтрРазделить(стр.Диапазоны,"-");
			если диапазон.Количество()=1 тогда
				дначало=Число(диапазон[0]);
				дконец=Число(диапазон[0]);
			иначе
				дначало=Число(диапазон[0]);
				дконец=Число(диапазон[1]);								
			конецесли;	
			если ПервыйТриЦифрыИндекса>=дначало и  ПервыйТриЦифрыИндекса<=дконец тогда
				возврат стр;
			конецесли;	
		конеццикла;	
		возврат неопределено;
КонецФункции

Тупо, в лоб. Но ничего умнее быстро не придумал

1 5 6 7 8 9 52