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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *