<?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='\
нормальный ход
Первый, кто найдет ошибку, получит вознаграждение в 5 с/м 😉
Не пригодится
как то снегопатом обхожусь пока.
Ну разве что сравнение объектов можно поглядеть
(3) Ёпрст, сравнение объектов — это круто 🙂
Вот был такой случай — знакомый 1С-ник жалуется, не могу понять. Создал новый документ — он проводится, а движения по нему нет.
Документ не отличается от почти такого же. Начиная разбираться и, оказывается, свойство «Запись движений при проведении» было «Записывать выбранные».
Он их визуально сравнивал, но это свойство доступно только по правой кнопке.
А вот эта мне нравится еще больше предыдущей. И не забывайте, что человек выложил публикацию и отвечает всем в свой день рождения! Еще раз поздравляю в оффтоп. Счастья, здоровья, любви и побольше новых интересных разработок!
(5) dusha0020, спасибо, Андрей
Кстати, тебя тоже с днюхой! Всего-всего тебе и побольше 🙂
(2)
Задумка отличная, но чего то не хватает в интерфейсе
…
Ах да!
В конфигураторе все как-то в виде дерева представлено!
Да, вид в виде дерева — более привычнее.
А можно настроить размер картинок в отчете по общим картинкам? (Чтобы больше картинок умещалось на экране)
Вещь из разряда «must have для программиста». Когда все-таки приходится писать запросы в конфигураторе и нужно посмотреть значения перечислений и др. предопределенных элементов, то норм. Соглашусь с мнениями коллег, нужно отображение в виде дерева, как в левой таблице так и в правой. Добавить также вариант для управляемого интерфейса. Для программиста поле представление объекта нужно отчасти, в основном Имя, так что какой-нибудь флажок или настройка отображения. Добавить поиск объекта метаданных/реквизита по представлению, нужная штука, для УПП однозначно или в конфе 1С-Совместимо. По нажатию кнопки открыть страничку разработки открывается страница Метаданные+, а не актуальная. А в целом, постоянно такая обработка нужна.
Отличная обработка. Правда посмотреть как работает не могу, попытка скачать ограничилась лишь снятием $m и записью что файл скачан, сам файл получить не удалось…
(7) yuraos,
Речь идет о левой табличной части? Тут есть плюс и минус — дерево привычнее, но ТЧ, имхо, удобнее.
Полностью заменять не буду, сделаю оба варианта по переключателю.
Спасибо за предложение.
Для обычного приложения не интресно 🙁
Автор, лучше давай для Управляемого 🙂
И лучше не на форуме 🙂
(8) echo77, приму к сведению.
Но не через размер, а через количество колонок. Так будет нормально?
Посмотрел, ну… да, работа проделана, но лючше бы ты такое реализовал на управляемом приложении 🙂
Цены бы тогда не было бы 😉
(10) vladir, попробуйте еще раз.
За повторное скачивания одного и того же файла в течение одного дня с/м не должно сниматься.
Если что — пишите в личку
(9) DoctorRoza, спасибо за такой обстоятельный комментарий.
Но пока что успел только поменять ссылку на страничку разработки 🙂
Поиск тоже нужен, но я обхожусь отборами (ведь все поля обеих табличных частей доступны для видимости и отборов).
А управляемые формы… У нас на них только «Документооборот», как вспомню так и вздрогну
Так что, это дело не ближайшего будующего.
(14) DrZombi, если сделаю на УП, то цену я определю 😉
(15) спасибо. Со второго раз действительно получилось скачать. Буду сегодня посмотреть :)))
(18) vladir, не за что 🙂
Надеюсь, повторно с/м не сняли
(19) на этот раз не сняли. А вот месяца полтора назад была такая же ситуация, потратил на эксперименты по скачиванию 4 или 5 с/м. Мелочь, конечно, но напрягло 🙁 Обработка, ВЕСЧЬ! Бывает надо посмотреть, что есть что в реквизитах объекта.
(8) echo77, обновил с выбором количества колонок при печати всех картинок
(20) vladir,
> Бывает надо посмотреть, что есть что в реквизитах объекта
Вот именно! 🙂
Вот пример:
КонтрагентДляОтбора = ДопМодуль.ВернутьКонтрагентаПоИНН(«», КодПоЕДРПОУДляПоиска);
Это разработчик знает (или может догадаться по имени функции), что вернется ссылка на справочник Контрагенты.
А встроенные подсказки и Снегопаты об этом знают? Смогут ли они дать контекстную подсказку по реквизитам?
(19)
у меня подобная фигня на работе через IE наблюдается.
У него что-то нарулено с безопасностью.
После теста на «интеллект» IE блокирует загрузку файла.
Говоришь ему — да, мол хочу загрузить.
IE после этого торгуется малость и снова показывает
страничку с тестом «интеллекта» без загрузки файла.
(23)
ЗЫ
Самое интересное, что прихожу домой
и через Operu скачиваю файл,
который на работе неудалось скачать через IE
и при этом s-мани повторно не снимаются
(снимаются 1 раз на работе при первой попытке).
(2) Нашел!
ВремТабл.Колонки.Добавить(«Имя», <<?>>ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));
Не работает ни черта в моей самописной конфигурации
🙂
Создал такую же экспортную процедуру в модуле обработки. Пока все пашет
(25) echo77,
Да-с, не заметил-с…
Те, кто уже скачал:
1) в модуле формы замените строку 504
ВремТабл.Колонки.Добавить(«Имя», ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));
на
ВремТабл.Колонки.Добавить(«Имя», ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(50));
2) в модуле обработки добавьте код:
Функция ПолучитьОписаниеТиповСтроки(ДлинаСтроки) Экспорт
Возврат Новый ОписаниеТипов(«Строка», , Новый КвалификаторыСтроки(ДлинаСтроки, ДопустимаяДлина.Переменная));
КонецФункции // ПолучитьОписаниеТиповСтроки()
(25) echo77,
Обновил файл, 5 с/м перевел 😉
(3) Ёпрст, Да. снегопат делает ненужными многие обработки. Это мегавесч. Но за неимением оного очень даже хорошая обработка
Ну вот это уже более понятно.
(17)
Зачем оно нужно? 🙂
(9) DoctorRoza,
У вас весь ИС — «must have» 🙂
(22)
КонтрагентДляОтбора = ДопМодуль.ВернутьКонтрагентаПоИНН(«», КодПоЕДРПОУДляПоиска);
Это разработчик знает (или может догадаться по имени функции), что вернется ссылка на справочник Контрагенты.
А что, обработка скажет, в данную вариативную переменную возвратится именно ссылка на Контрагента? Она что — оценит функцию ВернутьКонтрагентаПоИНН на предмет типа возврата?
(29) AlexO, я вот сейчас попробовал запустить В Документообороте (на УП) — фигня получается:)
(30) AlexO,
кроме Вашей разработки? 😉
(31) AlexO, читайте внимательно последнюю строку из приведенной Вами цитаты…
Это разработчик знает (или может догадаться по имени функции), что вернется ссылка на справочник Контрагенты.
Читайте и думайте.
А у меня такая ошибка при открытии:
{ВнешняяОбработка.Метаданные2Плюс.МодульОбъекта(1724,9)}: Процедура или функция с указанным именем уже определена (ПолучитьОписаниеТиповСтроки)
Функция <<?>>ПолучитьОписаниеТиповСтроки(ДлинаСтроки) Экспорт
Конфа сложная самописная)
(35) SeiOkami, это просто несчастный случай 🙂
Как я понимаю, такая функция уже есть в общем глобальном модуле?
Попробуйте удалить эту функцию из модуля обработки.
Сейчас переименовал все экспортные процедуры и функции и обновил файл обработки.
Можете еще раз скачать — за повторное скачивание в течение дня денег не снимает.
(34)
«Разработчик — знает»
«Читайте и думайте»
«Обработка — ?»
Достройте, пожалуйста, логическую цепочку 🙂
(37) AlexO,
Разработчик знает
Разработчик открывает МД++
Разработчик находит Справочники — Контрагенты
Разработчик видит реквизиты
Разработчик копипастит идентификаторы в свой код
(38)
Разработчик видит реквизиты
Все равно непонятно — как связаны реквизиты (объекта видимо, надо полагать) и возвращаемое функцией значение.
Обработка делает анализ функции?
(39) AlexO,
Обработка не делает анализ функции.
Анализ функции делает программист. Или уже не делает, если знает.
И программист находит с помощью обработки реквизиты нужного объекта.
Неужели до сих пор непонятно?
(40)
Странный программист.. сертифицированный 1С, небось? 🙂
А если там объект получают «через 31 функцию», или просто его же там и создают? Или запросом?
(41) AlexO, я так понимаю что сейчас уже пошел чистый флуд и жажда наживы?
Любой нормальный программист получает результат функции осознанно, а не просто так.
И он знает что она вернет.
(42)
Так зачем тогда обработка, если и так наперед известно, что она вернет? 🙂
Мы с чего начали?
А пришли — к
И он знает что она вернет.
Змей укусил себя за хвост. А где же обработка? 🙂
(43) AlexO, обработка позволяет показать реквизиты возвращаемого объекта.
(44)
А как она видит этот возвращаемый объект, если запущена только обработка? Вы научились перехватывать процессы 1С?
(45) AlexO,
еще раз прочитайте (38)
P.S. Большая просьба — для Ваших словесных упражнений найдите другую публикацию.
(46)
Такая же большая просьба — четко отвечать 🙂
Ведь если обработка ничего такого не видит, а возвращаемое значение должен «знать» программист, который по отладке получает возвращаемое значение и потом смотрит — «а какие же это реквизиты у этого типа?», так что мешает ему их посмотреть в дереве метаданных?
Вот этот тонкий момент как-то все время обходится стороной 🙂
(47) AlexO,
> так что мешает ему их посмотреть в дереве метаданных?
Ничто не мешает. Кроме того, что для этого нужен конфигуратор.
(48)
А как иначе тогда узнаешь тип возвращаемого значения, если:
— не помнишь/не знал
— конфигуратора нет
— данная обработка этого не делает
?
(49) AlexO,
Прочитайте (22)
А встроенные подсказки и Снегопаты об этом знают? Смогут ли они дать контекстную подсказку по реквизитам?
После этого Вы начали безосновательный флуд в комментариях.
(50)
Это вот был вопрос к Снегопату с подсказкой, или реплика в защиту обработки?
Но за сравнение объектов спасибо, это можно глянуть 🙂
(51) AlexO, это было напоминание — с чего Вы начали флуд
Новая версия с деревом объектов почти готова. Не хватает только картинки с коллекцией иконок объектов.
Вот, что у меня есть:
Может, кто поделится? Или подскажет, где скачать готовую.
Хорошая вещь !!! Именно посмотреть реквизиты не заходя в конфу — мне и не хватало !!!
Спасибо !
Ай спасибо, мил человек!
Как вовремя мне попалось твое творение. Нет нужды теперь самому мастырить подобное.
(0) А слабо еще вот это добавить? 😉
(55) DMSDeveloper,
очень рад!
(56) Abadonna,
Ага! А потом ты еще имена полей попросишь? 🙂
(54) Al-X, для этого и писалось 🙂
(57)
Я-то ничего не попрошу. Чужой кокаин не нюхаю, свой есть — качественный, безглючный, на модули «ОбщегоНазначения» не ссылается :)))
(57) а если серьезно, то для SQL-баз имена таблиц очень даже не лишние!
К примеру, DELETE FROM … а from=???, надо знать!
(6) фига се мониторчики
(60) Abadonna,
А тоже кокаин не нюхаю. А как насчет водочки? 😉
А по сабжу — уже готова версия с деревом объектов. Но… см (53)
В нее и вставлю.
(62) tango,
ага! 🙂 У меня 2 SyncMaster S23B300
Зачет, однозначно
(65) Famza,
Спасибо большое!
Все никак не закончу новую версию — не насобираk картинок для дерева.
Напишите в личку e-mail — вышлю свежую версию, потестируете 🙂
(66) спасибо, получил.
Но тут возникло 2 момента, так сказать.
Момент 1 — наугад открывал Обработки.АвтоОбменДанными в ЗУП 2.5.70.1:
Ошибка открытия объекта.
{ВнешняяОбработка.Метаданные2Плюс.МодульОбъекта(292)}: Ошибка при вызове метода контекста (ПолучитьФорму): Недопустимое значение параметра (параметр номер ‘1’).
Может какую проверку добавить, чтоб ошибки не вываливало?
Момент 2 — просьба:
МожноНужно ли добавить в условие отбора ссылку на элемент?(67) Famza,
п.1 — Специально не делал такую проверку, чтобы было нагляднее в чем проблемы
п.2 — сорри, не очень понял о чем речь?
Если речь идет об объектах/полях — то все отборы в вашей власти 🙂
(67) Famza,
+ 68
(68), (69) речь не об объектах/полях, а конкретных ссылках. Например, справочник сотрудников выбрали, а в обработке в отбор включить ссылку на элемент «Петров», чтобы открыть не форму списка, а форму объекта, в которой все реквизиты есть — иначе открывается форма создания — пустая и ненаглядная. Может это и не улучшение, а просто убрать лишний клик мышкой.
(70) Famza,
Каталог внутренних и внешних объектов (для 1С8)
Данная обработка предназначена для показа структуры базы данных, а открытие форм — это дополнительная фича.
Я не могу придумать логической связи между метаданными справочника «Сотрудники» и конкретным элементом «Петров».
Если уж Вам хочется держать Петрова всегда под рукой 🙂 ….
(71) спасибо. Это была просто хотелка — добавить поле дополнительного отбора. А про обработку я писал (65)
Хотелось бы видеть в представление реквизита полное имя.
Например: «Документ.РКО» или «Перечисление.ВидыОпераций», а не просто «РКО» или «ВидыОпераций».
Отделу аналитики довольно сложно по укороченному имени понять, что именно лежит в реквизите.
Сделаете ?
Мой вариант доработки
Показать
(73) 7OH, такая возможность уже есть
все никак не дойдут руки выложить новую версию 🙂
(73) 7OH,
прошел ровно год, и я обновил разработку 🙂
Цены бы не было разработке, если бы прикрутить в нее редактор форм как в конфигураторе (без возможности изменения)
Например, в форме есть реквизит, а как он называется в конфигураторе, я не знаю.
Причем таких реквизитов (название на форме не совпадает с названием в метаданных) великое множество.
Ваша разработка удобна для просмотра метаданных, но ради получения имени реквизита метаданных, используемого в форме — приходится лезть в конфигуратор.
(78) pvlunegov, спасибо за столь лестный отзыв. И отдельно — за пожелание.
Как мне кажется, кое-что сделать можно.
Реально титанический труд, но есть камень в твой огород, можешь написать тоже самое, но для Тонкого клиента 🙂
Все таки за ним будущее :_
(80) DrZombi, это был титанический труд, а переписывать для тонкого клиента — вдвойне 🙂
тем более, сначала хочется по максимуму наполнить функционал чтобы потом не делать двойные изменения
Вот я валенок, только сейчас заметил, что работа Понравилась!!!
Но как и раньше, такое бы и на тонком клиенте.
Да еще с мастером запросов 🙂
(82) DrZombi, почти дозрел чтобы сделать на УФ 🙂
100-ый плюсик в копилку 🙂 Работа титаническая, но практический смысл (при условии использования снегопата) извлечь из разработки сложно, имхо
Ошибка при попытке открытия:
{ВнешняяОбработка.Метаданные2Плюс.МодульОбъекта(617)}: Значение не является значением объектного типа (Имя)
СтрокаДляСвертки.Что = СтрРекв[Реквизит].Имя;
спасибо большое
Коллега, на платформе 8.3.10.2580 ошибка
https://partners.v8.1c.ru/forum/message/1703511
{ВнешняяОбработка.Метаданные2Плюс.МодульОбъекта(62)}: Ошибка при вызове метода контекста (ПолучитьСтруктуруХраненияБазыДанных)
ТЗТаблиц = ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных, ИменаБазыДанных);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)
{
Для платформы 8.3 нужно как то по другому… Это ошибка платформы, и её до сих пор не исправили 🙁
не понимают они фильтр по константам
(87)
Здесь тоже, поправьте, если Характеристики объекта «кривые», то падает. Выделено жирным
Показать
(87) Вышел из ситуации, просто убрав параметр из вызова, понятно что работает таки образом дольше… Полезная разработка! Куда плюсы ставить то? Про УФ уже писали, могу только присоединиться. Не всегда теперь доступ дают, чтобы толстого клиента можно было запускать…