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




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

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