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




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

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