Настраиваемая панель пользователя




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

78 Comments

  1. sCHTASS

    Штука полезная.

    Только вот как объяснить пользователю что это и че с ним делать?

    Reply
  2. Широкий

    Иконки мне понравились 🙂

    Reply
  3. Evg-Lylyk

    (1) есть видео, можно его переделать добавить то чего нет

    (2) Иконки из Бухг.1.6

    Reply
  4. YVolohov

    Интерфейс радует глаз, настраивается просто и понятно.

    Только вот в окне настройки объекты проще добавлять не перетягиванием а просто двойным щелчком, так быстрее для юзверя. И еще неплохо бы добавить возможность создания новых элементов, для тех объектов, которые поддерживают эту возможность.

    Reply
  5. YVolohov

    Видео заслуживает еще одного плюса, поставлю в коментариях )))

    Reply
  6. Evg-Lylyk

    (4) добавление по щелчку считай уже добавил

    «И еще неплохо бы добавить возможность создания новых элементов, для тех объектов, которые поддерживают эту возможность.» как бы это интерфейсно реализовать чтобы не перегружать? может в список метаданных добавить Справочники (Новый), Документы (Новый) мне как то не очень понятно.

    (5) Спасибо на нем я хоте показать как собственно создается интерфейс

    Reply
  7. YVolohov

    (6) Можно использовать выбор из контекстного меню или из списка значений с пунктами «открыть форму списка» и «создать новый элемент» соответственно.

    Reply
  8. YVolohov

    http://www.infostart.ru/projects/4059/ вот здесь я добавлял выбор из списка значений, который динамически создавался при обработке расшифровки. Там два варианта — или открыть форму списка или создать детализирующий отчет (в справочниках или документах, для других объектов только открывает форму списка).

    Reply
  9. Evg-Lylyk

    (7) Такой вариант мне как раз не хотелось использовать. Не подойдет там есть мультиперенос что делать если ты переносишь кучу разнотипных строк. Наверно добавлю в дерево с метаданными ниже, но позже. Спасибо за замечание.

    Добавление по двойному щелчку есть

    Reply
  10. YVolohov

    (9) Выбирать, что делать с объектом нужно не в форме настроек а в основной форме. В форме настроек выбирается объект а не действие над ним и переносится тоже объект.

    А уже в пользовательской форме при щелчке на объекте (если над ним можно выполнить несколько разных действий) выводится меню с выбором действия. Туда (в это меню) можно добавить еще много чего, например печать списка элементов, или выгрузка этого списка во внешний файл.

    Reply
  11. Kyrales

    Еще бы была бы возможность присваивать каждому объекту свою иконку, ваще классно было бы

    Reply
  12. spy-83

    Можно еще сделать:

    1. чтобы можно было каждому объекту назначать другое наименование

    2. создавать группы объектов

    3. для ввода нового элемента (для тех которые это поддерживают) можно справа от наименования добавить гиперссылку «Новый» или в виде иконки

    Reply
  13. Evg-Lylyk

    (12)

    1 Модно в настройках

    2 Можно создавать группы

    ————

    3 Спасибо ченить придумаю

    Reply
  14. mikl79

    прикольная вещь, плюсую

    Reply
  15. Evg-Lylyk

    Обновил до 1.2

    1. Добавил сохранение настроек в регистр «СохраненныеНастройки» (если присутствует)

    2. Добавил сохранение/загрузка в/из файла

    3. Для объектов поддерживающих ввод нового (справочники, документы) добавлен пункт в контекстном меню

    Reply
  16. Evg-Lylyk

    В 1.3

    1. Добавил справку для пользователей

    Reply
  17. lion11

    +

    Классно: просто и со вкусом…

    Reply
  18. Evg-Lylyk

    (17) Спасибо

    В 1.4 Поправил ошибку с закладкой конфигурация и мелкие улучшения интерфейса

    Reply
  19. YVolohov

    Могу еще идейку подбросить — запуск exe-файлов и открытие веб-страниц. Реализация несложная а удобства добавляет.

    Reply
  20. Evg-Lylyk

    (19) можно, но я смысла не вижу. Я не собираюсь ее долго и упорно разрабатывать. Мне она нужна чтобы мне меньше мороки с интерфейсами для новых объектов. Замучали заданиями вроде добавить пользователи Х отчет Y

    Reply
  21. YVolohov

    У меня была когда то идея создать что то типа 1C Commander (по аналогу с оболочками для Windows), да только больно уж долгая это работа.

    Reply
  22. an_zhdan

    а с регистрами накопления эта обработка не сможет дружить?

    Reply
  23. Evg-Lylyk

    (21) а что там будет интересного

    (22) можно доделать попозже

    Reply
  24. Evg-Lylyk

    (22) даже не знаю нужну ли они пользователю

    Reply
  25. YVolohov

    (21) Дело в том что структура данных в 1С напоминает файловую сиcтему Windows. Сравни:

    логический диск — база;

    каталог — справочник, документ, план, регистр и т.д.

    файл — отдельная запись одного из названных выше объектов.

    Даже пометка на удаление в 1С напоминает удаление в корзину Windows.

    Если в Far, Norton или другой подобной оболочке в двух окнах можно открыть два логических диска и обмениваться файлами между ними то в двух окнах 1C Commandera можно открыть две базы, одна из которых текущая а другая подключена через OLE. Получается очень удобный менеджер обмена данными.

    Также в эту оболочку можно насовать и множество других функций.

    Reply
  26. YVolohov

    (25) к (23)

    Reply
  27. Evg-Lylyk

    (25) наверно можно через UnPack, но много труда. Ведь и так открываешь два конфигуратора и переносом можно копировать метаданные

    Reply
  28. YVolohov

    (27) Нет, это чисто для переноса данных, метаданные никак не изменяются. Например выделил в одной панели группу документов (аналогично группе файлов в Windows) и скопировал (переместил) в другую панель, где открыт соответствующий объект другой базы.

    Но в общем то это слишком долгая работа, и хотя идея интересная, вряд ли я ее когда нибудь реализирую.

    Reply
  29. Evg-Lylyk

    (28 редко нужно переносить данные, плюс интрументов только от самой 1С много. А делать просто «как Тотал Коммандере» ИМХО не нужно. Я его вообще не перевариваю

    Reply
  30. Akv@rel

    Спасибо, очень удобная обработка!

    Reply
  31. Evg-Lylyk

    (22) 1.5

    1. Добавил регистры накопления

    2. Новая строка страновится текущей

    Reply
  32. Ivon

    Посмотрел на твой интерфейс и на еще один и доделал свой. Теперь в довесок к обычному и узкому есть вертикальный вид интерфейса.

    Reply
  33. Ivon

    Ссылку на интерфейс можно увидеть в моем профиле

    Reply
  34. MSensey

    Классно.

    Предлагаю добавить команду для добавления в пользовательский список текущего элемента из списка на закладке «Конфигурация»

    Reply
  35. dgonson

    Штука классная, но хотелось бы иметь возможность ограничивать дерево метаданных,т.е. что бы пользователь не мог добавить объекты которые ему не нужны. Например, заполнять дерево метаданных не из конфигурации, а из интерфейса пользователя.Можно конечно в правах поотключать доступ, но объем работ увеличивается…

    Reply
  36. dgonson

    (35) Вопрос снимаю, в дереве метаданных появляются только объекты доступные для просмотра…

    Reply
  37. Evg-Lylyk

    (32), (33) имеется расположение закладок позже добавлю

    (34) даже не знаю, пользователь все равно сразу захочет переместить или еще чтото. Я думаю это не так пока не так важно. Спасибо за пожелание.

    (35), (36) Да это описано в описании (только теперь слово доступные выделил жирным 😉 )

    Reply
  38. Evg-Lylyk

    Извините торопился

    (32) по вертикальному интерфесу… вроде все также только закладки по другому расположены

    Reply
  39. Ivon

    (38). Если сделать панельку пошире, а названия поменьше, то будет так же как у Вас в 3-м скрине. Просто у меня вид отображения закладок не меняется. И разница наших интерфейсов в том, что Ваш интерфейс пользователь наполняет сам, а в моем интерфейсе это делает администратор, а пользователь в этом не принимает участие..

    Reply
  40. MSensey

    Пожелание: добавить возможность указывать ссылки.

    Например, можно сделать избранное по контрагентам и т.п.

    Reply
  41. Evg-Lylyk

    (40) Извините по сообщение не понял в чем состоит пожелание

    Обновил 1.6

    1. При пустом списке и когда нет настроек пользователю выводится поясняющее сообщение

    2. Исправил пару мелких ошибок

    Reply
  42. Dimma

    Есть в обработке одна досадная ошибка. Пользователь, у которого нет права «Интерактивное открытие внешних обработок» может запросто добавить в панель любую внешнюю обработку и спокойно ей пользоваться.

    Для исправления этой ошибки мне пришлось срочно в модуле формы «Основная» добавлять такой код:

    Процедура ДеревоПользователяПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

    //—=== ## Dimma Begin 19.08.09 ===—

    Если ЗапрещеноЗапускатьВнешниеОбработки И Найти(ДанныеСтроки.ВыполняемыйКод,»ОткрытьВнешниюОбработку»)>0 Тогда

    Если ЗначениеЗаполнено(ДанныеСтроки.Родитель) Тогда

    ДанныеСтроки.Родитель.Строки.Удалить(ДанныеСтроки);

    Иначе

    ДеревоПользователя.Строки.Удалить(ДанныеСтроки);

    КонецЕсли;

    Возврат;

    КонецЕсли;

    //—=== ## Dimma End 19.08.09 ===—

    ОформлениеСтроки.Ячейки.Действие.ОтображатьКартинку = Истина;

    ОформлениеСтроки.Ячейки.Действие.ИндексКартинки = ДанныеСтроки.НомерКартинки

    КонецПроцедуры

    Или можно добавить этот код при сохранении Настройки.

    Но вообще, конечно, надо делать проверку права и не разрешать Пользователю добавлять внешние обработки, если прав нет.

    Reply
  43. Dimma

    (41) Он имел в виду, чтобы можно было включать в Панель не только общие метаданные, но и конкретные объекты. Например конкретный документ или конкретного Контрагента, как например сделано тут: http://infostart.ru/projects/5466/

    Имхо это всё лишнее, но вот что не лишнее и чего просят все, это возможность добавлять в Панель элементы справочника «ВнешниеОбработки». Этот справочник уже стандарт 1С и, конечно, неплохо было бы включить в панель возможность добавлять его элементы.

    Reply
  44. Evg-Lylyk

    (42) лучше в ПриВыводеСтроки ничего не добавлять у 1С и так тупит не по детски 🙂

    Как пользователь откроет эту обработку если она тоже внешняя ведь у него нет прав (хотя можно ведь в конфу встроить)

    при попытке открыть запрешенное… не откроется т.к. просто нет прав

    в 1.7 решил проблему с правами на внешние отчеты и обработки

    (43) на счет «»ВнешниеОбработки» согласен с вами сейчас просто нет времени на это (хотя сделать и не сложно) извините много дел 🙁

    Reply
  45. Dimma

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

    Я специально проверил добавление внешней обработки на пользователе без прав. Панель спокойно запоминает обработку в дереве, а потом запускает неинтерактивно, что разрешается при любом раскладе прав.

    Будем ждать 1.8 с «Внешними обработками» 😉

    Спасибо за Панель!

    Reply
  46. Evg-Lylyk

    (45) тормоза при простой промотке

    Проверил все еще раз (даже встраевал в конфу) вроде все правильно работает. На уровне Метаданные есть права «ИнтерактивноеОткрытиеВнешнихОбработок»

    «ИнтерактивноеОткрытиеВнешнихОтчетов» их и проверяю если их нет кнопка не активна.

    Спасибо за помощь 😉

    Reply
  47. Evg-Lylyk

    46+ еще если есть доступ только к обработка при добавлении соотв. фильтр

    Reply
  48. Dimma

    (44) В 1.7 действительно с правами на добавление внешних обработок всё ок. Но осталась еще одна дыра. Если пользователь загружает дерево из файла, а в этом файле есть внешние обработки и отчеты (чужой файл), то он их тоже сможет спокойно использовать. 😉

    PS

    Извиняюсь за дотошность. 🙂

    Reply
  49. Dimma

    Чтобы решить пункт 48 достаточно добавить в модуль формы РедактированиеИнтерфейса следующий код и немного изменить Процедуру КоманднаяПанель1СохранитьИзменения(Кнопка)

    Процедура КоманднаяПанель1СохранитьИзменения(Кнопка)

    ФормаВладелец.ДеревоПользователя = ПредварительноОбработатьДеревоДействий(ДеревоДействий);

    ЭтаФорма.Закрыть();

    КонецПроцедуры

    //—=== ## Dimma Begin 19.08.09 ===—

    Функция ПредварительноОбработатьДеревоДействий(мДеревоДействий)

    Если НЕ ПравоДоступа(«ИнтерактивноеОткрытиеВнешнихОбработок»,Метаданные) ИЛИ НЕ ПравоДоступа(«ИнтерактивноеОткрытиеВнешнихОтчетов»,Метаданные) Тогда

    ПроверитьНаПрава(мДеревоДействий.Строки);

    КонецЕсли;

    Возврат мДеревоДействий;

    КонецФункции

    Функция ПроверитьНаПрава(СтрокиДерева)

    МассивСтрокКУдалению = Новый Массив;

    Для каждого Строка Из СтрокиДерева Цикл

    ПроверитьНаПрава(Строка.Строки); // Проверяем рекурсивно

    Если НЕ ПравоДоступа(«ИнтерактивноеОткрытиеВнешнихОбработок»,Метаданные) И Найти(Строка.ВыполняемыйКод,»ОткрытьВнешниюОбработку»)>0 Тогда

    МассивСтрокКУдалению.Добавить(Строка);

    ИначеЕсли НЕ ПравоДоступа(«ИнтерактивноеОткрытиеВнешнихОтчетов»,Метаданные) И Найти(Строка.ВыполняемыйКод,»ОткрытьВнешнийОтчет»)>0 Тогда

    МассивСтрокКУдалению.Добавить(Строка);

    КонецЕсли;

    КонецЦикла;

    Для каждого Элемент Из МассивСтрокКУдалению Цикл

    СтрокиДерева.Удалить(Элемент);

    КонецЦикла;

    КонецФункции

    //—=== ## Dimma End 19.08.09 ===—

    Reply
  50. Erne100

    А с регистрами накопления по прежнему не дружит ? В общем списке

    (Рис. 5563) открыть не смог (в БП1.6.17.4 и КА1.0.2.1).С первой закладки всё О.К.

    Reply
  51. Istur

    Супер, просто супер. (19) Передо мной стояла аналогичная задача, тож пользователи задолбали. Это обработка сэкономила мне дофига времени, спасибо большое)))

    Reply
  52. Evg-Lylyk

    (50) Проверю, исправлю седня

    (51) Спасибо 🙂

    Reply
  53. luns

    А чего она умеет, чего не умеет типовая? )))))))))))))))))))))))))))

    Reply
  54. Evg-Lylyk

    (53) это к чему?

    1.8. Исправил ошибку при открытии регистров накопления из закладки конфигураци

    Reply
  55. IOL

    1. Ошибка при открытии внешнего отчета, т.е. добавляется нормально, при открытии ошибка

    2. Не плохо было бы добавить вызов и справочника «Внешние отчеты».

    Reply
  56. Evg-Lylyk

    (55)

    п.1. проверил работает может что с отчетов

    п.2. пока нет времени

    Reply
  57. lukas

    Код прописал, обработку добавил. При запуске 1С Предприятия автоматом не грузится почему-то, руками запускается. Если убрать галку Запускать при старте — потом перестает запускаться вообще… В чем может быть причина?

    Reply
  58. Evg-Lylyk

    (57) Проверьте под отладкой скорее всего ошибка в попытке

    Reply
  59. margosha80

    Обработка отличная. Вопрос. А почему нельзя сделать загрузку при открытии 1С как панель функций?

    Reply
  60. Evg-Lylyk

    (59) Такова 1С. Запуск ПанелиФункций задан в конфигурации.

    Надо изменять конфигурацию :

    В описании написано

    Для запуска обработки у каждого пользователя при старте системы (присутствует галка «Открывать при старте»):

    В «Модуль приложения» процедуру «ПриНачалеРаботыСистемы» добавить след. код:

    //Запуск панели пользователя

    Попытка

    ПанельПользователя = ВнешниеОбработки.Создать(ИмяФайлаОбработки);

    ФормаПанелиПользователя = ПанельПользователя.ПолучитьФорму();

    ФормаПанелиПользователя.Открыть();

    Исключение

    КонецПопытки

    Reply
  61. Evg-Lylyk

    (57) «Если убрать галку Запускать при старте — потом перестает запускаться вообще… В чем может быть причина?»

    Да это можно сказать недоработка

    Сохранились настройки что пользователь не желает запускать

    Выход: Убить настройки.

    Reply
  62. margosha80

    Вот еще какой вопрос есть. В обработке есть возможность добавления внешних обработок, но когда я пытаюсь ее запустить выдает вот такую ошибку:

    Ошибка открытия внешнего отчета: (адрес с именем отчета)

    Reply
  63. Evg-Lylyk

    (62) поправил

    Reply
  64. sommid

    все интуитивно понятно и удобно. для непривередливых юзеров и ненавернутых интерфейсов сама то. спасибо.

    Reply
  65. astick

    Спасибо!:) Клёво! Первая панель, которой я пользуюсь:)

    Reply
  66. mgor

    Супер!

    Симпатично и лаконично.

    Единственное, чего не хватает — так это «Бизнес-процессов» и «Задач».

    (в последних типовых уже часто используется, например «Задачи пользователя»

    Reply
  67. Evg-Lylyk

    (66) Спасибо. Извините нет желания доделывать (хотя это легко).

    Reply
  68. Rusmus

    ИМХО, в форме «Редактирование интерфейса» лучше сделать кнопку «СохранитьИзменения» кнопкой по-умолчанию. Тогда форму можно будет быстро закрывать по Ctrl+Enter.

    UPD. И на открытие формы настройки неплохо было бы горячую клавишу настроить.

    PS. Версия 1.9.

    Reply
  69. Evg-Lylyk

    (68) поправил… версия 1.91

    Reply
  70. German

    А как же такие эл. конфигурации как:

    Произволные отчеты;

    Внешние отчеты;

    Внешние обработки;

    + отчеты лучше запускать с выбранной настройкой

    Reply
  71. Evg-Lylyk

    (70) Да надо доделать. В ближ.время

    Reply
  72. German

    (71) не дождался 🙁

    поэтому функцию ДобавитьСписокМетаданных формы РедактированиеИнтерфейса

    дополняем след кодом

    //  8 февраля 2011 г. 14:28:02 вывод произвольных отчетов
    Если  Не ФлПервые
    И ИмяКоллекции = «Отчеты»
    И Не Метаданные.Справочники.Найти(«ПроизвольныеОтчеты») = Неопределено Тогда
    ПроизвольныйОтчет = Справочники.ПроизвольныеОтчеты.Выбрать();
    Пока ПроизвольныйОтчет.Следующий() Цикл
    НоваяСтрока = СтрокаПриемник.Строки.Добавить();
    НоваяСтрока.Действие   = ПроизвольныйОтчет.Наименование;
    НоваяСтрока.НомерКартинки  = СтрокаПриемник.НомерКартинки;
    //формируем строку вызова
    Ссылка = СтрЗаменить(ЗначениевСтрокуВнутр(ПроизвольныйОтчет.Ссылка),»»»»,»»»»»»);
    НоваяСтрока.ВыполняемыйКод  = »
    |ПроизвольныйОтчетСсылка    = ЗначениеИзСтрокиВнутр(«»»+Ссылка+»»»);
    |ОтчетОбъект     = Отчеты.ПроизвольныйОтчет.Создать();
    |ОтчетОбъект.УстановитьПроизвольныйОтчет(ПроизвольныйОтчетСсылка, Неопределено);
    |Форма = ОтчетОбъект.ПолучитьФорму(,, ПроизвольныйОтчетСсылка);
    |Форма.Открыть();»;
    
    КонецЦикла;
    КонецЕсли;
    //  8 февраля 2011 г. 14:33:53

    Показать

    Reply
  73. Evg-Lylyk

    (72) Спасибо добавлю… просто нет времени на этот проект

    Reply
  74. Evg-Lylyk

    версия 2.0

    Добавил:

    Доп. отчеты

    Доп. обработки

    добавил версию под 8.2 (в дальнейшем доделывать буду только в ней)

    Reply
  75. mtv:)

    Спасибо за обработку! Перебрал кучу похожих, но остановился на Вашей. Просто и со вкусом, и ничего лишнего.

    Reply
  76. Aydrey

    Большое спасибо. простой и ничего лишнего. спасибо за сэкономленное время.

    Reply
  77. Alis95

    Спасибо за обрабоку, замучался лазить за отчётами. Теперь всё будет под рукой.

    Reply
  78. a1ex4ndr

    (72) German,

    поэтому функцию ДобавитьСписокМетаданных формы РедактированиеИнтерфейса

    дополняем след кодом

    //  8 февраля 2011 г. 14:28:02 вывод произвольных отчетов
    Если     Не ФлПервые
    И ИмяКоллекции = «Отчеты»
    И Не Метаданные.Справочники.Найти(«ПроизвольныеОтчеты») = Неопределено Тогда
    ПроизвольныйОтчет = Справочники.ПроизвольныеОтчеты.Выбрать();
    Пока ПроизвольныйОтчет.Следующий() Цикл
    НоваяСтрока = СтрокаПриемник.Строки.Добавить();
    НоваяСтрока.Действие         = ПроизвольныйОтчет.Наименование;
    НоваяСтрока.НомерКартинки     = СтрокаПриемник.НомерКартинки;
    //формируем строку вызова
    Ссылка = СтрЗаменить(ЗначениевСтрокуВнутр(ПроизвольныйОтчет.Ссылка),»»»»,»»»»»»);
    НоваяСтрока.ВыполняемыйКод     = »
    |ПроизвольныйОтчетСсылка    = ЗначениеИзСтрокиВнутр(«»»+Ссылка+»»»);
    |ОтчетОбъект                 = Отчеты.ПроизвольныйОтчет.Создать();
    |ОтчетОбъект.УстановитьПроизвольныйОтчет(ПроизвольныйОтчетСсылка, Неопределено);
    |Форма = ОтчетОбъект.ПолучитьФорму(,, ПроизвольныйОтчетСсылка);
    |Форма.Открыть();»;
    
    КонецЦикла;
    КонецЕсли;
    //  8 февраля 2011 г. 14:33:53

    Показать

    в сообщении

    боролись с любыми обработками

    Функция ПроверитьНаПрава(СтрокиДерева)
    
    МассивСтрокКУдалению = Новый Массив;
    
    Для каждого Строка Из СтрокиДерева Цикл
    ПроверитьНаПрава(Строка.Строки); // Проверяем рекурсивно
    Если НЕ ПравоДоступа(«ИнтерактивноеОткрытиеВнешнихОбработок»,Метаданные) И Найти(Строка.ВыполняемыйКод,»ОткрытьВнешниюОбработку»)>0 Тогда
    МассивСтрокКУдалению.Добавить(Строка);
    ИначеЕсли НЕ ПравоДоступа(«ИнтерактивноеОткрытиеВнешнихОтчетов»,Метаданные) И Найти(Строка.ВыполняемыйКод,»ОткрытьВнешнийОтчет»)>0 Тогда
    МассивСтрокКУдалению.Добавить(Строка);
    КонецЕсли;
    КонецЦикла;
    
    Для каждого Элемент Из МассивСтрокКУдалению Цикл
    СтрокиДерева.Удалить(Элемент);
    КонецЦикла;
    
    КонецФункции

    Показать

    а сейчас опять любых добавить? только отчетов…

    Reply

Leave a Comment

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