Выгрузка данных в таблицу MS SQL SERVER

02.07.19

Интеграция - Внешние источники данных

Процедура по выгрузке данных из 1C (таблица значений) в таблицу MS SQL SERVER через COM.

Процедура предназначена для выгрузки данных из таблицы значений в таблицу на MS SQL SERVER. Имена колонок таблицы 1с и таблицы на SQL сервера должны совпадать.

Процедура НазваниеПроцедуры....(ТаблицаДанных)
    

Сервер =  ..... Наименование сервера ms sql;
НазваниеБазы = Имя базы данных;
НазваниеСхемы = ....
НазваниеТаблицы = ....
Пользователь = .....
Пароль = .....
 Попытка


Подключение к ms sql server

    SQL_Соединение = Новый COMОбъект("ADODB.Connection");
                    
    SQL_Соединение.Open("Provider=sqloledb; Server=" + Сервер + " ;Database=" + НазваниеБазы + "; User Id=" + Пользователь + ";Password=" + Пароль + ";");
    ПодключениеSQL = Истина;
        
 Исключение
        
    Сообщить("Соединение Не Установлено");
    ПодключениеSQL = Ложь;
    Возврат;
 КонецПопытки;
    
 Если ПодключениеSQL Тогда
        
    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = SQL_Соединение;

 

Очистка таблицы для загрузки данных, можно не выполнять, если надо догрузить данные в таблицу
        

 

    Command.CommandText = "DELETE FROM [" + НазваниеБазы + "].[" + НазваниеСхемы + "].[" + НазваниеТаблицы + "]";
    Command.Execute();


Выборка данных о типах колонок в таблице на ms sql server
        

       Command.CommandText = "SELECT TABLE_CATALOG
                                |,TABLE_SCHEMA
                                |,TABLE_NAME
                                |,COLUMN_NAME
                                |,IS_NULLABLE
                                |,DATA_TYPE
                                |,CHARACTER_MAXIMUM_LENGTH
                                |,NUMERIC_PRECISION
                                |FROM INFORMATION_SCHEMA.COLUMNS
                                |Where INFORMATION_SCHEMA.COLUMNS.table_catalog = '" + НазваниеБазы + "'
                                |AND INFORMATION_SCHEMA.COLUMNS.table_schema = '" + НазваниеСхемы + "'
                                |AND INFORMATION_SCHEMA.COLUMNS.table_name = '" + НазваниеТаблицы + "'
                                |ORDER BY TABLE_SCHEMA, TABLE_NAME";
        
        
        Выборка=Неопределено;
        Попытка
            Выборка = Command.Execute();
        Исключение

            Сообщить("Не сделана выборка колонок из таблицы " + НазваниеТаблицы + " на MS SQL сервере");
            
            Если SQL_Соединение <> Неопределено Тогда
                SQL_Соединение.Close();
            КонецЕсли;

            Выборка                     = Неопределено;
            SQL_Соединение                 = Неопределено;
                        
            Возврат;
 
        КонецПопытки;
        
                
        ИменаКолонокМассив = Новый Массив;
        СтруктураИменКолонокИДлин = Новый Структура;
        
        
        ТекстЗапросаSQL= "INSERT INTO [" + НазваниеБазы + "].[" + НазваниеСхемы + "].[" + НазваниеТаблицы + "]
                    | (";
        
        ПерваяКолонка = Истина;
    
        Пока Выборка.EOF() = 0 Цикл
            
            //Добавляем
            ИмяКолонки      = Выборка.Fields("COLUMN_NAME").Value;
            
        
            ИменаКолонокМассив.Добавить(ИмяКолонки);
            
            Если ПерваяКолонка Тогда
                ТекстЗапросаSQL = ТекстЗапросаSQL + "[" + ИмяКолонки + "]";
            Иначе
                ТекстЗапросаSQL = ТекстЗапросаSQL + "," + "[" + ИмяКолонки + "]";
            КонецЕсли;
            ПерваяКолонка = Ложь;
            Выборка.MoveNext();
        КонецЦикла;
        
        ТекстЗапросаSQL = ТекстЗапросаSQL + ")
                    |  VALUES (";
        
        ТекстЗапросаДоVALUES = ТекстЗапросаSQL;
        
        КолВсего = ТаблицаДляЗагрузки.Количество();
        КолТекущая = 0;
        
        //Выгрузка данных из таблицы значений
        Для Каждого СтрТаб Из ТаблицаДанных Цикл
            ПерваяКолонка = Истина;
            ТекстЗапросаSQL = ТекстЗапросаДоVALUES;
            
            
            Для Каждого КолИмя Из  ИменаКолонокМассив Цикл
                
                Если ПерваяКолонка Тогда
 
                    ТекстЗапросаSQL = ТекстЗапросаSQL + СтрТаб[КолИмя];
                        
                Иначе
 
                    ТекстЗапросаSQL = ТекстЗапросаSQL + "," + СтрТаб[КолИмя];
                КонецЕсли;
                
                ПерваяКолонка = Ложь;
            КонецЦикла;
            
            ТекстЗапросаSQL = ТекстЗапросаSQL +")";
            Command.CommandText = ТекстЗапросаSQL;
            Command.Execute();            
            
            КолТекущая = КолТекущая + 1;
        КонецЦикла;
        
        
        
        Если SQL_Соединение <> Неопределено Тогда
            SQL_Соединение.Close();
        КонецЕсли;
        
        Выборка                     = Неопределено;
        SQL_Соединение                 = Неопределено;

    Сообщить("Всего:" + КолВсего + "; Загружено:" + КолТекущая);    
        
    КонецЕсли; 

Конец процедуры    

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22620    19    1    

22

Экстрактор данных 1С в BI - выгрузка данных из 1С в BI-аналитику

Внешние источники данных Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

15.11.2022    13653    12    SQV0    47    

29

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9307    9    8    

11

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48842    97    163    

86

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30083    20    31    

21

Загрузка в БГУ из УРМ "Криста"

Внешние источники данных Банковские операции Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия государственного учреждения Россия Бухгалтерский учет Платные (руб)

Обработки для загрузки данных из УРМ "Криста" в бухгалтерию государственного учреждения редакция 2.0. Есть Демо доступ на вкладке Бесплатные файлы на 1 месяц со дня получения демонстрационного ключа регистрации. Поддерживает ПО "Web-исполнение" от НПО "Криста".

4800 руб.

19.06.2013    38506    136    90    

30
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bintape 02.07.19 12:50 Сейчас в теме
1) лучше подготовить один большой запрос и отдать серверу СУБД на исполнение, чем дергать каждый раз

2) как вариант подготовить шаблон типа @q=' INSERT INTO #bd# ....VALUES ##' , а в 1С подставлять значения через СтрЗаменить() - намного улучшится читабельность кода для последующей отладки
3. A_Max 19 03.07.19 10:55 Сейчас в теме
(1) А ещё лучше использовать для этого СтрСоединить и СтрШаблон.

Шаблон = " INSERT INTO bd.tbl (value) VALUES (%1)";
Результат = Новый Массив;
Для Каждого СтрокаТЧ Из ТЧ Цикл
   Результат.Добавить( СтрШаблон(Шаблон, СтрокаТЧ.Значение));
КонецЦикла;

Результат = СтрСоединить(Результат, Символы.ПС);
4. EvgenSav 21 03.07.19 17:50 Сейчас в теме
(3)Спасибо за дополнение, только есть один нюанс, что функция СтрШаблон появилась только в версии платформы с 8.3. а данный функционал работает и на платформе 8.2.
(1)Спасибо, все верно лучше один запрос выполнить на сервере СУБД. В данном варианте, проще найти ошибку с данными, будет понятно на какой строке таблицы значений вылезла ошибка.
2. gosizo 38 02.07.19 15:56 Сейчас в теме
Спасибо, познавательно
5. user813409 04.07.19 12:34 Сейчас в теме
Если требуется полностью переписать таблицу существенно быстрее проходит операция очистки таблицы:
	Command.CommandText = "TRUNCATE TABLE [" + НазваниеБазы + "].[" + НазваниеСхемы + "].[" + НазваниеТаблицы + "]";
6. EvgenSav 21 04.07.19 16:01 Сейчас в теме
7. s0nya 28.10.19 22:46 Сейчас в теме
Сейчас думаю как в SQL через 1с загрузить файл на 1000000 строк. Почему через 1С? Это будут делать пользователи и учить их SSIS или чему другому желания нет. Операция обновления данных с перезаливкой раз в месяц. Данные нужны самой 1С.

Не думали что можно данные выгрузить в файл и дать команду SQL импорта данных с файла? Должно быть намного быстрее.
8. nomad_irk 72 29.10.19 06:12 Сейчас в теме
(7)Использовать ADO и параметризованый запрос, не?
13. s0nya 29.10.19 11:35 Сейчас в теме
(8)
ADO и параметризованый запрос

Есть файл с 3-мя колонками (Артикул, наименование, вес) в формате csv. 1М строк. Понятно, что загружать в 1С этот файл, что то делать с данными и потом вставлять в параметр SQL желания нет. Или Вы не это имели в виду?
14. nomad_irk 72 29.10.19 11:40 Сейчас в теме
(13)И вы решили запихать в MS SQL напрямую запрос, состоящий из 1М строк вида INS ERT IN TO <TableName>, так?
В 1С достаточно выполнить "трансляцию" значений колонок из файла в значения параметров запроса, тем более вы все равно будете генерировать текст запроса SQL средствами 1С, если я правильно понял.
15. s0nya 29.10.19 12:52 Сейчас в теме
(14)

Нравится этот вариант. Файл на 250 000 залетает менее чем за секунду. Можете набросать вариант с параметрами. Явной трансляции для универсальности мне не хватает.

BULK
INSERT PDTest
FROM 'c:\temp\UA_test.txt'
WITH
(
CODEPAGE = '65001',
firstrow = 2,
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
GO
16. nomad_irk 72 29.10.19 13:35 Сейчас в теме
(15)Если такой вариант работает, то и 1М строк залетит за малое время. Для чего в таком случае привлекать 1С - вообще не понятно.
В публикации используется конкатенация строк вида INS ERT IN TO <TableName> по количествую вставляемых в таблицу строк - в этом случае я предлагаю использовать параметризованный ADO запрос.
17. s0nya 29.10.19 15:35 Сейчас в теме
(16)
1С нужна как "Окно" / UI загрузки данных для людей привыкших к 1С. Данные и загружаются для использования в 1С, просто обновлять в системе миллионы строк не вижу оптимальным, там еще поиск нужно организовывать. В SQL это в десятки раз быстрее отрабатывает.
Надеялся, что есть готовые наработки по этому направлению.
18. GennadiyN 16.06.20 11:31 Сейчас в теме
(17) Добрый день! Подскажите пожалуйста, как решили вопрос? столкнулся с таким же вопросом(
9. nomad_irk 72 29.10.19 06:14 Сейчас в теме
(0) Вы про параметры запроса при использовании ADO что-нибудь слышали?
10. EvgenSav 21 29.10.19 08:37 Сейчас в теме
(9) да, слышал. я же не утверждаю что это единственный метод.
11. nomad_irk 72 29.10.19 08:58 Сейчас в теме
(10) Так в случае передачи больших объемов данных формировать текст запроса, используя конкатенацию строк как минимум - глупо.
12. EvgenSav 21 29.10.19 09:22 Сейчас в теме
(11) для больших объемов возможно да, про это уже писали в комментариях выше
19. petrobol25 26.04.23 09:05 Сейчас в теме
(12) Статья очень помогла решить задачу выгрузки данных регистра с 1С в SQL для последующего соединения с power bi. Только отрабатывает долговато, а другие методы не могу пока раскурить. Есть еще статьи по данному вопросу?
Оставьте свое сообщение