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




Принцип обмена данными из 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='\

47 Comments

  1. eazy123

    Имеем: ТиС 941

    1) делаем копию базы

    2) удаляем в оригинале несколько документов

    3) пытаемся воспользоваться «Переносом справочников и документов…»

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

    Результат:

    Ошибка!!!! ИмяРеквизита=НомерЛистаКассовойКниги Источник=Сибирь Контейнер (ОФ033), получатель=Сибирь Контейнер, вид=СвоиЮрЛица Реквизит.Периодический=1

    1С:Предприятие: НомерЛистаКассовойКниги не является константой или периодическим параметром!

    еще:

    1С:Предприятие: СтавкаНПсАванса не является константой или периодическим параметром!

    Ошибка!!!! ИмяРеквизита=НомерЛистаКассовойКниги Источник=Семеновна ООО (ОФ009), получатель=Семеновна ООО, вид=СвоиЮрЛица Реквизит.Периодический=1

    и так далее.

    Reply
  2. Зачем это нужно, Данная задача быстро и без проблем решается с помощью конфигурации «Конвертация данных».

    Reply
  3. keifaya

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

    Насчет ошибки — исправлю.

    Reply
  4. wildcat

    Так что насчет этой ошибки:

    Ошибка!!!! ИмяРеквизита=СтавкаНДС Источник=14.3759-10 Преобразователь (16414), получатель=14.3759-10 Преобразователь, вид=Номенклатура Реквизит.Периодический=1

    1С:Предприятие: СтавкаНДС не является константой или периодическим параметром!

    Ошибка!!!! ИмяРеквизита=СтавкаНП Источник=14.3759-10 Преобразователь (16414), получатель=14.3759-10 Преобразователь, вид=Номенклатура Реквизит.Периодический=1

    1С:Предприятие: СтавкаНП не является константой или периодическим параметром!

    в этом месте:

    Если Реквизит.Периодический=0 тогда

    УстановитьРеквизит(Реквизит,Источник,Получатель,ДатаДок);

    Иначе

    Пер=v7.CreateObject(«Периодический»);

    Попытка

    Пер.ИспользоватьОбъект(ИмяРеквизита,Источник);

    Исключение

    Сообщить(«Ошибка!!!! ИмяРеквизита=»+ИмяРеквизита+» Источник=»+Источник.Наименование+» («+Источник.ПолныйКод()+»), получатель=»+Получатель.Наименование+», вид=»+Получатель.Вид()+» Реквизит.Периодический=»+Реквизит.Периодический+»

    |»+ОписаниеОшибки(),»!»);

    Продолжить;

    КонецПопытки;

    Reply
  5. а что значит «надо зарегестрировать Journal.dll»?

    Reply
  6. keifaya

    Зарегестрировать Journal.dll означает выполнить команду «regsvr32 c:progra~11cv7inJournal.dll» (либо другой путь, где лежит данная dll)

    Reply
  7. pap

    Так что насчет этой ошибки:

    Ошибка!!!! ИмяРеквизита=ЦенаРеализации Источник=Проверочный товар 3 (00010025), получатель=Проверочный товар 3, вид=Номенклатура Реквизит.Периодический=1

    1С:Предприятие: ЦенаРеализации не является константой или периодическим параметром!

    НО ЦенаРеализации — периодический реквизит!

    Reply
  8. pap

    Для решения переноса периодических реквизитов. Можно попробовать

    Если Реквизит.Периодический=1 тогда

    ИмяРеквизита=Реквизит.Идентификатор;

    СтароеЗначение=Источник.ПолучитьАтрибут(ИмяРеквизита).Получить(ДатаДок);

    Если ПустоеЗначение(СтароеЗначение)=1 тогда Возврат; КонецЕсли;

    Пер=СоздатьОбъект(«Периодический»);

    Пер.использоватьОбъект(ИмяРеквизита,Получатель);

    Пер.ДатаЗнач=ДатаДок;

    Если Реквизит.Тип=»Неопределенный» тогда

    ТипВид=ПолучитьТипВидРеквизита(Реквизит,СтароеЗначение);

    Пер.НазначитьТип(ТипВид);

    КонецЕсли;

    Пер.Значение=СтароеЗначение;

    Пер.Записать();

    КонецЕсли;

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

    Reply
  10. keifaya

    Попробуйте войти в этом случае в базу самостоятельно под указываемыми логином и паролем в немонопольном режиме. У меня подобная ошибка возникала, когда были не проиндекированы таблицы БД или неправильно указаны параметры соединения. Либо под данным пользователем уже кто-либо сидит, а в параметрах пользователя указан каталог.

    Reply
  11. keifaya

    Внесены изменения в обработку. По поводу ошибки с периодическим реквизитом — для случая когда 1С отказывается признавать периодический реквизит периодическим, сделано по совету Pap. Но, поскольку в этом случае невозможно узнать, на какую дату установлено значение, оно записывается на дату начала периода, за который переносятся объекты.

    Также внесены изменения, в процедуру OLE-соединения, что, возможно, устранит проблему, с которой столкнулся Grigory.

    Reply
  12. shicko

    Не переносит цены номенклатуры

    Reply
  13. Re:аниматор

    Обработка гут! Пожелание: сделать отбор по комметарию, т.е. когда перегружаю определенный вид, то и нужно отбор по комметарию, подобно как в обработке документов.

    Reply
  14. almatrade

    По моему мнению самая корректная программа!

    У нас кординально сменился план счетов, самый коректный перенос, не завязанный не к чему!

    Огромное спасибо!

    Reply
  15. SorEZH

    работает…

    Reply
  16. keifaya

    Спасибо за отзывы 🙂

    Внесены изменения в обработку: добавлена возможность отбора документов по комментарию.

    Reply
  17. Dodzh

    Следует называть эту обработку «Перенос документов между идентичными конфигурациями средствами OLE» Потому как справочники отдельно от документов не выгружаются. Тобишь эл.справочника выгружаются только если они входят в состав выгружаемого документа.

    Так уж получилось что мне срочно нужна «корректная» обработка по переносу справочников (1Совская не корректно работает). Наткунулся на эту и обламался.

    Reply
  18. ИванИванИван

    Данная обработка распростроняется бесплатно как есть и че хотите то и делаите или может настать такой момент когда заявится амон и скажет что я вор или я чего то не дапонял????

    Reply
  19. keifaya

    Dodzh: Вы невнимательно изучили обработку — следом за списком документов на закладке «Что переносить» начинается список справочников.

    ИванИванИван: Ну что Вы, какой омон между хорошими людьми?! 🙂

    А если серьезно, то эта разработка распространяется бесплатно.

    Reply
  20. mihenius

    Обработка оч. понравилась.

    Единственный недочет. Не обрабатывается записи в ЖурналеРегистрации по УРБД. Т.е. не рассматривается вариант, что база в распределенной базе элементы и документы могут приходить с других баз.

    Там следующие данные

    Объект = 9, Действие = 100

    Смотреть что за объект можно только через комментарий

    Reply
  21. mihenius

    Если Метаданные.Документ(ВСФ.Док.Вид()).Выбран()=1 Тогда

    {ЗАГРУЗКА ДОКУМЕНТОВ ЗА ПЕРИОД.ERT(689)}: Поле агрегатного объекта не обнаружено (Вид)

    Ошибка при загрузке справочников

    Reply
  22. consult

    ВСФ.Номер=СокрЛП(Объект.ПолныйКод());

    {D:ОБРАБОТКИ7.7ПЕРЕНОС2ЗАГРУЗКА ДОКУМЕНТОВ ЗА ПЕРИОД.ERT(164)}: 1С:Предприятие: Не задан в

    Что это, и как это исправить, подскажите

    Reply
  23. consult

    обмен происходит между ТИС 7.7, релиз 879

    Reply
  24. Sprite

    Плюсую. Вовремя пригодилось!

    Reply
  25. ivanovnm

    ТЗ.ВыбратьСтроки();

    {ЗАГРУЗКА ДОКУМЕНТОВ ЗА ПЕРИОД.ERT(141)}: Значение не представляет агрегатный объект (ВыбратьСтроки)

    Reply
  26. ivanovnm

    Имеются две идентичные конфигурации, надо выгрузить 6 новых документов из одной в другую.

    Вы будете смеяться, но НИ ОДНА ИЗ ВЫЛОЖЕННЫХ НА ИНФОСТАРТЕ, ОБРАБОТКА НЕ СРАБОТАЛА!!!

    Reply
  27. Ёпрст

    (26) вы просто не умеете их готовить..

    Reply
  28. ivanovnm

    В смысле, после сборки обработать напильником?

    Reply
  29. Ёпрст

    (28) даже на ИТС есть обработки по переносу…

    И это, что именно у вас «не переносится» и чем вы пользовались ?

    А то слишком громогласное утверждение..

    Reply
  30. Mortal

    Для своих задач более удобной обработки не находил. Хотя обработочка-то уже с «сединой на висках».

    Автору очередной плюс.

    Reply
  31. assa

    Спасибо. Пригодилась.

    К стати, немного доработал напильником в плане выстраивания документов по времени.

    Reply
  32. nikolas

    Благо Дарю!!

    Reply
  33. Nanale

    Поставила 281 релиз. В Документе Начисление ЗП при учтении документа пишет следующее:

    ПерСтавка.ИспользоватьОбъект(«Ставка»,НиО);

    {Документ.НачислениеЗП.МодульДокумента(134)}: Ставка не является константой или периодическим параметром!

    Помогите пожалуйста!!!!!!!

    Reply
  34. Arhh

    Пробовал на УТ и Бух 1.6. Все работает «как надо», все довольны. В некоторых случаях лучше чем распределенка и решает все потребности. Спасибо.

    Reply
  35. MYRZILKA123

    я соглашусь все получилось спс

    Reply
  36. Гость

    очень интересная и полезная обработка,спасибо,очень кстати

    Reply
  37. keifaya

    (33) Nanale, ошибка которую Вы описали, относится не к переносу данных моей обработкой, а к конфигурации. К тому же Вы не написали в какой именно конфигурации возникла ошибка — Зарплата и кадры? Поставила 281 релиз, в нем нет строки «ПерСтавка.ИспользоватьОбъект(«Ставка»,НиО);» в документе НачислениеЗаработнойПлаты. Перенос документов НачислениеЗаработнойПлаты работает нормально на 281 релизе

    Reply
  38. keifaya

    (25) ivanovnm, у Вас возникла ошибка с компонентной Journal.dll. проверьте, присутствет ли она по адресу C:Program Files1Cv77BIN\r

    и выполните в командной строке (Пуск / Выполнить) команду: regsvr32 c:progra~11cv77inJournal.dll

    Reply
  39. serezhka87

    Была необходимость перенести все справочники из одной базы в новую. Обработка сэкономила кучу при кучу времени. Спасибо.

    Reply
  40. AnyaIT

    RE : «Обработка выполняет перенос справочников и документов (в т.ч. все объекты по ссылкам), между двумя идентичными конфигурациями средствами OLE. Также имеется возможность переносить объекты базы, которые были изменены пользователями в определенный период» Почему-то не могу ее запустить? ошибка соединения…

    Reply
  41. chetirepda

    Отличная простая, без наворотов обработка переноса…. автору большой плюс, очень понравилась!

    Reply
  42. OlesyaBelochka

    Спасибо за обработку. Очень пригодилась.

    Reply
  43. OrsoBear

    Контроль уникальности единый для всех справочников по коду или по наименованию — нехорошее решение.

    Reply
  44. mtv-100

    Научите пожалуйста, как пользоваться этой обработкой, пошагово. Спасибо.

    Reply
  45. maksa2005

    При переноса НЕ ЗАПОЛНЯЕТЬСЯ ФИРМА!!! Бесит менять в каждом документе!!!!

    Reply
  46. natarezn

    (26) ivanovnm, кто бы сомневался ! необходимо скачать 6 обработок и быть занятым ими.

    Reply
  47. 402002

    Это самая лучшая разработка!

    База при обновлении стала выдавать ошибки, не считала, как надо, в общем намучилась я с ней и создала новую, релизов на 30 новее..

    С помощью этой программки перенесла все из старой.

    Методом проб добилась, что документы встали идеально!

    Сначала заполнить сведения об организации учетную политику.

    Закгружать в несколько этапов:

    1.Справочники

    2. Приходы

    3. Расходы.

    4. Закрытие месяца

    Оборотка — один в один!

    Спасибо вам огромное, восхищаюсь!

    Reply

Leave a Comment

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