Попал на проект 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Строка(СТО));
ЗаписьТекста.Записать(Символы.ПС);
КонецЦикла;
ЗаписьТекста.Закрыть();
Первая статья. Закидывайте помидорами. Задавайте вопросы в комментариях и расскажите, что где-то работает лучше.