1С:Предприятие 7.7. Оптимизация.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

99 Comments

  1. ineoosaki

    хорошая статья для новичков. +1

    Я бы добавил, еще, что при разработке отчетов/печатных форм надо стараться вычислять выражения в модулях, а не в таблицах.

    Reply
  2. CheBurator

    плюс выигрыш при заполнении областей в печатных вормах

    Reply
  3. Djelf

    А вот если Ускоренное создание объектов в 1С: http://www.1cpp.ru/forum/YaBB.pl?num=1215146216 в функционал turbobl.dll добавить, стало бы еще лучше.

    Reply
  4. alexk-is

    (3) Зачем? Функционал turbobl.dll полностью присутствует в 1CPP.dll. http://www.1cpp.ru/index.php/VeryBeginning

    Reply
  5. Djelf

    Тут есть некоторая подстава: 1++ конечно содержит весь функционал ускорения, но накладные расходы на дополнительные возможности 1с++ (не все можно отключить) съедают все ускорение. Если мы хотим ускорить штатные функции с минимальным изменением кода turbobl.dll все оказывается значительно лучше 1с++

    Reply
  6. Djelf

    Кстати, вот еще одно ускорение «Быстрые и медленные переменные» http://subscribe.ru/archive/comp.soft.prog.school1c/200501/18080241.html сам не проверял 😉

    Reply
  7. ineoosaki

    Функция, заменяющая стандартные методы СоздатьОбъект(«ТаблицаЗначений») и СоздатьОбъект(«СписокЗначений»), подсмотренная в конфе СКАТ-профессионал, от 33lab:

    Функция _Новый(стрОбъект) Экспорт

    Если стрОбъект = «СписокЗначений» Тогда

    Возврат ЗначениеИзСтрокиВнутр(«{«»VL»»,{}}»);

    КонецЕсли;

    Если стрОбъект = «ТаблицаЗначений» Тогда

    Возврат ЗначениеИзСтрокиВнутр(«{«»VT»»,»»1″»,{«»0″»,{{«»»»,»»0″»,»»0″»,»»0″»,»»»»,»»2″»}}}}»);

    КонецЕсли;

    КонецФункции

    Reply
  8. artbear

    (5) C чего ты это взял-то про «накладные расходы на доп.возможности 1С++) съедают все ускорение» ? 🙁

    Последние версии 1С++ 3.0.1.ХХ еще сильнее ускоряют 1С даже по сравнению с ТурбоБЛ 🙂

    (7) Кстати, в последних версиях 1С+ 3.0.1.ХХ списки и таблицы значений автоматически создаются намного быстрее, чем в простой 1С, и даже чуть быстрее указанного тобой известного способа 🙂

    Reply
  9. artbear

    По поводу печатных форм — еще ускорит формирование применение ранее подготовленных секций.

    Reply
  10. Djelf

    (8) В 1С вообще тесты скорости радуют своей неповторяемостью, поэтому скорость я замерял в ТиС-Демо вот таким образом: обработка перепроводила документы, документы перепроводились несколько раз, либо цепочка документов несколько раз проводилась, в лог попадали min/max/avg.

    У меня на этом тесте получилось что максимальная скорость достигается именно с ТурбоБЛ. Если отключить перехватчики в 1C++ скорость повышается, но все равно медленнее чем с ТурбоБЛ.

    Проверял я это после введения ускоренного создания объектов в 1С++, честно говоря, был удивлен полученным результатом.

    Reply
  11. JohnyDeath

    Последнее предложение в 10-м приёме (Объединяем ячейки таблицы.) в корне не верно! Чем больше объединённых ячеек, тем медленнее становится таблица. Старайтесь вообще избегать объединений, лучше воспользоваться «по выделенным столбцам»

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

    Reply
  12. JohnyDeath

    Автор, ты про главный инструмент забыл — ОТЛАДЧИК с замером 😉

    Reply
  13. alexk-is

    (11) Отчет на котором я «тренировался» в первоначальном варианте без объединения «съедал» 700 Mb оперативной памяти, а на чем «тренировались» вы?

    (12) Ну, это очевидное. Не хотелось бы переписывать документацию…

    Reply
  14. artbear

    (11) Ага, про глобальные переменные это очень верно 🙂

    (13) Отладчик с замером обязательно нужно упомянуть — без него никуда!

    (10) Давай на сайте 1С++ обсудим эту тему?

    Reply
  15. Ёпрст

    10 предложение — гон чистой воды…

    Объединенные ячейки — смерть для мокселя… равно как и любые внедренные объекты — картинки, оле-объекты…

    Reply
  16. f13

    Собственно автором вопроса про производительность/методы был я.

    Спасибо за статью, будет полезна новичкам: недавно натолкнулся на http://infostart.ru/projects/3334/ — после просмотра кода пришел в ужас.

    Вопросы вызывают пункты 7 и 11 (как и у всех).

    Повсеместное использование глобальных переменных до добра не доводит. Должен быть баланс: иногда логичнее применить способ оптимизации 1 (железа или вообще технология).

    Собственно к камням 🙂

    Документ ВводРасчетов модуль документа:

    Процедура ОбработкаПроведения(Режим = 0)

    // Режим = 0 — провести документ без формирования движений по документу

    // Режим = 1 — удалить движения документа

    // Режим > 1 — допроведение документа

    Если ГрупповаяОбработка() = 1 Тогда

    глСообщениеГрупповойОбработки(ТекущийДокумент);

    СтатусВозврата(0); Возврат;

    ИначеЕсли Режим = 0 Тогда

    Возврат;

    КонецЕсли;

    Если ДатаДок <> НТП Тогда

    Предупреждение(«Этот документ можно провести только в текущем периоде!»);

    СтатусВозврата(0); Возврат;

    КонецЕсли;

    Для Сч = 1 По _гл_СписокАбонентов.РазмерСписка() Цикл

    Аб = _гл_СписокАбонентов.ПолучитьЗначение(Сч);

    ИнициализацияАбонента();

    КонецЦикла;

    КонецПроцедуры //ОбработкаПроведения

    При интерактивном проведении _гл_СписокАбонентов заполняется. А что будет если мне забожается выполнить ДокВводРасчетов.Провести() из кода обработки?

    МНЕ кажется такой подход не оправдан. Не стоит раскидывать логику проведения по разным местам.

    Reply
  17. alexk-is

    (16) Я думаю что применение любого из предложенных приемов каждый определяет для себя сам. В конфигурациях фирмы 1С часто создается таблица товаров, а затем передается и модифицируется всеми процедурами модуля объекта. Речь собственно шла именно о таких случаях.

    По 11 приему вроде не было вопросов. Скоро сделаю обезличенную базу — посмотреть как это выглядит можно будет там.

    По 10 приему — можно еще погонять тесты, но варианта без объединения по вертикальным секциям состоящих из нескольких строк я не представляю…

    > При интерактивном проведении _гл_СписокАбонентов заполняется. А что будет если мне забожается выполнить ДокВводРасчетов.Провести() из кода обработки?

    Внутри конфигурации есть групповая обработка документов. Там все работает как надо…

    Сейчас проверю. Добавлю статистику по этому вопросу…

    Reply
  18. f13

    (17) конечно же имел ввиду 10 пункт.

    Я НЕ сомневаюсь, что работает как надо :).

    Речь об «изолированности» что-ли. Ведь можно передавать список в качестве параметра для функции проведения: ОбработкаПроведения(вхСписокАбонентов), и получить более «устойчивый» функционал 🙂

    З.Ы. Сейчас задам вопрос в теме http://infostart.ru/projects/3163

    Reply
  19. alexk-is

    (18) По пятому приему статистика следующая:

    При проведении документа в 1 транзакции время проведения не стабильно в течении сеанса:

    1 проведение — 128 секунд

    2 проведение — 216 секунд

    3 проведение — 235 секунд

    4 проведение — 700 секунд

    5 проведение — 221 секунда

    6 проведение — 668 секунд

    При использовании приема время проведения стабильно в течении сеанса — 49 секунд

    Reply
  20. alexk-is

    +19

    В 19 посте данные при работе в монопольном режиме.

    В разделенном режиме терминальной сессии картинка иная.

    Проведение в 1 транзакции

    1 проведение — 756 секунд

    2 проведение — 955 секунд

    3

    Reply
  21. Djelf

    (14) Извиняюсь, был не прав насчет 1с++. Тест пепероведения базы на рам-диске (чтоб исключить влияние дисковой системы) показал, что с 1с++ база проводится быстрее чем с turbobl.

    Reply
  22. Valet

    Присоединяюсь к мнению что начинать надо с замера производительности в отладчике. Иначе часты варианты, что тратим кучу времени на оптимизацию какого то куска, а этот основная проблема в другом месте.

    При этом рефакторинг даст существенно меньший прирост.

    Сначала выявить узкие места, а потом решать в каком порядке их чинить.

    Reply
  23. vcv

    (20) А поясните, пожалуйста, в общих чертах, возможную техническую реализацию 5-го приема.

    Reply
  24. alexk-is

    (23)

    1. Отключается автоматическое удаление движений документа

    2. В форме документа создается процедура, которая запускает на проведение документ блоками

    3. В модуле документа процедура проведения изменяется на работу с блоками данных

    4. В модуле документа добавляется процедура отмены проведения

    5. В глобальном модуле добавляются процедуры на события пометки на удаление и отмены проведения документов с «особой» обработкой документов без автоматического удаления движений

    6. Изменяется групповая обработка документов, которая для документов без автоматического удаления движений открывает форму с передачей параметра запускающего документ на проведение

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

    Примеры реализации можно посмотреть в типовых конфигурациях 1С или здесь http://www.infostart.ru/projects/3163/

    Reply
  25. alexk-is

    +24 При больших объемах обрабатываемой информации, эффективнее передавать указатель. Т.к. большие списки это дополнительные ресурсы ПК.

    Reply
  26. artbear

    (21) И это правильно 🙂

    Reply
  27. Shaman100M

    (0) К теме можно добавить библиотеку Vk_TerminalSleep. от Ромикса http://infostart.ru/projects/1515/

    Reply
  28. hogik

    (0)(alexk-is)

    Вопрос по «Пятый прием». Как можно «при использовании данного приема документ проводится несколькими транзакциями»? Не понимаю… 🙁

    Reply
  29. nickVZ

    Во-первых, насчет «современной вычислительной системы». Это понятие («вычислительная система») включает в себя и «железо» и «софт». Так вот, современный «софт» может сущестенно «затормозить» исполнение Предприятия 7.7. Классика жанра: клиент на w98 работает значительно быстрее, чем клиент на XP 🙂 Настройкой эту разницу можно превратить в «слегка быстрее», но ликвидировать невозможно.

    А про настройки сервера базы в статейке ни слова….

    Зато немало места уделено тому, чему вообще не надо уделять внимания в теме «производительность». Какое-такое снижение производительности вы добъетесь манипуляцией объявления закладок формы?! Вы о чем? Отладка чего-то в формах совершенно бессмыслена, если результат «не заметен глазу».

    Как приятно было узнать (из ссылка на subscribe.ru), что обращения к реквизитам формы «самые медленные». Только надо циклом обратиться к ним миллион раз, чтоб заметить это :))

    Но для сдачи зачета пойдет 😉

    Reply
  30. nickVZ

    И еще… Не знаю что — смеятся или плакать от совета «вынести за циклы» команды СоздатьОбъект»….

    Это совершенно не имеет отношения к «1С:Предприятие». Требование «выноси за пределы цикла все, что можно сделать вне цикла» — это ШКОЛА. И дОлжно исполнятся не думая.

    Reply
  31. alexk-is

    (28) Расписал подробнее. Стало понятнее?

    Reply
  32. alexk-is

    (30) Открываю в ЗиК 7.70.284 форму элемента справочника сотрудники. В процедуре Печать18ФО ищем СоздатьОбъект(«СписокЗначений»).

    Документ ЗаявкаНаОткрытиеСчетов процедура СформироватьФайлНаОткрытиеСчетов ищем СоздатьОбъект(«Справочник.ДокументыУдостоверяющиеЛичность»).

    Документ НачислениеНалоговСФОТ процедура ПровестиИзФормы ищем СоздатьОбъект(«СписокЗначений»).

    Документ ПриказНаОплатуПоСреднему процедура Печать ищем СоздатьОбъект(«ТаблицаЗначений»).

    …нашел еще 5 мест — надоело…

    Теперь можно смеяться или плакать…

    Reply
  33. alexk-is
    Reply
  34. hogik

    (31)(alexk-is)

    Да, стало понятнее. Спасибо. Но мне суть алгоритма не понравилась…

    Reply
  35. alexk-is

    (34) Почему?

    Reply
  36. hogik

    (35)(alexk-is)

    Почему? А Вы это написали во втором абзаце «пятого приёма». Плюс приличные переделки конфигурации. Однако проблема больших транзакций в DBFной 1С существует. Я, как раз, недавно проводил тестирование этой проблемы. Так если выполняется 10’000 некоторых (моего теста) обновлений в рамках одной транзакции, то это занимает пол минуты. А для 100’000 таких же действий — часы. Т.е. это дольше не в 10 раз :-(. В этом смысле CodeBase — бяка… 😉

    Reply
  37. alexk-is

    (36) Да, есть такая закономерность, что чем больше объектов в транзакции, тем медленее она выполняется. Поэтому и появились эффективные порции. В первоначальном варианте документ проводился несколько часов, а потом расчитывался еще несколько часов. Для фронт-офисной программы это непростительная роскошь, т.к. всегда стоит очередь…

    Так такой выход из ситуации? Какие предложения?

    Reply
  38. hogik

    (37)(alexk-is)

    «Так такой выход из ситуации?»

    Сменить СУБД.

    «Какие предложения?»

    Если оставлять Ваш алгоритм, то хотя бы упразднить большие переделки конфигурации. Например, взять вот эту дрянь http://infostart.ru/projects/2418/ и добавить управляемый алгоритм принудительного завершения и начала реальной транзакции внутри логической транзакции. С помощью вызова некой функции, расставленной в тексте конфигуратора. И еще добавить алгоритм отслеживания целостности…

    Reply
  39. hogik

    (37)(alexk-is)

    +(38) И сразу вопрос себе — а как откат транзакции делать? А у Вас как это делается?

    Reply
  40. alexk-is

    Удаление движений документа:

    Если глУдалитьДвиженияДокумента(ТекущийДокумент()) = 0 Тогда

    Возврат

    КонецЕсли;

    Reply
  41. Ёпрст

    (40) А есть уверенность что они удаляться ?

    Reply
  42. Ёпрст

    +41 тем более,что цикл просто прерывается…

    Reply
  43. alexk-is

    Пока не спрашивали проблем не было. Теперь наверное будут… 🙂

    Reply
  44. Ёпрст

    (43) Таи вообще в топике — не рабочий алгоритм…

    На N-ой строке не провелось по какой-либо причине (транзакция например, или тупо по условию в модуле проведения, не суть важно как) и привет…Документик на половину проведён ? …

    Reply
  45. Ёпрст

    Я понимаю еще, когда делают весь расчет ммодуле формы, а в ОбработкаПроведения пишут только готовые движения… только потеря актуальности данных может быть в таком случае…

    А тут — в данном виде вообще каша 🙂

    Reply
  46. Ёпрст

    Еще каша будет, при любом аварийном выходе при проведении такого документа..

    Часть движений уже будет в ИБ.

    Reply
  47. nickVZ

    (32) «…нашел еще 5 мест — надоело…». Дык дело-то не в ЗиК. Обсуждается статья. Которая, несомненно, привлечет внимание многих своим заголовком.

    Сырая статья. Ну очень сырая. Поспешил ты. Написал то, что не стОило упоминания. Скомкал то, что достойно более тщательного описания (про «пятый пункт», например).

    Вот что обидно.

    А приведенные тобой примеры вполне ложаться в раздел «Программируйте правильно». Или «Как не надо кодить». А что? Стиль оказывает общеоздоровляющее действие и на производительность ;))

    Хотелось бы поместить статью в свой директорий на диске «Полезные статьи», ан не судьба. Вот такое эгоистическое желание.

    Но еще не вечер? Да? 🙂

    Reply
  48. hogik

    (40)(alexk-is)

    «Удаление движений документа:…»

    Согласен с Ёпрст в (41-46). И сомневаюсь, что «…проблем за 8 лет не возникало»©. Или всем всё безразлично при работе с Вашей разработкой… Или, типа, как в анекдоте: «Нам выдают бесплатное молоко, т.к. у нас вредное производство. Но мы этого не замечаем, не замечаем, не замечаем…».

    Reply
  49. alexk-is

    (7) Провел испытания. По предложенной схеме. Этот интересный вариант оказался более медленным даже без вызова функции.

    Результаты проверки:

    Список значений: 1: 410 2: 427

    Таблица значений: 1: 498 2: 1254

    Текст процедуры проверки:

    //*******************************************

    Процедура Сформировать()

    С1 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл

    А = глТипСписокЗначений();

    КонецЦикла;

    С2 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл

    А = ЗначениеИзСтрокиВнутр(«{«»VL»»,{}}»);

    КонецЦикла;

    С3 = _GetPerformanceCounter();

    Сообщить(«Список значений: 1: » + (С2 — С1) + » 2: » + (С3 — С2));

    С1 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл

    А = глТипТаблицаЗначений();

    КонецЦикла;

    С2 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл

    А = ЗначениеИзСтрокиВнутр(«{«»VT»»,»»1″»,{«»0″»,{{«»»»,»»0″»,»»0″»,»»0″»,»»»»,»»2″»}}}}»);

    КонецЦикла;

    С3 = _GetPerformanceCounter();

    Сообщить(«Таблица значений: 1: » + (С2 — С1) + » 2: » + (С3 — С2));

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

    Reply
  50. alexk-is

    +49 Поменял немного тест. Я в шоке…

    Текст процедуры проверки:

    //*******************************************

    Процедура Сформировать()

    С1 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл
    \

    Reply
  51. Tatitutu

    «Шестой прием связан с заменой использования для объектов типа СписокЗначений метода Принадлежит() на метод Найти().»

    может все таки не Найти() , а НайтиЗначение()?

    Reply
  52. alexk-is

    (51) совершенно верно…

    Reply
  53. artbear

    (50) Надеюсь, теперь вопросы по необходимости юзания 1С++ сняты? 🙂

    ЗЫ ведь и другие встроенные объекты ускорены 🙂 а не только СЗ и ТЗ.

    Reply
  54. alexk-is

    (53) Я думаю, что в типовых конфигурациях лидерство однозначно будет за 1С++.

    Переписал тест. Убрал время на цикл. Поставил прямые вызовы.

    Текст процедуры проверки:

    //*******************************************

    Процедура Сформировать()

    Перем А, ПустойСписокЗначений, ПустаяТаблицаЗначений;

    С0 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл

    КонецЦикла;

    С1 = _GetPerformanceCounter();

    глПустойСписокЗначений.Выгрузить(ПустойСписокЗначений);

    Для Индекс = 1 По 100000 Цикл

    ПустойСписокЗначений.Выгрузить(А);

    КонецЦикла;

    С2 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл

    А = ЗначениеИзСтрокиВнутр(«{«»VL»»,{}}»);

    КонецЦикла;

    С3 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл

    А = СоздатьОбъект(«СписокЗначений»);

    КонецЦикла;

    С4 = _GetPerformanceCounter();

    ПоправкаНаЦикл = С1 — С0;

    Сообщить(«Список значений: 1: » + (С2 — С1 — ПоправкаНаЦикл) + » 2: » + (С3 — С2 — ПоправкаНаЦикл) + » 3: » + (С4 — С3 — ПоправкаНаЦикл));

    С1 = _GetPerformanceCounter();

    глПустаяТаблицаЗначений.Выгрузить(ПустаяТаблицаЗначений);

    Для Индекс = 1 По 100000 Цикл

    ПустаяТаблицаЗначений.Выгрузить(А);

    КонецЦикла;

    С2 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл

    А = ЗначениеИзСтрокиВнутр(«{«»VT»»,»»1″»,{«»0″»,{{«»»»,»»0″»,»»0″»,»»0″»,»»»»,»»2″»}}}}»);

    КонецЦикла;

    С3 = _GetPerformanceCounter();

    Для Индекс = 1 По 100000 Цикл

    А = СоздатьОбъект(«ТаблицаЗначений»);

    КонецЦикла;

    С4 = _GetPerformanceCounter();

    Сообщить(«Таблица значений 1: » + (С2 — С1 — ПоправкаНаЦикл) + » 2: » + (С3 — С2 — ПоправкаНаЦикл) + » 3: » + (С4 — С3 — ПоправкаНаЦикл));

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

    Результаты проверки:

    Без библиотек

    Список значений: 1: 1031 2: 352 3: 5204

    Таблица значений 1: 1249 2: 1167 3: 6303

    Загружена turbo.bl

    Список значений: 1: 98 2: 348 3: 5178

    Таблица значений 1: 116 2: 1143 3: 6279

    Загружена 1cpp.dll

    Список значений: 1: 101 2: 351 3: 131

    Таблица значений 1: 118 2: 1142 3: 181

    Reply
  55. Ёпрст

    Итого в сухом остатке

    1. Загрузка ВК +

    2.сокращением общего количества точек —

    3.Сокращение вызовов СоздатьОбъект —

    4. ?? Вообще не понятно о какой оптимизации идёт речь

    5.спользованием эффективных порций —

    6.Использовать НайтиЗначение вместо Принадлежит +/-

    если СЗ статичный, то Принадлежит быстрее…причем намного

    7.объявить переменными модуля не есть гуд —

    8.Непонятно о каком повторном чтении данных идёт речь .. +

    9.Выражения расчитывать вне мокселя +

    10. Объединять ячейки —

    (и вообще, стараться избегать их вообще, даже если страдает красота при объединении вертикальных ячеек)

    11.Вы предлагаете смотреть отчет в 5-6 листах что ли ? Кто его вообще смотреть будет ?



    12.Печать без просмотра +

    Итого:

    4 +

    6 —

    🙂

    Получается «оптимизация» наоборот…

    Reply
  56. alexk-is

    (55) Бодаться можно вечно. Подготовлю тесты и контрольные примеры…

    Не уверен что быстро, но пока готовы только 2 синтетических теста…

    Reply
  57. Ёпрст

    (56) Никто и не бодается.. просто итог статьи.

    Reply
  58. Арчибальд

    Что-то обсуждение чисто техническое. Что будет работать, что не будет. Послушаем автора:

    1) Статья про абонентский отдел водоканала.

    2) Фронт офис.

    3) Компонента «Расчет».

    Уже некий сюрреализм. Еще бы торговый зал супермаркета на журнале расчетов построили.

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

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

    4) Перерасчет за пол года формирует 190000 записей за 2 минуты, при этом проводится только 1 документ.

    190000 записей из одного документа, не уголовщина, конечно, но оскорбление общестенной нравственности — однозначно. Если вы едете в автомобиле по городу с нормальной скоростью, но на двух колесах, ПДД вы не нарушаете. Но на первом же посту вас тормознут — и правильно сделают.

    Кстати, а зачем может потребоваться перерасчет сразу всех за полгода? При изменении законодалельства задним числом? Это уже форс-мажор, имхо. А если полгода назад абонент заплатил 200 рублей, а разнесли ему 20, так при нормальной реализации требуется одна запись, а не 180000.

    Reply
  59. alexk-is

    (58) Я так понимаю разговор идет об альтернативном решении на 7.7. Хорошо давай посмотрим его…

    Reply
  60. alexk-is

    …странный получается разговор…

    — есть заводик. делает розетки

    — да? какие?

    — вот смотрите. все здесь

    — что всего 12? такое мы богато бачили. лучше бы сало показали

    — да нет. он много может делать. это образцы — 12 цветов

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

    — сокращаем непроизводственные потери

    — потери уже потеряны. итог «ацтой»

    — но он ведь может делать 190000 шт. за 2 минуты

    — зачем делать 190000, когда можно делать только 1?

    — …

    Reply
  61. darkfire

    Ни кто не спорит все круто и классно когда ты можешь перепахать конфу вдоль и поперек, но, если тебе надо внести минимум изменений чтоб оставаться максимально близко к типовой или ты вообще работаешь с базовой версией или над одной конфой работает человек десять и каждый вносит свои изменения по требованиям пользователей, т.е. в пожарном порядке охватить мыслью все что на работали до тебя и выдать оптимальное не конфликтное решение =)

    Вобщем решения интересны, но не всегда реализуемы

    Reply
  62. alexk-is

    (55) Добавил тест по 4 приему. http://www.infostart.ru/projects/3406/

    Reply
  63. alexk-is

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

    Когда конфигурация самописная, то все понятно — режешь как хочешь. В типовых конфигурациях мне приходилось оптимизоровать лишь самые узкие места с точки зрения пользователей. Т.е. внося минимальные изменения в конфигурацию, но получая максимальный эффект.

    Reply
  64. Арчибальд

    (59)http://www.kamin.kaluga.ru/products/rent/

    Это не готовое решение, конечно, но пример реализации на компоненте Бухучет.

    Речь шла о том, что содержательных расчетов для нескольких тысяч абонентских точек не требуется – начисление фиксированное. Содержательные расчеты, вроде перемножения двух чисел требуются при изменении статуса абонентской точки (справку принесли), при поступлении платежа – это две-три проводки. При вводе показаний счетчиков контролерами количество проводок соответствует количеству строк документа. Все это измеряется в секундах.

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

    Reply
  65. alexk-is

    (64) Итак, начисление по бессчетчиковым абонентским точкам — требует оптимизации.

    А статья как раз об оптимизации…

    В конфигурации «Абонентский отдел водоканала», например, ПКО рассчитан на работу с 1 абонентом. Но есть ряд документов рассчитанных на работу с несколькими тысячами абонентов. И приведенный в заголовке пример как раз обсчитывает абонентов, услуги для которых рассчитываются по нормам.

    Reply
  66. Арчибальд

    (65) Я отнюдь не против обсуждения приемов оптимизации. Минуса я ведь не поставил.

    Мои замечания касались применения в конкретной предметной области неподходящего инструмента.

    Вот, например, «Но есть ряд документов рассчитанных на работу с несколькими тысячами абонентов».

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

    Reply
  67. Арчибальд

    +66 «В первоначальном варианте документ проводился несколько часов, а потом расчитывался еще несколько часов. Для фронт-офисной программы это непростительная роскошь, т.к. всегда стоит очередь…»

    Вполне очевидно, что это непростительная роскошь

    Reply
  68. alexk-is

    (67) Предлагаю обсуждение самой программы перенести сюда http://www.infostart.ru/projects/3163

    Reply
  69. alexk-is

    (47) (55) Поправил статью, добавил тесты. Лучше стало?

    Reply
  70. artbear

    ИМХО по первому приему давно очевидно, что последние версии 1С++ — 3.0.1.ХХ еще лучше ускоряют всю систему, чем ТурбоБЛ 🙂

    Reply
  71. alexk-is

    (70) Как было написано в 54 посте, в типовых конфигурациях лидерство однозначно будет за 1cpp.dll.

    Но в некоторых отдельных случаях turbo.bl может быть эффективннее. См. результаты проверки в 54 посте. Думаю это зависит от конкретной конфигурации и от конкретного комьютера. Например, если есть проблемы с загрузкой 1cpp.dll, то можно использовать turbo.bl. Это будет лучше чем не использовать ничего…

    Reply
  72. bulpi

    Все это очень умнО (кроме шуток) А слабО писАть такие конфигурации, при использовании которых даже не возникает мысли об оптимизации, т.к. оптимизация на этапе постановки задачи и разработки алгоритмов на 2 порядка перекрывает потери в миллисекундах от использования СоздатьОбъект ?

    Reply
  73. alexk-is

    (72) Так статья про такую конфигурацию 🙂

    Все описанные приемы были заложены при разработке конфигурации и не описанные тоже 🙂

    Reply
  74. stepan_shock

    Вы можете реально что нибуть посоветовать в таком случае: 2 ПК, на одном компе лежит 1С7.7 БУХ. База 1,5 гига. Второй комп подключается по сети, при этом интерфейс тормозит безбожно, то есть для того, чтобы тупо набить номенклатуру в накладную при выборе из справочника уходит много времени.

    Естественно на том коме, где лежит база все быстро.

    Конфигурация компов 1ПК: CoreDuo, 1Gb RAM, GigabitLAN , 2ПК: CeleronD, 512 Mb RAM , GigabitLAN/

    Выключение Кашмарского эффекта не дает:(

    Reply
  75. Ёпрст

    (74) поднять сервер терминалов…или скуль, или альтернатива на кодебэйсе или адвантадже..

    Reply
  76. stepan_shock

    ребята о чем вы говорите, «поднять терминал для двух компов» , поставить «скуль» стоимость бюджета проекта превысит годовую зарплату буха:))

    Reply
  77. Ёпрст

    (76) не вопрос.. найди админа ставь нетварь и работай.

    Reply
  78. stepan_shock

    🙂 я админ. у юзера стоит Лиценз. хрюша и другого ставить незя

    Reply
  79. alexk-is

    (74) К уже предложенным в (75) вариантам и к приемам изложенным в статье добавлю:

    1. можно уменьшить трафик по сети отключив неиспользуемые отборы и сортировки по операциям и проводкам

    2. можно уменьшить трафик по сети увеличив время обновления списков

    3. проверить работу антивирусов, отключить проверку сетевых дисков

    4. проверить размещение каталогов пользователей, сделать каталоги локальными

    5. почистить файл с настройками пользователей 1Cv7.CFG

    6. можно уменьшить время обработки, сделать upgrade слабого компьютера

    7. проверить работу сети. влючен ли Gigabit FullDuplex. какая скорость прокачки?

    8. выполнить дефрагментацию жестких дисков обоих ПК

    Reply
  80. Ёпрст

    (78) а при чем тут юзверь вообще ? На сервак ставь..

    Reply
  81. stepan_shock

    ну нету отдельного компь.тера… нету!!! и никто не купит для ДВОИХ бухов СЕРВЕР (((

    Reply
  82. Ёпрст

    (81) тогда ау..

    Reply
  83. stepan_shock

    жесткое ау:(

    Reply
  84. Ёпрст

    (83) можешь из хрюши своей сделать терминал-сервер.. но не помню, лицю. при этом теряется, или нет ?

    И второй чорт будет работать по удаленке как на сервере терминалов..

    памяти еще доставишь в первый комп..

    Reply
  85. Ёпрст

    +84 как на хрюше сделать сервер терминалов — в поиск..

    Reply
  86. Ёпрст

    http://martin-martin.narod.ru/xpterminal.html

    так, например и еще до едрени фени ссылок…

    Reply
  87. Altair777

    (0)

    В пятом приеме нужно поправить ссылку http://www.infostart.ru/projects/3163/

    Reply
  88. Altair777

    +(87) Везде. Почти все ссылки неправильные.

    Reply
  89. alexk-is

    (87) (88) Починил статью…

    Reply
  90. Altair777

    (89) А приемчиков не добавилось?

    Reply
  91. alexk-is

    (90) Добавил еще один…

    Reply
  92. artbear

    В последних версиях 1С++ З.Х достигнуто максимальное уменьшение времени создания любых объектов в 1С 77 даже в сравнении с более ранними версиями 1С++ 2.Х и З.Х

    Простая загрузка 1С++ уже серьезно ускоряет систему.

    Reply
  93. alexk-is

    (92) Да. Знаю. Скачал. Проверил. С 1С++ З.Х работает быстрее.

    Но прием описанный в статье после загрузки 1С++ З.Х выполняется все равно быстрее, чем создание нового объекта. Это наглядно демонстрирует тест приема 3. Вот лог теста:

    Список значений: 1 (из статьи): 1078 2 (альтернативный): 347 3 (типовой): 74725

    Ускорение (из статьи): 69.32

    Ускорение (альтернативный): 215.35

    Прием 3 из статьи «1С:Предприятие 7.7. Оптимизация.»

    Таблица значений 1 (из статьи): 1252 2 (альтернативный): 1146 3 (типовой): 75911

    Ускорение (из статьи): 60.63

    Ускорение (альтернативный): 66.24

    1cpp.dll загружена

    Список значений: 1 (из статьи): 100 2 (альтернативный): 356 3 (типовой): 128

    Ускорение (из статьи): 1.28

    Ускорение (альтернативный): 0.36

    Прием 3 из статьи «1С:Предприятие 7.7. Оптимизация.»

    Таблица значений 1 (из статьи): 118 2 (альтернативный): 1201 3 (типовой): 188

    Ускорение (из статьи): 1.59

    Ускорение (альтернативный): 0.16

    Reply
  94. artbear

    (93) Прикольно, т.к. по СЗ точно знаю, что при загруженной 1С++ внутри 1С юзается почти полный аналог создания СЗ из строки — сам его писал в коде 1С++ 🙂

    Reply
  95. alexk-is

    (94) Может нужно было сделать по аналогии со статьей? При загрузке библиотеки создать пустые СписокЗначений и ТаблицаЗначений, а потом получать их копии. Тогда бы предложенный мной в статье вариант проиграл бы, наверное…

    Тогда я статью поправлю…

    Reply
  96. artbear

    (95) Я именно так и делал для СЗ и ТЗ 🙂

    Возможно, уже после меня kms переписал на более универсальный способ, который не так хорош для СЗ и ТЗ.

    Reply
  97. alexk-is

    Если есть вопросы по поводу продажи «Система электронного документооборота ‘Управление делами’ : 1 лицензия», то работы по преодолению несоответствий ведутся. И я искренне надеюсь, что ситуация в ближайшее время благополучно разрешиться.

    Reply
  98. alexk-is

    Результат применения 9, 10, 11 приемов можно посмотреть здесь http://www.infostart.ru/public/67695/

    Reply
  99. ehoo

    Большое спасибо за статью. О некоторых приемах даже не догадывалась.

    Reply

Leave a Comment

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