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




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

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