Заполнение табличной части по любой другой табличной части




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

40 Comments

  1. Serj1C

    Работает как «Внешняя обработка табличных частей». Отлично!!!

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

    И еще. Вроде сбрасывает имя табличной части априемника при выборе документа-источника.

    Reply
  2. e.kogan

    Имя ТЧ-приёмника выбрать не так уж сложно 😉 а заморачиваться на такие мелочи уже не стали.

    В макет параметров авторегистрации каждый может добавить сам всё, что ему нужно. Обработка-то универсальная, а значит, подключается к ЛЮБОЙ конфе. Мы не телепаты — угадывать, у кого какие документы )))

    Есл иленьнаписать цикл по метаданным, выводящий табличку нужного формата, могу помочь )))

    Reply
  3. e.kogan

    Имя ТЧ-приёмника выбрать не так уж сложно 😉 а заморачиваться на такие мелочи уже не стали.

    В макет параметров авторегистрации каждый может добавить сам всё, что ему нужно. Обработка-то универсальная, а значит, подключается к ЛЮБОЙ конфе. Мы не телепаты — угадывать, у кого какие документы )))

    Если лень написать цикл по метаданным, выводящий табличку нужного формата, могу помочь )))

    Reply
  4. gutentag

    В конфигурации 1.6.10.6 (организация на УСН), Ваша обработка даже не открывается :-/

    Reply
  5. e.kogan

    (4) Вы её подключили как внешнюю обработку ТЧ? Что говорит?

    Reply
  6. gutentag

    (5) … я разобрался, спасибо 🙂 (ошибочно подключил в доп.внешние обработки)

    Протестировал на документе требование-накладная:

    -обработка, не заполняет колонку «Расходы (НУ)»

    -обработка, не заполняет данные по забалансовым счетам — закладка «материалы заказчика», например счету 003.02 при «давальческой переработке»

    В остальном, Ваша обработка понравилась 🙂

    Reply
  7. e.kogan

    Если не указан источник копирования — и не заполнит.

    Для заполнения колонки значением воспользуйтесь обработкой, выложенной чуть выше (заполнение колонки ТЧ значением).

    Reply
  8. gutentag

    (7) Извините, я все перепутал :-/

    Написанное мною в (4) и (6) относится к «Заполнение табчасти по остаткам на складе для Бухи 8.1» http://infostart.ru/profile/41675/projects/2588/

    Reply
  9. slavamts

    Мне нравится

    Reply
  10. abonement

    А у меня не подключается…((((..в чем проблема?Бухгалтерия 1.6.13.3

    Reply
  11. e.kogan

    (10) Не знаю, я не телепат. Опишите подробнее.

    Reply
  12. gutentag

    (10) После подключения через Сервис — Доп.отчеты и обработки — Доп.внешние обработки табличных частей, надо заполнить по максимальности табличную часть «Принадлежность обработки по заполнению табличных частей». Хотя бы пару строк для накладной и счета

    Reply
  13. abonement

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

    Reply
  14. abonement

    Ой,я разобралась..извините….а теперь не подскажите,как пользоваться…Заранее спасибо))))

    Reply
  15. gutentag

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

    Reply
  16. abonement

    Разобралась…отличная обработка)))))То,что я искала…только можно вопросик:а как можно сделать так,чтобы данные при переносе в другой документ из предыдущего удалялись?

    Reply
  17. turbocast

    Не работает в 1с УТ 8.1 Не переносит ТЧ из док-та переоценка товаров в рознице в док-т установка цен номенклатуры. Соответствие — по Номенклатура

    Reply
  18. e.kogan

    (17) Извините, тестировать не на чем, у нас УТ нет. ТЧ приёмника изначально пуста?

    Reply
  19. turbocast

    Да, пуста

    Reply
  20. e.kogan

    (19) ТЧ источника заполнена? В ТЧ обработки указано поле-источник и поле-приёмник, флаг «Поиск по» снят? Нажимаете «Выполнить» и не появляется ни одной строки? Тогда не знаю.

    Reply
  21. balance

    😀 Просто удовольствие работать!!!

    Reply
  22. Romarius

    Не правильно сопоставляет реквизиты, например: ЕдиницаИзмерения и ЕдиницаИзмеренияМест. Она сопоставляет первое найденное по типу.

    Нужно немного подправить:

    Если рЦелевойТип=рТип Тогда

    рПодходящаяСтрока=стро;

    Если СокрЛП(метарек.Имя) = СокрЛП(стро.ЦелевойИмя) Тогда

    рПодходящаяСтрока=стро;

    Прервать;

    КонецЕсли

    //Прервать // незанятая строка с подходящим типом

    КонецЕсли;

    и закоментировать:

    //Если рПодходящаяСтрока<>Неопределено Тогда Прервать КонецЕсли;

    Reply
  23. AZok

    У меня почему то дает выбрать исходным объектом, только аналогичный принимающему…(8.1.15.14 БП -2)не пойму что не так делаю….

    Reply
  24. el_diaz

    что то не пойму. Хочу перенести ТЧ товары из Авансового отчета в Поступление товаров и услуг. И источник и приемник одного типа, то есть или из Авансового отчета в авансовый или из ПТиУ в ПТиУ…

    ЗЫ. 1С 8.2 Комплексная автоматизация 1.1.6.1

    Reply
  25. asg1975

    Полезная вещь! Для себя докрутил только автовыбор типа документа источника, а то как-то ни с руки выбирать каждый раз тот тип документа из которого нужно скопировать ТЧ. Ну это чисто мой случай. В целом ЗАЧЕТ!

    Reply
  26. Likusia

    (25) asg1975, а можно получить ваш вариант с автовыбором?

    Reply
  27. iov

    Вот такая вот беда.

    Reply
  28. e.kogan

    (27) Стоп, а в чём проблема-то? С левой стороны можно спокойно переуказать поле-источник.

    Reply
  29. iov

    (28) 1 раз — да. регулярно — не комильфо.

    Reply
  30. kg0

    УТ 10.3.8.9

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

    В диалоге подключения пишет, «Настроить авторегистрацию», отвечаю Да, заполняется список документов,

    сохраняю, открываю вновь диалог создания-редактирования внешней обработки — но там список документов (список Принадлежность) — пуст.

    Соответственно, никак обработку не запустить, если запускается — то выдает окно со значениями параметров авторегистрации (список документов).

    Reply
  31. e.kogan

    (30) ничего не поняла. вызываете из документа, по кнопке «заполнить» над табчастью?

    Reply
  32. brato4karik

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

    Reply
  33. e.kogan

    (32) А ввод на основании уже не катит?

    Reply
  34. anc2002

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

    Пригодилось

    Reply
  35. alex_asoft

    спасибо , пригодилось

    Reply
  36. EugeneR1c

    Благодарю за обработку!

    Reply
  37. sick_russian

    Хорошая обработка!

    Reply
  38. Alex1Cnic

    Спасибо автору… и предлагаю свою идею обработку http://infostart.ru/public/22454/

    Универсальная обработка заполняет выбранные реквизиты и табличные части по любому документу-основанию, в любых конфигурациях.

    Новшества (18-07-2013):

    1) Добавление версии обработки для платформы 1С 8.2

    2) Доработка самой обработки: появилась новая функция автоматического соответствия реквизитов и табличных частей при выборе вида документа-приемника

    Reply
  39. e.kogan

    (38) Alex1Cnic, я в таких случаях использую http://infostart.ru/public/70480/ — она гибче.

    Reply
  40. chmv

    Отлично!!!!!!!!! Огромное Спасибо

    Reply

Leave a Comment

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