По сути, мы имеем 3 этапа, которые я опишу, а так же какой выигрыш по времени мы получили:
Выгрузка данных из УТ (было ~ 45 часов, стало 8 -10)
Загрузка в бухгалтерию (на удивление быстро проходит, но стала идти параллельно с выгрузкой из УТ)
Проведение загруженных документов в бухгалтерии (было 40 часов, стало 10)
Сразу хочу уточнить, что для взаимодействия между базами мы автоматом создавали в папке на сервере файлики (маяки). Это выглядит довольно грубо, но на деле оказалось довольно удобно. Можно посмотреть на каком этапе процесс выгрузки/загрузки, не заходя в базы. Плюс у нас ночью перезагружаются серваки, и если выгрузка/загрузка не успела пройти за вечер по этим маякам видно, на чем дело остановилось.
Так же мы создали 2 константы: начало периода выгрузки и окончание периода выгрузки. Если нам нужно выгрузить март, то устанавливаем 01.03.2014 и 31.03.2014 в соответствующих константах. Выгрузка месяца каждый раз согласовывается с бухгалтерией и день для нее назначается вручную.
Выгрузка
Выгрузка данных из УТ осуществляется с помощью обработки «Универсальный обмен данными в формате XML», которая запускается регламентными заданиями по расписанию. Выгрузка идет в 8 потоков, т.е. параллельно запущены 8 регламентных заданий. Стартуют они с интервалом 1 минута. Выгрузка идет по 1 дню.
Принцип работы регламентного задания выгрузки.
При запуске задания создается файлик в папке «Начата выгрузка в УТ» имя которого, это дата для выгрузки. Это нужно для того, что бы следующее регламентное задание знало, какой день надо выгружать.
Т.е. например нам надо выгрузить март. Ищем в папке «Начата выгрузка в УТ» файлы и, анализируя каких не хватает, определяем день для выгрузки. Что удобно, если был пропущен день, то он начнет выгружаться.
Функция ПолучитьДеньВыгрузки()
НайденныеФайлы = НайтиФайлы(Путь,"*.txt");
НачалоПериодаВыгрузки = Дата(Формат(Константы.НачалоПериодаВыгрузки.Получить()));
КонецПериодаВыгрузки = Дата(Формат(Константы.КонецПериодаВыгрузки.Получить()));
Если НачалоПериодаВыгрузки = '00010101' или КонецПериодаВыгрузки = '00010101' Тогда
Сообщить("Константа НачалоПериодаВыгрузки или КонецПериодаВыгрузки не заданы");
Возврат Неопределено
КонецЕсли;
ДеньВыгрузки = НачалоПериодаВыгрузки;
Пока ДеньВыгрузки 0 Тогда
ДеньВыгрузки = ДеньВыгрузки + 24*60*60;
Продолжить
Иначе
Возврат ДеньВыгрузки
КонецЕсли;
КонецЦикла;
Возврат неопределено
КонецФункции
Перед началом выгрузки в папке «Начата выгрузка в УТ» создается файл, имя которого это дата выгружаемого дня. Теперь остальным регламентным заданиям видно, что этот день выгружается или уже выгружен и его не надо трогать.
В папке «Файлы выгрузки» создаются сами файлы с данными. У них тоже имена – это даты. Видно, какой день выгружен. Что интересно, обработка «Универсальный обмен данными в формате XML» увеличивает файлы выгрузки каждые 2-3 секунды, т.е. видно как идет выгрузка. Это тоже бывает полезно.
После окончания выгрузки в папке «Закончена выгрузка из УТ» создается txt файл с именем – датой. Таким образом, появляется возможность определить, какие файлы можно загружать в бухгалтерию.
Так устроена выгрузка в несколько потоков. Работает нормально, задания особо друг другу не мешают. Пробовали выгружать в 4, 8 и 12 потоков. По опыту 30 файлов (месяц) лучше всего выгружать в 8 потоков.
Загрузка
Загрузка в бухгалтерию так же осуществляется регламентным заданием, но только в 1 поток, т.к. по логике считывание данных может происходить одновременно несколькими заданиями, а вот запись нормально без блокировок идет только в 1 поток.
Принцип тут следующий:
В 6 вечера стартует регламентное задание в бухгалтерии с интервалом 10 секунд. В папке «Закончена выгрузка из УТ» ищем файлы и определяем, какой день можно загружать и сразу удаляем это файл. Определив день, ищем соответствующий файл с данными по наименованию и загружаем его. По окончанию создаем файл с именем датой в папке «Загружены в Бух». И теперь видно, какие дни полностью загружены в бухгалтерию.
Выгрузка из УТ и загрузка в бухгалтерию начинается одновременно, поэтому, как только день заканчивает выгружаться, он сразу начинает загружаться в бухгалтерию.
Проведение документов в бухгалтерии
Так как документов много, то решили на время проведения засунуть базу в оперативную память (ram dick). Использовали программу RAMDisk, описывать ее установку я не буду, т.к. занимался этим не я и в интернетах можно найти инструкции.
Документы должны проводиться в строгой последовательности по датам без учета их типа, для этого был нарисован нехитрый запрос.
В результате после загрузки непроведенных документов за месяц, бухгалтерия архивировалась в .dt и разворачивалась в файловой версии в оперативке. После проведения, она снова отправлялась в .dt и разворачивалась на своем законом месте и Вуаля! Мы получаем счастливого бухгалтера. Во всяком случае, я в это верю.