<?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='\
В табличных документах 1С 8 имеется отличная возможность использования группировок, но управление уровнями группировок через контекстное меню не очень удобное.
В своих отчетах для управления уровнями группировок я использую маленькие кнопочки на поле табличного документа — это намного удобнее и быстрее, чем через контекстное меню.
Перейти к публикации
И зачем? Если для поля табличного документа отобразить заголовки, то кнопочки волшебным образом появятся сами собой.
Saint,
Да, можно и так…
Но (IMHO) отчет с включенными заголовками смотрится как-то «лохмато», непрофессионально. Заголовки захламляют отчет, представляя собой совершенно лишнюю информацию. А также занимают место, уменьшая полезную площадь для отчета, которой порой так не хватает…
Вобщем я пользуюсь сгенерированными кнопочками. Может кому-то это тоже понравится. Как говорится — «На вкус и цвет…». 😀
Привяжи начальные координаты к верхнему углу ПоляТабличногоДокумента, будет универсальние. В отчете могут быть отборы как в типовых отчетах. И надо уж тогда менять координаты кнопок при влючении и выключении отборов в отчетах.
НачалоВерх = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Верх + 3; // Тут установить начальные координаты для кнопок
НачалоЛево = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Лево + 3; // Тут установить начальные координаты для кнопок
….
НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Сч — 1));
…….
Испоравь так. Так кнопки сгенерерованные перекроют даже кнопки при включенном заголовке )))
Pashkaa,
Спасибо за дельное дополнение, так действительно будет лучше и универсальнее.
Уже поправил.
В случае если табличное поле находится на панели, ЭлементыФормы.ПолеТабличногоДокументаРезультат.Верх даст результат расстояния поля от верха панели, а не формы. Для корректного формирования кнопок в этом случае их нужно формировать на панели.
VladZetRu,
Да, конечно,если ПолеТабличногоДокумента находится на Панели, то в этом случае кнопочки нужно формировать на Панели, а не на Форме.
И код тогда надо будет изменить так:
НоваяКнопка = ЭлементыФормы.Добавить(Тип(«Кнопка»), ПрефиксИмениКн + Сч, Истина, ЭлементыФормы.Панель1);
(5) Возможно, что для универсальности строку с именем элемента управления «ТабличноеПоле» (т.е. «ТабДок») лучше передавать как параметр в обе процедуры, чтобы не пришлось менять код в случае с другими именами.
Или вариант 2 — сделать спец.шаблон 1С, в котором имя будет запрашиваться и подставляться в код.
(8)Да, на счет передачи, как параметра, ты прав, так будет лучше.
А про «спец.шаблон 1С» — чёт не понял… (((
(9) Ну этот код явно просится быть добавленным в файл шаблонов 1С, при вставке шаблона в код можно юзать подстановку параметров.
Клевая штучка, но не более, нужно быть очень метким чтобы «ткнуть» на эту кнопочку.
Очень удобный вариант сделан в «1с Деньги».
(10) Теперь понятно, о чем речь. Тоже неплохая идея. Спасибо, artbear.
(11) На счет: «… нужно быть очень метким …» — эти кнопочки даже чуть-чуть больше, чем те системные кнопки, которые появляются при отображении заголовков Таблицы.
Интересно, а какой вариант в «1С Деньги»? Я не видел…
здо’рово! спасибо!
Респект! Надо будет к универсальному отчету прикрутить…
Показать
и разворачивает тоже.
(16) e.kogan,
Твой вариант Процедуры СвернутьДоУровня(Элемент) предпологает другой алгоритм работы кнопок, отличающийся от системного. Наверное кому-то понравится и твой вариант, что-то в нем есть.
Но твой вариант требует проработки. Попробуй сразу после формирования отчета: нажать 1 (сверется до уровня 1), потом нажать 2 (развернется уровень 1 и уровень 2), потом снова нажать 1 (ничего не происходит… а срабатывает только по повторному нажатию).
Можно передавать ЭлементыФормы и ПолеТабличногоДокумента как параметры процедуры. Тогда не будет привязки к конкретной форме и табличному полю, а сама процедура станет универсальной и ее можно будет вынести в один из общих модулей.
(17) Да я сама что-то, видимо, под конец рабочего дня перекрутила мысль 🙂 Ну нафиг, оставлю у себя как было.
(18) Да, можно и так — прописать параметры и вынести в общий модуль. Получится действитель универсально.
В публикации описана сама идея генерации кнопочек, а как ее применить — каждый для себя решит сам, в меру своих знаний и потребностей. 😀
(19) Утро вечера мудренее… 😀
(18) Я об этом уже говорил в (8)
Есть один минус — у действия «СвернутьДоУровня» может быть только один параметр (Элемент), сюда параметры не передашь, значит, нужно либо где-то отдельно хранить данные либо пользоваться шаблоном, который автоматом развернется в нужный/правильный код.
Врезал в типовой универсальный отчет. Теперь работает во всех отчетах, сделанных на его основе включая внешние. Спасибо за идею.
+23 Изменения для модуля УниверсальногоОтчета с учетом комментария (27)
// ИС КАВ ( 20.04.2011
Перем Фор
(24) Спасибо alexk-is. Твоё сообщение тянет на отдельную публикацию. 😀
Отличное применение идеи.
Только в коде (в двух местах), наверное, лучше заменить: текст «КнопкаГруппировки_» на переменную ПрефиксКнопки.
Добавил в публикацию ссылку на твоё сообщение.
А как быть если группировки расположены не по вертикали а по горизонтали? Или и то и другое вместе?
(24) Малость пришлось дописать, т.к. при нажатии кнопки «Быстрые отборы» «КнопкиГруппировки_» оставались на месте
Показать
Ну и в процедуре «СгенерироватьКнопкиУправленияГруппировкой» добавил удаление кнопок
Показать
(26)
А как быть если группировки расположены не по вертикали а по горизонтали? Или и то и другое вместе?
Ответом на этот вопрос служит публикацияhttp://infostart.ru/public/84642/ от alexk-is, которая содержит дальнейшее развитие идеи.
очень удобно)
А как быть с управляемыми формами?
я не по делу, спасибо за обработку и возможность ее откомментировать
Не получилось наскоком прикрутить к управляемой форме 🙂
Нет свойств Верх-Низ… Надо что-то думать. Идея — суперская!!
(32)Спасибо за комментарий, очень приятно!
Я не использую в своей работе управляемые формы, поэтому не могу ни чем помочь, к сожалению… 🙁
Но если у тебя получится прикрутить эту фичу в управляемых формах, будет очень здорово. Не забудь только сообщить об этом в этой теме. Я думаю, что это бы потянуло на отдельную публикацию.
Успехов в исследованиях.
(33) mtv:)
Спасибо за напутсвтвия, пошел пробовать.
Для избавления от рамок рисунков изменил функцию СвернутьДоУровня() молуля формы так:
[CODE 1с]// Вызывется при нажатии кнопочек «1», «2» и т.д. (для сворачивания группировок)
&НаКлиенте
Процедура СвернутьДоУровня(Уровень)
Результат.ПоказатьУровеньГруппировокСтрок(Уровень — 1);
Массив = Новый Массив();
Массив.Добавить(Результат.Область(1,1,1,1));
Элементы.Результат.УстановитьВыделенныеОбласти(Массив);
КонецПроцедуры[/1C-CODE]
Теперь все довольно мило.
Однако, в веб-клиенте FF8, IE8 не работает. Кнопки рисуются не тогда и не там, где определено и не реагируют на нажатия. Так что пока только для тонкого клиента (8.2.13.219).
(36)Приветствую ваше любопытство и упорство. Вот и первые результаты появились.
До этого получал только вопросы типа: «А как быть с управляемыми формами?»…
И вот нашелся человек, который решил исследовать эту проблему.
В моей публикации только рабочая идея. А развить ее под свои задачи может каждый для себя сам. Примеры имеются. Правда все только (до текущего момента) под обычное приложение.
Успехов вам.
(36) Отлично, спасибо за труд — все получилось как надо! Вынес функции формирования кнопок и реакцию на их нажатие во внешний клиентский модуль и в любом отчете теперь все что нужно добавить 2 строчки!
А если добавить в формировании кнопок: НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша[«_»+сч],Истина,Ложь,Ложь), тогда мона будет с помощью комбинаций alt+[номер кнопки] сворачивать/разворачивать клавой.
(39) Похоже у объекта НоваяКнопка нет свойства СочетаниеКлавиш, вы сами пробовали, работает?
ДА, пробовал, все работает на ура.
(41) А, я кажется понял — я вынес процедуру создания кнопок во внешний модуль, а СочетаниеКлавиш относится к контексту формы
(39) rumik007, спасибо за дельное дополнение.
Добавил в код публикации твою идею (горячие клавиши для кнопок управления уровнем группировок), с сылкой на тебя.
Еще раз, спасибо.
Добавил в модуль формы (1С 8.2.14.540) код программы, то что на главной указано при проверке модуля на ошибки выдает сообщение:
«{Отчет.Отчет2.Форма.ФормаОтчета.Форма(38,57)}: Тип не определен (Действие)
НоваяКнопка.УстановитьДействие(«Нажатие», Новый <<?>>Действие(«СвернутьДоУровня»)); (Проверка: Сервер)»
Да и я как понимаю, код не для управляемых форм, т.к. просто вызвать функцию Добавить() для 8.2 не пройдет.
(44) на клиенте тоже самое, поэтому просто попробовал на сервере выполнить данную процедуру, но всё-равно не прошло.
(44)(45) EvgeniuXP, да, код, который в публикации, работает только в обычных (неуправляемых формах).
Для управляемых форм смотри выше сообщения от nissal, он экспериментировал с управляемыми формами, и у него есть определенные результаты.
Я не работаю с управляемыми формами, т.к. нет пока необходимости, поэтому помочь ни чем, к сожалению, не смогу.
(46) Спасибо, нашел, прочитал комментарии. Но минусы есть в решениях, в веб-клиенте кнопочки не видны — это одна беда, а вторая — то, что эти кнопки не всегда нормально отображаются в зависимости от уровней в отчете… нет такого события обновить форму после нажатия кнопки «Сформировать», а при чтении — не всегда срабатывает 🙁
Решение там одно, делать кнопки 1,2,3 и т.д. — т.к. они видны в веб-клиенте и написать свою кнопку «Сформировать» вместо штатной.
Спасибо! За идею! 🙂
Спасибо
И ведь работает. 🙂 Теперь буду втыкать во все свои отчеты, а автору — огромное спасибо, действительно нужные кнопочки.
По мне так самый лучший вариант сворачивания открытых группировок сделан в Windows в редакторе реестра. Так в очень больших группировках снизу бывает долго подниматься на самый верх,а так кликнул по вертикальной полосе и группировка свернулась. На мой взгляд так гораздо удобнее.
(51) MrVesna, Ctrl+»стрелка лево» гораздо эффективнее.
В СКД сделал немного по-другому:
Показать
и в форме отчета
По-идее должно без проблем работать в тонком клиенте.
(53) andy_zhav,
если твой код будет работать в тонком клиенте, то это замечательно. К сожалению проверить не могу, не на чем.
Отпишись здесь, пожалуйста, если действительно нормально заработает в тонком клиенте.
(54)Отбой тонкого клиента. Только толстый. На сервере нет команды «Оповестить»
Хотя, по моему мнению, все равно красивее смотрится через обработку оповещения…
Нужные кнопочки, можно использовать в отчетах — удобно и просто….
Подскажите, а в какой предопределенной процедуре вызывать процедуру генерации, если отчет строишь на СКД ?
(57) mybracho, в твоем случае проще всего сделать так:
Вешаешь на кнопку «Сформировать» следующую процедуру
Показать
И твоя задача решена… 🙂
(58)
Круто. Спасибо
Повыносил эти процедуры в общий модуль. Повставлял их вызов в свои отчеты. Получилось компактно. Счастлив
Понравилась идея, очень удобно, если вынести в общий модуль. Совсем несложно и доработка для группировки колонок.
Ай, молодцы, всё ведь возможно
понравилось
И почему народу так трудно выбрать уровень из контекстного меню? Причем доступно в любом месте показа уровней, и не надо крутить туда-сюда отчет.
Спасибо, пригодилось !!!
Вот это как раз и надо. Спасибо!
Замечательный механизм, как я раньше о нём не узнал.
А главное это позитив от довольных пользователей которым добавили удобняшку 🙂
Можно как-то использовать данную разработку, чтобы развертывать/свертывать группировки по условию? Например, поле группировки равно 0 и т.д.
Спасибо! Как просто и удобно.
Супер! Очень удобно! Спасибо!
Интересно попробовать, возьму на вооружение для своих целей!
Процедуру СвернутьДоУровня(Элемент) можно только в модуле формы отчета размещать — получается что каждый отчет нужно корректировать?
Коллега unichkin опубликовал решение этой задачи для управляемых форм:
Кнопки управления группировками табличного документа для управляемых форм
есть идеи, как сделать так, чтобы при вызове команды ОтчетТабличныйДокумент.ПоказатьУровеньГруппировокСтрок(0) сворачивалась таблица, но при этом не сворачивались Параметры и строки Отбора?
Огромное спасибо автору! Все работает идеально!
P.S. ..и чего я сам до этого не додумался…
Спасибо! Очень полезный механизм