<?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='\
Лично для меня…познавательно, но один вопрос: если в типовой конфе в документе «Поступление полуфабрикатов» появится форма выбора, то достаточно будет просто переименовать нашу добавленную форму выбора?
Переименовать? А для чего? Немного не понял вопроса
Жесть какая-то… Чую беспощадно заминусуют публикацию.
Если нужно сделать форму «только для реквизита», то не стоит ее указывать основной. И в принципе основная — она для выбора документа… Выбор специфический, док без партии уже не выберешь.
Запрос к остаткам в динамическом списке без параметров?
Зачем в принципе параметры?? «Компоновщик данных» в запросе… слыхали? Указываем параметры отбора в фигурных скобочках. А в вашем случае (автозаполнения) полей этого и не требуется.
Связи параметров выбора при список-основной реквизит автоматом наложат отбор. Не нужно ничего городить, никакого программного кода.
Да и с обработкой выбора ерунда какая-то… Выбор тоже работает без программного кода.
Ересь, не иначе…
Все поняно, а как обратится к регистру партий? Это одно из условий отбора
(2) В обновлении фирма 1С добавила в этот документ свою форму выбора, тогда что будет при обновлении?
(5) Это вопросы из другой серии.
СКД (в данном случае динамический список) сам достаточно умный чтобы наложенный отбор перенсти внутрь скобок виртуальной таблицы.
Т.е. не надо передавать параметры к запросу к регистру партий?
(6) Спасибо
(5) Есть основная форма выбора только одна. А просто форм выбора можно наделать сколько угодно и они не будут конфликтовать. В статье как раз описывается, как сделать свою форму выбора, не делая ее основной. Только в статье используется название «ФормаВыбора», но его лучше поменять, например, на «ФормаВыбораСОстатками».
(11) так я к этому и подводил, ИМХО и надо называть как-то нестандартно
(10)
Ну так ничего хорошего в этом нет. Скорее это можно считать неестественным методом фильтрации выборки для компоновщика. По крайней мере действий и кода становится больше.
(7) я бы вот проверил данный факт sql профайлером. Теоретически да, а как в реале — не поручусь за это.
(13) Тем не менее, мне кажется, что механика форм раскрыта в статье неплохо. А конкретная реализация, ну да, можно тут кое-чего покритиковать.
(14) Профайлер даже не нужен, гораздо удобней использовать «Консоль системы компоновки данных» с ИТС.
Хотя признаю я ошибся. Всё-таки нужно скд немного помочь добавив фигурные скобки в условия виртуальной таблицы:
Теперь если добавить отборы на тип цен и валюту получится вот такой запрос:
Показать
(16) Мы тут вроде как про ДинамическийСписок, а не про СКД. Понятно, что один базируется на другом, но все же. Я вот на 100% не уверен в том, что платформа подставит правильные отборы в параметры ДС. Скорее всего да, но, повторюсь, лучше проверить.
(17) Я уже давно проверил и использую эту возможность постоянно. Во многих формах динамические списки которые настраиваются прогграмно отборами и если-бы не такая «донастройка», то тормозило бы несусветно.
Есть конечно некоторые «особенности», но всё-таки это СКД.
1. не понял зачем соединение в дин запросе. кажется все поля можно вытащить из остатков.
2. возможно автор хотел показать как можно переопределить форму выбора. но конечный продукт ужасен:
2.1 не понятно что будет если 2 строки будут в документе и какой остаток будет в форме выбора
2.2 отсутствует форма подбора, в ней было бы больше удобства для пользователя
(19)
Возможно без такого соединения не будет выбрана основная таблица динамического списка.
(20)
а зачем там основная таблица? вряд ли из этой формы будут партии создаваться.
Больше статей — хороших и разных. При разборе «полётов» в комментариях часто встречается полезная информация. В целом статья — полезная.
Статья хорошая (даже замечательная), но…
1) Название статьи совершенно не отражает суть.
«Меняем стандартную форму выбора…» правильнее бы было — «Создаем свою новую форму выбора…»
2) в статье не указано, с какой конфигурацией работаем!
(5) Используем расширения! и будет счастье (вселенское)!