Ускорение обмена УТ — БП

Добрый день.
В конторе, в которой я сейчас работаю, возникла необходимость раз в месяц выгружать продажи из Ут в Бухгалтерию.  Дело обычное, но проблема заключалась в том, что объем данных оказался приличным (около 500 реализаций в день) и выгрузка/загрузка обычным способом была очень долгой, так что мы решили прибегнуть к некоторым ухищрения, о которых я хочу рассказать в этой публикации, может кому-то они помогут.

По сути, мы имеем 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 и разворачивалась на своем законом месте и Вуаля! Мы получаем счастливого бухгалтера. Во всяком случае, я в это верю. 

36 Comments

  1. davdykin

    Спасибо за интересный пример. А вы не пробовали не переносить всю базу на RAMDisk а только временные файлы винды и/или скуля? Потому как выгрузка/загрузка dt, как мне кажется, через некоторое время возможно будет съедать всю экономию на проведении.

    Reply ↓
  2. Lenten

    (1) не думали в этом направлении. Мне кажется, что это лишь частично увеличит производительность, т.к. чтение данных все еще будет с жесткого диска. Но если база разрастается, то ,возможно, это будет решением.

    Reply ↓
  3. asved.ru

    Если речь только о продажах — целесообразно писать свой обмен, основанный, к примеру, на XDTO. Ибо КД вещь универсальная и малотрудозатратная, но очень медленная.

    Reply ↓
  4. aspirator23

    Некоторые приемы для УТ-БП кажутся странными: использование универсального обмена, файлы-маяки. Может не все стандартные способы использовали?

    Reply ↓
  5. DoctorRoza

    Надо бы тут провести тестовые замеры производительности между КД и XDTO, что является отличной темой для будущей статьи! 🙂 Ну а если разобраться, то когда на серверах стоят слабенькие процессоры, то какую технологию обмена не используй, всегда будет медленно! 32-разрядная система и этим все сказано!

    Reply ↓
  6. belochkaNN

    Тоже предстоит настраивать выгрузку-загрузку. Спасибо. Будем иметь ввиду.

    Reply ↓
  7. DoctorRoza

    Поразмыслил тут, в принципе, использовать КД или XDTO особого выигрыша в работе не даст. Основная нагрузка ведь идет во время выгрузки и загрузки с дальнейшим проведением. А тут уже все зависит от платформы!

    Reply ↓
  8. Lenten

    (3) Выгружаются все документы, участвующие в товародвижении и оплатах. Про реализации написал что бы указать примерный объем данных.

    Reply ↓
  9. Lenten

    (4) Использовали обработку универсального обмена, т.к. у нас совсем переписанная ут 10.1 )

    Reply ↓
  10. borda4ev

    Я бы на вашем месте использовал бы веб сервисы, вот http://infostart.ru/public/203109/ есть прекрасная статья, скорость очень высокая.

    Reply ↓
  11. Puk2

    Lenten, регистрацию изменений используете? Количество объектов в транзакции ограничиваете?

    Ещё как вариант можно попробовать справочники выгружать первым этапом, а потом документы, в которых будут выгружаться только ссылки, а не все подчиненные объекты. Это позволит за один запрос получать все необходимые данные для выгрузки без лишних запросов данных к базе. Для интереса посмотрите сколько раз встречается в файле XML идентификатор (или код) какой-нибудь часто используемой номенклатуры.

    Reply ↓
  12. Lenten

    (10) Спасибо, надо будет ознакомиться.

    (11) Если надо будет еще подсократить время, проверим и это

    Reply ↓
  13. Aleksey_3

    (11) Боюсь что регистрация изменения может дать обратный эффект, ибо дурацкая таблица изменений на которую нельзя наложить блокировку, и которая мешает параллельной работе, может сыграть злую шутку.

    Поясню что я имею ввиду. Каждый раз, когда пользователь меняет (записывает) документ программа регистрирует изменения, т.е. пишет в некую таблицу ссылку на записанный объект. И если для документа мы можем настроить управляемые блокировки (т.е. заставить одновременно и параллельно проводить реализации по разным складам), то с таблицей изменений такой фокус не пройдет. Она общая, что приводит нас к двум вещам

    1. запись объектов в УТ будет происходить медленнее (так как нужно дополнительно еще писать в таблицу изменении)

    2. запись объектов в УТ нельзя распараллелить, ибо пока пишутся изменении, другие объекты в эту таблицу не смогут писать

    Второй очень важный момент. Это выгрузка изменений.

    Каждый раз при выгрузки программа записывает в таблицу изменений признак того что данный объект был выгружен, добавим сюда тот факт, что на таблицу нельзя повесить управляемую блокировку получаем очень забавную вещь

    Регламентное задание 1 начало выгрузку за определенную дату. При выгрузки программа «помечает» в таблицу, что объект выгружен, блокирую таблицу от изменений

    Параллельно регламентное задание 2 тоже начало выгрузку, но (!) таблица изменений заблокирована 1 регламентным заданием, и поэтому периодически одно из заданий будет нарываться на ошибку транзакции. Т.е. в этом случае мы не сможем распараллелить выгрузку

    Резюме. Положа хвост на сердце. а так ли нам нужна эта таблица изменений? Ну зафиксируем что кто-то записал документ от 2012 года и что? Мы же всё равно его выгружать не будем, нам главное выгрузить все документы за указанный период, и даже если есть изменения за другие периоды нам это не интересно, к тому же есть опасность, что кто-то случайно внесет изменения в бухгалтерию в выгруженные документы и в случае использования регистрации мы получим расхождения (так как в УТ этот документ не помечен как измененный, а значит ни будет не выгружен из УТ, ни обновлен в БП), что в случае выгрузки за период не важно, так как гарантированно что все документы за период в БП будут совпадать с данными в УТ

    Reply ↓
  14. Aleksey_3

    А по поводу отслеживания изменений… У себя я при выгрузке сделал возможность выгружать обороты и при загрузки в БП программа сравнивает данные из БП и данные из УТ и выдает таблицу расхождений. Т.е. если у бухгалтера есть подозрения, или он хочет проверить что данные актуальны ему достаточно выгрузить данные за период (контрагент, номер документа, дата, сумма — этих данных вполне достаточно чтобы оценить есть ли расхождения. Понятно что от замена номенклатуры в ТЧ она не спасет, но от изменения цены или строк, т.е. изменения суммы документа вполне может выявить). Таким образом бухгалтер может быть уверен в актуальности данных

    Reply ↓
  15. Lenten

    (13) У нас этот вопрос решился управленчиским методом. Старые месяца наглухо закрывают и все изменения только после согласования с главбухом

    Reply ↓
  16. RocKeR_13

    Ммм, а для чего «изобрели» фоновый обмен? Более того на эту тему есть хорошая статейка Автоматический, фоновый обмен в файловом режиме ИБ без участия юзеров

    Reply ↓
  17. Lenten

    (16) Не очень понял ваш комментарий. Мы настраивали выгрузку таким образом, что бы выгружать в несколько потоков для ускорения. А в статье написано как сделать обмен в 1 поток.

    Reply ↓
  18. RocKeR_13

    (17) фоновый обмен как раз и создан для тех случаев, когда зарегистрировано большое количество объектов: задается количество объектов в транзакции и при каждом обмене выгружается лишь указанная часть. А в статье написано, как все это дело еще и автоматизировать

    Reply ↓
  19. Lenten

    (18) он быстрее чем в описанном мною? за счет чего?

    Reply ↓
  20. RocKeR_13

    (19) так откуда же мне знать, будет ли это быстрее, я физически не могу смоделировать ваши условия (ведения баз, конфигурацию «железа», работу ОС и т.д.). Но постоянно выгружая объекты в фоновом режиме (например, раз 5 в день по 100 документов), вы получаете оперативную информацию в бухне. И не факт, что общее время выгрузки в фоновом режиме будет больше, чем общее время работы ваших 8 регламентных заданий, к тому же параллельных. Помещение базы в оперативку — да, несомненно даст прирост скорости

    Reply ↓
  21. Lenten

    (20) Согласен. Когда мы приступали к этому обмену, я предлагал каждый вечер выгружать документы за день, а также измененные документы предыдущих дней вечером. Был бы вполне сносный объем данных, и не пришлось бы заморачиваться. Но в компании работа устроена так, что надо было выгружать месяц (манагеры активно работают с документами за текущий месяц, потом бухи его наглухо закрывают для изменений, и все недоделки менеджеры переносят на новый месяц).

    Reply ↓
  22. RocKeR_13

    (21) очень многие так делают, а потом ночами все это правят (хорошо, если ошибок не наделали в УТ и все красиво перенеслось, что я редко наблюдал))) А уж когда приходит время сдавать отчетность — вообще караул.

    Reply ↓
  23. awk

    (0) 500 реализаций 45 часов? Как-то совсем медленно, даже для типовой…

    Reply ↓
  24. Lenten

    (23) там 500 реализаций в день (500 * 30) и еще сопутствующие документы (поступления, платежки и т.д.). Про реализации написал, чтоб показать примерный объем данных

    Reply ↓
  25. awk

    (24) Ну нормально.. Штатный обмен, 12 часов, на на объеме 40 000 документов.

    Reply ↓
  26. aximo

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

    почему нельзя просто первым шагом:

    1.загрузить документы — сохранить. (1 ночь)

    2.потом частично проводить их — 2-3 ночи если на то пошло…

    все равно много…. у вас с сетью проблемы скорее всего — если клиентом грузите, а не напрямую на сервере.

    Reply ↓
  27. Lenten

    (26)Из статьи

    Загрузка в бухгалтерию (на удивление быстро проходит, но стала идти параллельно с выгрузкой из УТ)
    почему так долго загружается? не могу представить себе количество документов, которое бы грузилось 48 часов!

    не понял что вы имеете ввиду

    Reply ↓
  28. Новиков

    Чуть не в тему, но все таки поделюсь своим опытом ниже-процитированного:

    Использовали программу RAMDisk

    Есть нульсовая железяка:

    — Xeon CPU E5-2609 v2 2.5GHz (две шт.)

    — оперативы 64 гига

    — 4 винта в двух RAID 1

    Все под Windows Server 2012 R2 (x64)

    В качестве исходной базы, брался *.CD размеров 5 гигов. Тестились рам диски двух производителей:

    — QSoft (WinRamTech) RAMDisk, о котором говорил ТС,

    — SoftPerfect RAM Disk.

    Объем диска ставился в 15 гигов.

    К моему ужасному расстройству, деградация производительности по перепроведению базы, на вскидку была в раз 10, если сравнивать с тем жестким массивом, о котором я писал. Полагаю, что возможно есть какая-то особенность у 2012 сервера, какая-нибудь волшебная галка, или в самих этих рам дисках, что-то нужно более тонко подстраивать. Повозившись пару дней, бросили эту затею. Поэтому, хотел бы у коллег поспрашать — кто-то сталкивался с подобным?

    Reply ↓
  29. Lenten

    (28) Единственное что приходит в голову, какие-то используемые файлы остались на жестком диске. Мы пробовали 3 компа, на всех было быстрее чем обычно. В основном это зависело от частоты процессора и частоты оперативной памяти.

    Reply ↓
  30. RocKeR_13

    (26) aximo, (27) ну имел в виду, видимо, что не верит приведенным цифрам)))

    (48 часов*3600сек)/15000 документов~12 сек на загрузку и проведение одного документа

    Ну если в файле обмена десяток документов, в тч которых десяток строк, то да, много. Однако, если в файле 15 000 доков и, не зная сколько строк в каждом из них, я бы так сразу и не сказал, что много: тут хотя бы на таком объеме потестировать, как изменяется среднее время на проведение 1 документа, в зависимости от их общего количества (а то может и есть подобные исследования?)))

    Reply ↓
  31. Lenten

    (30) Я уже писал, примерно 15000 реализаций + сопутствующие документы. файлы xml за месяц весят 773 мб (это за июнь). Я честно никого не обманываю насчет объемов и сроков выгрузки/загрузки ) Если у вас идет все быстрее, то это здорово. Я надеялся акцентировать внимание на методах ускорения, а не конкретных цифрах.

    Reply ↓
  32. CheBurator

    12 сек на загрузку и проведение одного документа — да удавиться…

    используйте программное кеширование найденных объектов дабы не искать повторно.

    не используйте универсальных тормозных механизмов — напишите свой частный обмен. будет леатать существенно быстрее.

    Reply ↓
  33. russinow

    а зачем столько данных переносить? нельзя настроить менее громоздкую выгрузку??

    собственно к вопросу — зачем данные о торговом товародвижении в бухгалтерии??

    Reply ↓
  34. Новиков

    (29)

    какие-то используемые файлы остались на жестком диске.

    А саму платформу вы откуда запускали? С этого же RAM диска? Или с дискового массива? Кажется, что сама платформа то пофик должна откуда запускаться. А остальные используемые файлы…был сделан диск H: и на него скопирован *.cd. С дискового массива запущена платформа. Деградация.

    А еще вопрос — а какая ОС использовалась у вас?

    Reply ↓
  35. Lenten

    (34) Все было на виртуальном диске. И платформа и база (файловая). Использовали Windows 7

    (32) Раза 4 уже отвечал. Видимо это бесполезно.

    (33) Для того, что бы отчитываться перед государством. + руководство просило наиболее детализованные данные для анализа работы менеджеров. Я так понял нужна связка ЗП + продажи. В УТ ведь про зарплату ничего нет.

    Reply ↓
  36. RocKeR_13

    (32) CheBurator, вы хоть читали собственно публикацию?) Автор как раз и пишет, что штатными средствами выгрузка столько шла, теперь же эти 15 000 доков в бухне грузятся (данные публикации) примерно 10 часов, или (10 часов*3600 сек)/15000доков=2.4 сек на загрузку и проведение одного документа.

    (31) да я, собственно, вас ни в ем не обвиняю) Самому стало интересно, как будет увеличиваться среднее время проведения одного документа в зависимости от их общего количества, и в принципе какие программные нюансы будут на это влиять (например, действия самой платформы, кэширование данных и т.п.)

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *