Имя: Пароль:
1C
1С v8
Выгрузка данных в MS SQL
,
0 Amfiaray
 
09.06.20
09:26
Добрый день!

Есть необходимость выгружать данные из 1С в стороннюю базу MS SQL.
Объем данных большой и постоянно растет, на данный момент около 4кк строк. Пробовал несколько вариантов:

1. Построчно INSERT - работает очень медленно.
2. Сформировать файл csv с последующей загрузкой с помощью BULK INSERT - Ещё медленнее на больших объемах, такое ощущение что при формировании текстового документа чем больше строк, тем дольше добавление новой строки.
3. Загрузка с помощью csv и BULK INSERT порциями по 200к записей - Пока это самый быстрый вариант(2.5-3 часа).

Может есть какой то более быстрый способ загрузки данных в MS SQL?
1 ДенисЧ
 
09.06.20
09:37
"при формировании текстового документа чем больше строк, тем дольше добавление"
Как создаёшь документ?
2 ДенисЧ
 
09.06.20
09:40
А вообще - напрямую из скуль-базы 1с в скуль-базу стороннюю через линкед-сервер
3 МихаилМ
 
09.06.20
09:44
причем тут 1с
при булк инсерт должно быть минимум 100к записей в секунду (зависит от индексов) те загрузка должна длиться в районе минуты
можно использовать многопоточную запись с помощью ssis.
почитайте про загрузку данный  номеров недействительный паспортов из файла list_of_expired_passports.csv.bz2
4 Кирпич
 
09.06.20
09:45
загружать вот самый быстрый способ
https://docs.microsoft.com/ru-ru/sql/tools/bcp-utility?view=sql-server-ver15

а быстро выгружать из 1с это отдельная песня
5 Кирпич
 
09.06.20
09:52
Быстро выгружать из 1с. Я бы запрос сбрасывал на диск функцией ЗначениеВФайл(), а потом этот текст парсил на быстром языке и выдавал файл для загрузки для bcb или BULK INSERT.
6 Amfiaray
 
09.06.20
10:00
(1) Документ создаю вот так:
        ФайлCSV = Новый ТекстовыйДокумент;
    ФайлCSV.ДобавитьСтроку(ТекстШапки);
    
    Для Каждого СтрокаТ Из ТаблицаДанных Цикл
        
        ТекстСтроки = "";
        Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
            Если ТекстСтроки = "" Тогда
                ТекстСтроки = СокрЛП(СтрокаТ[Колонка.Имя]);
            Иначе
                ТекстСтроки = ТекстСтроки+Разделитель+СокрЛП(СтрокаТ[Колонка.Имя]);
            КонецЕсли;
        КонецЦикла;
        ФайлCSV.ДобавитьСтроку(ТекстСтроки);    
        
    КонецЦикла;    
    
    ФайлCSV.Записать(ИмяФайла, КодировкаТекста.UTF16);
7 Amfiaray
 
09.06.20
10:01
(2) Там ТЗ получается в мудреном и большом запросе а не просто из таблицы в таблицу
8 Amfiaray
 
09.06.20
10:02
(3) Долго файл csv формируется
9 ДенисЧ
 
09.06.20
10:02
(6) Используй ЗаписьТекста, она быстрее
10 Amfiaray
 
09.06.20
10:03
(9) Ок, сейчас попробую, по результату отпишусь
11 arsik
 
гуру
09.06.20
10:06
(10) Еще и перебор колонок лучше из цикла убрать. Например перед циклом в массив загоните названия колонок. Внутри цикла уже этот массив используйте.
12 arsik
 
гуру
09.06.20
10:07
+ (11) И зачем вам там имя, можно по индексу обращаться.
13 Amfiaray
 
09.06.20
10:11
(10) Всё это быстро отрабатывает. С каждой новой строкой вот этот код работает всё дольше: ФайлCSV.ДобавитьСтроку(ТекстСтроки);
14 ДенисЧ
 
09.06.20
10:13
(13) Это в записи текста?
15 Кирпич
 
09.06.20
10:13
(13) ну дак ты все в память пихаешь, да еще и каждый раз память перевыделяется при добавлении. пиши сразу в файл и не парься
используй ЗаписьДанных.ЗаписатьСимволы, например.
16 Amfiaray
 
09.06.20
10:14
(14) нет, в текстовом документе
17 ДенисЧ
 
09.06.20
10:14
(16) не удивительно
18 arsik
 
гуру
09.06.20
10:14
(14) Не. В записи всегда линейно. Это в текстовомДокументе так работает.
19 ДенисЧ
 
09.06.20
10:26
(18) На это я и намекаю. Ещё с (9)
20 Кирпич
 
09.06.20
10:39
Так вот попробуй

ФайлCSV = Новый ЗаписьДанных(ИмяФайла, КодировкаТекста.UTF16);
ФайлCSV.ЗаписатьСтроку(ТекстШапки);
Для Каждого СтрокаТ Из ТаблицаДанных Цикл
    ТекстСтроки = "";
    Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
        Если ТекстСтроки = "" Тогда
            ТекстСтроки = СокрЛП(СтрокаТ[Колонка.Имя]);
            ФайлCSV.ЗаписатьСимволы(ТекстСтроки);
        Иначе
            ФайлCSV.ЗаписатьСимволы(Разделитель);
            ФайлCSV.ЗаписатьСимволы(СокрЛП(СтрокаТ[Колонка.Имя]));
        КонецЕсли;
    КонецЦикла;
    ФайлCSV.ЗаписатьСтроку("");    
КонецЦикла;
21 rsv
 
09.06.20
11:23
(0) есть мастер импорта и експорта в скуле родной (правой кнопокой на табличке скуля контекстное меню)
. Если одинэска на скуле - выгрузите через него данные в  текст или еще куда там в мастере
Много форматов . На стронней базе сделайте импорт
22 МихаилМ
 
09.06.20
11:24
я бы посмотрел в сторону https://its.1c.ru/db/metod8dev#content:2584:hdoc
23 rsv
 
09.06.20
11:28
Когда через промежуточные файлы надоест гонять - создайте на строннем скуле
линк на 1с скуль и .... select * into табличка from линк. База.dbo. Табличка
24 Кирпич
 
09.06.20
11:30
(23) он какой то хитроумный запрос выгружает, а не просто справочник
25 rsv
 
09.06.20
11:31
(24) придется переписать под скуль... или  как и ранее промежуточный файл
26 Кирпич
 
09.06.20
11:34
(25) да кто там будет писать то
27 МихаилМ
 
09.06.20
11:41
(23)
человек за 10 лет не узнал про https://speshuric.livejournal.com/163665.html
28 rsv
 
09.06.20
11:42
Как вариант минимизации это сделать табличку простенького
Регистра сведений в 1ске с выходными полями запроса  строка число дата

Регистр.загрузить(запрос. Выполнить.выгрузить) - по скорости это к движку 1с
Будет таблица - ее уже можно выгружать и гнать напрямки селектом простым
29 rsv
 
09.06.20
11:50
(27) по ссылке наверное автор любит все выгружать либо в текст или xml и
Обратно загружать ...
30 Ёпрст
 
09.06.20
11:52
(27) да..через ЗаписьXML реально быстро
31 МихаилМ
 
09.06.20
11:55
(30)
в 16 релизе переписали работу с памятью. так что возможно что-то изменилось.
32 Ёпрст
 
09.06.20
11:57
(31) на 15 пока..лень смотреть новые релизы
33 Ёпрст
 
09.06.20
11:59
(0) а че за данные то хоть ?
Мот того, не выгружать ничего в текст, а все сразу в сторонний скуль, напрямую, как ужо неоднократно советовали
34 Конструктор1С
 
09.06.20
12:25
4kk строк это ниочем. Что-то вы делаете не так
35 Кирпич
 
09.06.20
12:46
(34) И правда. Попробовал (6)
200000 строк типа "Колонка1;Колонка2;Колонка3;Колонка4;Колонка5;Колонка6;Колонка7;Колонка8;Колонка9;Колонка10" за 40 сек выгружает
чота автор понапрограммировал неправильно
36 Amfiaray
 
09.06.20
20:23
(33) Данные для bi системы, там движения по регистру бухгалтерии по доходам, расходам и производству за 1.5 года по 300+ организациям в разрезе аналитики(+ анализ аналитики и замена при необходимости).
37 Престарелый Заяц
 
09.06.20
20:50
(23) И что быстро работает?
38 Amfiaray
 
09.06.20
21:22
(37) В итоге переделал на ЗаписьТекста и стало работать быстрее, 1,5 года выгружаются меньше чем за час.
39 Ёпрст
 
09.06.20
22:40
(38) записьXML еще быстрее будет
40 Ёпрст
 
09.06.20
22:40
+39 см (27)