Универсальное распределение затрат (для Бухгалтерии предприятия 1.6)




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

31 Comments

  1. RegrZ

    даже странно что такие решения стали выкладываться бесплатно, автору + 🙂

    Reply
  2. Ish_2

    Ай , да автор. Ай ,да молодец. Не проверяя — только за идею +.

    Reply
  3. cehuma

    Не проверяя — только за идею +.

    Reply
  4. Арчибальд

    Сначала плюс за важный шаг в учете производственных затрат.

    Теперь вопросы: откуда взять коэффициенты распределения? Как мы поступаем со вторичными затратами (раз есть первичные затраты, вторичные, очевидно, тоже рассматриваются)?

    Reply
  5. gutentag

    (2) Согласен.

    Reply
  6. gutentag

    (4) коэффициенты беруться на основании учетной политике.

    Имхо наиболее удобно брать = заполнять коэффициенты пропорционально фонду оплаты труда(относимых к определенным видам деятельности) или суммы реализации(с учитывая что вид деятельности облагается НДС и не облагается НДС). А если нельзя определить к какому виду деятельности относится расход(затрата) тогда пропорционально реализации.

    —-

    Литература по теме: ПБУ 10/99 «Расходы организации», ст.318, 319 Налогового Кодекса.

    Reply
  7. Demarsh

    Всем спасибо за отзывы и плюсы.

    (4) По поводу коэффициентов. Пожалуй соглашусь с gutentag, коэффициенты должны устанавливаться на основе учетной политики организации. В качестве коэффициентов могут быть и всевозможные «чел/час»,»тн/км»,»кв/ч» и т.д., если мы говорим о услугах вспомогательных производств. Для выпущенной готовой продукции в качестве коэффициента скорее всего будет ПлановаяСтоимость*Количество. Тут важно понимать одно коэффициент <> доля, доля вычисляется как отношение коэффициента получателя к сумме коэффициентов всех получателей одного источника.

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

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

    Reply
  8. Арчибальд

    (7) Цех №1 (электроцех) освещает цех №7 (котельную), а котельная отапливает электроцех. Отопление электроцеха и освещение котельной — явно вторичные затраты, коэффициенты к учетной политике в данном случае отношения не имеют (и даже меняются в зависимости от времени года), и совсем не относятся к готовой продукции, тем более, ее реализации. Ну и? Как прикручивать опцию автоматизированного заполнения коэффициентов?

    Reply
  9. belkaksyu

    вот спасибо!

    Reply
  10. Mickl

    Это просто супер! Согласен с 1

    Reply
  11. Demarsh

    (8) Вы совершенно правы, а я вот ошибся с формулировкой — в учетной политике, конечно же, устанавливаются правила получения коэффициентов, а не сами коэффициенты (точнее коэффициенты тоже могут устанавливаться, но это скорее исключение, нежели правило). В приведенном Вами примере, в учетной политике должно быть отражено, что затраты «Цех №1 (электроцех)» распределяются пропорционально количеству отпущенной электроэнергии, а затраты «Цех №7 (котельная)» распределяются пропорционально количеству отпущенного пара, т.е. коэффициентами будут выступать натуральные показатели. Под автоматизированным заполнением коэффициентов в данном случае, я имел ввиду получение коэффициентов на основе анализа документов «Отчет производства за смену».

    Кстати, приведенный Вами в (8) пример, существует в выложенном мной примере «Пример для УниверсальноеРаспределениеЗатратТест»: объект с кодом 683 «23 — Цех №1 (Электроснабжение)» и объект с кодом 704 «23 — Цех №7 (Котельная)». Они взаимодействуют также, как Вы и описали. При этом коэффициентами для «23 — Цех №1 (Электроснабжение)» являются «квт/ч», а для «23 — Цех №7 (Котельная)» — «гкал».

    P.S. Приведенный мной пример «Пример для УниверсальноеРаспределениеЗатратТест» содержит реальные взаимосвязи объектов реального предприятия (по этическим соображениям в нем изменены названия объектов, значения коэффициентов и суммы первоначальных затрат).

    Reply
  12. Demarsh

    Выложил статью, в которой описывается дополнительная область применения данного алгоритма распределения затрат и общее описание работы самого алгоритма, http://infostart.ru/blogs/1196

    Reply
  13. rasswet

    у нас нечто подобное в 7ке сделано. по договорам которые в работе раскидываем затраты набравшиеся по 25му счету…

    Reply
  14. Мухин

    (6),(7),(8) Затраты надо грамотно классифицировать как прямые и накладные, а не первичные и вторичные. С такой классификацией не только вас не поймут, но и вы долго будете понимать о чем речь идет. Основной недостаток универсальной системы распределения затрат хочется выделить отсутствие возможности реализации сложного алгоритма при распределении накладных затрат. Примером хочу отметится, если базой служиться полученная рентабельность по выручке(СуммаРениабельности1=ВыручкаПродукция1*1.2, СуммаРениабельности2=ВыручкаПродукции2*1.02 и т.д) при этом сформировавшееся распределение служит базой для последующего, т.е. динамиченское. Как здесь эта обработка поведет себя?

    Reply
  15. Мухин

    Лично я не сторонник универсальности, поскольку реализовывал оч. сложные алгоритмы. Автору большой ПЛЮС за единомыслие!!!

    Reply
  16. Demarsh

    (15) За большой ПЛЮС, спасибо.

    (14) Мы говорим о разной классификации затрат, т.е. классификации для разных целей. Попробую дать еще одно определение: Первичные затраты — это затраты, сумма которых известна из первичных документов. Вторичные затраты — это затраты, которые возникают при распределении от одних объектов к другим, т.е. затраты полученные одним объектом от другого, при распределении и есть вторичные, их сумма изначально неизвестна и формируется в процессе распределения.

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

    Reply
  17. Арчибальд

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

    Reply
  18. Denis_Viktorovich

    Нельзя задать период, очень не хватает!

    Reply
  19. Demarsh

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

    Reply
  20. Borisych

    Пока не пользовался, но + за грамотную проработку и справку

    Reply
  21. NCH

    Спасибо!

    Reply
  22. ТатьянкаО

    А нельзя ли эту обработку адаптировать под УПП. очень нужно, а то мне выдает ошибку: Поле объекта не обнаружено (новнаяОрганизация)

    ЗначениеИзПараметраСеанса = ПараметрыСеанса[Сред(ИмяПараметра, 3)]; и обработка запоролена

    Reply
  23. Demarsh

    (22) Постараюсь посмотреть к понедельнику. Если не сложно версию конфигурации напишите на всякий случай.

    Reply
  24. ТатьянкаО

    Вот — Управление производственным предприятием, редакция 1.2 (1.2.20.1)

    Заранее, спасибо 🙂

    Reply
  25. ТатьянкаО

    Demarsh, получилось у вас посмотреть для упп?

    Reply
  26. ТатьянкаО

    Demarsh, скажите пожалуйста стоит ли еще ждать? очень нужна эта обработочка 🙁

    Reply
  27. Demarsh

    ТатьянкаО, сорри, была срочная работа — только освободился. Завтра обязательно будет обновление. Кстати, паролем защищен только модуль объекта (т.е. модуль самой обработки) — в нем находятся процедуры и функции, которые будут работать в любой конфигурации. А вот ошибка проявляется из модуля Формы — он как раз незапароленный и его можно изменять, просто при сохранении на предложение ввести пароль следует нажать отмена, при этом изменение модуля формы будет записано.

    Reply
  28. Demarsh

    ТатьянкаО, обработка обновлена и теперь ее можно использовать и в конфигурации «Управление производственным предприятием». Также исправлен ряд мелких ошибок.

    Reply
  29. Katerina_S

    Спасибо за обработку! Жаль не переделали под 2,0

    Reply
  30. zhleonid8

    за идею+

    Reply
  31. NoRazum

    Идея хороша, но код модуля под паролем.

    Reply

Leave a Comment

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