БП 3.0 (УФ) Заполнение требования-накладной остатками ТМЦ по складу с отборами по счетам и номенклатурам




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

42 Comments

  1. klaus38

    41 счет подцепит?

    Reply
  2. HorusTheOne

    Краткий ответ — да, 41-й счет подцепит.

    Обработка не проверяет счета, указываемые в отборе, на логику. Поэтому при формальном совпадении видов субконто (1-е субконто — номенклатура, второе — склад) обработка будет работать на любых счетах. Т.е. корректными счетами, которые можно указать в поле отбора, и по которым могут быть выбраны остатки обработкой в стандартной конфигурации БП являются: 07, 08.04, группа 10-х (кроме 10.07 и 10.11), 21, группа 41-х, 43.

    Reply
  3. supporting

    У тебя ошибка в запросе,»Склад» не «субконто2» а «субконто3″…

    Reply
  4. HorusTheOne

    В каком счете какой конфигурации?

    Reply
  5. supporting

    Бух 3.0 версия 236…не в счете,а при указании условия…субконто2 = &Склад

    Reply
  6. supporting

    ой…точнее бух корп

    Reply
  7. HorusTheOne

    В бухгалтерии предприятия редакции 3.0 (3.0.43.155) Корпоративной со стандартным планом счетов третьим субконто вида «Склады» имеют только два счета:

    003.01 — забалансовый «Материалы на складе»

    и 004.01 — забалансовый «Товары на складе».

    Но там и номенклатура — второе субконто, так что запрос на этих счетах не будет работать. Но насколько я помню

    1) я не приводил эти счета в качестве обрабатываемых обработкой.

    2) заполнение Требования-Накладной остатками по этим счетам не выглядит логичным с точки зрения БУ.

    Поэтому, я не совсем понимаю, о какой ошибке ты говоришь.

    Ты точно план счетов конфигурации БП 3.0 Корп платформы 1с 8.3 описываешь?

    И не перелопачен ли твой план счетов чьими-то игрывыми руками?

    Reply
  8. dodanna

    Добрый день!

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

    Reply
  9. nasha4

    платформа: 1С:Предприятие 8.3 (8.3.9.1850)

    Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.44.199)

    Вариант интерфейса: Такси

    ВОТ ЧТО ВЫДАЕТ

    Ошибки:

    ———————————————————————————

    28.11.2016 18:20:58

    Неизвестный идентификатор формы

    ———————————————————————————

    28.11.2016 18:20:39

    {ВнешняяОбработка.ЗаполнитьТНОстаткамиПоСкладуСОтборамиПоСчетамНоменклатурам.Форма.Форма.Форма(210)}: Поле объекта недоступно для записи (Окно)

    Для каждого Окно из Окна Цикл

    Reply
  10. HorusTheOne

    (9)

    Прошу прощения, но таки — да. Обработка не всегда работает при запуске из открытой формы документа (теряет идентификатор формы). Код заполнения я взял из чьей-то обработки, не полностью удостоверившись в ее работоспособности.

    Это моя вина, но на исправление сейчас нет времени и знаний, тем более, что при всех иных способах запуска — обработка работает корректно.

    Reply
  11. vado.shop

    Обработка не работает при всех вариантах запуска. Пишет, что «Команда выполняется» и потом ничего. Просто голый документ. Жаль.

    Reply
  12. HorusTheOne

    В вашем сообщении нет ни версии конфигурации, ни ее названия. Ничего, что могло поспособствовать разрешению проблемы. Жаль.

    Подозреваю, что корень проблемы тот же, что и у автора (9):

    В какой-то момент (уже после написания обработки) буквосочетание «Окно», использованное мной в качестве переменной, стало служебным словом. И, соответственно, код обработки перестал выполняться.

    Я перезалил 20.04.17 обработку в этой публикации, с учетом этого обстоятельства. Пользуйтесь.

    Reply
  13. Akela80

    Здравтсвуйте. У меня обработка не работает.

    ТЧ не заполняется остатками

    1С:Предприятие 8.3 (8.3.10.2168)

    Бухгалтерия предприятия, редакция 3.0 (3.0.49.17)

    Reply
  14. user748202

    Та же проблема. Не заполняет табличную часть документа. БП 3.0.49.27

    Reply
  15. sergoqwe

    не заполняет

    8.3.8.2137

    бух 3.0.43.241

    Reply
  16. HorusTheOne

    (16) Будучи сломленным авторитетом вашего рейтинга, под пристальным взором ясного взора с вашего аватара, а также обладая недостатком времени и знаний, я просто вставил ваш код в обработку и все заработало 🙂

    Без шуток, я сейчас временно отошел от программирования в осьмерке и порядком уже подзабыл устройство БП, и счел наиболее рациональным воспользоваться вашим кодом в перевыложенной сегодня (17.05.2017) обработке.

    Благодарю Вас за помощь и прошу совета, каким именно образом я мог бы быть вам полезен в ответ.

    Reply
  17. HorusTheOne

    Прошу скачавших более ранние (и одновременно менее рабочие) версии в личку. Ответом я вышлю текущую версию.

    Reply
  18. chesnokov-a-v

    (17) Спасибо за предложение. Вы мне и так помогли, написав данную обработку (а то что ее пришлось немного подправить, так это ерунда).

    Reply
  19. soln08

    пишет «поле объекта недоступно для записи (Окно)». как можно исправить?

    Reply
  20. HorusTheOne

    (20) Доброго Вам дня!

    Вы уверены, что скачали эту обработку после 20 апреля 17-го года?

    Если «Да», то это крайне мистическое событие, потому что начиная с 20.04 в коде обработки отсутствует слово «окно» и такая ошибка невозможна в принципе.

    Если «нет» — то Вам следует или скачать обработку по приведенной в публикации ссылке, или обратиться ко мне в личную почту с указанием даты и времени предыдущего скачивания (данные находятся в разделе «транзакции» вашего кабинета), и я вам отправлю свежую версию.

    Reply
  21. CAIN

    Коллега, такая же ерунда, обработка выдает ошибку с окном, потратил 2 стартмани, обидно…

    Reply
  22. HorusTheOne

    (22) Коллега, пожалуйста, ответе на два вопроса:

    — Как у вас получилось потратить два стартмани на обработку, которая стоит 1$m?

    — Каким образом исполнение обработки вызывает ошибку неправильного наименования переменной («Окно»), если текст обработки не содержит данной переменной?

    Reply
  23. CAIN

    (23)

    1) В две Ваших темы провалился актуальную и не актуальную

    2) Выходит что ошибку выдает.

    Воспринимайте критику без сарказма.

    Reply
  24. HorusTheOne

    А никакого сарказма и нет. Своим первым вопросом я пытался добиться от вас признания факта, что вы скачали, потратив свои $m, обработку, в описании которой красным цветом указано «неактуальная» и приведена ссылка на правильную.

    А вот ваше утверждение под пунктом 2 меня реально смущает. Вы точно уверены, что запускаете обработку из этой публикации, в названии которой фигурирует «(v1.03)»? Если «нет» — то все таки следует запускать именно ее. Если «да» — то это чудо, потому что в коде нет слова «Окно». В этом случае сообщите мне в личную почту любой альтернативный канал связи, завтра попробуем разобраться, как же так выходит.

    Вы опять можете посчитать мой вопрос сарказмом, но практика показывает, что после него ошибка с «Окном» у клиента все таки пропадает 🙂

    Reply
  25. CAIN

    (25)

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

    Reply
  26. HorusTheOne

    Нет, документ специально записывать не нужно. Если в этом будет необходимость, обработка сама предложит его записать. Обычно, если ТЧ документа после выполнения обработки остается пустым, то это обозначает, что на выбранных счетах отсутствуют номенклатуры в разрезе Организация/Подразделение/Склад. Обратите внимание — в данной обработке ведение учета по подразделениям — обязательно. Если в вашей организации не ведется такой учет, обратитесь ко мне в личку.

    С открытием разобрались

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

    Reply
  27. Atrika-96

    Не заполняет((( ошибок не выводит, но ТЧ остается пустой. Остатки есть — проверили

    Reply
  28. HorusTheOne

    (28)

    Прошу обратить внимание на важность выбора необходимой обработки в зависимости от установок учета (о чем неоднократно упомянуто в этом обсуждении). Если у вас включен учет по подразделениям — используйте обработку «БП 3.0 (УФ) Заполнение требования-накладной остатками ТМЦ по складу с отборами по счетам и номенклатурам: (v1.03)». Если учет по подразделениям не ведется — используйте «БП 3.0 (УФ) Заполнение требования-накладной остатками ТМЦ по складу с отборами по счетам и номенклатурам (v1.03) (Учет по подразделениям не ведется)«.

    В большинстве случаев выбор правильной обработки разрешает ситуацию с «Не заполняет(((«.

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

    Reply
  29. Atrika-96

    (29) Да, наверное нужно было другую обработку))) Извините)))

    Reply
  30. HorusTheOne

    (30)

    Надеюсь, что под словом «другую» Вы имеете в виду вторую из этой публикации, а не «вообще другую, другого автора» 🙂

    В любом случае, Ваши извинения излишни. Наоборот, я прошу прощения, что так и не смог внятно объяснить различие версий.

    Reply
  31. Atrika-96

    (31)

    Надеюсь, что под словом «другую» Вы имеете в виду вторую из этой публикации,

    Ну да, именно это))

    Reply
  32. user704697_iosafovam

    Добрый день!

    Конфигурация Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.53.38)

    Та же проблема «не заполняет».

    Версию обработки скачала верную.

    Reply
  33. HorusTheOne

    Добрый день!

    Прошу прощения за долгое время отклика и за возможные негативные ощущения от нижесказанного, но…

    Вся предыдущая практика подсказывает, что Вы скачали неверную версию обработки.

    Reply
  34. mikitondom

    Коллега разработчик не прав, в БУХ КОРП (!) не работает.

    Пришлось немного допилить, убрать часть запроса по складам.

    Reply
  35. Olshirokova

    Добрый день!

    В Бухгалтерия предприятия, редакция 3.0 (3.0.58.20) не работает

    Reply
  36. user632183_etatbadin

    БП 3.0 (3.0.58.41)

    Скачала обе обработки, не заполняет ни одна.

    Reply
  37. user632183_etatbadin

    (34) Скачала обе, блин, прочитав Ваш коммент. Не решило. Пустая ТН

    Reply
  38. doctorov_s

    В данной обработке не корректно работает группировка!

    Reply
  39. ptica-voron

    Скачал, не заполняет.

    БП 3.0 (УФ) Заполнение требования-накладной остатками ТМЦ по складу с отборами по счетам и номенклатурам (v1.03) (Учет по подразделениям не ведется)

    Бухгалтерия 3.0.60.50

    Reply
  40. v_id

    В БП Корп 3.0.67.54 не работает заполнение БЕЗ фильтра по счетам (СписокСчетов пуст в параметре запроса)

    Если отбирать нужные счета руками, то заполняет.

    Reply
  41. vika77777

    В БП Бухгалтерия предприятия, редакция 3.0 (3.0.66.60) просто не заполняет без всяких комментариев. Учет по подразделения ведется.

    Reply
  42. HorusTheOne

    Приведенные выше комментарии актуальны до выхода версии 2.0.

    Прошу комментировавших обратиться в личку для урегулирования.

    Reply

Leave a Comment

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