Как устроена регламентированная отчетность в 1С




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

29 Comments

  1. DoctorRoza

    До кучи, можно указать, где хранятся данные для этих отчетов.

    Reply
  2. EMelihoff

    Вот почему Вы в 2010 не написали такую статью )) столько крови они попили у меня, пока вник! Спасибо, людям будет полезно!

    Reply
  3. iolko

    Вот прям вот спасибо!! ))

    Reply
  4. vener2004
    До кучи, можно указать, где хранятся данные для этих отчетов.

    +вопрос: Можно ли после сохранения подправить программно некоторые цифры отчета? Если можно то как?

    Reply
  5. voneska7

    Полезная статья, спасибо.

    Reply
  6. mrXoxot

    (1) DoctorRoza, (4) vener2004,

    Если вкратце то отчет хранится в документе «РегламентированныйОтчет».

    Можно ли после сохранения подправить программно некоторые цифры отчета? Если можно то как?

    Можно исправить, но не понятно зачем? Гораздо проще и правильнее исправить в заполнении или разово.

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

    Reply
  7. defender

    Кому интересно как все внутри, написал статью http://infostart.ru/public/428432/

    Reply
  8. klinval

    Автору плюс за публикацию, но вставлю свои 5 копеек.

    Если бы всё так было радостно. В первом квартале задались мыслью обеспечить редактируемость новых разделов декларации по НДС. Посмотрел офф сайт 1С и увидел, что у них заявлено, что все отчеты можно редактировать (пускай неудобно, но можно). Я им написал, мол почему в декларации по НДС 8,9,10 и 11 разделы нельзя редактировать. Мотив их ответа был: ведите правильно учёт тогда вам не надо будет редактировать. Я им назвал часть нюансов законодательства, которые никак не предусмотрены в их базе. Часть ошибок они приняли к исправлению (и вроде исправили только через пол года) и заявили, что мол редактируемость новых разделов они делать не будут!

    Решил проследить где хранятся данные и в каком виде. На примере 8 раздела вычислил, что данные хранятся в «ДополнительныеФайлыРегламентированныхОтчетов»:1. ИтогиРаздел8,(структура) 2. ДанныеРаздел8.1 (таблица значений), 3. ТабличныйДокументРаздел8.1 (Табличный документ). Пользователю декларация отображается в виде Табличного документа, а в xml данные выгружается из ТЗ. Т.е. все 3 сущности ТЗ, ТД и Итоги существуют отдельно и никак не связаны. ТЗ в ТД штатными средствами перевести нельзя никак.

    Т.е. их реализация того как хранится отчет я бы сказал спорная… И то что они что-то хранят в РС «ДополнительныеФайлыРегламентированныхОтчетов» — это больше похоже на костыли.

    /////

    Прочитал статью указанную в (7), оказывается о РС «ДополнительныеФайлыРегламентированныхОтчетов» там уже сказано.

    Reply
  9. Corablove

    Отличная статья, спасибо.

    Пользуясь случаем, задам свой дилетантский вопрос компетентному специалисту.

    В функции «Счет», которую Вы привели в пример «Служебных процедур» — в чём тайный смысл 600 строк через ИначеЕсли?

    Почему нельзя написать только полторы строки на тему «Возврат ПланыСчетов.Хозрасчетный.НайтиПоКоду(УсловныйКодСчета);»?

    Reply
  10. mrXoxot

    (9) Corablove,

    Кто бы знал…

    Но такой код я видел еще в БП 2.0, поэтому скорее всего так исторически сложилось.

    Reply
  11. vener2004
    Можно исправить, но не понятно зачем? Гораздо проще и правильнее исправить в заполнении или разово.

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

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

    Вы не ответили на вопрос: КАК?

    Reply
  12. mrXoxot

    (11) vener2004,

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

    Как хранятся данные в регламентированных отчетах и как их можно изменять описано здесь.

    Reply
  13. KliMich

    Тут 6 НДФЛ раскапывал. Пригодилось. Спавибо.

    Reply
  14. jobkostya1c8

    Хорошая статья, навеяло на идею все-таки покопаться в отчетности Бухгалтерии 3.0, т.к. разработчики типовой опять что-то там не успели.

    Reply
  15. Synoecium

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

    Reply
  16. user861090

    Очень хорошая статья. Особенно будет полезна начинающим.

    Reply
  17. корум

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

    Статья с годами не теряет своей актуальности.

    Reply
  18. AlexBor255n

    Добрый день уважаемый автор. Статья без сомнения очень полезная. Но может быть я и не прав тогда поправьте меня. Работаем В БГУ 1.0 текущий релиз 1.0.49.5. Так вот уже несколько дней разбираюсь с регламентированной отчетностью. Как я вижу именно в БГУ дела с регламентируемой отчетностью обстоят несколько иначе. Например где лежат форма 0503730 бухгалтерского баланса или форма 0503127? Если не затруднит 2 частью сделать освещение регламентированной отчетности в БГУ. Если сделаете тогда с меня пиво.

    Reply
  19. klinval

    (18) Почитайте статью https://infostart.ru/public/428432/, возможно в вашем случае поможет.

    Про БГУ не знаю, но в БП 3.0 часть отчётов хранится в РС «ДополнительныеФайлыРегламентированныхОтчетов». Попробуйте там глянуть.

    Reply
  20. Sashares

    (18) То что описано в данной статье, в БГУ 1.0 — это налоговая и статистическая отчетность.

    Регламентированная бюджетная (бухгалтерская) отчетность в БГУ это совсем другая подсистема.

    Reply
  21. AlexBor255n

    (20) А про это где нить можно прочитать?

    Reply
  22. Sashares

    (21) Не знаю =)

    Если есть конкретные вопросы, могу попробовать ответить.

    Относительно неплохо знаю эту подсистему.

    Reply
  23. tailer2

    эх, где бы манул про механизм сдачи через отца ихнего провайдера

    Reply
  24. EVP_EVP

    Спасибо Вам, добрый автор!!!!! Я сегодня весь день убила на поиски потаенных мест откуда берутся данные в налоговую отчетность и не известно сколько ещё бы потратила впустую!

    Reply
  25. AlexeyK1

    Такой вопросик, если можете подскажите:

    настроен RLS по организациям! и каждый Бухгалтер имеет в доступе только свою организацию, каждая организация подключена к 1С отчетности. так вот правильно ли я понимаю, что корреспонденция при обмене будет доставляться только по той организации на которую имеется доступ? Или при запуске обмена с проверяющими органами бухгалтер получит по всем организациям в программе, просто их не увидит?

    Спасибо )

    Reply
  26. mrXoxot

    (25) К сожалению, у меня нет ответа на этот вопрос.

    Лучше уточнить это у разработчиков конфигурации.

    Reply
  27. Vida

    Прошу прощения, в последнем разделе «Механизм автозаполнения» появляется некий

    КонтекстИсполнения.

    Подскажите пожалуйста, откуда он берется?

    Reply
  28. Vida

    (27)Это примерно так:

    КонтекстОтчета = Новый Структура;
    КонтекстВыполнения.Вставить(«КонтекстОтчета», КонтекстОтчета);

    ?

    Reply
  29. graphbuh

    Всем привет!

    А кто знает, в какое процедуре показатели выводятся в ячейки макета…

    Например в ЗУП для РСВ есть показатель

    П011110003001 он выводится в ячейки П011110003001_1 до П011110003001_9 и еще две на знаки после запятой….

    Reply

Leave a Comment

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