Андрей Ланченко. Блуждающие огни 1-4. Краткий сюжет: земля на задворках, и оказывается она забытая колония. Программист Дима через портал попал на транспортный корабль колонистов. И понеслось (с). Читабельность 4/5
Григорий Володин. Газлайтер 1-18. Классическое бояр-аниме. Попаданец в паралельный мир с магией и прочим. Там не было СССР и власть в руках дворян/царя. Читабельность 4/5
Толкиню Хоббит. Властелин колец. Дочке не зашло, хотя прочитали примерно половину.
Задача: распаралелить медленную вставку записей в БД 1С, при чтении файла Excel
Как ни странно, но такая возможность есть и работает начиная с версии платформы 8.3.8. Т.е. можно запустить фоновое задание внутри фонового задания….ну например по вставке в БД большого количества записей, которая выполняется весьма медленно. Полноценно этот процесс распаралелить можно например как-то так:
Функция СделатьЗаписьвБДПДЗФоново(парам) экспорт
...
// делаем медленную запись в БД
...
конецфункции
// Просматриваем массив с идентификаторами фоновых заданий и удаляем те которые завершились
Функция ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий) экспорт
для каждого ФЗМ из МассивФоновыхЗаданий цикл
ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФЗМ);
если ФЗ.Состояние<>СостояниеФоновогоЗадания.Активно тогда
МассивФоновыхЗаданий.Удалить(МассивФоновыхЗаданий.Найти(ФЗМ));
конецесли;
конеццикла;
возврат МассивФоновыхЗаданий;
конецфункции
// выполняем загрузку построчно файла Excel, запуская запись данных в БД
// отдельным потоком. Количество потоков ограничивам 10 штуками
Функция ВыполнитьЗагрузку(парам) экспорт
МассивФоновыхЗаданий=Новый Массив();
МаксимумЗаданий=10;
...
Для нСтрокаТФ = 2 ПО КолВоСтрокФайла Цикл
....
МассивПараметров = Новый Массив;
Параметры=Новый Структура("aa,bb,cc",
1,
2,
3,
);
МассивПараметров.Добавить(Параметры);
ФЗ = ФоновыеЗадания.Выполнить("ДлительныеОперации.СделатьЗаписьвБДПДЗФоново",МассивПараметров);
МассивФоновыхЗаданий.Добавить(ФЗ.УникальныйИдентификатор);
МассивФоновыхЗаданий=ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий);
// ждём пока завершаться запущеные потоки, если их больше 10
пока МассивФоновыхЗаданий.Количество()>МаксимумЗаданий цикл
МассивФоновыхЗаданий=ПочиститьМассивОтЗавершенныхЗаданий(МассивФоновыхЗаданий);
конеццикла;
....
конеццикла;
конецфункции
В ниже приведённом каркасе кода, фоново выполняется функция ВыполнитьЗагрузку(), которая читает большой файл Excel, затем каждый цикл вставки записи в БД запускает в свою очередь фоново, ограничивая в данном случае количество фоновых заданий 10 штуками.
Иногда удаётся найти подводные камни там, где совсем не ждешь от 1С. Оказывается в запросах 1С, сложение столбцов а+б даёт в сумме null, если одно из значений равно null. даже если чётко укажешь преобразовать значение в строку, например так:
ВЫБОР
КОГДА 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
КОНЕЦ
ИЗ
...
Вот не писал бы, если бы не припекло. Бесконечно звонят, предлагают всякие услуги купить. Причем звонят не роботы, а люди. Каждый раз прошу и вежливо и руганью удалить меня из своих БД и больше не звонить НИКОГДА. Не понимают..
Да, зарегистрирован на сайте. Но не сам, а принудительно в школе. И нигде своего согласия не давал на спам звонки. И возможности отозвать у них «согласие» на сайте нет. И учётку удалить тоже нет возможности.