Флажки (галочки) в списках документов обычных форм в 1С Предприятии 8.2, 8.3




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

17 Comments

  1. Yashazz

    Что-то я не понял: если вы всё равно храните данные во временных коллекциях, зачем было привязываться к пометке удаления? Изврат же.

    Reply
  2. Art1387

    А зажать ctrl и мышкой выделить нужные документы, потом все действия, действие — не вариант?

    Reply
  3. miniogn

    (1) > Изврат же.

    Ну да. По другому не удалось галочки пропихнуть в список. Такой вот обходной маневр.

    (Изменение пометки на форме на документ ни как не влияет).

    (2) > выделить нужные документы

    Множественное выделение это хорошо. Но иногда нужно по другому.

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

    Reply
  4. Yashazz

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

    Reply
  5. miniogn

    (4) Возможно можно и обойтись. Возможно подумаю

    Reply
  6. miniogn

    (4) Поразмыслил.

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

    >бойтись безо всяких пометок удаления

    И да, в чем криминал?

    Reply
  7. Yashazz

    И ещё, если надо хранить связку между ссылкой на документ и некой пометкой, делайте соответствие и по факту наличия ссылки в нём определяйте, есть ли эта пометка. Быстрее будет, чем список и массив.

    Reply
  8. miniogn

    (7) Согласен, быстрее, по этому сразу так и сделал. Название переменной наверное ввело в заблуждение.

    Reply
  9. SiAl

    (2) Art1387, да, я тоже об этом подумал. Но видать или автор, или его пользователи до сих пор живут в парадигме 1С 8.0.

    Reply
  10. miniogn

    (2)(9) Если что, в парадигме обычных форм по умолчанию нет выделения Ctrl и мышкой и хоть защелкайся больше одного не выделить.

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

    Не агитирую, просто показал, как это можно сделать, если именно так нужно.

    Reply
  11. Art1387

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

    Reply
  12. miniogn

    (11) Ну групповую обработку пользователю не дашь…

    Reply
  13. kimskiysanya

    (9) SiAl, (11) Art1387,Помоему вы сильно не правы. Пример делаю групповую печать документов Реализация товаров и услуг. Допустим у компании 1000 документов нужно напечатать 40 из них. Мне кажется пользователю будет не очень удобно помечать их зажатым контролом. Нет тут ни каких парадигм просто действительно удобнее. Автору спасибо!

    Reply
  14. UralKIT

    Второй способ не вполне рабочий. Если перемещаться по ячейкам колонки «Флажок1» с помощью клавиш, то будут открываться документы, даже если это запретить в процедуре выбор.

    Операторы, которые постоянно работают с большими списками, обычно работают с клавиатуры, перемещаются по строчкам и пробелом ставят отметку.

    При множественном выборе с ctrl часто бывает что палец с ctrl соскальзывает и выбор приходится повторять по новой.

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

    Reply
  15. Alexjas25

    Спасибо автору, очень полезная информация.

    Reply
  16. gulchitai

    Спасибо автору. Использовала это в своей доработке ЖурналОператораСклада. Хочу еще сделать кнопки командной панели «СнятьФлажки» и «УстановитьФлажки» для быстрого выбора/снятия всех флажков. Не могу сообразить как обойти все документы из журнала…

    Reply
  17. NataLisa

    (16) Подскажите, на каком релизе платформы делали? Я пыталась сделать тоже в форме списка справочника — не получилось…платформа 8.3.9.2170

    Форма списка справочника — это динамический список и у него уже нет метода ПриПолученииДанных

    Reply

Leave a Comment

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