Заполнение табличной части "Установки цен номенклатуры" из документа "Оприходование товаров"




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

57 Comments

  1. Моха

    Обычно регистрирую цены поставщика, установив соответствующую галку в документе поступления. Затем по этим ценам заполняю Установку цен номенклатуры. В типовой это сделано.

    Reply
  2. VchikA

    Согласен, так и надо делать. Но речь тут идет не о поступление от поставщика, а об оприходовании собственных товаров на склад.

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

    Reply
  3. nikser

    Согласен. практически не нужная доработка .

    Reply
  4. larisab

    Обработка нужная. Перенесла из бух 77 в комплексную остатки по товарам, они ессно только на бух.регистры попали, на остальные регистры — ручками. Сделала обработку, загнала все по складам на несколько доков оприходования ТМЗ, а цены — ручками — ну как-то неохота, а тут захожу лежит — прямо как по заказу. При переходе в начале года — многим нужно будет, так что (1) и (3) не путай те народ, если самим не надо.

    Reply
  5. Моха

    (4) Это 8-ка, УТ.

    Прим. «остатки по товарам, они ессно только на бух.регистры попали» — суровые у вас переносы. ИМХО, это неестественно.

    Reply
  6. larisab

    (5)

    Это 8-ка, УТ

    Комплексная в моем комменте — это комплексная автоматизация (КА), у нас она называется УТП, УТ+БП, но без ЗУПа, как у вас. Ценообразование почти полностью идентично УТ, во всяком случае в этом документе.

    И таки да, у нас «такие суровые переносы». Сначала в БП, оттуда в УТП. А у вас есть вменяемые переносы из Бух 77 или из БП, такие чтобы и регистры заполнялись, хотя бы по номенклатуре и контрагентам. Если что кинь ссылку в каком релизе КА они появились, очень интересуюсь.

    Reply
  7. natali_sch

    Ой, а такую бы штучку для 7 версии (Бухгалерия)… но не для оприходования, а для поступления товара… Никто не встречал? 😳

    Reply
  8. larisab

    По поводу нужности обработки для дотачивания данных после переносов:

    Нашла ваши переносы из Бух77 и БП 8.1, посмотрела.

    Остатки из бухгалтерии по номенклатуре переносятся в документ оприходование товаров (вид операции ВводНачальныхОстатков) по ЦЕНЕ:

    ТоварыСтрока.Цена  = Окр(Строка.Сумма/Строка.Количество,2)

    Без заполнения колонки Цена, док не проведется. Вот понятие ваших разработчиков о данной ситуации с переносом номенклатуры в упр.учет.

    А вот о том же у наших разработчиков (КЗ):

    «Задача по переносу остатков товаров управленческого учета (в том числе и партий) по данным бухгалтерского у нас зарегистрирована и она не так проста, как кажется на первый взгляд. Необходимо учитывать множество параметров базы источника, а также базы приемника, чтобы остатки перенеслись наиболее корректно. Работы в направлении развития правил переноса данных ведутся»

    Поэтому изгаляемся пока как можем. 😉

    На мой взгляд — переносим номенклатуру по себестоимости, а в потом в УТ или КА (УТП, УПП) решаем, как ее превратить в закупочную, розничную и т.д., но на основании этих цен и перенесенных в документ УстановкаЦенНоменклатуры — как раз с помощью данной обработки.

    Reply
  9. Моха

    [QUOTE=»larisab»]Комплексная в моем комменте — это комплексная автоматизация (КА), у нас она называется УТП, УТ+БП, но без ЗУПа, как у вас. Ценообразование почти полностью идентично УТ, во всяком случае в этом документе.

    И таки да, у нас «такие суровые переносы». Сначала в БП, оттуда в УТП. А у вас есть вменяемые переносы из Бух 77 или из БП, такие чтобы и регистры заполнялись, хотя бы по номенклатуре и контрагентам. Если что кинь ссылку в каком релизе КА они появились, очень интересуюсь. [/IS-QUOTE]Я КА не юзаю. И каким боком данная наработка и КА? О каких регистрах идет речь. Я предпочитаю грузить только документы, правила пишу сам или выцарапываю из типовых.

    Reply
  10. Моха
    На мой взгляд — переносим номенклатуру по себестоимости

    Непонятно (с).

    Reply
  11. VchikA

    Итак, спасибо всем за комментарии. тут дело не в «хромание в предметной части»(7). При переносе остатков из 7.7 в КА все остатки заносятся в документ «оприходование товаров», при попытке проведения. выдается сообщение что необходимо выполнить переоценку.

    Прекрасно понятно, что сначала должен быть введен документ Установки Цен, затем переоценка, а затем в оприходование заполняются цены.

    Но при переносе с точностью наоборот.

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

    Эту обработку пришлось написать потому что оператор уже успел весь склад оприходовать.

    Советую начальные остатки вносить документом Поступление товаров и услуг.

    Eugeneer > все верно говоришь, заполнение цен не по себестоимости, а по типу цен «закупочная». ❗

    Reply
  12. VchikA

    Спасибо, учтем! 🙂

    Reply
  13. natali_sch

    (13) так там для 8, а я хочу для 7… или я не в теме?…

    Reply
  14. larisab

    (11) (12)

    Я КА не юзаю. И каким боком данная наработка и КА?

    КА, УПП, УТ — система ценообразования одна и та же, есть навороты в КА и УПП, но документ Установка цен одинаков во всех конфах.

    Данная обработка, сделанная для УТ может применятся в КА, УПП, УТП для КЗ, возможно для Украины.

    О каких регистрах идет речь.

    Речь идет о регистрах упр.учета, состав можно посмотреть в документе Оприходование товаров.

    (12)

    Строка.Сумма/Строка.Количество

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

    ТАК понятнее?

    Я предпочитаю грузить только документы, правила пишу сам или выцарапываю из типовых.

    Иногда приходится делать переносы остатков, при переходе на новую конфигурацию. 😉

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

    Reply
  15. Моха
    Итак, спасибо всем за комментарии. тут дело не в «хромание в предметной части»(7). При переносе остатков из 7.7 в КА все остатки заносятся в документ «оприходование товаров», при попытке проведения. выдается сообщение что необходимо выполнить переоценку.

    Прекрасно понятно, что сначала должен быть введен документ Установки Цен, затем переоценка, а затем в оприходование заполняются цены.

    Но при переносе с точностью наоборот.

    У меня такое ощущение, что речь о розничном складе. Какие могут быть переоценки на обычном оптовом складе?

    (19) Честно говоря, не понял сути операции. Перенос делается из разных документов в один? Т.е. остатки берутся из одних доков/регистров, а цены из других? По любому формируем документы в базе-приемнике, а не прямо в регистры пишем. Так?

    Reply
  16. larisab

    (19) У нас перенос вообще только бухоперации делает и все, далее приходится или обработкой в оприходование или из вашего переноса брать (я его только вчера ночью нашла на сайте).

    Далее проводить на ценам себестоимости, но в регистр ЦеныНоменклатуры они не попадают, надо делать док УстановкаЦен, для этого и обработка эта нужна.

    У вас в переносе есть правило УстановкаЦенНоменклатурыОстатки, но запрос там тоже к этому регистру, пока еще не разобралась, откуда же записи возьмутся в этом регистре на момент переноса )))

    Reply
  17. VchikA

    (20) Моха, речь идет о розничном складе.

    Reply
  18. Арчибальд
  19. VchikA

    Большое спасибо всем проголосовавшим 💡

    Reply
  20. onguk

    При запуске выдает

    {Форма.Форма(5,2)}: Недостаточно фактических параметров (ЗаполнитьТабличнуюЧастьПоОприходованиюНаОсновании)

    <<?>>ЗаполнитьТабличнуюЧастьПоОприходованиюНаОсновании(СсылкаНаОбъект, Объект, Истина);

    Что бы это значило?

    Reply
  21. Shum23str

    Спасибо за обработку!

    Именно то, что мне надо сейчас было

    Очень помогла и облегчила труд 😉

    Reply
  22. VchikA

    (25) 💡 Возможно, при подключении внешней обработки вы не указали табличную часть документа. Проверти: Сервис — Внешние печатные формы и обработки — Внешние обработки и заполнение табличных частей. Подгружаете обработку. Указываете документ и обязательно Табличную часть. Смотрите в прикрепленном фото. 🙂

    При загрузке обработки происходит ее инициализация, если не указана таб. часть, куда будут выгружаться данные, то возникает ошибка.

    Reply
  23. VchikA

    (25)onguk Действительно, если просто открыть внешнюю обработку в 1С, то выскакивает ошибка. Форма обработки, использовалась, только для упрощения отладки внешней обработки.

    Спасибо за замечание, перезалил файл с исправлением.

    Через форму вы не получите желаемого результата, подключайте как внешнюю обработку и вызывайте ее из документа установки цен. Скрин ниже. ❗

    Reply
  24. onguk

    Спасибо!

    Разобрался с Вашей помощью, обработка полезная.

    Не понятно только почему разработчики не реализовали эту возможность в таком простом варианте, а оставили витиеватый вариант. Правой рукой левое ухо. ❓

    Описано здесь http://www.forum.mista.ru/topic.php?id=326150

    цитирую:

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

    делаем установку цен номенклатуры. выбираем нашу цену. жмем заполнить -> заполнить по поступлению. выбираем наше поступление. проводим.

    метим поступление на удаление. удаляем.

    Reply
  25. ladoga

    Еще раз спасибо Инфостарту и Вам всем, господа программисты. 2 часа гадала, как это сделать, поискала здесь — 2 минуты и готово! +++

    Reply
  26. Franki

    Доброе время суток обработку подгружаю ругается что данная обработка не предназначина для запуска в этой конфигурации. УТ (2.2.9.7) еси не трудно можете скинуть обнавленную обработку… Товароведы забили весь остаток в опреходования и перебивать не хотят… зарание спасибо

    Reply
  27. VchikA

    (31)

    Обработка предназначена для версии платформы 8.1, если Вы используете платформу 8.2 откройте обработку в конфигураторе. Конфигуратор переконвертирует ее в формат 8.2. После этого снова подключите ее как внешнюю обработку.

    Reply
  28. sadko11

    Добрый день. Пробовал сделать все как указано на скрине ниже, но что-то не идет, не подскажите, в чем может быть проблема?

    Reply
  29. sadko11

    к 33 добавление: то есть, когда подключается обработка как внешняя в сервисе, то не открывается диалог выбора документов к которой надо подключить обработку.

    Reply
  30. sadko11

    к 33 при заполнении через другой диалог сервиса, обработка дает после загрузки диалог выбора документов, но при установке табличной части предлагает только товары и серийные номера?

    Reply
  31. VchikA

    (35) sadko11. выберите документ установка цен номенклатуры, а не документ Оприходование товаров(как у вас на картинке). и появится табличная часть «Таблица цен»

    Reply
  32. SergioVB

    Спасибо, как раз нужно!

    Reply
  33. Charlzzzz

    большое спасибо ты волшебник………я думал уже все веревку мылом мазать))))))) оприходовал 4000 позиций сам понимаешь)))))))

    Reply
  34. VchikA

    Charlzzzz,

    Не за что. Рад что обработка оказалась полезной! 🙂

    Reply
  35. valdisss

    Обработка супер-полезна, ты-молодчина, не пойму только почему в базовом функционале этого нет.

    Reply
  36. valdisss

    У меня просьба, поправить для розницы 1.0.14.4, в ней нет расчётных типа цен. В Документе оприходование одно поле — цена, тип цены не устанавливается. Мне нужно, чтобы он брал эту цену из оприх-я и вносил её в колонку с названием типа цены закупочная.

    Reply
  37. matpukc

    Огромное спасибо за обработку, кучу времени сэкономил! 😀

    Reply
  38. Zasonya_k

    Добрый вечер! Это как раз то, что нужно. Плюсую.

    Reply
  39. VchikA

    (43) Zasonya, Спасибо 🙂

    Reply
  40. DimDimych

    Спасибо автору ставлю плюс

    Reply
  41. hmv59

    Я эту обработку взяла за основу использовала в конфигурации, спасибо, помогло.

    Reply
  42. lenka-nes@mail.ru

    спасибо!пригодилось

    Reply
  43. boir

    в 10.3 в этой обработке нет необходимости, но все равно пригодилась. Спасибо

    Reply
  44. Kamikadze

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

    Reply
  45. Inkeeper

    очень полезная обработка! Спасибо!

    Reply
  46. maxim72e

    (14) Именно такая ситуация (из п.2) и у нас произошла.

    За обработку спасибо.

    (48) А почему в 10.3 нет необходимости?

    Reply
  47. ogeniv

    Спасибо, пригодилось

    Reply
  48. SERaGON

    Была взята за основу для создания обработки автоматического оприходования (создания документов). Спасибо!

    Reply
  49. ejka

    Спасибо! Очень помогла после перехода с 7 на 8! 🙂

    Reply
  50. Morokola

    А где взять такую же только под 8.2?

    Reply
  51. Morokola

    (32) Спасибо понял…

    Reply
  52. Morokola

    Спасибо, обработка классная, но только почему то валюта при установке цен не заполнилась, но это мелочи….

    Reply
  53. GvinuS

    СПАСИБО!!!!!!!!!!!!!! делал под 8,2 — спасло меня от ручной работы на 1500 позиций!!! Если в оприходывании стоит нормально Закупочная цена и валюта с курсом — все происходит на УРА!

    Reply
  54. Signal

    На 8.2 нормально работает?

    Reply
  55. Strannik99

    Так на 8.2 работает или не ??

    Reply
  56. VchikA

    обработка для 8.1 без проблем конвертируется под 8.2

    Reply
  57. Strannik99

    да, всё отлично !!!

    И доступно для нашей Тётки.

    Спасибо

    Reply

Leave a Comment

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