Работа со справочниками 1С:Предприятие7.7 ("все под рукой")




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

57 Comments

  1. Арчибальд

    Надо полагать, что последует и работа с регистрами 😉

    Плюс однозначный.

    Reply
  2. 1Cworking

    (1) боюсь, что тогда ФАС займется мной.

    Reply
  3. rimma_n

    очень хороший инструмент. интерфейс понятный и не перегруженный кнопками

    Reply
  4. Арчибальд

    (2) ФАС никем не занимается без команды ФАС с самого верха 😀

    Reply
  5. ChugaevArtem

    Хорошая вещь! Особенно для сотрудников «поумнее», которые вечно подчищают за теми у кого ручонки «кривоватые»! Однозначно +! 🙂

    Reply
  6. Sprite

    Плюс за работу.

    Замечание:

    Но выгрузку и загрузку справочников надо обязательно сделать по ссылке http://www.infostart.ru/public/14315/.

    Отличается тем, что умеет (позволяет) работать с большими объемами справочников. Использует возможности расширения V7PLUS.DLL. ❗

    Reply
  7. 1Cworking

    (6) теперь с использованием возможности расширения V7PLUS.DLL

    Reply
  8. kliman

    класс!

    Reply
  9. rasswet

    ЗафиксироватьТранзакцию();

    {F:\_С ИНЕТАРАБОТАСОСПРАВОЧНИКАМИ.ERT(1196)}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию

    ***

    выгрузил справочник Договора. типовая бух.

    изменил в базе коды трех договоров. хочу увидеть, что при загрузке не найдет по коду трех элементов, но на закладке загрузка нет доступа к установке реквизитов, по которым искать. т.е. не могу поставить там флаг «код»(( при попытке сделать такой маневр со справочником контрагентов всё прошло отл. т.е. показало правильно, у каких элементов коды я изменил…

    для подчиненных нельзя искать по коду? или что?

    Reply
  10. Filipp_inf

    Проверено в работе. Класс!!!

    Хотелось бы разнообразить тип файла выгрузки и загрузки —

    Excel намного бы расширил круг применения данной обработки.

    А так все очень понравилось, жаль что нельзя ставить за разработку не просто плюс, а конкретную оценку, т.е. много плюсов.

    Reply
  11. 1Cworking

    (9) Неверно определялся пустой/непустой подчиненный справочник. Ошибку исправил.

    (10) давай обработку выгрузки и загрузки —

    Excel, вставлю.

    Reply
  12. rasswet

    (11) у нас сейчас такая задача. в двух базах вносят контрагентов и договора к ним. т.е. в одной код с120-это ООО Солнышко, а в другой а41 это тоже Солнышко ООО. попробую с помощью выгрузки-загрузки твоей обработкой сделать синхронизацию по коду. т.е. в конце месяца все коды в обоих базах должны быть одинаковы.

    Reply
  13. rasswet

    (11) спасибо, баг пофиксился. а можно в таблицу несуществующих элементов добавить Владельца, для подчиненного, и код Владельца. а также код загружаемого элемента? тогда это полностью решит мою задачу..

    очень хочется. заранее спасибо!

    Reply
  14. 1Cworking

    (13) т.е. добавить колонки с этими данными? можно все обсудить по icq

    Reply
  15. rasswet

    (14) да, добавить дефолтную колонку код справоничка, а для подчинных справочников ещё и колонку владелец. можно в виде Код+Наименование. Имхо это будет идеальный вариант, отлавливать изменения.

    Reply
  16. ChugaevArtem

    Господа программисты… однако мы всегда забываем прописывать в циклах, которые могут длиться очень долго, возможность прерывания! Убедительная просьба не забывайте этого делать! =) всего то 1 строчка в каждом цикле! =)

    Reply
  17. ChugaevArtem

    (16) Млин… это ведь в восьмерке все так просто сделать… в 7-ке не могу найти аналога восьмерошной процедуре ОбработкаПрерыванияПользователя(); 😥

    Reply
  18. 1Cworking

    (15) добавил колонки в таб.несуществующих эл. со значениями реквизитов из поля со списком несуществующих эл.

    Исправил ошибки, добавил новые возможности. Новые строки в описании помечены «New!»

    Reply
  19. rasswet

    (18) ну теперь по-моему близко к идеалу! ещё бы 💡 в табличку

    с колонками «загружать, наименование, родитель, владелец»

    добавить Код элемента который указан в Наименование и код владельца.

    потому что например имеем в базе ООО солнышко с кодом С00045, а грузим Солнышко с кодом 00058, так бы сразу видели, что в базе надо перебить руками с00045 на 00058…

    Reply
  20. marsohod

    5300 строк … 😮

    Солидно … 😮

    Reply
  21. Altair777

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

    Reply
  22. Altair777

    +(21) Это при нажатии на кнопку «Выбрать элементы»

    Reply
  23. 1Cworking

    (22) исправил, проверь.

    Reply
  24. Altair777

    (23) Ошибок нет

    Reply
  25. 1Cworking

    1. Исправлена ошибка: при печати подч.справочников порядок следования реквизитов в шапке не соответствовал порядку в теле таблицы.

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

    Reply
  26. Altair777

    (0) хм… разочарование…

    Только группы. Условие по родителю. Выбрать элементы.

    Показывается только 11 групп.

    Reply
  27. Altair777

    +(26) При чем первая показывается неправильно.

    Кто Вам сказал, что группа сама себе родитель?

    И кто Вам сказал, что пихать эти группы в

    Перем гУслР1,гУслР2,гУслР3,гУслР4,гУслР5,гУсл
    Reply
  28. 1Cworking

    (27) благодарю за тестирование, ошибку исправил.

    Reply
  29. adeni30@mail.ru

    Полезная обработка. Буквально вчера с её помощью в очередной раз подправлял косяки коллег.

    Reply
  30. montanaw

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

    Reply
  31. 1Cworking

    10.02.2010 изменения:

    — в условиях выбора добавлена клавиша «Очистить значение»

    — если в условии выбора задан Родитель с пустым значением, то будут выбраны элементы, находящиеся в корне справочника (без родителей) .

    Reply
  32. Erroroot

    Автору спасибо большое прибольшое!!!!!!!!! классная обработка!!! Очень долго искал что то подобное!!!! ❗ 😀 +1000000000000000

    Reply
  33. homichochik

    Очень полезная вещь, Спасибо!!

    Reply
  34. shpal

    Очень полезная программа.

    А как выгрузить справочник, у которого только Код и Наименование? 😎

    Reply
  35. 1Cworking

    (34) Спасибо за вопрос. Похоже до сего дня никто не работал со справочниками, в которых только код и наименование. Исправил ошибки, связанные с даннами типами справочников. Теперь можно выгружать такие справочники.

    Reply
  36. Cvetic

    Спасибо 🙂

    Reply
  37. Altair777

    Честно говоря, устал я уже находить ошибки!

    Ну сколько можно? 😀

    Reply
  38. 1Cworking

    (37) Есть аксиома: «В каждой программе есть хотябы одна ошибка». И ничего страшного, что и в этой обработке есть ошибки. Один из плюсов — выложить обработку на данном сайте — это тестирование данной разработки всеми пользователями (своеобразная оплата за бесплатное пользование). И никто никого не заставляет искать ошибки, все делается бесплатно и на добровольной основе. Ну, а раз Вы устали, идите отдохните, и не тратьте свои силы на пустяки. А за найденные ошибки, всем — спасибо! Обязательно исправлю после отпуска

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

    Reply
  39. Altair777

    (38)

    Есть аксиома: «В каждой программе есть хотябы одна ошибка»

    см. (21), (26), ну и (37) 🙂

    Это только те ошибки, которые нашел я. Самое обидное в этих так называемых «обработка предназначена для работы со справочниками в любой конфигурации 1С:Предприятие 7.7» это то, что на них надеешься.

    А когда они действительно вдруг нужны, то оказывается что они не работают.

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

    P.P.S. Похоже, что сбилась нумерация комментов. У меня показываются именно такие — 21,26,37.

    Reply
  40. 1Cworking

    (39) «Самое обидное в этих так называемых «обработка предназначена для работы со справочниками в любой конфигурации 1С:Предприятие 7.7″ это то, что на них надеешься. А когда они действительно вдруг нужны, то оказывается что они не работают.» — сразу было понятно откуда раздражение.

    «У меня сложилось такое впечатление, что те, кто плюсовал эту разработку, использовали только те возможности, которые нормальный программист может написать за 5-30 минут» — если Вы себя причисляете к нормальным программистам, то могли бы исправить эту ошибку за 5-30 сек (код открыт, да и ошибка элементарная) и выложить исправление ошибки. У 1С в каждом релизе немеренное кол-во ошибок и ничего работаем, не устаем.

    Reply
  41. natasha_za

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

    А то я уже замучилась с кодами в номенклатуре (на каждую группу — свой код, а по сути он никому не нужен (на моей фирме)).

    Reply
  42. 1Cworking

    (37) Была ошибка: при задании в условии выбора родителя и других реквизитов — неправильно формировался запрос.

    Ошибка исправлена . Добавлен новый флаг «выбирать без использования запроса». Если при выборе элементов возникает ошибка запроса, то можно установить флаг «выбирать без использования запроса» и повторить выбор. Об ошибке не забудьте сообщить разработчику!

    Reply
  43. 1zbf

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

    Reply
  44. 1Cworking

    (43) Попробовал у себя, проблем нет, все перенумеровывается без ошибок. Пришлите пож метаданные и выгрузку вашего справочника. Все это можно получить в обработке «Работа со спр».

    Reply
  45. Pavean

    Действительно при попытке перенумеровать справочник с неуникальными кодами выдаёт ошибку что код не уникален.

    >РАБОТАСОСПРАВОЧНИКАМИ.ERT(3609)}: Код не уникальный!

    Reply
  46. 1Cworking

    (45) Что значит «справочник с неуникальными кодами»?

    Пришлите пож метаданные и выгрузку вашего справочника. Все это можно получить в обработке «Работа со спр».

    Reply
  47. Pavean

    2 46

    Справочник с не уникальными кодами это справочник в котором есть два и более элемента с одинаковым кодом. Достигнуто это было за счет УРБД.

    А мои метаданные и мой справочник Вам вряд ли что-то дадут. Дело именно в том что есть элементы с одинаковым кодом. Поэтому нумеровать их с 1 по N не получится.

    Я сначала в одном цикле присваивал им новый код чтобы устранить дубли, А потом в другом уже присваивал номера как мне надо.

    Reply
  48. 1Cworking

    (47) Спасибо за разъяснение.

    Reply
  49. Altair777

    (40)

    то могли бы исправить эту ошибку за 5-30 сек

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

    А насчет хороших программистов… Вы уже исправили ошибки, которые обещали пофиксить в (38)?

    Reply
  50. 1Cworking

    (49) См. (42), можете тестировать.

    Reply
  51. Altair777

    (50) ясно, сбилась нумерация комментов

    Reply
  52. rew

    часто выручает обработка и фильтр, автору «+»

    Reply
  53. Sergik010

    Спасибо. Часто пользуюсь. Особенно выгрузкой-загрузкой и перенумерацией, да и в этой обработке много других полезных возможностей. Огромный плюс!

    Reply
  54. Sasha25

    Спасибо. Очень помогла перненумерация и добавление префикса к коду справочнику.

    Reply
  55. Sasha25

    Многофункциональная полезная обработка

    Reply
  56. Лена_Лена

    Спасибо, разработчику полезная обработка, многофункциональная!

    Reply
  57. pipulas

    Спасибо, хорошая обработка.

    Reply

Leave a Comment

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