Постобработка документов после свертки БП 3.0




Принцип обмена данными из 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='\

18 Comments

  1. avasl

    > а почему разработчики этого не исправляют

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

    Reply
  2. pyrkin_vanya

    (1)

    > а почему разработчики этого не исправляют

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

    Чуть подробнее можно? Не понял Вашу мысль? Что там «съедет»?

    Reply
  3. avasl

    (2) например: в середине 2016 года мы решаем свернуть базу на 31.12.2014.

    Пусть на дату свертки есть остаток аванса по Поступление на расчетный счет # 1. А в 2015 году есть Реализация, зачитывающая этот аванс. Если в операции ввода остатков Поступление на расчетный счет # 1 будет заменено на документ ручного учета расчетов, то в проводках зачета аванса все равно останется Поступление на расчетный счет # 1 и будет ошибка по оборотам.

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

    Reply
  4. pyrkin_vanya

    (3) понял, что вы хотите сказать. Спасибо большое. Какой смысле в свертки тогда?

    Reply
  5. avasl

    (4) да ну смысл тот же — убрать прошлый ненужный период. Просто та аналитика, на которой есть остатки — приходится её оставлять.

    У меня другое общее замечание — в типовой свертке 1С не обрабатываются оборотные регистры НДС покупки/Продажи. Соответственно все регистраторы — поступления и реализации и т.д. остаются…

    Reply
  6. pyrkin_vanya

    (5) Давайте зарезюмируем. Значит получается судя по описанию, что свертка предназначена для:

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

    Или как Вы написали

    убрать прошлый ненужный период.

    , что в принципе одно и то же.

    Но в случае, когда, например, документ поступление товаров (он же партия), будет употребляться в качестве партии в документах с датой после даты свертки и будет заменен в документе операция, то возникнет ситуация когда остатки будут висеть на одной партии, а позже они же будут списываться по другой партии. Что касается движений, то, в принципе, достаточно перепровести документы в последовательности, или перезакрыть месяца (что после свертки и так будешь делать). Но тут встает вопрос с движениями откорректированными вручную. Соответственно, удалив документы из базы, мы получим не совсем корректную картинку по счетам (и не только по счетам). Следовательно, моя обработка будет полезна только если ты делаешь свертку на дату, после которой нет документов или эти документы можно беспрепятственно перепровести, сформировав при этом новые движения.

    В таком случае мой вопрос остается открытым: «Зачем тогда нужна типовая свертка, если она не выполняет свое предназначение?» И еще один вопрос: «Как тогда правильно выполнить подобную работу?»

    Reply
  7. sb111

    (6) Поддерживаю. Свернули базу, работать в ней неудобно из за кучи помеченных на удаление документов…

    Тоже интересно как сделать без сильных доработок.

    Reply
  8. pyrkin_vanya

    (7) Ну я, в принципе, ответил в предыдущем посте. 🙂 Можно моей обработкой.

    Reply
  9. sb111

    (8) ) Вопрос шире. Есть документы которые используются как аналитика (Заказ покупателя), по ним расчеты и остатки еще не закрыты их не заменять не удалять ненужно.

    Как тогда быть ? ) Ваша обработка их заменит на документы по партиям ?

    (Конфигурация КА)

    Reply
  10. pyrkin_vanya

    Обработку писал для БП 3.0. Для КА, не знаю как она себя поведет. Ну в ваших силах проверить и отписаться. На тестовой разумеется.

    Reply
  11. AlexEuro

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

    Reply
  12. Alex_E

    При ОСНО остатки по авансам полученным по счету 62.02 завязаны на счета-фактуры на аванс на счете 76.АВ, если раздельный учет НДС, то остатки ТМЦ кроме партий завязаны на счета-фактуры полученные, для возможного восстановления НДС, в общем не всё так просто, как Вам показалось)))))

    Reply
  13. pyrkin_vanya

    (11)

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

    Не вижу смысла искать взаимосвязь. Их вообще удалить нужно. Для этого все это.

    Reply
  14. Alex_E

    (13)

    Не вижу смысла искать взаимосвязь. Их вообще удалить нужно. Для этого все это.

    — это печально, но потом бухи выяснят, что 1С не работает((((( Свертка не для того делается, чтобы документы прошлых периодов заменить на документы расчетов с контрагентами, а для того, чтобы:

    — сократить размер базы (аналитика документами далеко не самый большой объем в этом деле);

    — при необходимости, исправить остатки на дату свертки, без необходимости исправлять весь учёт за несколько лет ….

    Но, никак целью свёртки базы, не является замена реальных документов периода до свёртки на документы, предназначенные в программе для ввода начальных остатков, как бы ни странно, для Вас, это не звучало))))

    Reply
  15. AlexEuro

    (13) В одной дате у одного контрагента могут документы с разными номерами и с разными видами документа (Реализация и возврат например). А в вашей обработке сопоставление тупо дата, организация, контрагент и договор

    Reply
  16. Alex_E

    (7) Обработайте эту кучу таким образом:

    1. Отмените пометку на удаление (реально мешает удалять то, что удалить необходимо);

    2. Установите для них реквизиты РучнаяКорректировка и Проведен в Истина (движений не будет, удалять мешать они не будут, но в случае, например необходимости провести корректировку реализации, это будет легко сделать).

    Reply
  17. dracula

    скачал обработку, но при запуске выдается следующее сообщение

    {ВнешняяОбработка.ПостобработкаДокументовПослеСверткиБП30.Форма.Форма.Форма(50)}: Ошибка при вызове метода контекста (Записать)

    КоллекцияДвижений_Хозрасчетный.Записать();

    по причине:

    Попытка вставки неуникального значения в уникальный индекс:

    Microsoft SQL Server Native Client 11.0: Cannot insert duplicate key row in object ‘dbo._AccRgAT2604’ with unique index ‘_AccRgAT2604_ByPeriod’. The duplicate key value is (0, 0xadea9f9f9c69aa84453481c2d6b676cc, 4016-12-01 00:00:00, 0xaad150465d9ef2d011e431cb4b733978, 0x08, 0x00000033, 0x9f4a50465d9ef2d011e45dac3faea7b9, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, 0).

    HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=E, native=2601, line=1

    Reply
  18. Stеls

    Что-то мне подсказывает не тот инструмент выбрали. Судя по описанию надо было делать через ввод остатков, а не свертку. Это совершенно разные вещи и по смыслу, и по содержанию.

    Reply

Leave a Comment

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