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




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

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 не будет опубликован. Обязательные поля помечены *