<?php // Полная загрузка сервисных книжек, создан 2024-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='\
Системы контроля версий на службе у 1С-ника.
Перейти к публикации
Правильно ли я понял, что сами файлы уходят в систему контроля версий как бинарники, просто добавлена возможность просмотреть разницу «по-человечьи»?
(1) orefkov, совершенно верно. Даже при таком простом подходе вероятность порчи внешних обработок (случайно кэш почистили) уменьшается в разы.
Видна простейшая история изменений. Та даже просто когда есть несколько веток разработки уже красиво становиться.
Я раньше использовал в bzr хук при commit автоматом запускало v8unpack и для модулей всегда можно было посмотреть различия, но обезличено.
Автор v8Reader подсказал, что есть досадная ошибка при построении дерева измененных…
https://bitbucket.org/Shenja/diff1c
Открываю общедоступный репозиторий, где буду выкладывать изменения:
Да, если просто хранить внешние обработки в конфигурации, то у реквизитов формы слетают типы. Поэтому приходиться придумывать типа сабжа.
А для себя, если не секрет, что используешь? Мы на Bazaar пробуем, просто он не совсем «модный», интересен опыт других.
Я вот пользую mercurial и для небольших проектов —fossil .
(5) andy_minsk, Раньше использовал svn, но это остатки прежних заказов. На машине стоит в принципе зоопарк: svn, git, hg, bzr, вот еще благодаря снегопату fossil осилил:
Кратко сейчас использую две системы fossil и bzr: bzr последний который 2.5 beta, там добавили работу с ветками как в git. Fossil использую на выездах (удобно со снегопатом сочетается, в принципе я дорабатываю плагин для снегопата — работа с версионным контролем), пришел к клиенту сделал fossil open, если дорабатывал какие либо отчеты внешние, закоммител и уже дома сделал синхронизацию (для каждого клиента своя ветка) — так же есть скрипт самопальный, который делает экспорт из fossil ревизий в bzr.
Причины использования bzr, fossil, svn а не git и hg: нормальная работа с кирилицей в именах файлов. Если есть XP, 7 и linux — тогда только bzr, fossil или svn. Если только win7 (vista) и linux тогда можно и hg или git.
но только он из модных с красивым GUI поддерживает в хранилище у себя unicode названия файлов.
(6) orefkov, я бы тоже использовал с удовольствием mercurial, но так как на работе XP, дома linux, на сервере redmine (тоже linux), а английский я хорошо не знаю, да и 1С предлагает все таки русские наименования обработок… пришлось искать альтернативы.
Ну у меня mercurial в С++ проектах используется, и что он кириллицу в именах файлов не поддерживает, я даже как-то впервые услышал.
Он поддерживает, только к себе в хранилище сохраняет имена в системной кодировке (в xp cp1251), когда на другие системы разворачиваешь, естественно перекодирует (utf-8) и получается, Файл МояОбработка удален, файл МояОбработка добавлен. Аналогично и git.
Да, поскольку линукс, 7 и ХР, победили кодировки только в bzr, и сами пришли к этой мысли :).
А насколько интенсивно пользуете, примерное количество веток, ревизий?
(11) trunk, dev, production
Из production — в базу, в trunk основная разработка, dev быстрые, срочные правки.
trunk по желанию разбивается на bug123, новаяФича и т.д.. Мелкие ветки в основном задаю, когда с консолью играюсь и СКД-шные макеты надо сохранить, а то сейчас вот как добавлю еще один подзапрос и посмотрю…
Для cf около 80 commit, в целом если брать production около 200 (254 посмотрел) сейчас. Ну а ветки кто ж их считает…, коли их просто удалять. Сказать, что суппер быстро работает, не скажу — но зато у меня есть возможность в отличии от хранилища 1С накидать 10 commit и потом сделать merge c основной веткой и главное красиво все будет видно в истории.
(13) поправлю обязательно.
(14) я если честно, с трудом пишу публикации, советом, примерами могу помочь. Постараюсь написать, но не гарантирую, я эту статью 4 раза переписывал (в такие дебри уходил).
(12) Тоже очень интересуюсь организации альтернативы хранилищу. Вопросы:
1. Как организовано хранение cf-файлов? Также, как и обработок? Выгружаете cf и коммитите целиком как бинарник?
2. Если да, то насколько быстро выполняется коммит? Если нет, как организовано версионирование изменений в cf?
(16) kuntashov, cf также как и обработок, commit длиться около 30 секунд(субъективно, завтра замеряю более точно, но хочу сразу уточнить использую bzr, а про него вроде как говорят не сильно скоростной, но по очучениям 🙂 быстрее хранилища).
Были попытки командной строкой выгружать модули объектов и потом скриптом Документ.АвансовыйОтчет.МодульОбъекта.txt разбивался в папку ДокументАвансовыйОтчетМодульОбъекта.txt, но к сожалению этой информации не хватало для дальнейшего анализа, нет не реквизитов, ни форм.
Есть большое желание сделать выгрузку как у gcomp — хотя бы для выгружать структуру форм и модулей по папкам, опять на основании v8Reader, он то дерево строит. (В хранилище ложить cf и дерево файлов, без cf страшно)
OFF:
Так же планирую в посмотреть в сторону bugzila — нравиться мне как у fedora сделана зависимость между пакетами и их версиями. Это просто как идея витает: есть внешняя обработка допустим заполнить табличную часть док Авансового учета — для версии документа «Авансовый Отчет», в случаи изменения ревизии для объекта(пакет) Авансовый отчет, автоматом информировать проверить такую ревизию такого файла… Ну или пытаться вникнуть в юнит-тестирование…
(17) Спасибо. Не уточнишь, о конфигурации какого размера идет речь?
Скорость для меня очень важна, иначе теряются многие преимущества, которые я ожидаю получить.
Если ограничиваться текстовым представлением, то можно вместе с выгружаемыми модулями коммитить отчет по конфигурации. Теоретически, должно быть быстрее на последующих операциях сравнения. Но тут опять узким местом может стать выгрузка модулей и формирование этого отчета…
(18) kuntashov, УПП-ыще. Формирование отчета и выгрузка модулей действительно узкое место, в принципе для анализа модулей может попробовать v8unpack запускать (хотя бы тексты модулей). Отчет по конфигурации имеет такое свойство: строиться табличный документ, только он всеми системами определяется как binary, кажется выгружает utf-8 только без BOM, сейчас точно уже не вспомню, последний раз так делал летом. Кстати по ощущениям (опять таки на глаз), fossil дольше commit делает, хотя может и вправду статусная строка движущаяся на ощущения влияет, у bzr есть, у fossil нет.
(19) Я имел в виду отчет по конфигурации в текстовом (TXT) виде (Меню «Конфигурация» — пункт «Отчет по конфигурации», в диалоге переключатель в позиции «Текстовый документ»).
(20) kuntashov, да, да. После формирования, надо выбирать Сокранить как, выбрать любую кодировку, потом обратно utf-8 тогда будет правильный utf-8 файл сохранять.
8.2.16 вроде как обещает предоставить больше возможностей по детальной выгрузке метаданных. Но насколько она будет детальной пока непонятно.
(22) tormozit, только на это и надежда (только вот как быстро это будет …). В принципе в плане сравнения и объединения в 1С не хватает 3-х уровнего merge. Уже подумывал скрипт может написать взять cf base создать поставку — создать базу — объединить с this — создать обновление для other и потом показать окно конфигурации с обновлением. (Сейчас в комментариях приходиться прописывать объекты измененные
*ОбщиеМодули.ОбщегоНазначения
*Документ.АванасовыйОтчет
что бы видеть что же поменялось по сравнению с базовой).
беда всех этих «контроллеров версий» в том что слишком много накладных расходов по установке, настройке и поддержке данных систем..
всмысле, для тупого 1Сника это все черезчур сложно и геморно..
проще поставить себе БСП, и заюзать ее подсистему хранения файлов… где есть версии, описания версий и тд..
вот и получается у вас база с наработками и версионированиеам.. а так же с поиском, общей архивацией и тд и тп..
(24) IamAlexy, беда в лени, а не в установке. Даже возьми ту же БСП — это же надо хотя бы раз в день сохранить версию и че то написать поморщивши лоб.
Тупому 1Снику это не предназначено…
Мне допустим нравиться пользоваться ветками (в понимании версионных систем), причем особенно нравиться для макетов СКД, когда не знаешь куда кривая тебя приведет.
(пример не показательный но картинка может заинтересует).
(25) да для 77 красиво смотрится — душа радуется. а для 82 покажи пример
Да, версионирование кода 1С, это просто такой… недостаток, стандартное хранилище тоже не устраивает, решил в очередной раз попробовать ваш вариант, попробую на git=)
(24), (25) Согласен с мнением IamAlexy. Для меня тоже основная проблема — сложность совместного использования такой системы в команде со «среднестатистическим 1Сником». Конечно же, эффект от использования в одиночку тоже есть, но это совсем не то, что ожидаешь от систем коллективной разработки.
В одиночку навязать команде не типовую технологию, которую надо изучать, которая в нашей отрасли (разработка на 1С) не является стандартом, очень тяжело. Особенно, где много не-технарей, или специалистов, не знакомых с разработкой ПО вне конфигуратора.
Все усугубляется еще и тем, что 1С:Предприятие 8 не очень располагает к использованию таких инструментов из-за отсутствия представить конфигурацию полностью в текстовом виде. А с бинарниками работать зачастую специфично.
Но альтернативная система контроля версий нужна однозначно. Или не альтернативная, а улучшенная существующая:
* с быстрыми коммитами в больших конфигурациях с большим числом объектов;
* быстрая на операциях сравнения объектов разных версий «здесь и сейчас» (сценарии «Покажи мне, что я изменил после предыдущего коммита» и «Покажи, что изменилось в этой версии относительно вот этой версии»);
* с возможностью создавать ветки;
* с возможностью немонопольного захвата объектов
(29) kuntashov, основной посыл данной публикации, использовать для внешних отчетов и обработок альтернативные системы контроля версий. Сегодня в типовых много приходиться добавлять внешних отчетов, обработок заполнения ТЧ, печатных форм… Хранилище для этого использовать — как из пушки по воробьям.
Работа с системами контроля версий для простейших случаев, согласитесь не сложнее работы с хранилищем «commit» и в африке «commit». Установка DVCS сегодня уже проще простого, в примере описания bzr (неудачный пример, скоро дополню инструкцией для hg и git, там же все значительно проще).
Помечтаем:
Компоновщик 1С: натравил на папку с исходниками, собрал cf. Натравил на cf — создал дерево исходников. (узкое место оказывается сборка, компиляция рабочей конфигурации. Но, если мечты понесут еще дальше: берем пакетные менеджеры — 1 документ, справочник = 1 пакет. Есть зависимости: док 1 зависит от Справочника 2, есть мета-пакет Подсистема 22)
Режим разработчика в конфигураторе: у этого объекта изменить uuid — прозрачно прошла реструктуризация базы данных.
Закончили мечтать.
Или должна 1С сделать или возможно только, если дерево конфигурации будет представлено в файлов варианте и редактировать будем отдельные файлы (системы контроля версий для быстрого определения изменения смотрят на время изменения файла, если каждый раз перезаписывать все дерево, тогда sha1 для каждого файла — не будет быстрого коммита.
Если предыдущий пункт выполниться, тогда это возможно и это было бы прекрасно.
* с возможностью немонопольного захвата объектов
Ветки и непомопольный захват объектов: путь к 3-х уровневому сравнению… (и это печально, потому как вероятность, что 1С это сделает крайне низка, хотя может какой либо американский (канадский) блогер-прогер, блогер-аналитик заплюет 1С за это и они сделают…).
Хотелось бы посоветовать, тем кто в принципе ничем не пользуется: Используйте хоть, что-то.
(30) Если что, оговорюсь, что я посыл стати прекрасно понял и сообщение написал в порядке дискуссии.
Названные технические проблемы моих «пожеланий» тоже прекрасно понимаю.
Пока же остается ждать 8.2.16 и эксперементировать с существующими возможностями.
Между делом: Какое же хранилище тяжелое… в плане помещения объектов и извлечения. Bzr делает commit .cf макс за 20 секунд, fossil при той же модели до минуты. Выгрузка практически сразу. По размерам хранилища fossil сжимает, bzr хранит полностью файл, соответственно в размере хранилища bzr проигрывает хранилищу конфигурации процентов на 30% (больше у bzr). Fossil выигрывает размер хранилища самый маленький.
Как вариант может делать на основании v8Reader отчет и дерево файлов (cf так и так будет ложиться), но при этом можно будет видеть сразу изменения и для
, единственная большая проблема это 3-х уровневое сравнение (при слиянии веток).
Я тоже пользую mercurial, но публикация нормаль
Очень сложно. Те кто незнакомы со сторонними программами, те может и будут использовать. Те кто работал в svn и mercurial тот этим способом не будет пользоваться.
Отличная вещь, спасибо!
При сравнении отчетов выдает ошибку, т.к. неправильно настроено соответствие видов файлов.
Правильно будет сделать так:
(36) kabanoff, спасибо. По иронии судьбы ради версионного контроля внешних отчетов я начал разбираться с системами DVCS и как их к 1С прикрутить…
Ссылка на последние изменения
Ошибку исправил:
Правильно
Может кто подсказать с настройкой под git, что то совсем не выходит=(
(39) iceflash, советую использовать TortoiseGit. При использовании Tortoise(SVN, GIT, HG) настройка для сравнения делается аналогично как и для TortoiseSVN.
Вот пример:Видео настройка git
(40) Благодарю=) попробую, просто со стандартным Git + Git extension настраивать замучался, вот с черепахой попробую, даже не знал что есть она для гита=)
(40) «Вообще Огонь!» Огромное спасибо!
(42) iceflash, заслуга больше V8Reader (с расширенным анализом форм) , только благодаря этой разработке можно было, что либо сделать.
(43) Это да, согласен, но в любом случае спасибо за наводку и помощь=)
Кстати по вопросу с кириллицой, это проблема TortoiseGIT или самого GIT? до сих пор не могу понять, как так существуют такие проблемы, используйте UTF и все должно быть хорошо.
Так вот по самому вопросу, планируется ли исправление, pumbaE, не в курсе?
(45) iceflash, это проблема именно git и mercurial, имена файлов или латиницей или же в UTF, но именно в XP кодировка консоли cp1251 (а файловая система в unicode) — в результате, получаются проблемы с кодировками: для git есть сборки UTF-8http://code.google.com/p/utf8-git-on-windows/ (у японцев тоже проблемы с наименованиями файлов). Как вариант ставить git c поддержкой c cygwin, но тогда лишаемся красивой оболочки в виде tortoise. В дополнение можно поставить http://code.google.com/p/gitextensions/ (но у меня все равно не получилось завести).
И да проблема будет с кодировками только если будут использоваться и XP и (Win 7 или linux (тот же github или сервер на linux)).
Я пока остановился на svn, bzr и fossil.
Не будет, как считают разработчики: это не ошибка, а фича :).
Если нет файлов с русскими наименованиями или же нет необходимости синхронизации с другими компьютерами то можно смело использовать git.
(30) Вообщем альтернативное хранилище конфигураций нужно :(…. Похоже ты единственный кто более-менее приблизился к решению проблемы… собственно нужно по сути научиться извлекать файлы конфигурации и отправлять их в систему контроля версий… Герман уже вроде этой затеей развлекался, но до коллективной разработки в iE у него ещё далеко, и особо пока в другом направлении работает… может спросить и поделится подходом, тогда можно будет попробовать скрипт для снегопата написать…
Огромный плюсище!
Просьба для автора: дополнить скрипт diff-1c-cf.js чисткой файлов после себя, а также обратить внимание на то что файлы в папке Temp могут быть с атрибутом «только для чтения» и тогда при вызове метода CopyFile возникает ошибка
Окей, отчёт по изменениям у нас есть и вполне удобоваримый. А как быть, если необходимо вернуться к какой-то версии?
(49) Chrizt, ни что не мешает сделать «сохранить версию файла»
(50) так. А как же патчер?
(51) Chrizt, не понял. Расшифруйте плиз.
(52) патч накатить нельзя, ибо это не код. Всегда оперируем только цельным файлом обработки 🙁
(53) Chrizt, да, патчи не наложишь. Но и патчи можно в реальности наложить только на текст, не на формы, не на макеты. Для конфигураций уже можно пробовать, а для внешних обработок пока к сожалению нет. Появиться в 8.3 возможность выгружать внешние обработки и обратно загружать, тогда будет возможность патчи накладывать.
(54)
А можете подробнее, что имеется в виду под этой фразой?
Вроде и так же выгружаются и загружаются обработки.
(55) Chrizt, 8.3 позволяет выгружать полностью конфигурацию, но отдельно внешний файл (обработка, отчет) невозможно. Получается полноценно использовать git для конфигураций можно, а для внешних обработок пока только в бинарном виде и хранить.
(56) а, в этом плане… Да уж, 1С в этом плане — довольно убогая прикладная фигня.
Википедия говорит , что есть альтернативы 🙂
Давно бы уже всё стало проще, если бы исходники модулей и схемы UI были бы текстовыми файлами, хотя бы даже упакованными в зипчик какой-нибудь подписанный или типа того.
Все нормальные ЯП — это сорцы в чистом виде, а с 1С нужно быть магом, чтобы считать его хоть сколько-нибудь ЯП.
Хотя,
Вылетает вот такая ошибка при попытки сравнения в bazaar. кто-нибудь знает как это можно полечить?