Удобный менеджер для работы со справочниками в 1С




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

68 Comments

  1. MarSeN

    Добавьте архивацию ) — выгружает в хмл и пакует куда нить)

    Думаю надо обязательно прикрутить проверку на целостность и предупреждать перед удалением элемента.

    На мой взгляд, пока не столкнешься с проблемой, подобной вашей, не оценишь всю прелесть вашей обработки.

    Reply
  2. tango

    +(1) загружает чё-нить и распаковывает 🙂

    Reply
  3. DrAku1a

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

    Reply
  4. OBEH

    Старый добрый командер.

    Для возможных идей.

    Может быть, стоит сюда добавить функции работы с документасми и прочими объектами конфигурации?

    Еще, может быть, сделать возможность «подключения» внешних обработок и прочего.

    Reply
  5. mikmike

    Поле для развития гигантское — вся конфигурация и весь функционал файловых менеджеров 🙂

    Поддерживаю про проверку целостности, но и безусловное удаление тоже нужно — в принципе как это и есть в том же фаре — лично я его больше люблю :):)

    Reply
  6. GoodZone

    Клевая идея, можно развивать ))) плюс однозначно

    Reply
  7. PowerBoy

    Где-то я уже подобное видел? А вот где:

    http://infostart.ru/public/65473/

    Reply
  8. yuraskas

    Интересные идеи, надо будет обязательно внедрить, особенно понравилось с выгрузкой-загрузкой, даже отельных ветвей, как в реестре.

    Reply
  9. mzelensky

    Прикольная штука!

    Reply
  10. Evil Beaver

    И удаление дублей туда же. На ИТС есть, только встроить, чтобы под рукой было.

    Reply
  11. Alex1Cnic

    Слушай отличная идея! точно ПЛЮС

    Reply
  12. StepByStep

    Прекрасная идея. Просто и красиво. Плюс.

    Reply
  13. ivanov660

    Свежо и оригинально. Идея мне понравилась. Ставлю плюс. На управляемых формах осилите?

    Замечания, я бы изменил:

    1. Названия — создать группу вместо создать каталог. Я так понимаю планируется отдать пользователям и им незачем еще новые синонимы терминов вводить.

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

    Reply
  14. mdv0572

    Как раз занимался наведением порядка в справочнике «Номенклатура», а тут эта обработка подвернулась. Удобства ощутил по полной. Практически 90% манипуляций произвел без мыши — ОЧЕНЬ удобно. Неплохо было бы добавить выделение строк пробелом, как в ТК.

    Автору заслуженный +.

    Reply
  15. ogoneksergei

    Идея супер. Для сортировки просто незаменима. Можно добавить просмотр ссылок на объект.

    Reply
  16. Temniy

    Любопытно. Плюс автору

    Reply
  17. yuraskas

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

    Reply
  18. ShantinTD

    Проверку на целостность — однозначно нужно!

    Можно просто не отображать помеченные на удаление (или отображать опционально).

    Reply
  19. yuraskas

    ок, проверка на целостность будет по умолчанию.

    Reply
  20. smir

    Интересно 🙂 вот бы 1с сделало это в типовых.

    Reply
  21. mdv0572

    И еще небольшое замечание — не хватает кнопки синхронизации левой и правой части.

    Reply
  22. fuxic

    1. Поведение кнопки «удалить» — полное или пометка лучше сделать настройкой с предупреждением при установке. В настройки — прятать/отображать помеченные на удаление

    2. Путь — толькоПросмотр, чтобы копировать и редактировать для перехода

    + запоминать любимую папку в выпадающий список

    3. Панель любимых справочников с выбором иконки

    Reply
  23. fuxic

    А в прочем… Это же не ежедневная работа))

    Reply
  24. DAnry

    Нравится ТоталСомандер — удобный. Теперь вот что-то похожее для 1С. Что ж попробуем. Очень интересно…

    Reply
  25. GATTUSO

    Идея оригинальная, красава! 🙂

    Reply
  26. bulas

    Интересные «пассатижы». Можно рядом с кнопкой Удалить поставить кнопку Ссылка, чтоб лишнего не «крякнуть».

    Reply
  27. AZel84

    Предложения

    1. Сделать кнопку «Настройки»

    2. В настройках выбор варианта удаления:

    — Пометка удаления

    — Непосредственное удаление с проверкой (в этом случае происходит поиск ссылок на элемент)

    — Непосредственное удаление без проверки

    Reply
  28. yuraskas

    Да, доп.форма «Настройки» будет обязательно.

    Reply
  29. rus128

    плюсую за оригинальность идеи!

    Reply
  30. Yashazz

    (6)(13)(25)(29) Это — оригинально? Кхм. Эта идея существует столько же, сколько файл-менеджеры двухпанельного вида и 1С как таковая. Я делал это ещё на 7.7, правда, не для справочников, а для смысловой принадлежности документов в журнале, но не суть.

    И обработки похожего вида на ИС уже точно бывали. Если вы такого не помните, это не значит, что до вас его не бывало.

    А судя по тому, что «добавлен лишь два основных справочника» — это ещё и не универсал, хотя такой универсал сделать элементарно.

    Кнопка «Создать каталог» вгонит юзера в ступор, лучше напишите «Создать папку» или «группу».

    Драгэндропа, подозреваю, нет, а его многие юзверя любят.

    В общем, новое — это хорошо забытое старое. )))

    Reply
  31. yuraskas

    специально не сделал выбор из всех справочников, здесь это лишнее

    Reply
  32. Algiz

    Оставлю заметочку, на досуге посмотрю

    Спс автору

    Reply
  33. AzagTot

    Спасибо автору!

    Идея отличная, поле для дальнейшего развития безгранично 🙂

    Reply
  34. yaguarrr

    Огромное Sorry, щелкал на «+» -влепился почему-то минус. Достойная обработка

    Reply
  35. KliMich

    Спасибо! Оригинальная идея

    Reply
  36. SVGS

    Спасибо.

    Идея — отличная!

    Удаление без всяких предупреждений чрезвычайно опасно…

    Солидарен с:

    Предложения
    1. Сделать кнопку «Настройки»
    2. В настройках выбор варианта удаления:
    — Пометка удаления
    — Непосредственное удаление с проверкой (в этом случае происходит поиск ссылок на элемент)
    — Непосредственное удаление без проверки
    Reply
  37. glek

    Класс. Осталось сделать цветовую схему и панельку в стиле нортона ))))

    Reply
  38. shard

    плюс за интересную мысль) как вариант можно добавить верхним уровнем перечень справочников из метаданных (как в тотале перечень дисков, правда там опционально)

    (30) Yashazz, а еще говорят что новое — это хорошо восстановленное старое)

    Reply
  39. shard

    еще можно добавить переименование по F2 и переход в корень по ctrl+

    Reply
  40. DrAku1a

    Немного позаморачивался — вот что вышло (см. вложение). Баловство всё это 🙂

    Reply
  41. yuraskas

    поле для дальнейшего развития безгранично :), ех было бы время побольше.

    Reply
  42. vbuots

    Прикольно.

    Reply
  43. sudmorsh

    Спасибо! Оригинальная идея

    Reply
  44. ShantinTD

    что-то потерялся: кто-то тут писал, что нужно добавить «как корень диска выбор справочника». тут или смену справочника на обе панельки одновременно (чего пользователь не всегда ожидает), или перемещение номенклатуры в контрагентов. =) а этого не ожидает ни номенклатура, ни контрагент. 🙂

    Reply
  45. yuraskas

    (45) ShantinTD, не понял смысла данного поста.

    Reply
  46. ShantinTD

    (46) все очень просто. Тут кто-то что-то писал о том, что по аналогии с переходом в корень диска (и выходом на список дисков) в тотал коммандере можно сделать смену вида справочника.

    На мой взгляд этот вариант — неудачный. Вполне достаточно предложенного Вами (выбор из списка) и в (41) DrAku1a (кнопка «F12 Сменить справочник»).

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

    Reply
  47. Boudybuilder

    Глядя на такой ТС — осень меняется на весну! И на душе стает тепло.

    Reply
  48. pt_olga

    тяжеловато для восприятия, пользователям такое лучше не показывать 🙂

    плюс за идею

    Reply
  49. echo77

    Идея хорошая

    Reply
  50. Synoecium

    Красиво и эргономично, однозначно плюс)

    Reply
  51. yoyoman

    У меня одного не работает переключение между панелями по TAB

    Reply
  52. Abadonna

    (47) ShantinTD,

    то и хранить его нужно в группе «покупатели первой организации» (пофиг, что он за все два года своего существования в базе купил всего один раз, два года назад. зато поставляет товар другим организациям в этой же базе — постоянно).

    Пример лишний раз подтверждает мою давнюю нелюбовь вообще к папкам внутри справочника «Контрагенты».

    Еще в 7.7 безжалостно истреблял папки «Покупатели» и «Продавцы», делая «плоский» справочник.

    А если Контрагент вообще «фифти-фифти»? Куда его отнести?

    P.S. ShantinTD, а у вас, как я понял, внутри еще и подпапки по организациям? — вообще офигеть!

    Reply
  53. ShantinTD

    (53) Abadonna, у нас было несколько отдельных бухгалтерских баз. Потом их решили объединить.

    В результате у нас папки вида «Покупатели первой организации», «покупатели второй организации» и так далее (всего организаций ~10), и с поставщиками такая же фигня. А еще сотрудники, налоговые, «Прочие» (куда же без них?!), прочие и не рассортированные по папкам. Налоговые, кстати, тоже хитро разложены: часть в специальную группу «налоги и фонды», а часть — по разным другим группам.

    И для вновь созданных контрагентов зачем-то сохраняется эта ахинея.

    В приведенном мной примере контрагент действительно сначала стал однократным покупателем первой организации, а потом — постоянным поставщиком для оставшихся девяти.

    Переубедить бухгалтера не удается до сих пор.

    P.S. О том, чтобы придерживаться какого-то минимального шаблона наименований (например: НазваниеФирмы, ИП/ООО/ЗАО/…) — и речи не идет — названы они в абсолютном беспорядке: Общество с ограниченной ответственностью Поставщик1, ООО Поставщик2, «Поставщик3» ИП, И.О. Поставщика4 ИП, ИП Поставщик5 И.О.

    Ну-ка найди нужного… «без поллитры не разберешься».

    Reply
  54. yuraskas

    (54) ShantinTD, а чем они мотивируют отказ от наименования по шаблону??? Им же и работать то легче будет.

    Reply
  55. ShantinTD

    (55) если бы они чем-то мотивировали!!! «Нам так удобно!» — вот у них аргумент.

    Я им предложил воспользоваться Вашей обработкой — «ха, ха, прикольно, но нам не нужно, нам и так нормально!»

    Непробиваемо!

    Тут еще следует сказать о том, что очень немногие пользователи 1С из виденного мной множества таковых умеют пользоваться клавиатурой в 1С. В 98% случаев все(!), кроме ввода текста, они делают мышкой. И начинают кричать «а-а-а-а-а! что ты сделал?», когда показываешь им что-то с клавиатуры.

    Благо, что я залезаю в бухгалтерию изредка (счет выставить), и «своих» контрагентов завожу так, что найти их не составит труда.

    Reply
  56. newold2

    Еще не смотрел. Но за подход +.

    Reply
  57. tamidi

    Интересно, надо будет попробовать. В Винде работаю только через файловые менеджеры, может и в 1с стоит.

    Reply
  58. KliMich

    Огромный плюч за идею!

    Очень удобно для корректировки в Номенклатуре (особенно когда нет ответственного за порядок)

    Reply
  59. Nuuq

    Классно! Остался только один штришок — заменить стандартную иконку обработки в заголовке на ту желтую дискетку в топике 😉 Удачи!

    Reply
  60. mrmasson

    Идея интересна. Почему кнопка просмотр не работает ( даже не предусмотрено, что она будет работать)?

    Reply
  61. WalterMort

    Тысячелетний баян:

    http://infostart.ru/public/65473/

    На данный момент есть версия Data Commander 2.4 под 8.2, на недельке выложу и её.

    Выбранные прикладные объекты (не только справочники) можно быстро слить в одну ссылку, удалить непосредственно и т.д. Можно обрабатывать ссылки, полученные запросом. Также можно вытащить данные из внешних БД через ADO, запросом к другой базе (7.7, 8.2), MXL, и обработать их, например, произвольным алгоритмом.

    Reply
  62. yuraskas

    (62) WalterMort, выкладывай, посмотрим. Кстати, после того, как я выложил свою, появилось еще 3 аналога. :))))

    Reply
  63. WalterMort

    (63) Публикацию подготовлю попозже, плюс дошлифую до состояния «можно выложить». Текущая 2.3 вот, http://www.fayloobmennik.net/3342014 если любопытно.

    Reply
  64. dmbal

    Отличная обработка. Только сразу к ней прикрутил множественный выбор, и удаление все же заменил на пометку удаления. А то уж очень круто 🙂

    Однозначно плюс за работу!

    Reply
  65. vms_367

    F4 можно вставить — для просмотра, а F3 — переименовать (переделать) для поиска.

    Reply
  66. Mi4man

    Уважаемый автор, предлагаю следующую идею!

    Используя механизмы моей публикации можно к Обработке прикрутить обмен между базами. Например, в левой части окна будут справочники (документы) из ИБ1 , а в правой — справочники (документы) из ИБ2. Далее будет кнопка «Копировать», которая запускает механизм обмена через xml.

    Обсудим?

    Reply
  67. bandru

    При копировании справочника поддерживается копирование подчиненных справочников?

    Reply
  68. yuraskas

    (68) Нет. Такой задачи не стояло.

    Reply

Leave a Comment

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