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




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

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