Каталог решений - Как мы тащили выгрузки в SQL из болота

Как мы тащили выгрузки в SQL из болота

Как мы тащили выгрузки в SQL из болота

В наличии

Ускорение, оптимизация и автоматизация выгрузок в SQL.

Категория:

Описание

Попал на проект DWH. 

Входные данные: 

  • Разработчик SQL DWH ETL (Мастер на все руки)
  • Разработчик 1С (Я)
  • Аналитик (Смысловой нагрузки не несёт)
  • Много баз
  • Объемы в несколько тысяч строк в день

Цель: Обеспечить стабильную выгрузку данных из 1С в SQL. Желательно максимально быстро и часто.

Как работало:

  • Так как баз много, происходило подключение ко всем базам по очереди через WebСервис для подключения SQL к 1с который передает строковый параметр. Так как это DWH и идея была в том, что расписание было настроено на стороне Менеджмент студио через ssis пакеты (Это делал аналитик).
  • WebСервис вызывал внешнюю обработку, из которой в зависимости от параметра вызывал процедуры выгрузки. (Внешняя обработка нужна для оперативного изменения выгрузок)
  • Внешняя обработка собирала данные и делала стандартные "Инсерты" и "Апдейты", которые давал разработчик SQL.

Проблемы:

  • Блокировки в SQL. 
  • Время обновления (от 0.5 до 2.5 часов)
  • Постоянные подключения к базе SQL 

Решение:

Если вкратце, то 1с очень не очень работает с SQl напрямую.

Что сделали, чтобы взлетело:

  • SISS пакеты стали подключаться параллельно ко всем базам.
  • 1с больше не стучится в SQL. Теперь 1с собирает CSV файл с результатом запроса и складывает файл в конкретную папку. (Пример кода будет в конце).
  • Ожидаемый вопрос. Как же SQL забирает данные, если ей никто об этом не говорит? На самом деле говорит. Web сервис в конце возвращает параметр обратно Менеджемент студии.
  • Она в свою очередь понимает, что выгрузка окончена, и начинает вызывать хранимые процедуры SQL, которые в свою очередь из конкретной папки забирается конкретные файлы для конкретной таблицы. 

Важный момент. Можно задуматься о том, а как же потери данных? А всё просто. 1с при выгрузке не создает новый файл с данными, а дописывает в старый, если он есть. Удалением занимается SQL, если у него успешно удалось загрузить данные.

Итог:

  • Время уменьшилось до максимального 0.5 часа при экстраординарных объёмах данных.
  • Блокировки пропали.
  • Частота обновлений увеличилась в 3 раза.
    Запрос = Новый Запрос;
	Запрос.Текст = "";
	//Запрос
	
	РезультатЗапроса = Запрос.Выполнить();
	
    //Ими базы или любой другой идентификатор для разделение баз.
	ИмяБазы = XMLСтрока(Константы.Станция.Получить());
	
	Выборка= РезультатЗапроса.Выбрать();
	
	ФайлВыгрузки = ""; // Путь к конкертной папке + Имя базы чтобы создавался новый файл для каждой базы			
	ЗаписьТекста = Новый ЗаписьТекста(ФайлВыгрузки, КодировкаТекста.UTF16,, Истина); //Последняя истина обеспечивает дописывание
	Пока Выборка.Следующий() Цикл
		
		ЗаписьТекста.Записать(XMLСтрока(Выборка.Ссылка); // 
		ЗаписьТекста.Записать(";");
		ЗаписьТекста.Записать(XMLСтрока(СтрЗаменить(СокрЛП(Выборка.Артикул),";",""))); 
		ЗаписьТекста.Записать(";");
		ЗаписьТекста.Записать(XMLСтрока(СтрЗаменить(СокрЛП(Выборка.КоличествоПовторений),";",""))); 
		ЗаписьТекста.Записать(";");
		ЗаписьТекста.Записать(Строка(Выборка.СкладКомпании)); 
		ЗаписьТекста.Записать(";");
		ЗаписьТекста.Записать(XMLСтрока(Выборка.КоличествоОстаток)); 
		ЗаписьТекста.Записать(";");
		ЗаписьТекста.Записать(XMLСтрока(Выборка.Себестоимость)); 
		ЗаписьТекста.Записать(";");
		ЗаписьТекста.Записать(Строка(Выборка.ВерхнийСклад)); 
		ЗаписьТекста.Записать(";");
		ЗаписьТекста.Записать(XMLСтрока(СТО)); 
		
		ЗаписьТекста.Записать(Символы.ПС);
		
	КонецЦикла;
	ЗаписьТекста.Закрыть();  

Первая статья. Закидывайте помидорами. Задавайте вопросы в комментариях и расскажите, что где-то работает лучше.

has been added to your cart:
Оформление заказа