Перенос справочников, документов и настроек констант между одинаковыми конфигурациями




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

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

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

<?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='\

76 Comments

  1. support

    Впечатляет работа с таблицей. Сделано мастерски. Только не до конца понятны механизмы переноса, например, по какому полю идет синхронизация? По коду или наименованию, а если в спровочнике вообще нет кода и наименования (ТИС: Спровочник.Цены )

    Как переносится история элементов?

    Есть ли возможность рекурсивного переноса всех связанных объектов?

    Reply
  2. GreyK

    Синхронизация идет по полю с таким знаком (!).

    Два щелчка по другому реквизиту сменит реквизит синхронизации.

    Reply
  3. GreyK

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

    Переносится вся история в пределах периода + значение на начало периода.

    Какие связанные объекты? Если подчиненные справочники, тогда конечно.

    Reply
  4. support

    >Какие связанные объекты? Если подчиненные справочники, тогда конечно.

    Да, подчиненные элементы, например, цены товара из ТиС

    Например, значения реквизитов это тоже элементы справочников или документов.

    Reply
  5. imsoftware

    Достаточно интересная разработка (и актуальная!), но до Rocket Launcher’а ей еще как до Китая ползком! А как быть с остальными объектами метаданных (Перечисления, Виды Субконто, Планы Счетов и т.д.)? Интерфейс разработки достаточно хороший и простой, но надо смотреть на вещи в более глобальном контексте.

    Reply
  6. GreyK

    imsoftware, а ты попробуй и посмотри.

    Как это в глобальном масштабе? Как соотнесется сия обработка и движение планет?

    Reply
  7. GreyK

    Обновлено

    Reply
  8. GreyK

    Вообще-то нужно сообщать о мнении хотя-бы или ошибки!

    Reply
  9. 97% закачки и ступор.

    Reply
  10. Пытаюсь скачать тоже 97% и стоп

    Reply
  11. Надо просто сохранять на диск , а не качалками . Тогда сохраняет.

    Reply
  12. support

    надо попросить автора заново залить этот файл, действительно плохо качается

    Reply
  13. GreyK

    Скинул. Может чё с серваком?

    Reply
  14. wildcat

    Что значит «По ссылкам» и что задаёт Период.

    Вообще было бы не плохо хоть маленькое описание работы прилепить.

    Reply
  15. GreyK

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

    P.S. обработка не предназначена для использования простыми пользователями, надо знать хоть какие-то «основы» програмирования, без их знаний она бесполезна и даже опасна.

    Reply
  16. GreyK

    Исправил перенос пустого значения даты.

    Сталкнулся с таким фактом при подключении через ОЛЕ значения типа число иногда передаются не правильно. Пример иногда значение 2.00, передаётся 1.999999.

    Reply
  17. Martyn

    Тэнкс

    Reply
  18. ne01ext

    Очень удобная обработка… Ничего лишнего… Спасибо!

    Reply
  19. DDD2005

    Вещь конечно удобная!

    НУ есть вопросы:

    1. Если в спровочниках один и тот же код но разные наименования, обработка перезатрет?

    2. Два документа под 1 номеров, что будет в этом случае?

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

    Reply
  20. DDD2005

    Вещь конечно удобная!

    НУ есть вопросы:

    1. Если в спровочниках один и тот же код но разные наименования, обработка перезатрет?

    После проверки справочники с одним и тем же кодом (наименование изменилось, а значит данные перезатерлись)


    2. Два документа под 1 номеров, что будет в этом случае?

    таже сама ситуация

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

    Видно нужно добавлять префикс к документам, сравнение не по наименованию а по коду 🙁

    Reply
  21. GreyK

    1) Значок (!) в идентификаторе реквизита справочника означает, что поиск будет вестись по этому реквизиту. Таким реквизитом может быть код, наименование или реквизит с установленным признаком «сортировка».

    2) Два документа с одним номером и в одном периоде нумерации? Конечно перезапишется, для того и создана.

    3) Нужно установить разные префиксы в нумерацию документов у каждой базы.

    Reply
  22. Alex_222

    Спасибо

    Reply
  23. logarifm

    Ща… тестону, как раз вовремя попалась под руки, а то клиент мну дибает, а мне такой влом писать біло, как вспомню скоко там всего аж плохо делается! Рес+1

    Reply
  24. Sinaps

    Что-то в расходных накладных негрузиться парития

    Reply
  25. GreyK

    Sinaps Какая конфигурация?

    В настройках переноса для реквизита расходной наклодной «партия» стоит пометка загружать?

    Reply
  26. GreyK

    Как сделать что-бы 7ка не задавала вопрос о смене даты или ответить «Esc» и закрыть открытое OLE окно?

    Reply
  27. CheBurator

    Типовая ТиС.

    Требуется перетащить/синхронизировать между родственными базами Номенклатуру (код, наименование, полное наименование) и базовую единицу измерения. Вопрос: как синхронизировать между базами Спр.Единицы причем условием синхронизации должна быть пара «ОКЕИ+ШК»

    ???

    Reply
  28. GreyK

    В ТиС у каждой еденицы номенклатуры вроде как должна быть только одна единица для каждого ОКЕЙ, и неё может быть или не быть ШК, т.ч. условие остается одно. В описании есть заготовка для «расширенного отбора».

    Reply
  29. Товарищ Сержант, разрешите обратиться?

    Из бюджетной конфы (релиз 609, свернута и сжата (удалены неиспользуемые элементы толстых справочников и пожата база) на начало года) переношу в пустую авансовые отчеты (ВСЕ) за неделю (всего 10 штук). Остальное все по ссылкам. Перенеслось все корректно (10 ав. отчетов, с десяток элементов в нескольких справочниках), НО ВРЕМЯ РАБОТЫ 1,5 ЧАСА (ОБРАБОТАНО/ЗАГРУЖЕНО 9217 ССЫЛОК)!!!! Для 10 документов и десятка элементов в нескольких справочниках? Что за бред? Можно ли как-нибудь ускорить сие мероприятие оптимизацией кода (сам лезть не хочу)?

    Reply
  30. Машина Atlon 2000+, 256Mb опертивки.

    Reply
  31. GreyK

    _toro_ спасибо за сообщение. Я решил проверить информацию и нашел у себя ошибку: не обрабатывались значения типа «ВидСубконто» (используется в справочнике «Журналы»), исправил.

    Создал пустую базу 6ой бюджетки и заполнил её из демоконфигурации, вот результаты.

    Все операции с 07.04.2007 21:39:00 завершены в 21:58:15 07.04.2007

    Обработано объектов: 15980

    Изменено элементов справочников: 15667

    Изменено документов: 96

    Проведено документов: 70

    Не удалось првести документов: 13

    Intel 1500M, 512mb.

    Reply
  32. GreyK

    _toro_ Если надо загрузить только авансовые отчеты то надо только для них поставить «загружать все», все остальные объекты должны загружатся «по ссылке».

    Reply
  33. 2 Serjant

    > Если надо загрузить только авансовые отчеты то надо только для них поставить «загружать все», все остальные объекты должны загружатся «по ссылке».

    Дык я так и делал :).

    Сейчас затетстим еще раз.

    Reply
  34. Ну, скорость работы не изменилась. Но сейчас действительно все корректно перенеслось.

    Хочется понять, почему все-таки так долго.

    Объясни, pls, суть алгоритма работы этой обработки.

    Подобные обработки, построенные на рекурсивном вызове процедуры переноса агрегатного объекта (рекурсия-рекурсия…рекурсия, пока не дойдем до атомарного объекта (строка, число, дата)), как, например, эта http://infostart.ru/projects/874/?ref=8252 справляются с той же задачей практически мгновенно. Но в таких алгоритмах есть один нюанс. Если реквизит Справочника1 ссылается на Справочник2, а реквизит Справочника2 ссылается на Справочник1, тогда такие алгоритмы, теоретически, должны упасть в бесконечный цикл. Я так понимаю, в этой обработке использован принципиально иной алгоритм. Для корректной ли отработки данной ситуации в ущерб времени работы?

    Reply
  35. GreyK

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

    Reply
  36. GreyK

    Чуть ускорил, пока больше возможностей не вижу.

    Reply
  37. GreyK

    Изменил отбор документов для загрузки.

    Reply
  38. soltik

    +

    Reply
  39. Amorfus

    +1

    Reply
  40. GreyK

    Спасибо. Всех с праздниками!

    Reply
  41. Борислав

    Не загружает!

    При открытии файла произошла ошибка : C:Program Files1Cv77Зарплата 2008PRBasicfiltr1.txt was not found.

    .РазмерБуфера();zC43F675574AE.ОткрытьФайл(КаталогПользователя()+»filtr1.txt»,0);z6F0F93E9E0AD=»»;zC43F675574AE

    {F:1С ОБРАБОТКИ1С ВЫГРУЗКА-ЗАГРУЗКА ДОКУМЕНТОВPERENOSOLE&MLG.ERT(541)}: Ошибка при выполнении метода объекта компоненты C:Program Files1Cv77Зарплата 2008PRBasicv7plus.dll

    Reply
  42. GreyK

    А файл КаталогИБ()SYSLOG1cv7.mlg есть?

    Reply
  43. gif

    Документы переносит,но при условии что отказываешься от переноса справочников.При этом тащит пустые.Мне очень понравилось,но если бы вы решили эту проблему,тогда 100+++

    Reply
  44. GreyK

    Какую ошибку выдала программа при переносе? Что такое пустой документ, он помечен на удаление? Сейчас переносится база, но там я переношу только документы, а справочники только по ссылке. Вечерком попробую со справочниками, пока у меня зависимости переноса документов от переноса справочников не было.

    Reply
  45. adik_

    Согласен с gif(43 сообщение). При выборе условий загрузки «по ссылкам» справочников и документов ошибок никаких не выдает. Пишет, что все операции завершены: изменено 0, обработано 0, проведено 0. Может быть это из-за использования одного и того же списка значений в секции «Загружать» для документов и справочников или одних и тех же значений в этом списке. Поэтому он воспринимает только документы или только справочники.

    Reply
  46. GreyK

    adik_ Если ставишь для всех справочников и докментов «по ссылке», кто-же на что должен ссылатся 🙂

    Пример: В документе есть реквизит Контрагент. Если загружать эти документы, то загрузятся «по ссылке» и контрагенты из этих документов. Если выбрать для Контрагентов «не загружать» то не загрузятся контрагенты. А если выбрать для Контрагентов «Все», то загрузится весь справочник Котрагентов.

    Reply
  47. adik_

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

    Reply
  48. GreyK

    adik_ Для примера вот как происходит создание новой «чистой» базы из старой.

    1. Делается свертка итогов в копии старой базы.

    2. В настройках обработки помечаем на загрузку:

    1) константы,

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

    3) Документы ввода остатков.

    3. Загружаем документы ввода остатков, период только тот день когда сформированы остатки.

    4. После загрузки остатков ставим все справочники по ссылкам и загружаем документы за период после ввода остатков.

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

    Reply
  49. aslanbek

    я вот тренируюсь по этой программе и вопрос есть, из демки 7.7 бух хочу перебросить документ приказ о принятии на работу в демку 7.7 зик. как сделать это?

    Reply
  50. GreyK

    aslanbek Структура конфигурации бухии и зика различаются, для таких переносов рекомендую потренироватся на «Конвертации данных», там есть примеры переноса.

    Reply
  51. bezmenov

    Призапуске обработки появляется ошибка:

    ;z34F856E76950.Ссылка.ДобавитьЗначение(z34F856E76950.ПолныйИдентификатор,z34F856E76950.Тип+».»+z34F856E76950

    {E:DEVELPERENOSOLE&MLG.ERT(57)}: Значение не представляет агрегатный объект (ДобавитьЗначение)

    Reply
  52. DrZombi

    Накой кадаброй было все переделовать под кадабру 🙂

    А так молодца, на будущее, если ты не хочешь делиться кодом, то некуй его выкладывать 😉

    Reply
  53. siyanych

    нормальненько!!!!

    Reply
  54. sl_k

    Пишет что не может открыть базу данных.Есть какие то особенности?

    Reply
  55. GreyK

    (54) Особенностей никаких нет. Если база открывается в режиме предприятия, то и в ОЛЕ откроется.

    Reply
  56. sl_k

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

    Reply
  57. luns

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

    Reply
  58. sl_k

    (57) Спасибо, очистил каталог пользователя в конфигураторе-помогло

    Reply
  59. maxnn2

    Эта обработка может перенести документ ввод остатков ТМЦ из ТиС в Комплексную?

    Если да, то что значит ошибка

    ,1,0);z8720EB63EC9E=Макс(z8720EB63EC9E,zC21BC14141F5(z533C545C5F99,Идентификатор,z533C545C5F99.ПолучитьАтрибут

    {D:3DSWORK1CНОВАЯ БАЗАATC1EXTFORMSPERENOSOLE&MLG.ERT(408)}: 1С:Предприятие: Неверное имя атрибута

    Reply
  60. GreyK

    (59) Перенос осуществляется между едиентичными, и без настроек соответствий. Для настраиваемых переносов есть КД.

    Reply
  61. Stitch62625

    Подскажите плиз откуда скачать эту обработку

    «Перенос справочников, документов и настроек констант между одинаковыми конфигурациями»

    А то я обсуждения читаю а где ее саму взять не пойму

    Reply
  62. Stitch62625

    Я имею ввиду перенос между идентичными конфигурациями 8.2

    Reply
  63. Alraune

    (61) Отсюда: http://infostart.ru/public/14022/

    (62) Хотя это не 8.2, а, наоборот, 7.7

    Reply
  64. evg300183

    а будет работать между зарплата+кадры 77 и зарплата+кадры 77

    Reply
  65. evg300183

    и можно ли перенести отдельно форму Т-2 у сотрудников?

    Reply
  66. GreyK

    Форма Т-2 хранится в реквизитах справочника «Сотрудники». Без переноса сотрудников не взлетит…

    Reply
  67. 1801

    Спасибо! О-о-очень облегчает жизнь бухгалтеру, не «имеющему» собственного программиста!

    Reply
  68. brato4karik

    Достойная обработка для выполнения переноса справочников в идентичных конфигурациях. Отработала быстро и без потерь ссылок. Проводил загрузку на больших объемах данных. Базы данных как файловые так и клиент серверные. Неплохой инструмент для переноса, но если есть опыт работы с КД то лучше ею

    Reply
  69. agamidov

    Спасибо, очень помогло

    Reply
  70. internetname

    Полезная вещь

    Reply
  71. Builder

    Очень помогло

    Reply
  72. OrsoBear

    Спасибо огромное! По Вашей обработке учил примеру реализации задания. И для себя несколько полезных идей подсмотрел.

    Reply
  73. pallpall4

    А данная обработка переносит Банк»Выписки» в идентичную бухгалтерию

    Reply
  74. GreyK

    (74) Переносит обработка всё, но надо правильно настроить поиск. Рекомендую тренировку на копии.

    Reply
  75. zhleonid8

    обычно к таким рекомендациям прислушиваются после экспериментов

    Reply
  76. leasing

    Пожелание автору.

    Не делайте секрета и укажите в описании, что Ваш код закрыт (обработан обсфукатором).

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

    Reply

Leave a Comment

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