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




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

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