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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *