<?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='\
Может и баян, но писалось под себя
использую давно в самых разнообразных случаях 😉
первая из стопиццоттыщ перенумераторов, которая позволяет отбирать документы по префиксу номера… ну или я просто не натыкался на такие.
(2) а что, универсальная обработка подбора объектов — этого не позволяет? — не далее как в четверг перенумеровывал справочник, выбирая элементы принадлежащие ЦБ — по вхождению в номер префикса «ЦБ» — и заметьте! без программирования… — учите матчасть!
(3) она слишком универсальная и не всегда подходит 😉
Боян же братия…
Мне понравилось:
1. Методичность автора в процессе разработки (набор комментариев)
2. Четкий дизайн.
(5) тогда уж скорей «+»
———————
(3) универсальная не даст обработать по нумератору, подрезать номера, добавить нули и т.д.
———————
хочу заметить обработка работает в очень специфичных конфах в отличие от прочих: где нет документов или справочников, только общий журнал и т.п.
тоже понравился код и дизайн. молодец)
Хорошая обработка! Быстро и без проблем решила мою проблему. Надо было перенумеровать документы разных видов с одним нумератором в ЗиК.
Спасибо! Очень вовремя!
Если уж речь зашла об универсальности, то я бы сделал следующие доработки:
1. интерфейс — 3 закладки: подбор, данные, настройки;
2. данные должны выбираться запросом: на DBF разницы, конечно, нет, а вот на SQL (особенно на больших объемах) — существенная;
3. заключить изменения данных в транзакцию (одну или несколько, по настройкам);
4. в попытке/исключении учесть разделенный режим работы (ошибку записи из-за блокировок т.е.), либо проверку на монопольный режим при запуске;
5. не изменять номер/код, если он совпадает со вновь присвоенным;
6. расширить отбор документов общими реквизитами (например, выбирать по одной фирме).
Очень хотелось бы увидеть режим эмуляции и отчет на выходе, что на что изменилось.
Восторгов по поводу кода не разделяю. Структурированность не сильная. + Мое мнение — обработчики событий (формулы элементов диалога) должны быть отделены от базового функционала.
Согласен с (9). Не скачивал, но по скриншотам вижу, что интерфейс перегружен. Я вообще не представляю, как можно пользоваться черным ящиком, не видя требуемых для перенумерации данных. Грамотно написанные обработчики событий делают прогу более универсальной и более стабильной
еще добавлю обработка учитывает текстовый номер или числовой (многие другие на числовых спотыкаются, когда пытаются им префикс добавить)
————————-
(7)(8) и вам спасибо
————————-
(9)(10) вам тоже спасибо, но вы по моему просите совсем другую программу…
это простой перенумератор, делать его супер универсальным ради самой универсальности действительно не вижу большого смысла!
у меня была идея — разместить весь функционал на одной рабочей площадке.
перегружать программу уймой настроек, отборами, доп фильтрами (которые мне ни разу не понадобились), вкладками я не собираюсь.
(9.2) sql баз у меня к сожалению нет, соответственно переписывать не буду, к тому же перенумеровка не такая уж и частая процедура, и не такая уж и долгая разок можно и подождать
(9.3,5) вы правы транзакцию нужно сделать, а так же проверять на существование уже существующего кода/номера
(9.4) вы действительно запустите мою обработку на рабочей базе в раздельно режиме, не сделав копии??? вот это Доверие — Спасибо 😉 (я бы сам не запустил)
(9.6) чем отбор по префиксу не устраивает?
(9.7) режим эмуляции делать не буду (делайте копию базы), а отчет на выходе вполне хорошая идея
(9.8.) «обработчики событий (формулы элементов диалога) должны быть отделены от базового функционала» — поясните пожалуйста, зачем?
(10) «не видя требуемых для перенумерации данных» — там есть окно где представлены все обрабатываемые данные, попользуйтесь и увидите
«Грамотно написанные обработчики событий делают прогу более универсальной и более стабильной» — вы же не скачивали, как вы оценили грамотность?
😉
(11) >>sql баз у меня к сожалению нет, соответственно переписывать не буду
Тогда слово «универсальный» из описания я бы исключил)
>>вы действительно запустите мою обработку на рабочей базе в раздельно режиме, не сделав копии
Опять же «универсальность»… далеко не у всех есть возможность выгнать бухгалтеров на сколько-то часов из базы
>>…должны быть отделены от базового функционала» — поясните пожалуйста, зачем?
Про контекстонезависимость слышал? Я стараюсь придерживаться данных принципов. В v8, кстати, в т.ч. под это дело выделен модуль обработки.
Вот тебе 30й плюс..молодца!)))
(13) спасибо. да уж, за неделю больше 30 «+» одной обработкой — очень не плохо
(12.11) не исключу, т.к. она в sql работать будет 😉 как и во всех остальных
впрочем вы можете доработать под свои нужды
(12.12) вы собираетесь несколько сот тысяч объектов перенумеровывать, что бы на несколько часов ее загрузить??? опять же даже если так, все бухгалтера просто не смогут нормально работать!
(12.13) аааа понял. только тут ведь Один модуль. так и быть отсортирую функции обработчика от интерфейсных.
Друзья. эта обработка — маленькая удобная тележка.
грузить ее функционалом самосвала с грузоподъемностью тележки я не хочу.
так что, что-то я добавлю, что-то нет… Всем Спасибо
молодец. очень вовремя она мне подруку попала))
доработано в v 1.6 (от 10/09/09) — по Вашим просьбам
отсортированы функции модуля, ко всем интерфейсным элементам добавлено описание, работа в транзакции
сделан отбор для документов по общему реквизиту, для подчиненых справочников по родителю
скриншоты попозже обновлю (не так там много изменений)
ндя… 90% процентов — делается с помощью штатной универсальной обработки. Из востребованного в универсальной обработке, по-моему, только работы с нумератором нет…
(19) ну да — каждому свое… только почему-то ею не многие пользуются (или не хотят пользоваться) 😉
Правильно, потому что при нормальной работе — всякую перенумерацию — прог только должен делать… у меня на старой работе и сейчас — такие задачи по оперативным документам — возникали ну настолько редко… что я даже ПЕРЕНУМЕРАТОРЫ НЕ ПИСАЛ!!!!
(21) Ага, я так ни разу перенумератор за свою жизнь не написал, все время чужими пользуюсь, правда, очень и очень редко, в основном, у новых клиентов 🙂
(21,22) я на продажу делал 😉
а вот теперь со всем делюсь
(221) аналогично, коллека! 😉
(21), (22) не уж-то на вашей работе расходнички задним числом не делают? 😉
(25) неа.. не делают.. 😉 а вот наклдную перетащить вперед на 10 дней — это могут.. потому что блин типа Ипшник не может товар покупать в рассрочку при оплате налом… 😉
+ спасибо
+ Спасибо. То что нужно. 🙂
ЗафиксироватьТранзакцию();
{D:DOWNLOADSPERENUMEROVKA.ERT(633)}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию.
Пытаюсь перенумеровать справочник «Номенклатура», 12000 элементов, длина кода 8, текстовый.
Где-то собака зарылась!
(29) с транзакциями там фигово (это скорее всего на будущее), нужно алгоритм избавить от конструкции «Попытка Исключение», тогда долнжо будет нормально работать.
не включай транзакции и будет тебе счастье, но медленно …
У меня пишет ошибка открытия файла и подвешивает 7.7. У меня Vista может в этом дело!?
(31) может и Висте… на лицо баг самой 1С
а другие-то обработки открываются?
🙁
Другие открываются нормально. Была с одной обработкой проблема, но решилась путём запуска её дллов от администратора.
Если честно понятия не имею в чем дело ;( нет там ни каких ДЛЛ.
попробуй загрузить заново, попробуй в конфигураторе открыть…
Благодарствую))) разработчику
Благодарю за обработку.
ЗафиксироватьТранзакцию();
{D:NIXPERENUMEROVKA.ERT(633)}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию.
Пытаюсь перенумеровать справочник «Номенклатура», 8000 элементов, длина кода 8, текстовый.
Точно такая же ошибка.
(37) алгоритм не совершенный (есть косяки, а выискивать смысла большого не вижу). лечится просто:
1. неиспользуйте транзакции, т.к. внутри есть конструкция Попытка/Исключение — именно она валит транзакцию
2. отключите на время перенумеровки в конфигураторе контроль уникальности в справочнике, тогда все будет ОК
2. отключите на время перенумеровки в конфигураторе контроль уникальности в справочнике, тогда все будет ОК
Именно так и поступил, и все пошло, еще раз СПАСИБО!
Буду пробовать. Но с нетерпением буду смотреть и анализировать код.
Благодарю за обработку.
я тоже присоединяюсь, огромное спасибо
Очень удобно, спасибо 😉
очень здоровская обработка спасибо!
Доработал ее добавив возможность перенумерации всей базы.
Очень удобно перед объедидением нескольких баз
Обработка супер!!! Как я раньше без нее могла. И справочники и документы. Я кассу вручную нумеровала, а на это почти целый день уходит, а сейчас нескольок секунд. Спасибо!!!
Отличная обработка, спасибо!
Спасибо! Но очень медленно… Особенно обязательное заполнение списка к перенумерации. У меня 20000 номенклатуры, она просто умрет от таких визуальных приблуд.
(47) MoonAriman, отключить визуализацию можете и сами 😉
так же рекомендую (как уже писал раньше), на время процедуры массовой перенумерации отключите контроль уникальности и проводите процедуру в режиме транзакции!
При включенной галке макс. длинна номера обработка проверяет код в справочнике если он больше указанного значения, то из кода удаляются лишние нули?
плюсую! сохранение префиксов документов — как раз то, что нужно (оххх, когда же народ уйдет с 7.7? 🙂 )
(50) eslava,
да все верно. ее можно использовать для укорачивания номеров или добивания нулями до нужной длинны (правда могут возникнуть дубли в номерах: 00100 и 0100 — станут одинаковыми)
(51) orehova123,
когда уйдет? у меня есть учетные конфы на ТИС, зачем с них уходить-то? есть и на УТ под 8.0 — все работает.
Обработка весьма неплохая.
Немного разобрался и доработал.
Первое — пункт «Заменить у существующих префиксов на…» следует читать как «Заменить выбранную подстроку
в префиксах документов на введенную в поле «Строка префиксов документов».»
Разбил на транзакции по 100 элементов.
Флаг «Добить нулями» в исходной реализации не имеет смысла — если его отключить, то никакой перенумерации не будет вовсе.
Т.е. перенумерация заложена только с набиванием нулей перед числовой составляющей кода.
(38)
Думаю, чтобы как раз этого не делать/сократить выборку с невыполнимой транзакцией — поможет запуск отдельных транзакций на каждые 100 элементов.
(44) sergb1979,
Что значит — перенумерация всей базы? А сейчас — не по всей нумерует?
(52)
Не станут, в обработке есть механизм обработки дублей, который работает так:
если какие-то номера в процессе перенумерации оказались неуникальными — то
— попытка вернуть обрабатываемым объектам их первоначальные «неуникальные» номера;
— если это не удается — присваивается вспомогательный номер вида «максимально возможный (99999) — позиция элемента в текущем списке».
Т.е. в любом случае но выходе получим разные номера 🙂
(55) AlexO, Сейчас только по выбранному типу Справочника
(57) sergb1979,
А зачем перенумеровывать ВСЕ справочники одновременно?!
(56) AlexO, бывают всякие ситуации — алгоритм не совершенен и он дает иногда на один номер 2 элемента
если возникла такая ошибка, то транзакция упадет и часть справочника не будет перенумерована
а добить нулями иногда нужно именно без перенумервки
(59)
Отбора ВНУТРИ номеров все равно нет — велика вероятность, что попадет на существующий номер.
Кстати, видимо ошибка «Ошибка при выполнении процедуры ЗафиксироватьТранзакцию.» обычно из-за попытки создать уже существующий номер.
Но, опять же, отключение контроля уникальности — не всегда избавит от кривых номеров.
Лучше так:
— перенумеровать с неким уникальным префиксов (например, «F»)
— перенумеровать уже окончательно — все номера будут заранеее уникальны.
(3) CheBurator,
И как типовой перенумеровать номера 15, 0015 и 00015?
(61) вопрос непонятен.
приведите исходное множество документов с исходными номерами и итоговый желаемый результат — я попытаюсь сказать — можно перенумеровать или нет.
а так — конечно можно
вместо трех документов 15,0015,000015 будут документы 15,16,17 с нужными префиксами…
???