[УТ11] Интеркампани и расчет себестоимости или создание документов передачи товаров между организациями и закрытие периода




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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. ander_

    В УТ11 при использовании более 10 организаций обработка настройки схемы интрекомпани работает неверно для того, чтобы это исправить нужно в Обработки.НастройкаПередачиТоваровМеждуОрганизациями.Формы.Форма.МодульФормы в процедуре ТаблицаНастройкиВыбор заменить строку

    ИндексКолонки = Прав(Поле.Имя, 1);

    на

    ИндексКолонки = СтрЗаменить(Поле.Имя,»ТаблицаНастройкиСпособПередачи»,»»); // чтобы правильно отрабатывалить колонки с номером более 9

    почему-то очень «напрягает» этот момент…

    Reply
  2. mxm2

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

    Есть еще один вариант — обратится в 1С… чесно говоря, не помню прибегал ли к нему или нет. Много было косяков в УТ11, теперь их ЗНАЧИТЕЛЬНО меньше ))) что не может не радовать.

    Reply
  3. serezhick

    думал самому писать, а тут уже есть. спасибо

    Reply
  4. _Ramzes

    Очень интересное решение.

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

    Reply
  5. _Ramzes

    По непонятной причине запрос Запрос = Новый Запрос(ВернутьЗапросДляВычисленияСебестоимости()) возвращает номенклатуру с пустой себестоимостью.

    Сейчас буду дописывать заполнение по цене Себестоимость.

    Reply
  6. mxm2

    (5) _Ramzes, Это запрос возвращает себестоимость посчитанную документом «Расчет себестоимости»,

    Сейчас буду дописывать заполнение по цене Себестоимость.

    Можно использовать результат отчета АнализСебестоимости (Стандартный из УТ11)

    (4) _Ramzes, оперативное создание и заполнение документов Передачи УТ11 умеет делать сама, проблема только в выбранном типе цен и в правках «задним числом».

    Reply
  7. Stepan_1c

    Спасибо за статью, как раз в процессе изучения 🙂

    Reply
  8. mxm2

    (7) Stepan_1c, (4) _Ramzes, (3) serezhick, вся методика от начала до конца: http://infostart.ru/public/166451/

    Reply
  9. Stepan_1c

    (8) спасибо, заценю.)

    Reply
  10. DoctorRoza

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

    Вот уж не соглашусь! И где же там широкий функционал для настройки передачи товаров между организациями? 🙂 Ветхая обработка, в которой указывается Продажа/Не передается и т.п.!? ИМХО, это заблуждение. А вот Ваша обработка очень даже может пригодится. Только возникает вопрос, как передается товар с организации где цена с НДС/без НДС в организацию, в которой цена товара без НДС/с НДС? Если я не ошибаюсь, штатный механизм не перемещает товар, где есть несовпадение по НДС, хотя, возможно, и ошибаюсь! Как у Вас реализовано?

    Reply
  11. mxm2

    (10) DoctorRoza, обработка всего лишь агрегатирует стандартный механизм, которой есть в УТ11. Единственное преимущество — в УТ приходится все делать вручную, по каждой паре организаций (при условии, что передачи не формируются автоматически), а обработка все это делает как-бы в пакетном режиме.

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

    Reply
  12. Flyerink

    (7) Stepan_1c, если еще интересно есть отличное описание как расчитывается себестоимость в УТ

    http://www.1c-pro.ru/topic41156.html

    Reply
  13. Stepan_1c

    (12) Flyerink, спасибо уже разобрался по себестоимости. только остался один момент непонятный — после перемещения между складами реализация не списывает товар в типовых отчетах. в Анализе себестоимости видно что всё списалось, а в отчетах по складу висит остаток по собственному товару…

    Reply
  14. mxm2

    (13) Stepan_1c, Возможно дело в статусе документа перемещения.

    Reply
  15. Stepan_1c

    (14) можете поподробнее?

    Reply
  16. mxm2

    (15) Stepan_1c, Перемещение товаров (между складами) может быть проведено в трех статусах

    К отгрузке — что-то типа резервирования товара для предполагаемого перемещения

    Отгружено — товар отгружен, т.е. взят со склада источника но на склад приёмник еще не доставлен (типа товар в пути)

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

    Reply
  17. mxm2

    (1) ander_, в 11.0.9.15 — исправили ошибку эту )

    Reply
  18. Stepan_1c

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

    Reply
  19. capone

    (17) После закрытия месяца этой обработкой, запускаем штатную процедуру закрытия и она снова показывает, что обнаружены отрицательные остатки на конец месяца. Как это объяснить?

    Reply
  20. mxm2

    (19) capone, укажите плиз версию УТ и режим расчета себестоимости. Обработка работает в версии до 11.0.9.15 включительно. Для более поздних пока не адаптировал.

    Reply
  21. capone

    (20) Запускал на УТ 11.1.1.11 по среднему. В общем передача по ТоварамОрганизации формируется правильно, следом идет заполнение по регистру Себестоимость и тут минусовые остатки в ТоварыОрганизаций возвращаются опять. Какой-то ребус. А обработка нужная, не забрасывайте ее.

    Reply
  22. capone

    (20) не совсем понятно, для чего создаются передачи по регистру себестоимости? Первый проход по регистру товаров исправляет минуса по организациям, затем второй проход по регистру себестоимости возвращает эти минуса назад. ???

    Reply
  23. mxm2

    (22) capone, для 11.0 это было актуально как и оптимизация (обе вещи опциональны). Для 11.1 — это не нужно, но видимо, нужно будет строить передачи не в конце месяца, а на каждый день.

    Reply
  24. avtarworld

    Ссылка на версию для 11.1 нерабочая, можете скинуть на мою почту?

    Reply
  25. Jaivan

    Поддерживаю, обновите пожалуйста ссылку если есть рабочая версия для последней УТ 11.1

    Reply
  26. ЗС1

    Так куда же делась версия для 11.1?

    Reply
  27. mxm2

    (26) ЗС1, извиняйте господа, для последних версии УТ 11.1 рабочей обработки не существует.

    Reply
  28. fixin

    (27) Переделал эту обработку под актуальный релиз УТ (частично): http://infostart.ru/public/402503/

    Reply
  29. Crazy_kz

    Как обычно отражают возврат товара проданного в прошлом периоде?

    Reply

Leave a Comment

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