<?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='\
Честно говоря , не понял зачем это нужно, а в описании — ни слова.
Что же касается техники исполнения , то процедура в главной форме ПриАктивизацииСтроки отрабатывает очень медленно.
Предложение навскидку : интересно бы выглядел журнал — дерево ,свернутый по видам документов ,например, или по датам.
(1) Затем же, зачем нужен типовой Универсальный журнал. Этот работает везде и имеет энное количество дополнительных фич, которых лично мне не хватало довольно долго.
«Дерево» можно построить на основании журнала произвольным отчётом.
При активизации — посмотрю, что можно оптимизировать. Но там, по-моему, кэшем решать надо, а у меня времени маловато на переделку.
(1) Насчёт ПриАктивизации: а у вас включён показ движений и таб.частей?
Показ движений и табчастей не используется.
На форме только табЧасть с документами одного вида «ОтражениеЗарплатыВ РегламентированномУчете»( с большими табЧастями , разумеется).
Активизация каждой строки — медленная.
Очень странно. Посмотрите отладкой, на каком моменте тормозит? У меня всё отрабатывает быстро. Размер ТЧ при отключённом показе ни на что влиять не должен.
Предполагаю , что дело в объектной технике обращения к данным :
ТекОбъ=ТекущиеДанные.Ссылка.ПолучитьОбъект()
У Вас грузится весь объект (он может быть достаточно большим, как в моем случае).
Правильнее , на мой взгляд, использовать запросный метод обращения к данным :
«Выбрать * из … где Ссылка=&Ссылка»
Во всяком случае, можно попробовать и сравнить результаты.
(6) Чуть подправила, перезалила (объект документа получается только если включён показ движений).
(6) Запрос к полной таблице каждого регистра (а ещё метаданные парсить, чтобы понять, по чему вообще м.б. движения…) — точно дольше (именно дольше, вопрос памяти я здесь не поднимаю), чем получение объекта и его движений.
(9) Речь в (6) идет только об осторожном предположении ,
что запрос по документу
«Выбрать Номер из … Где Ссылка=&Ссылка»
отработает гораздо быстрее ,чем
Номер = Ссылка.ПолучитьОбъект().Номер,
потому что в последнем случае грузится весь объект.
Что же касается, обращения к движениям документа ,
то обращение к ним через свойство «Движения» это и есть неявный запрос к регистру и свойство это придумано для удобства разработчиков.
Так мне помнится написано у Радченко. Но боюсь соврать.
(10) Реквизиты документа (а также табчасти) действительно проще брать напрямую через ссылку, что и сделано в последней версии обработки.
Насчёт движений по регистрам: при включённом показе движений стоит задача получить в виде таблиц все движения документа (т.е. таблицы тех регистров, по которым конкретный документ имеет хоть одну запись как регистратор). Для этого есть пять возможностей:
1. Использованная в данной разработке — получение объекта документа, через него — его движений, перебор их в цикле.
2. Перебор в цикле по Ссылка.Метаданные().Движения и
2.1. Создание по каждому регистру набора записей с отбором по регистратору, считывание.
2.2. Обращение к каждому регистру через Выбрать() с отбором по регистратору (полный маразм, потому что ещё и таблицу создавать, и в ней построчно переносить, и вообще, но возможность-то есть).
2.3. Обращение к каждому регистру через запрос вида «ВЫБРАТЬ * ИЗ Регистр[…] ГДЕ Регистратор=&Ссылка».
2.4. Обращение к аждому регистру через запрос вида «ВЫБРАТЬ * ИЗ Регистр[…]([…],Регистратор) ГДЕ Регистратор=&Ссылка».
Что-то мне подсказывает, что наиболее быстрая — первая. Насчёт других ресурсов (память, пессимистичность/оптимистичность устанавливаемых блокировок и т.д.) — отдельный разговор.
В любом случае спасибо за замечание, полезно оказалось 🙂
2.1. Создание по каждому регистру набора записей с отбором по регистратору, считывание.
Чем плохо ?
В этом случае не происходит считывание в память всего объекта с его табличными частями как в Вашем варианте.
Идет обращение только к движениям документа.
Убиваем двух зайцев : сокращаем время считывания и уменьшаем вероятность невозможности считывания из-за возможной блокировки документа.
Мне кажется так.
Вроде красиво. Тоже делал подобное, только до универсальности не доработал, использую в самописках. Авансом плюсану, на всякий случай 🙂
Странно , но я вижу скрытые Вами записи с пометкой «Запись скрыта».
Что-то опять с движком …
(12) Возможно, так и быстрее будет. Замерять надо. Есть чем и на чём?
(15) «Есть чем и на чём?» — цокнул языком , почесал в затылке — Нету.
(16) А мне некогда 🙁
(17) Крыть нечем. Ухожу.
(18) Жаль, вдруг бы ещё что полезное сказали…
(0) Если текст процедуры СписокДокументовПриАктивизацииСтроки перенести в другую, например, ЖурналДокументовСписокПриАктивизацииСтроки и написать так
Процедура СписокДокументовПриАктивизацииСтроки(Элемент=«»)
ПодключитьОбработчикОжидания(«ЖурналДокументовСписокПриАктивизацииСтроки», 0.1, Истина);
КонецПроцедуры
то по списку документов можно будет даже бегать стрелками.
Возникает ошибка, если название табличной части совпадает с названием регистра.
(20) Спасибо за идею, попробую. (21) Сейчас разберёмся — префикс поставлю.
Пожелания:
1. Было бы хорошо что бы сохранялись настройки произвольного отчета.
2. Пункт «Найти содержащие ссылки на …» — хотелось бы что бы сохранял тип предыдуще выбранного
3. В печатном реестре чтобы автоматом отображал итоги по колонках с типом «число»
Если включен просмотр только движения и если при движении по списку попадает непроведенный документ, то панель с движениями прячется и больше не появляется.
(23) 1. Настройки произвольного отчёта можно сохранять в файл. Об этом написано в справке соответствующей формы. Мне бы и самой хотелось сохранять их параллельно с прочими настройками, но слишком много проблем пока — как отрабатывать удаление колонки из настройки, например?
2. Сохраняет по идее. На кнопку выбора из списка нажимали?
3. В произвольном отчёте отображает. В реестре доп. колонки не выводятся вообще.
(24) Исправлено, сейчас выложу.
(25) Теперь работает так. 🙂
Если включен просмотр только движения и при движении по списку попадает непроведенный документ, то панель с движениями прячется. Потом если попадает проведенный документ, то панель с движениями появляется. Потом если попадает непроведенный документ, то панель с движениями прячется и больше не появляется. Хватает на 2 документа.
+26 Немного подправил привязки. Осталось странное промигивание 🙁
Если разработка продолжается, то неплохо было бы где-то писать номер опубликованной версии. Например, как здесьhttp://www.infostart.ru/public/69189/ или здесь http://www.infostart.ru/public/19363/
(26) Очень странно, пойду проверю ещё разок. У меня такого эффекта нет 🙁
С привязками исходно пришлось помудрить (никак не хотели вставать как надо), так что любую помощь приму с благодарностью.
Нумерация версий и правда уже вести пора…
(26) Потестировала. Описанного явления не наблюдалось (
Привязки разделителя надо помучить, это да, а то он поверх списка документов плавает и никак не хочет убираться.
(29) Вариант в (27) не вариант?
(31) Упс, только заметила. Подходит за одним маленьким изменением:
ОтобразитьПанельТабЧастей(МетаданныеДокумента);
уходит в низ процедуры. Выкладываю как новую версию?
(32) Нет. Это просто пример, там много рабочего мусора.
При пролистывании списка документов в файловой версии тормозит на ОбновитьКнопки();, в SQL версии на ТекОбъ.Движения[НаборДвижений.Имя].Прочитать();
(33) А я уже выложила… машинально 😉
(34) Надо потестировать разные варианты получения движений, там в начале комментариев описано.
(35) Я могу посмотреть варианты оптимизации, так — чисто из спортивного интереса.
Выдает иногда вот такую ошибку
(36) Буду весьма признательна.
(37) Лечится элементарно, сейчас выложу поправленное.
(38) Возможно это новая версия. См. вложение.
1. Определение отображаемых закладок запросом.
2. Заполнение информации на закладках только при открытии соответствующей закладки.
+39 Чуть прибрался
+40 Что-то я не успеваю. Добавил заплатку как в (37)
(41) И не успеете — я уже у себя всё очередной раз перелопатила 🙂 Сейчас полезу сравнивать версии. Там выигрыш по времени насколько (если не считать показа только по отображению)?
(41) З.Ы. Вау, первый раз вижу такой вариант мРазложитьСтрокуВМассивПодстрок 😉
(41) Ох мы с вами и разойтись успели… Полчаса сидеть придётся 8)
(41) С заполнением ТЧ запросом не согласна абсолютно. Движения — да, есть о чём поспорить, а вот ТЧ выгрузить из ссылки — быстрее всего.
(45) Нет не так. Запросом отределяется только перечень закладок. См. ПЕРВЫЕ 1.
Т.е. только проведяется факт наличия информации и не более.
Остальное как было раньше, только не сразу все читается, а по мере обращения. Т.е. если закладку не открывать, то данные для неё не будут прочитаны.
(43) Я ещё крестиком вышивать умею… 🙂
(46) Прошу прощения, нашла. Да, имеет смысл. Сейчас перепричешу с учётом своих изменений и выложу.
(47) Не вопрос! Вышивайте 😉
(48) Не дождался. Добавил сортировку закладок.
(49) На обед ходила, не всё ж сразу делать. Минут 15 ещё, и усё будет.
(49) Таки вот, готово. Вроде ничего не упустила.
(51) Еще немного подправил код.
Хотелось бы уточнить про версии. Обычно делаю так:
1.2.3.4
1. Координальные изменения функционала
2. Значительные изменения, расширение функционала
3. Незначительные изменения функционала, оптимизация
4. Исправления ошибок — функционал не изменен
(52) Увы, я довольно безалаберна в версификации разработок 😉
Отчет по движениям документа находится в меню Перейти. Мне кажется логичнее его поместить в меню Печать.
Как насчет вложения в (52) ?
Кажется победил лешние промаргивания при отображении закладок, теперь только прорисовка объекта. См. вложение.
Эстер, я вернулся. Со скромной целью — влезть в вашу дискуссию со своим уставом (читай -вкусом).
Представленная разработка , возможно , полезна. Но ,на мой вкус, неинтересна.
Всё как обычно : чего-то к чему-то прикрутили , чего-то подправили.
Не хватает какой-то идеи , отличия или изюминки.
В (1) мне показалось , что такой изюминкой может оказаться представление журнала
в виде дерева , свернутого по какому -то интерактивно настраиваемому параметру (дата, вид документа и т.д.). Не Бог весть что- с точки зрения техники исполнения .
Но такая бы разработка заинтересовала бы и , думаю, запомнилась.
(54) Я подумаю. В типовых он в меню «Перейти» — тут скорее вопрос, как пользователю удобнее.
(55) Обновила основной файл, вычистив лишние закомментированные куски.
(56) А чем в таком случае не устраивает вывод отчёта?
(55), (56) Я вот думаю прикрутить настройку и сохранение позиций колонок (не ту, которая через Настройку списка, а свою похожую.
(57) Отчет , конечно, хорошо.
Но интересен подход ( только для меня ,конечно ) :
Табличное поле, содержащее журнал, имеет вид «Дерево».
Пользователь открывает , добавляет интерактивно документы, т.е. совершает все необходимые действия, из Дерева .
Пользователь интерактивно сворачивает-разворачивает журнал документов по нужному параметру (например, по дате).
Такой реализации я еще не встречал.
Вот такое скромное пожелание.
(59) Для построения дерева данные необходимо группировать. Перестроил запрос. Результата не дождался — убил.
(58) Поправил отображение итогов в списке и привязки на форме. См. вложение.
(60) Ничего не понял. По порядку :
Для получения таблицы значений , служащего источником данным для табличного поля «СписокДокументов» с источником данных «таблица значений» на Основной форме используется запрос.
Медленный или быстрый.
Вопрос :
чем такой запрос(«плоский») лучше или хуже запроса («с итогами») для выгрузки в дерево , как источника данных для табличного поля «Список документов» ?
Поэтому фраза «не дождался — убил» относится как к «плоскому» запросу ,
так и к запросу с итогами , который ничуть не медленнее .
(62) Переписал. Так?
(63) 1. Где в таком случае настраиваются группировки? Или фиксированно — только по дате?
2. Для дат и чисел надо бы периодическую группировку…
*а вообще идея хорошая, да. Только сразу перестают работать такие банальные штуки, как добавление нового документа и прочие операции со строками. Проверка нужна.
(64) Вообще-то отваливается почти всё и перенастраивать придется очень многое. Например, итоги. Чтобы это начало работать пришлось сделать ряд заплаток. Уверен, что для получения полной функциональности придется ещё многое перелопатить. Решение о направлении дальнейшего развития все равно примимать автору.
(65) Не ожидал , что сделаешь. Спасибо.
Мне-то , разумеется, понравилось. Визуально выглядит — необычно.
Конечно , перелопатить придется многое. Сейчас много ошибок.
Насколько это будет удобно для конечного пользователя — сказать трудно.
И , конечно, решать автору : нужно это или нет.
(65), (66)
Честно признаюсь: мне — лень. Слишком много проблем возникает. Лучше хранимую нормально настройку колонок напишу. Если многоуважаемый alexk-is решит развивать «деревянную» идею — флаг в руки, выкладывайте отдельно.
В скриншотах нет табличных частей и движений документов.
(66) Сам не ожидал. Первоначальный вариант был очень медленный и глючный
(67) Понимаю.
(68) Из «дерева» вытекают многия следствия и дополнительный, возможно неожиданный, сервис для пользователя.
Но каркать не буду.
Если останется зарубка на память , «что так можно!» — и то хорошо.
Браво , Алексей !
(68) А стоит? Тогда сейчас сделаю.
(71) Хм. А я думал, что в этом главная изюминка.
В некоторых конфигурациях есть скрытые табличные части. Без спец. средств их не увидеть.
Возможно я не до конца проникся. 🙂
(72) Нет, задача стояла сделать действительно универсальный (для любой конфы) журнал с фичами, которые иногда нужны, а с собой носить влом.
Давно хочу туда же всякие универсальные обработчики прикрутить — установку реквизитов, выполнение произвольного кода и тыды. С проверкой прав, конечно. Там в хелпе в принципе написано.
А показ ТЧ и движений — это уже почти по умолчанию для такой разработки. И не задумывалась особо. Мне больше важна СКД на всё это дело — позволяет выдать пользователю всю инфу (ну кроме собсно ТЧ и движений) в любых разрезах. Построить диаграммку — каких документов по какому признаку сколько, рост документооборота во времени и прочие вкусности.
«Следует учитывать, что при первоначальном открытии обработки список документов не заполняется. Данное поведение обусловлено тем, что по умолчанию в настройках обработки в состав отобранных документов не включен ни один документ. Для включения документов в список универсального журнала необходимо произвести первоначальную настройку состава обработки.»
Может быть сразу открывать форму для настройки списка, если он пустой?
Получил ошибку:
{ВнешняяОбработка.ИсторияОбъекта(40)}: Ошибка при вызове метода контекста (ВыгрузитьЖурналРегистрации): Ошибка совместного доступа к файлу ‘C:Documents and SettingsКонстантинов.INFORMLocal SettingsTempReg1C.xml’
ВыгрузитьЖурналРегистрации(ИмяФайлаЖурналаРегистрации, ФильтрЖурнала);
по причине:
Ошибка совместного доступа к файлу ‘C:Documents and SettingsКонстантинов.INFORMLocal SettingsTempReg1C.xml’
(74) Хорошая идея, сейчас сделаю.
(75) Никогда на такую не налетала, видимо, что-то локальное. Появятся идеи по обходу — пишите, пока затычку на попытка-исключение сделаю.
(74), (75) — 76 сделано.
(76) +75 Запустил в двух конфигурациях. Можно исключить ошибку, если использовать не фиксированное имя Reg1C.xml, а уникальные имена файлов. Как это сделано при обращении к вложенным обработкам.
(78) Можно. Уже готово.
(79) Хм. Пропали все изменения от 22.04.2010. Привязки, оптимизация кода и выравнивание итогов в подвале. Выкладываю снова. См. вложение.
(80) Уупс, может, файлом промахнулась. У вас уже с учётом поправленной ИсторииОбъекта?
(81) Да
(82) Тогда я не сравниваю файлы, просто выкладываю оверрайтом. Еще раз спасибо.
Аффтор жжот нипадецки!!!!!!!!!!
Давно хотел сам такое сделать, да лень 🙂
Жаль, нельзя поставить 10 плюсов.
(84) Можно. Нужно только захотеть… 😉
(84) Ну можно ставить плюсы к комментариям 😉
Вот подумываю продолжить (67), что скажите?
(88) Флаг в руки, однозначно 🙂 Я только за.
(88) Можно посмотреть, что из этого получается.http://www.infostart.ru/public/69707/
И, конечно, обсудить, прокомментировать, посоветовать. Буду весьма признателен.
А можно ли выбрать поле к примеру СуммаДокумента и чтобы все доки у которых такое поле есть выводили значение? Напрягает первый раз настраивать под себя. ❓
(90) В данном случае используется типовой механизм. Порядок действий следующий:
1. Выбрать виды документов для журнала.
2. Добавить в списке граф графу для журнала с нужным наименованием. Например, «Сумма документа»
3. В дереве реквизитов найти реквизит в одном из документов «Сумма документа»
4. В панели интрументов выбрать «Установить флажки» и «Отметить для всех документов по имени текущего реквизита»
Собственно таким образом можно заполнить любые графы, например, «Контрагент». Порядок действий будет аналогичным.
(91) Спасибо, абсолютно верно 🙂
(90) А ещё можно нажать «Заполнить»-«Заполнить автоматически все общие графы». Это если нужная графа есть у всех документов и называется одинаково.
У меня не доступна кнопка отмена проведения…=(
а документ точно проведён?
Хорошо. Добавить бы в список графы из табличной части — итого и еще отбор — по проведенным не проведенным документам
Извеняюсь отбор проведен не проведен нашла
Интересно, при открытии в конец не переходит…
Это только у меня?
Или эта ошибка всех общих журналов?
(97) Если вы внимательно посмотрите на обработку, вы заметите, что это — не журнал документов в терминологии 1С, следовательно, не все общие механизмы настройки журналов документов в нём применимы.
Если позарез нужна настройка типа «при открытии переходить…» — напишите, время будет — сделаю.
(98)
Спасибо за разъяснение.
Я думала, что если эта настройка в данной форме есть, то она должна работать.
Я только изучаю 1с8. Есть повод разобраться и сделать самой.
Только странно, как им пользуются другие.
Ведь без этой настройки работать очень неудобно.
Спасибо, очень удобный журнал. Нашим пользователям помог 🙂