Изменение нумерации кассовых документов




Принцип обмена данными из 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. Душелов

    Ура 🙂 Перенумератор 🙂

    Reply
  2. Душелов

    Да и еще запаролено. Несмомненно удачное решение.

    Reply
  3. YAN

    (2) Я думаю для тебя не составит труда открыть код.

    Reply
  4. Душелов

    (3) Да труда-то не составит, вопрос только — зачем? Зачем паролить-то?

    Reply
  5. WiseSnake

    (0) Нельзя обычному пользователю давать перенумератор в руки. ИМХО.

    Хотя бы потому что они базу не сохраняют…)))

    Reply
  6. YAN

    (4) Пароль установлен по принципу: «Кто хочет его посмотреть — тот посмотрит, всем остальным нужен результат. Результат обработки — выполнение заявленной задачи!».

    Reply
  7. YAN

    (5) Начнем по порядку:

    1. Архивы базы должны делаться регулярно.

    2. У пользователей должны быть ограниченные права доступа к периоду редактирования данных.

    3. За кассовую книгу отвечает 1-2 человека и они понимают смысл перенумерации кассовых документов!!! по крайней мере должны понимать 🙂

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

    Reply
  8. gutentag

    Оч полезная обработка!

    Замечания/пожелания:

    — Имхо обработка будет еще удобнее если в нее встроить «возможность расстановки очередности кассовых документов»(например, сперва ПКО, потом РКО).

    — Имхо дополнить обработку ограничителем знаков в нумераторе

    Reply
  9. WiseSnake

    (7) Начнем по порядку.

    1. А если бухи решили перенумеровать в середине дня то от сохранения нет никакого толку.

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

    3. Да они понимают смысл перенумерации, но не знают как работает перенумератор, а если даже объяснить, они забудут через 2 дня. Обычная спешка может привести к геморою Вам же…

    Но если кто не боится давать такой инструмент, то не вопрос обработка пригодиться… Мое дело предупредить 🙂

    Reply
  10. YAN

    (8) Возможность расстановки очередности кассовых документов добавил, но только ручную, пользователь должен понимать, что он делает это все-таки касса.

    Ограничитель знаков в начальном номере добавил, зависит от длины номера и префикса.

    Reply
  11. YAN

    (9) Написанное имеет место, но все зависит от конечных пользователей.

    Reply
  12. gutentag

    (10) Маленькое Замечание по обработке: Если РКО создано(дата условная) 10.12.08 в 00.00.00 часов, то перемещая вверх ПКО, документ меняет дату(что не правильно), а надо чтобы ПКО встал перед РКО созданным в в 00.00.00 часов, т.е. самым первым в этот день.

    А в остальном, благодарю ! 🙂

    Reply
  13. O-Planet

    Всегда задавался вопросом: как они перенумеровывают доки, если те — уже на руках? А если встречная проверка?

    ПС Шифрую грамотно название перенумераторов за плюсы, от местных троллей.

    Примеры в качестве рекламы:

    1. Менеджер организации последовательности нумерации документов

    2. Отдадчик положения документов в журнале по их номерам

    3. ОВЕРНУМБЕР PRO

    🙂

    Reply
  14. gutentag

    (13) у меня на работе принято выдавать зарплату сотрудникам (около 60-чел.) и дивиденды акционерам только по РКО +деньги получают в банке несколько дней. Поэтому кассир не знает кто и когда распишется в получении денег. Соответственно заранее печатаются бланки без номеров. И проводятся в течении нескльких дней. Поэтому и нужен перенумератор

    Reply
  15. Novice21

    Нет перенумератора для других документов?

    Reply
  16. YAN

    (15) Есть но я его не выкладывал. Хорошо на днях выложу.

    Reply
  17. Novice21

    А сегодня?

    Reply
  18. YAN

    (17) если только вечером.

    Reply
  19. Novice21

    Спасибо!

    Это Ваша, стандартного перенумератора для 1С Бухгалтерии не существует?

    На одном из ИТС, и т.п.

    Reply
  20. Душелов

    (19) 1CItsEXEEXTREPSUNIREPS81UniversalSelectionУниверсальны­еПодборИОбработкаОбъектов.epf

    Закладка «Обработки» — «Перенумерация объектов»

    Reply
  21. murat_

    1. Страноватая привязка размеров полей ввода к форме, когда разворачиваешь окно.

    2. Если преффикс оставить пустым, пишет «Укажите начальный номер документов, отличный от 0». Приходиться ставить 0 ???

    А вообщем, неплохо оформлено!

    Reply
  22. даша2009

    У меня выдает сообщения

    НомерДокПечатнойФормы = глПреобразоватьНомерДок<<?>>(Док.НомерДок, 0, 0);

    {\IVECOSERVER1СEUEXTFORMSПЕЧАТЬ ПКО РКО.ERT(29)}: Функция не обнаружена (глПреобразоватьНомерДок)

    СтрНДС = «НДС(«+глПредставлениеСтавки<<?>>(Док.СтавкаНДС)+»)- «+РубКоп(Док.НДС);

    {\IVECOSERVER1СEUEXTFORMSПЕЧАТЬ ПКО РКО.ERT(37)}: Функция не обнаружена (глПредставлениеСтавки)

    НомерДокПечатнойФормы = глПреобразоватьНомерДок<<?>>(Док.НомерДок, 0, 0);

    {\IVECOSERVER1СEUREXTFORMSПЕЧАТЬ ПКО РКО.ERT(72)}: Функция не обнаружена (глПреобразоватьНомерДок)

    Подскажите что делать?

    Reply
  23. YAN

    (22) Сначала необходимо сказать какая у вас конфигурация?

    Для БП 1.6 эта обработка работает.

    Reply
  24. даша2009

    У меня комплексная конфигурация редакция 4,5.

    Подскажите , в какую папку поместить недо эту обработку. Мне тут подсказали что в ExtForms, но там её программа вообще не видит, видит только с разрешением ert.

    Reply
  25. YAN

    (24) ээээ, а платформа 7.7?!

    Эта обработка для платформы 8.1

    Reply
  26. даша2009

    Да 7,7 . Жаль что не пойдет, очень нумератор нужен .

    Reply
  27. krielena

    а для Бух 8.2 нет такого перенумератора?????? 😀

    Reply
  28. alex_fursov

    Спасибо за обработку)

    Reply
  29. kingpin

    Использовал обработку в работе, спасибо

    Reply
  30. mstick

    (27) krielena, А почему бы не воспользоваться конвертированием обработок для 8.2?

    Reply
  31. mstick
    krielena пишет:

    а для Бух 8.2 нет такого перенумератора??????

    Кстати, интересно, будет ли работать после конвертирования (8.2 не пользуюсь, но планируется переход)?

    Reply
  32. YAN

    В ближайшее время добавлю эту обработку для 8.2

    Reply
  33. tanilka

    Спасибо! Очень полезная штука оказалась. Бухгалтер довольна, что теперь можно делать автоматически перенумерацию.

    Reply
  34. Riccis

    Появилась для 8.2?

    Reply
  35. YAN

    (34) Да появилась.

    файл для 8.2 является основным для загрузки.

    Reply
  36. juls

    Спасибо огромное! Очень полезная обработка, реально облегчила жизнь кассира.

    Reply
  37. dchatkin

    В модуле объекта ошибка

    мДлинаПКО = Метаданные.Документы.ПриходныйКассовыйОрдер.ДлинаНомера;

    мДлинаРКО = Метаданные.Документы.ПриходныйКассовыйОрдер.ДлинаНомера;

    Reply
  38. wolder

    Минус. За пароль. Не себе, не людям.

    Reply
  39. Maldiv

    (5) WiseSnake, у нас перенумерацию тоже делает кассир. Один раз за прошедший месяц. Он не знает, как она работает, но знает, какой должен быть результат. Это зона его ответственности.

    Reply
  40. Aleksey81

    При попытке перенумеровать РКО упорно пишет «Укажите начальный номер документов, отличный от 0» и отказывается работать.

    Начальной номер РКО и ПКО заданы(пробовал несколько значений)

    Модуль обработки запаролен.

    А потому разработка оказалась бесполезной.

    Reply

Leave a Comment

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