Закрытие бухгалтерских счетов в БП 2.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='\

30 Comments

  1. Maksimshap

    и так бывает?

    Reply
  2. Brawler

    Что так бывает?

    Если, о тех данных, что в окошке, то это просто от балды информация, а вообще в реалиях организаций, может быть всякое. У нас к примеру есть счет 10.00 «Заготовление и приобретение МЦ» (да, скажите есть счет 15, но предлагаю вам самим поспорить с бухией что к чему). Так вот этот 10.00 плавнеханько закрывается специально созданным для этой цели документом на указанный счет и определенной аналитикой, как правило счет 26.

    Reply
  3. gutentag

    + авансом, в надежде, что Автор исправит все баги в обработке и т.к. впервые увидел что-то нужное для себя из серии «закрытие счетов для бух-2.0».

    ———

    А теперь по существу:

    Попробовал закрыть «обороты» 26(25)-счета в дебет

    Reply
  4. yegorovnv

    вместо того, чтобы учет по уму поставить, лепим костыли??? за обработку минус

    Reply
  5. Brawler

    Не вам судить костыли это или нет, задачи могут быть совершенно не типовые и на не типовых счетах, для этого и сделана эта обработка еще до меня, а я уже просто ее допилил под БП 2.0. Бака.

    Reply
  6. Одинец

    Было бы супер, если бы в шапке обработке указывалась регламентная операция и действия обработки (по закрытия счета) ЗАМЕЩАЛИ/добавляли операции в выбранном документе.

    Reply
  7. gutentag

    (6)

    Было бы супер, если бы в шапке обработке указывалась регламентная операция и действия обработки (по закрытия счета) ЗАМЕЩАЛИ/добавляли операции в выбранном документе

    это сосвсем не к чему, т.к. регламентные операциии, если счет уже закрыт — не выполняются.

    Reply
  8. Brawler
    Одинец пишет:

    Было бы супер, если бы в шапке обработке указывалась регламентная операция и действия обработки (по закрытия счета) ЗАМЕЩАЛИ/добавляли операции в выбранном документе.

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

    Попробую реализовать как будет время. Нужно разгрестись с другими задачами.

    gutentag пишет:

    + авансом, в надежде, что Автор исправит все баги в обработке и т.к. впервые увидел что-то нужное для себя из серии «закрытие счетов для бух-2.0».

    ———

    А теперь по существу:

    Попробовал закрыть «обороты» 26(25)-счета в дебет 20.01.На закладке «Набор записей», обработка сделала сумма проводок задвоенную, например:

    -счета в дебет 20.01.На закладке «Набор записей», обработка сделала сумма проводок задвоенную, например:

    д.20.01 к.26 амортизация НМА =100руб

    д.26 к.20.01 амортизация НМА =100руб

    Итого имеем 200руб, вместо 100руб.

    Резюме: сейчас обработка сырая и даже не проверенная автором в простейших условиях 🙁

    Ну изначально обработка не моя и полагал, что там все должно быть нормально, а нехватало только поддержки БП 2.0.

    Буду смотреть, так как все равно задача стоит не создавать отдельных документов в типовой, а закрывать обработкой нужные счета.

    Reply
  9. Andrei12

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

    Reply
  10. gutentag

    (8)

    В принципе это возможно. У документов регламентная операция есть реквизит «ручная корректировка» и установив его можно спокойно дописать еще проводок в документ и не боятся, что его перепроведут

    Имхо нельзя это делать(ну в кранем случае предусмотреть вариант «создать операцию» или «внести коррективы в регламентную операцию»). Лучше в саму операцию внести коомментарий, типа «Дополнительно/взамен регламентной операции по закрытию счетов 20,23,25,26 за ИЮНЬ 2011г».

    Так как при составлении баланса и допроведения «забытых сумм» на закрываемые счета, бывает нужно/можно закрыть автоматически, как это делает Бух-2.0

    —-

    Примечание: в бух.и налоговом учете суммы <= 5%, в основном, считается не существенными и тратить на них дополнительное время = не рациоенально. И лично я, оставляю «дополнительныо внесенные суммы» для автоматического закрытия счетов…

    Reply
  11. Brawler
    gutentag пишет:

    + авансом, в надежде, что Автор исправит все баги в обработке и т.к. впервые увидел что-то нужное для себя из серии «закрытие счетов для бух-2.0».

    ———

    А теперь по существу:

    Попробовал закрыть «обороты» 26(25)-счета в дебет 20.01. На закладке «Набор записей», обработка сделала сумма проводок задвоенную, например:

    д.20.01 к.26 амортизация НМА =100руб

    д.26 к.20.01 амортизация НМА =100руб

    Итого имеем 200руб, вместо 100руб.

    Резюме: сейчас обработка сырая и даже не проверенная автором в простейших условиях 🙁

    Попробовал создать аналогичную ситуацию. В периоде, где нет ничего, создал две ручные проводки Дт25-Кт70 на сумму 1000 и 2000 рублей, ну и аналитика произвольная. Указал, что хочу закрыть обороты 25 счета из периода, где сделаны проводки. Указал счет приемник Дт20.01, указал аналитику куда отнести. Нажал сформировать проводки и получил на выходе как и должно было быть в теории, две проводки Дт20.01-Кт25 на суммы 1000 и 2000 руб. аналитика тоже правильная (то чего и хотел получить).

    Reply
  12. Brawler
    Brawler пишет:

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

    Попробую реализовать как будет время. Нужно разгрестись с другими задачами.

    Хорошо подумав, решил ничего не делать ибо если не нужны проводки сформированные самой регламентной операцией, то ее не надо выполнять, а во временной промежуток всегда можно втулить документ «Операция бух». Да и потом всякие неявные явности всегда сбивают с толку. Сейчас этой параши у меня в базе столько… и бухи не хотят обновляться до 2.0 с 1.5, сетуя на «уникальный» бух учет в конторе.

    Reply
  13. gutentag

    (11) наверное я чтото не так сделал :-/

    буду разбираться в выходные дни….

    Reply
  14. dj13

    Вообще в БП 2.0 и Корп и так можно закрывать счета, сделав не хитрые операции.Так то собирался статью написать, может и напишу. В двух словах, для закрытия 26 счета ( если не дерикт костинг), создается обычная операция 20/20 (допустим на копейку), с подразделением по которому не закрывается 26 счет. Для 25 аналогично. Для закрытия 20 счета в операции — корректировка регистров -регистр «Реализация услуг» — новая запись ; Счет затрат 90.02 — нужные подразделения/номенклатурные группы — любая сумма . Все это будет базой для распределения 20 счета.Счета затрат закрыты,90-е закрыты . Все счастливы.

    P.S. Если бухгалтерам пох, то мне тем-более.

    Reply
  15. Brawler

    (14)Ну это хитрости конечно, а вообще потребность в этой обработке у меня появилась в следствии «уникального» бух учета в конторе и это никак не связано напрямую с закрытием 25 и 26 счета. Тут наоборот на счет 26 кочуют суммы с 10.00 счета, не типового. Сути сам до конца не понимаю, почему они ведут счет 10.00, но раз он есть и закрывается по одной аналитике, то эта обработка, то что нужно. Городить в новой конфигурации документ «ЗакрытиеСчета10.00» не хочется.

    P.S. Да прибудет сила у бухов сдавать налоговую отчетность

    Reply
  16. dj13

    Вообще если с Кт 10 списывается материал, то это списание в производство (затраты).Значит нужен печатный документ,о том что подотчетник списал с себя материалы (например М-11). Это стандартный документ «Требование накладная». Бухи сами выбирают, что, с кого, когда, с какого счета списать.

    Reply
  17. Brawler

    (16)Там долго рассказывать, в общем там материалов нет. По сути как 15 счет, но с нюансами.

    Reply
  18. Lerusena

    А можно скрин двух первых закладок? Никак не могу решить полезная вещь или нет, качать или нет

    Reply
  19. ZergKRSK

    Попробуйте мою обработку 🙂

    Reply
  20. Brawler

    (18)Добавил

    Reply
  21. sergeyshik

    Скачал попробую. Помню переделывал под себя их 8.1, для 8.1. А сейчас как-то лень переделывать под 8.2 тем более велосипед уже изобретен

    Reply
  22. mcher

    Скачала. Попробую. Думаю, пригодится.

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

    Reply
  23. nikavilk

    Спасибо!

    очень пригодилась ваша обработка, как образец для новой обработки закрытия остатков НЗП сч 20 на 90.02, в случае когда выручки не будет

    Reply
  24. makas

    (23) nikavilk,

    очень пригодилась ваша обработка, как образец для новой обработки закрытия остатков НЗП сч 20 на 90.02, в случае когда выручки не будет

    Если ваша обработка для типовой конфигурации, тогда выложите ее пожалуйста на сайте. Это обязательно многим пригодится как для 20-счета, так и 44-счета

    Reply
  25. Death_eye

    Скачал. Вываливается с ошибкой при попытке развернуть по субконто или сформировать проводки:

    {ВнешняяОбработка.ЗакрытиеБухгалтерскихСчетов.МодульОбъекта(611)}: Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)

    Если Параметры.Отрицательные = ИСТИНА

    Reply
  26. sps02

    Здравствуйте. Скажите , я могу закрывать на любой счет. Мне нужно все на 86

    Спасибо

    Reply
  27. Brawler

    (26) sps02, теории да.

    На практике у меня на работе бухгалтерия не применяла эту обработку вообще.

    Убил время за зря переделывая найденную обработку, на просторах инета, под БП 2.0.

    Reply
  28. kwazi

    1. Группировать в запросе необязательно. Остатки по бух регистру и так сгруппированные.

    2. Получать значения из выборки по индексу — жуть.

    Выборка[индекс] = плохой код.

    Выборка[«Субконто»+Номер] — хороший код.

    Reply
  29. kwazi

    еще надо отбор по количеству и сумме чтобы избавиться от зависших копеек при нулевых количественных остатках ТМЦ на складе.

    Reply
  30. Brawler

    (28) kwazi, сойдет:

    1. обработка взята чужая и только допилена под БП 2.0 (рефакторинг не осуществлялся)

    2. см пункт 1.

    3. Развитием обработки не занимаюсь, как спилил ее для своих хитрых бухов у которых была до этого кнопочка в операции ручной, еще в БП 1.5, так ей этой обработкой и не пользовались, важности больше нагоняли при переходе с 1.5 на 2.0

    Reply

Leave a Comment

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