<?php // Полная загрузка сервисных книжек, создан 2025-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='\
А как работать с файлом 1cv7.7z
файлы *.7z это архивы, сайт разработчика http://www.7-zip.org.
Как то не густо замечаний и предложений.
инструкция содержит такие дикие формулы, что в md заглядывать не хочется , автор такая инструкция с формулами вида мин(макс(мин(мин(мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),?(с4=0,мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),с4)),?(с5=0,мин(мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),?(с4=0,мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),с4)),с5)),?(с6=0,мин(мин(мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),?(с4=0,мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),с4)),?(с5=0,мин(мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),?(с4=0,мин(?(с2=0,с1,с2),?(с3=0,?(с2=0,с1,с2),с3)),с4)),с5)),с6))
отпугивает
(4)уважаемый, ev-kov, этот пример был специасльно вставлен для демонстрации (что не стоит в «лоб» писать), там же приведёт аналогичный по взаимодействию скидок пример но сокращённый.
мн(макс(мн(мн(мн(?(с2=0,с1,с2),с3),с4),с5),с6),с7)
Спасибо за исправление. Теперь скидки работают и по агрегатным группам. Сам отловить глюк не смог.
(6)Если будут ещё замечания или проблемы лучше сразу мне отписывайте.
В целом всё хорошо, но не хватает печатной формы накладной с указанием суммы скидки по клиенту и прайса с учетом скидок по клиенту.
(4) ужос какой
(5) а в чем сакральный смысл вложенных Мин()? Ведь если синтакс-помощник нам не врет, функции Мин() и Макс() могут принимать и более 2 значений 😉
(9)Уважаемый, int3, в чём «сакральный смысл» постов, когда не разобрался с идеей но уже осуждаю?
(8)Добавлю
(10) зачем людей пугать дикими формулами, если можно проще записать тоже самое?
(11) Вы внимательно читали (5) это раз, во вторых «мин(100,99,90,0)» что вернёт? это два, немного ограничений наклыдывает пункт «Реализована возможность задания общей схемы взаимодействия скидок без изменения кода в конфигураторе» и человеческая лень это три, в четрёртых человек который научился пользоваться СП как правило может пользоваться и конфигуратором…, в пятых просто не люблю постов «ниочём» типа (4,9), слова проде есть а смысла кроме облить чем нибудь вонючим нет 🙂
(12) «а смысла кроме облить чем нибудь вонючим нет»
зависит от жизненной позиции, с негативной позицией — да, кроме как «облить вонючим» не видится
а если не зацикливаться на этом — можно усмотреть и предложение развития — увеличение чиса параметров например или еще чего
да и —
мин(100,99,90,0)=мин(мин(мин(100,99),90),0)
только короче
(13)Уважаемый, int3, если вы не возражаете давайте прекратим дискусию,
«мин(100,99,90,0)=мин(мин(мин(100,99),90),0)»
в обоих случая вернёт 0 а по нормальному, что косается именно цен, должно вернуть 90, в общем если не хотите разбираться с данной «разработкой» если её правда так можно назвать, то и не надо.
skonto написал
——————————————
>В целом всё хорошо, но не хватает печатной формы >накладной с указанием суммы скидки по клиенту и >прайса с учетом скидок по клиенту.
Бит ответил
———————————
> Добавлю
Будем ждать.
(15)Через недельку выложу
(8,15) Обновил
Исправил пару найденых ошибок в мд от 15.02.07
Исправлена ошибка
Добавлен флаг «Абсолютная» в скидки, для более гибкой настройки. Подробности во встроенном описании и в инструкции.
Интересно ктонибудь кроме skonto и ineoosaki пробывал использовать эту наработку?
думаю можно убрать признак «бэтта».
Для компаний быстро реагирующих на изменения вещь необходимая. Я только сейчас подумывал о том, что бы перейти на 1С. Можем ли мы более подробно поговорить на эту тему? Мой e-mail etibar.veliyev@gmail.com
Благодарю заранее.
(23)В иструкции есть мой e-mail
Идея здоровская.
Дурацкий вопрос:
после пересчета скидок в ТЧ документа изменяются столбцы «Цена», «Сумма без
скидки», «Сумма» и столбец «Скидка» обнуляется. Вроде ж «Цена» и «Сумма без скидки»
должны оставаться без изменения, а пересчитываться столбцы «Скидка» и «Сумма»?
(25)Доброго времени суток, просто первоначально стояла задача делать минимум изменений в типовой конфигурации + данный подход скидкам отличается от типового, это основные причины.
Для того, чтобы получить просто печатную форму с суммами скидок посмотрите отдельную печатную форму в архивах.
Если вы хотите видеть именно в самом документе скидки, то придётся переписывать.
Доброго времени, спасибо за быстрый ответ.
Ага, надо переписывать. В принципе, наверное любая фирма рано или поздно
«дорастает» до нетипового подхода к скидкам. Так что идея хороша.
Попробую под свои нужды приспособить, думаю, получится 🙂
(27)Удачи, если что пишите.
Как дойдут руки выложу также возможность задание скидок в абсолютных единицах
ДАров Мужики ТУт засада. Мне здать нужно выпускную работу, м.б. подскажете где можно нарыть какую либо информацию?*
Курсавая работа на тему:
«Автоматизированный учет скидок в системе «1С: Торговля и склад».»
Отличная разработка! Не подскажете, какие именно объекты конфигурации были изменены? Хочу внедрить механизм в нетиповой ТиС.
(30)Конфигурация изменена по минимуму, для сравнения выложен МД без изменений, если правильно помню то документы реализаций и заявка остальное в дополнительных объектах, но могу ошибаться, если будут проблемы пишите там что нибудь придумаем
(31) спасибо за оперативный ответ! Разобрался со всем, кроме валют. Если документ продажи рублевый, а цены установлены в USD или EUR, то получаем такую картину: цена товара = $200, в реализации = 5949 руб, по нажатию на кнопку ПРОСТАВИТЬ СКИДКИ имеем 200 рублей минус % скидки. А должно быть 200 долларов за вычетом скидки. Как можно решить проблему?
(32)Это или руками самому или подождать, до конца недели постараюсь поправить, у меня стояло на фирмах которые торгуют в одной валюте, поэтому такой проблемы не возникало
(33) Допилил сам. Спасибо!
Отлично! Давно хотел расширить систему скидок. Проблема с валютами, как в предыдущем сообщении. Изменением конфигурации занимаюсь сам, а опыта мало. Думаю буду долго возится.
(35), на самом деле, проблема учета валют решается добавлением пары строк в глобальный модуль. Достаточно передать валюту в процедуру глВернутьЦену, а затем обработать полученную переменную рез.
(36)Спасибо. Для меня пару строк в глобальный модуль это уже подвиг. Основное занятие непосредственно ТиС. Как только появится время, обязательно буду настраивать.
(36)Ваше решение сточки зрения производительности более оптимально, но пока придерживаюсь подхода при создании, минимального изменения конфигурации, поэтому преобразование идёт в обработке
(37)Обновил
(38)Спасибо! Всё работает. А есть ли возможность, чтобы скидки ставились автомотически, сразу при оформлении документа? Персональные скидки назначены не для всех контрагентов. Опасаюсь, что при интенсивной торговле можно упустить поставить скидки.
(39)Не за что, возможность есть только это будет «нагружать» сервер при интенсивной работе пользователей, как дойдут руки выхожу в виде комментария