Закрытие бухгалтерских счетов в БП 2.0




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

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 не будет опубликован. Обязательные поля помечены *