Универсальная обработка "Помощник ввода на основании для 1C v7.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='\

46 Comments

  1. O-Planet
  2. sCHTASS

    Судя по описания, шутка нужная. Посмотрим, ка можно будет вкрутить в свою конфу.

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

    Похоже, полезная вещь. Жаль, платформа не указана…

    Reply
  4. leov-001

    (3)

    А из скриншотов не видно что 1Cv77

    Reply
  5. hame1e00n

    Да, желательно конечно бы конечно указать платформу 😉

    Reply
  6. Ёпрст

    >>>»Главный минус обработки — введенный на основании документ при открытии формы уже записан в базу и этот «минус» никак не побороть используя внешнюю обработку.»

    1 строчка кода, если позволяет религия и записывать не обязательно.

    Reply
  7. Ctrl P

    6 просвяти пожалуйста, просто на форуме т1с тема: «как работать с табличной частью через контекст?» возникает постоянно и всегда один ответ — «НИКАК»

    Reply
  8. Ёпрст

    (7) «Никак» ? Вас жестоко обманывают. Есть как «штатные» способы, так и «нештатные».. самый простой — написать 1 строчку в обработке:

    ЗагрузитьВнешнююКомпоненту(«FormEx.dll»);

    и привет — всё будет работать через контекст открытой формы.

    Reply
  9. Ctrl P

    Ну с формЭкс может быть, но я не любитель внешних компонент, я фри по 1С, права на компах часто ограничены я не имею к ним никакого доступа (к настройкам прав) и поэтому заморачиваться с внешними длл не люблю… если есть штатные без использования ВК я с удовольствием воспользуюсь…

    Reply
  10. Ёпрст

    (9) формекс давно не требует регистрации в реестре, и на права и про «нелюбовь»

    можно тут не писать..

    Про штатные методы лень писать.. одно и тоже по 100 раз.

    Reply
  11. Ctrl P

    10 можно и не писать, но я их не пользую и в своих поделках чужие поделки не использую…

    Reply
  12. Ctrl P

    их имеется ввиду ВК… если хотите религия у меня такая…

    Reply
  13. Ёпрст

    Штатно — если только передавать параметром, либо модальность, либо эмуляцией F9 в журнале + прибитие доков… но это всё извраты.. в разы проще перейти в новую веру и не мучаться.

    Reply
  14. Ctrl P

    13 ну это все известно, только для этой идеи не подходит, мож как-нить перейду в новую веру…

    Reply
  15. Ёпрст

    (14) переходи ..многие вещи в разы быстрее и проще делать будуться..

    Reply
  16. klimat_oksana

    а почему номенклатуру не заполняет?

    Reply
  17. Ctrl P

    16, не знаю, а по-подробней можно? где не заполняет? Какую номенклатуру?

    Reply
  18. Ctrl P

    Есть не большой косячок,

    В процедуру приоткрытии добавьте в самое начало строчку

    ФС.УстТекКаталог(гПуть);

    Reply
  19. Доня

    хрошо

    даже в УСН идет

    молодец

    Reply
  20. Ctrl P

    19 обработка полностью оправдывает название «Универсальный помощник…» т.е. подходит для ЛЮБОЙ (и даже самописной) конфигурации и помогает организовать Ввод на основании без конфигуратора…

    Reply
  21. ZiKoman

    Все хорошо, только не запоминает путь к файлам настройки, всякий раз после очередного запуска 1С приходится искать файл обработки через Файл-Открыть, после чего все работает как обещано, может я чего-то недопонял?

    Reply
  22. CheBurator

    было бы неплохо например при инициализации значения некоего реквизита возмоэжность выполнять формулу.. например: при вводе на основании меняется дата документа и должна быть пересчитана датаоплаты…

    Reply
  23. Ctrl P

    21 см 18, в следующей версии будет исправлено, но следующая версия будет после отпуска

    22 чёт не понял, объясни на пальцах, для каких документов тебе нужна какая формула?

    Reply
  24. Ctrl P

    22 насколько я понял в версии v7.7.004 реализованно именно то, о чем вы писали…

    Reply
  25. ZiKoman

    Ура! заработало! после выполнения (18)

    Reply
  26. Oleg812

    Я делал такую доработку в конфигураторе. Курочить конфигуратор — и хорошо, и плохо. Если работаешь на окладе, — лучше внешняя. Если платят за вызов, то лучше курочить, привязывая таким образом клиентов к себе по обновлениям. А за созданную обработку — большое спасибо. Вещь нужная.

    Reply
  27. Ctrl P

    дааа, походу я накосячил и в архив положил не ту обработку zapusk.ert — вечером исправлю…

    Reply
  28. nata75

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

    Reply
  29. Лена_Лена

    Спасибо, за обработку, мне как единственному бухгалтеру в строительной фирме очень помогает данная обработка. Спасибо.

    Reply
  30. kalash75

    ая вобще скачать не могу(((( завтра надо сумму налога а уменя завал((( столько поступлений надо ввести…капец…

    Reply
  31. kalash75

    так скачала спасибо, но пытаюсь ввести поступление на основе авансового, номенклатура пусто(((( что посоветуете?

    Reply
  32. kalash75

    программа запуск ert вообще не запускается.это для чего она?

    Reply
  33. Ctrl P

    32 из описания:

    В архив добавлен загрузчик обработки: Если у вас несколько одинаковых баз что бы не настраивать одно и тоже на все базы

    добавлен файл zapusk.ert, теперь достаточни его поместить в PrnForms, а обработку vvodosn.ert в любое доступное место,

    в регистрации печатных форм регистрируете zapusk.ert. При первой попытки ввода на основании откроется диалог в котором необходимо

    указать путь к обработке vvodosn.ert, и в дальнейшем загрузчик будет перенаправлять данные в эту обработку… т.о. из разных баз можно попасть в одну обработку с одинаковыми настройками…

    Reply
  34. Ctrl P

    офигеть, щас глянул на свой последний пост, я этой обработкой не занимался уже больше двух лет…

    31. врятли я щас вспомню че там и как работает, если уж сильно нужно высылайте файл настроек (он где то должен лежать рядом с файлом обработки) гляну че там у вас, может вспомню че нить…

    Reply
  35. Belka063

    Отличная обработка.Работает на УРУ

    Reply
  36. musatov1c.ru

    Спасибо автору большое. Почти мгновенно настроил формирование в бухгалтерии 77 расходной накладной из прихода. Легкие деньги 🙂

    Reply
  37. antares_of

    А она будет работать в не стандартных конфигурациях? В 1с:Школьное питание например?

    Reply
  38. Ctrl P

    (37) antares_of, будет, к конфигурациям привязки никакой нет…

    Reply
  39. antares_of

    Отлично работала в 1с:ШП. Ввел расходники на основании приходников, быстро и удобно, спасибо

    Reply
  40. Tatiana71

    Добрый день!

    Уточните, пожалуйста, эта обработка позволяет формировать документ «Отгрузка товаров, продукции» на основании документа «Поступление товаров» И актуальна ли она для действующей на настоящий момент платформы 1С 7.7. (релиз 7.70.547)?

    Reply
  41. Tatiana71

    Как скачать программу?

    Reply
  42. Ctrl P

    40 если настроете, то будет… настраивать конечно лучше программисту…

    41 ну как обычно

    Reply
  43. klimat_oksana

    (18) «Есть не большой косячок,

    В процедуру приоткрытии добавьте в самое начало строчку

    ФС.УстТекКаталог(гПуть); »

    Подскажите, пожалуйста, (гПуть) — так и писать или прописывать что-то типа «Номенклатура»?…..

    ФС.УстТекКаталог(гПуть<<?>>);

    {,,,,,,,,,,,,,,,,,,,}: Переменная не определена (гПуть)

    Reply
  44. Лена_Лена

    Добрый день! Подскажите пожалуйста, возникла необходимость загружать данные из excel в документ Бухгалтерская справка, вернее ввести на основании отгрузки материалов, — поступление на Д-т сч 003 (в 7.7 это можно ввести только документом Бухгалтреская справка), Но так как в Бухгалтерской справке субконто тип значения имеет «неопределенный», не получается ввести в Бух справку. и счет 003 (ли любой другой из плана счетов) не вводится ( и к нему Субконто, не ищет материалы в справочнике,т.к тип значения «неопределенный»). Как можно решить, подскажите?

    Reply
  45. Ctrl P

    (44)насколько я помню в 7.7 это решается через выгрузку Табличной части в Таблицу значений, в ней заполняются колонки неопределенного типа автоматически происходит приведение к нужному типу, а затем загружается ТЗ обратно в ТЧ. Найдите в этой обработке место где заполняется табличная часть и вставьте ТЧ.ВыгрузитьТабличнуюЧасть() и потом ЗагрузитьТабличнуюЧасть(), ну а между ними соответственно заполняйте полученную ТЗ.

    Reply
  46. Лена_Лена

    (45) Ничего не поняла из написанного, это нужно найти где то в модуле? Пользуюсь вашей обработкой давно, как бухгалтер, а вот то, что написано выше непонятно, для меня как бухгалтера, ), но спасибо за ответ!

    Reply

Leave a Comment

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