Кнопка переоткрытия внешней обработки для 8.2




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

83 Comments

  1. Boroda

    Я правильно понял: внешнюю обработку (если она изменена в конфигураторе) закрывать и открывать не надо, достаточно щёлкнуть по кнопке на форме, и она обновится? Тогда это здорово, а то порой подутомляешься с этими переоткрываниями…

    Reply
  2. ShantinTD

    (1) Boroda, именно так. Особенно намучаешься, если открыто поочередно несколько обработок.

    Reply
  3. mtv:)

    (0) Хорошая и своевременная публикация. Давно себе хотел сделать подобный сервис, но всё руки не доходили…

    Ваша публикация подтолкнула к действию. На основании Вашего кода сделал для себя универсальный шаблон (для обработок и для отчетов).

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

    Код для неуправляемой формы получился вот такой (компактней и, по-моему, универсальней):

    Процедура КоманднаяПанель1_кнПереоткрыть(Кнопка)

    // Имя формы, которую надо переоткрыть, нужно прописать в КНОПКА.ПОЯСНЕНИЕ

    Отладка_ФормаКОткрытию = Кнопка.Пояснение;

    Отладка_ИмяФайла = ЭтотОбъект.ИспользуемоеИмяФайла;

    Закрыть();

    КонецПроцедуры
    //КоманднаяПанель1_кнПереоткрыть()

    Процедура ПриЗакрытии()

    Если НЕ
    ПустаяСтрока(Отладка_ФормаКОткрытию) Тогда

    ВнешниеОбработки.Создать(Отладка_ИмяФайла).ПолучитьФорму(Отладка_ФормаКОткрытию).Открыть();//Для обработок

    //ВнешниеОтчеты.Создать(Отладка_ИмяФайла).ПолучитьФорму(Отладка_ФормаКОткрытию).Открыть(); //Для отчетов

    КонецЕсли;

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



    , где Отладка_ФормаКОткрытию и Отладка_ИмяФайла — это реквизиты внешней обработки/отчета.

    _

    Reply
  4. kapustinag

    Согласен, полезная вещь. Приведенный в (3) код, думаю, и в 8.1 будет работать.

    Reply
  5. Незнайка

    в 7.7 часто пользовался, в 8 руки не доходили, да и подзабыл. Спасибо автору.

    Я еще на форме делаю кнопочку, цепляю на неё Ctrl+Z и становится ещё удобнее 🙂

    Автор — молодец. Спасибо.

    Reply
  6. ShantinTD

    Всем — пожалуйста. Пользуйтесь на здоровье. И спасибо за комментарии.

    (3) mtv:), у меня приведен шаблон, поэтому кнопку можно смело двигать, чтоб «глаза не мозолила».

    А такое сокращение кода для неуправляемой формы — накладывает еще одно ограничение: при переименовании редактируемой формы в моем варианте нужно всего лишь переоткрыть традиционным способом обработку, в вашем — придется в Кнопка.Пояснение не забыть прописать новое имя формы. И при копировании формы, кстати, тоже.

    Для внешних отчетов отличия минимальны — сами видите. Опять же подчеркну слово шаблон.

    Reply
  7. artbear

    (0) Ничего сложного на самом деле, сам юзаю такую кнопку.

    У меня лично такая кнопка со времен 77 называется «Перезагрузить» 🙂

    помнится, даже спец.скрипт для Опенконфа делал для автодобавления этой кнопки на форму прямо в конфигураторе.

    (3) ты не прав, так не удобно, (6) более прав — весь вопрос в телодвижениях, хотя и к нему есть вопросы 🙂

    (6) что-то как-то сложно и нерационально у тебя в неуправляемой форме 🙁

    все можно и нужно уместить в одной процедуре, лично у меня так и сделано.

    1. Зачем делить на КоманднаяПанель1ОткрытьЕщеРаз и ПриЗакрытии() ?

    Нужно тупо в КоманднаяПанель1ОткрытьЕщеРаз вместо оператора Прервать вставить код из ПриЗакрытии.

    2. Реквизиты ФормаКОткрытию и ИмяФайла совсем не нужны, имя файла можно узнать непосредственно в момент вызова кнопки.

    Ведь в управляемой у тебя фактически так и сделано? 🙁

    т.е. схема-то простейшая — при нажатии кнопки Перезагрузить открываем новую форму для этого же файла, а старую закрываем.

    в итоге все что нужно — вот этот код

    Процедура КоманднаяПанель1ОткрытьЕщеРаз(Кнопка)
    Для каждого ИмяФормы Из ЭтаФорма.Метаданные().Формы Цикл
    ПолученнаяФорма = ПолучитьФорму(ИмяФормы);
    Если СокрЛП(ИмяФормы.ТипФормы) = «Обычная» Тогда
    Если ПолученнаяФорма.Открыта() Тогда
    Обработка = ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла);
    лФорма = Обработка.ПолучитьФорму(ИмяФормы); // форма лучше не присваивать
    лФорма.Открыть();
    Прервать;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Закрыть();
    КонецПроцедуры

    Показать

    Reply
  8. CaSH_2004

    Странно, наверно я не доганяю, а как у вас реквизиты заполнятся сами что ли? Я давно так делаю, но перед закрытием заполняю в новой обработке все реквизиты из старой, есть вероятность ошибки, но при правильном построении обработок она минимальна, к тому же заполнение опционально. А у вас как?

    Reply
  9. mtv:)

    (7)

    artbear пишет:

    т.е. схема-то простейшая — при нажатии кнопки Перезагрузить открываем новую форму для этого же файла, а старую закрываем.

    Уважаемый artbear, у меня так не работает (по крайней мере в файловом варианте), форма закрывается, а новая не появляется.

    А вот так работает:

    При нажатии кнопки «Перезагрузить» сначала ЗАКРЫВАЕМ старую форму, а затем ОТКРЫВАЕМ новую форму для этого же файла.

    Reply
  10. artbear

    (8) Для отладочных целей не всегда нужно автозаполнение всех полей.

    Я предпочитаю полностью штатную перезагрузку, когда нужные поля заполняются так же, как и при ручной перезагрузке.

    (9) Случайно не юзаешь код (Форма = ПолучитьФорму()) ? я ведь специально указываю лФорма = …

    вообще разницы быть не должно, т.к. Закрыть(), как и в 77, не сразу закрывает форму, а только после выполнения текущего обработчика.

    Reply
  11. artbear

    (9) Приведи свой код, если совет из (10) не помог.

    Юзаю код, аналогичный (7), со времен 8.0

    Reply
  12. ARL

    Публикация из серии «Приятные мелочи».

    Поскольку на вкус и цвет…. себе сделал внешнюю обработку с выбором пути к файлу. После выбора файла форму всмогательной обработки минимизирую и размещаю в уголке. Один клик и наслаждаюсь исправленной обработкой или отчетом. Автору за идею +.

    Reply
  13. mtv:)

    (11) artbear, в сообщении (9) я говорил про твой код из (7).

    Скопировал его один-в-один в тестовую обработку, запустил — форма закрывается… и всё…

    Вывод — код не работает. Что-то не так.

    При отладке видно, что новая форма создается и открывается. Но после Закрыть(), старая и новая формы закрываются. 🙁

    Reply
  14. Borisych

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

    Reply
  15. mtv:)

    (0) При внимательном взгляде на процедуру «КоманднаяПанель1ОткрытьЕщеРаз» видно, что код будет работать некорректно в некоторых ситуациях. Эксперимент это подтверждает.

    Вот пример, когда получается неожиданный результат:

    В обработке имеем две неуправляемые формы «Форма01» и «Форма02». В списке форм они расположены именно в таком порядке. Открываем обе формы.

    В форме «Форма02» нажимаем кнопку «Открыть еще раз». И видим, что «Форма02» просто закрывается, и затем открывается еще одна «Форма01».

    Действительно неожиданный результат… 🙁

    То есть, при нескольких открытых формах, всегда открывается та, которая выше в списке форм.

    Reply
  16. mtv:)

    (0) Еще заметил один неприятный момент в работе алгоритма шаблона.

    Нужно внимательно следить, что бы Синоним формы был без пробелов, и в точности соответствовал Имени формы. Попробуйте, например, задать следующие имена форме: «НеуправляемаяФорма» или «Форма_01».

    В реквизите «ФормаКОткрытию» запоминается не Имя формы, а Синоним формы. А это не всегда одно и тоже.

    Reply
  17. Attest

    Прикольная штука,только сегодня хотел, что-нибудь такое сделать

    Reply
  18. mtv:)

    (0) (7) С учетом ранее замеченных недостатков, и положительно реагируя на критику в свой адрес, а так же учитывая подсказку от artbear, допилил «Алгоритм переоткрытия внешней обработки/отчета» для обычных форм. Вроде получилось очень даже ничего.

    На кнопку «Перезапустить» вешаем следующую процедуру:

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

    Показать

    В итоге совместных усилий имеем следующее:

    1. Всего одна коротенькая процедура, вызываемая нажатием на кнопку.

    2. Не нужны дополнительные реквизиты. Так же не нужны вставки кода в процедуры событий формы.

    3. Процедура работает как для внешних обработок, так и для внешних отчетов. Нужно только закомментировать/раскомментировать одну строку.

    4. Очень легко вставляется в новые внешние обработки и отчеты (одна кнопка и одна процедура).

    Reply
  19. Djun

    (18), идеальный вариант 🙂

    Reply
  20. artbear

    (18) Да, именно про такую процедуру я и говорил.

    Странно, почему код в (7) не работает 🙁

    Похоже, что ошибкой было сохранять форму в переменной 🙁

    Вот простейший 100% рабочий код, которым пользуюсь со времен 8.0

    Процедура ОсновныеДействияФормыПерезагрузить(Кнопка)
    ВнешниеОбработки.Создать(ОбработкаОбъект.ИспользуемоеИмяФайла).ПолучитьФорму().Открыть();
    Закрыть();
    КонецПроцедуры
    

    Только что проверил на всякий случай 🙂

    Reply
  21. artbear

    (18) >>Процедура работает как для внешних обработок, так и для внешних отчетов

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

    И для идеала — можно написать спец.процедуру, которая вставляет кнопку с вызовом сабжевого кода в командную панель. Это также несложно.

    Reply
  22. mtv:)

    (20) Согласен, это простейший 100% рабочий код. Но он всегда открывает основную форму обработки.

    А задача стояла — открывать форму, в которой была нажата кнопка «Перезапустить». Поэтому код в (18) получился чуть сложней. 🙂

    Reply
  23. mtv:)

    (20) Кстати, почему я поставил метод «Закрыть()» ПЕРЕД открытием нового окна.

    Если метод «Закрыть()» поставить ПОСЛЕ открытия нового окна, как в (20), то наблюдается неприятный эффект.

    Попробуй открыть форму. Затем измени размер окна формы, или просто максимизируй (распахни на полный экран). После этого понажимай на кнопку «Перезапустисть». Ты будешь приятно удивлен. 🙂

    Форма будет периодически открываться, с разными размерами окна… 🙂

    Reply
  24. mtv:)
    в (21) artbear пишет:

    И для идеала — можно написать спец.процедуру, которая вставляет кнопку с вызовом сабжевого кода в командную панель. Это также несложно.

    Думаю, что в данном случае это уже будет лишним. Хотя, действительно, написать такую процедуру несложно.

    Если кому-то это будет необходимо, то может посмотреть, как подобное делается здесь или тут. 🙂

    Reply
  25. mtv:)

    (0), (21), (18) «Алгоритм переоткрытия внешней обработки/отчета» для обычных форм. (ВЕРСИЯ 2).

    Приняв во внимание замечание artbear, доработал алгоритм из (18), и вот что получилось:

    На кнопку «Перезапустить» вешаем следующую процедуру:

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

    Показать

    В итоге совместных усилий имеем следующее:

    1. Всего одна коротенькая процедура, вызываемая нажатием на кнопку.

    2. Не нужны дополнительные реквизиты. Так же не нужны вставки кода в процедуры событий формы.

    3. Процедура работает как для внешних обработок, так и для внешних отчетов.

    4. Очень легко вставляется в новые внешние обработки и отчеты (одна кнопка и одна процедура).

    Reply
  26. ShantinTD

    Всем спасибо за положительные отзывы, а особенное спасибо — за конструктивную критику.

    Немного неожиданно (для меня) — бурная реакция на неуправляемые формы.

    (15), (16) mtv:), у меня встречный вопрос: как открыть сразу несколько форм одной обработки?

    (12) ARL, задача стояла именно в том, чтобы избавиться от необходимости вручную указывать (в коде ли, в реквизитах ли — неважно) какую обработку открыть.

    Reply
  27. tormozit

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

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

    Показать

    Правда еще бывает КлючУникальности установлен у формы. Тогда можно обнаружить только основную форму.

    Надежного решения задачи платформа не позволяет реализовать.

    Reply
  28. mtv:)
    ShantinTD в (26) пишет:

    …mtv:), у меня встречный вопрос: как открыть сразу несколько форм одной обработки?

    Не хочу никого обижать, но я не понял… 🙁

    Это прикол такой? Или действительно имеются затруднения с открытием нескольких форм одной обработки?

    Reply
  29. ShantinTD

    (28) mtv:), это не прикол. Просто не сталкивался. И не только я не сталкивался.

    Reply
  30. mtv:)

    (29) Ну, например, вставить следующий код в процедуру «ПриОткрытии», или повесить этот код на какую-нибудь кнопку:

     ЭтотОбъект.ПолучитьФорму(«Форма1»).Открыть();
    ЭтотОбъект.ПолучитьФорму(«Форма2»).Открыть();
    ЭтотОбъект.ПолучитьФорму(«Форма3»).Открыть();
    

    Или не это имелось ввиду?…

    Reply
  31. ShantinTD

    (30) mtv:), понятно. Спасибо. Но это, так сказать, искусственное открытие нескольких форм. До него я докумекал. Я так понимаю, что штатного механизма открытия нескольких форм платформа не предоставляет?

    Reply
  32. mtv:)

    (31), ShantinTD, ох чует мое сердце, что мы говорим о разных вещах…

    Возможно, что ты имел ввиду: «Как открыть одну и ту же форму несколько раз (в разных окнах)?».

    Тогда это делается по-другому… 🙂

    Reply
  33. mtv:)

    (31) если требуется открыть одну и ту же форму несколько раз (в разных окнах), то можно использовать, например, следующий код:

    ЭтотОбъект.ПолучитьФорму(«Форма»,,Новый УникальныйИдентификатор()).Открыть()

    Это пример штатного механизма платформы для открытия новых экземпляров формы.

    _

    Reply
  34. ShantinTD

    (32), (33) mtv:), нет, мы говорим об одном и том же: именно как открыть несколько разных форм. Про УникальныйИдентификатор() я видел. Но это опять же искусственное открытие нескольких форм (хоть разных, хоть одинаковых). Может быть я немного неточно выразил свою мысль про штатный механизм: я имел ввиду некий штатный механизм интерактивного открытия нескольких форм.

    Reply
  35. mtv:)

    (27) tormozit, да, согласен, что нужно за собой прибирать — т.е. закрывать все открытые формы внешней обработки/отчета. Спасибо за подсказку.

    Объясни, пожалуйста, смысл первой строки твоего кода: «ЭтотОбъект = ЭтаФорма.ЭтотОбъект;». Я не понял, зачем это. Тем более, что эта строка выдает ошибку, пришлось закомментировать.

    И еще, если ты используешь оператор «Попытка Исключение», то не проще ли в нем и разместить код открытия новой формы? Тем самым сократив код на семь строк.

    Я сам почему-то не люблю оператор «Попытка Исключение», использую его только в крайних случаях. 🙂

    Reply
  36. tormozit

    (35) Мой код может выдавать ошибку при попытке присвоения «ЭтотОбъект = …» только при выполнении из контекста формы. Я же очевидно писал его для выполнения в более изолированном контексте (например общего модуля).

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

    Reply
  37. mtv:)

    (36) Спасибо за разьяснения, всё понял, согласен.

    Reply
  38. bazcom

    Идея хороша, но есть уже и причем давно такие же. 5+

    Reply
  39. fomix

    Все работает чудесным образом. Давно мечтал о подобном свойстве при отладке. Спасибо!

    Reply
  40. mtv:)

    (0), (27), For All. «Алгоритм переоткрытия внешней обработки/отчета» для обычных форм. (ВЕРСИЯ 3).

    Приняв во внимание замечания (27) tormozit, доработал алгоритм из (25).

    Теперь закрываются все открытые формы внешней обработки.

    На кнопку «Перезапустить» вешаем следующую процедуру:

    Процедура кнПерезапустить_Нажатие(Кнопка)
    Для каждого МетаФорма Из ЭтаФорма.Метаданные().Формы Цикл
    ТекФорма = ПолучитьФорму(МетаФорма);
    Если ТекФорма.Открыта() Тогда
    ТекФорма.Закрыть();
    Если ТекФорма = ЭтаФорма Тогда
    Если Найти(Строка(ТипЗнч(ЭтотОбъект)), «Внешняя обработка объект:») = 1 Тогда
    ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
    Иначе
    ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

    Показать

    В итоге совместных усилий имеем следующее:

    1. Всего одна коротенькая процедура, вызываемая нажатием на кнопку.

    2. Процедура работает как для внешних обработок, так и для внешних отчетов.

    3. Очень легко вставляется в новые внешние обработки и отчеты (одна кнопка и одна процедура).

    Reply
  41. kea35

    Да, идея хороша!

    Reply
  42. ProkopyukIN

    идея не просто хорошая, а очень хорошая. коротко, ясно, и полезно.

    Reply
  43. Stepping1C

    Неплохо-неплохо.

    Reply
  44. cerg110

    Полезная вещь, немного экономит время)

    Reply
  45. ShantinTD

    (40) mtv:), нашел такой момент: если МетаФорма — управляемая, то в режиме обычного приложения она не может быть Открыта(), и происходит ошибка.

    For All, учел все ваши пожелания и предложения, учел http://infostart.ru/public/97685/ и получился новый вариант обработки.

    Reply
  46. artbear

    (45) Закрытие формы в управляемом режиме проверял? именно простое закрытие, а не переоткрытие?

    Reply
  47. ShantinTD

    (46) artbear, естественно. То, что мы видели по ссылке выше — натолкнуло в правильное русло. Из-за такой же ошибки у меня был сделан реквизит ФормаКОткрытию для обычной формы. Так что эти грабли — уже пройдены.

    Reply
  48. mtv:)

    (45) я писал в (40), что «Алгоритм переоткрытия внешней обработки/отчета» для обычных форм. Так что работоспособность для управляемых форм не тестировалась и, естесственно, не гарантируется.

    А по ссылке, указанной в (45) http://infostart.ru/public/97685/, публикация к сожалению уже удалена… 🙁

    Так и не узнать видимо никогда, что имелось ввиду… 🙂

    Reply
  49. ShantinTD

    (48) mtv:), вопрос в том, что код выполняется в обычной форме, но при наличии в обработке управляемых форм возникнет ошибка.

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

    Reply
  50. mtv:)

    (49) чтобы избежать ошибки при наличии в обработке управляемых форм, алгоритм из (40) можно дополнить условием (вставить перед строкой: «Если ТекФорма.Открыта() Тогда»):

    Если ТекФорма = Неопределено Тогда
    Продолжить;
    КонецЕсли;
    
    Reply
  51. artbear

    (51) Неправ/неправа, минусую

    Reply
  52. ShantinTD

    (51) Масянька, в споре — рождается истина. Выложен шаблон. Совместными усилиями — пришли к достаточно приемлемому варианту. Каждый в состоянии взять для себя ту часть, которая подойдет именно ему. Так что в этом отношении — я очень доволен. Я немного удивлен тем, что, по видимому, управляемые формы еще слишком мало вошли в нашу жизнь.

    Reply
  53. bkn_oktava

    Спасибо от начинающих!!!

    Кнопочка работает! На самом деле, пока отчет до ума доведешь, забодаешься перезапускать.

    Очень полезная штука, конечно, плюс!!!

    Reply
  54. rom-x

    Никогда об этом не задумывался, + за идею. Сделал и для 7-ки.

    Reply
  55. ShantinTD

    (55) rom-x, сделал сам — поделись с товарищем. Хотя я сам делал эту кнопку на основании семёрочной http://infostart.ru/public/86415/.

    Reply
  56. Программулькин

    покажи для 7ки … тупо позырить…

    Reply
  57. rom-x

    (56) (57) Программулькин,

    //*******************************************
    Процедура Переоткрыть()
    Форма.Закрыть();
    ОткрытьФорму(«Отчет#», , КаталогИБ()+»Extforms123.ert»);
    КонецПроцедуры
    
    Reply
  58. Программулькин

    (58) rom-x,

    Спасибо.

    Reply
  59. MGraf

    Сделал немного по-другому на основе вашего кода — http://infostart.ru/public/104428/

    Reply
  60. Rino

    немного корявая, но спасибо

    Reply
  61. ShantinTD

    (62) Rino, конструктивнее: что именно не понравилось?

    Reply
  62. N_aix

    Интересно. Спасибо.

    Reply
  63. kredko

    (62) Rino, Корявая или нет — субъективное мнение. Выложите свой вариант, мы все оценим. А так это пустой трёп. Идея хорошая. Мне понравилась.

    Reply
  64. electronik

    Интересно как глюки будут или нет

    Reply
  65. karakozov

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

    Reply
  66. vladir

    ShantinTD, отличная публикация. Шаблон не качал. Для себя взял Процедуру из коммента (40), отдельное спасибо mtv:). То что надо! :)))

    Reply
  67. Abadonna

    (58) rom-x, в 7.7 есть оператор РасположениеФайла(Путь,Имя), где Путь, Имя — переменные, принимающие путь и имя в контексте данного отчета/обработки.

    Поэтому писать КаталогИБ()+»Extforms123.ert» излишне и нерационально

    Reply
  68. chmv

    Нужная обработка. Давно хотела такую

    Reply
  69. markgenuine

    (3) mtv:), только по моему нужно использовать процедура не ПриЗакрытии(), а ПередЗакрытием().

    P.s. если я не прав то попровьте)

    Reply
  70. mtv:)

    (71) markgenuine, ты смотрел начальный вариант (сырой и глюкавый).

    Окончательный вариант смотри в комментарии (40). Там процедура ПриЗакрытии совсем не используется. 🙂

    Reply
  71. Stamper

    (71)так «при» от «перед» фактически отличается только возможностью предотвратить закрытие

    Reply
  72. kosmius

    Класная штука…. правда написано универсально… и при наличие нескольких форм откривает все…. немножко подправляю под ситуацию… и отладка ускоряється в разы… Спасибо за идею

    Reply
  73. yuraskas

    действительно удобно, +.

    Reply
  74. Crush

    Я вот тоже такой темой заморочился для УФ

    http://www.forum.mista.ru/topic.php?id=709041

    Reply
  75. Crush

    Может кому пригодится.

    Ничего писать во внешней обработке не надо. Решается добавлением только одной общей команды с хоткеем. У себя назвал глShiftF5

    Модуль:

    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    текОкно    = АктивноеОкно();
    Если ТипЗнч(текОкно) = Тип(«ОкноКлиентскогоПриложения») Тогда
    текФорма    = текОкно.ПолучитьСодержимое();
    Если ТипЗнч(текФорма) = Тип(«УправляемаяФорма») Тогда
    ПолноеИмяФормы        = текФорма.ИмяФормы;
    позПервойТочки        = Найти(ПолноеИмяФормы,».»);
    ТипОбъекта    = Лев(ПолноеИмяФормы,позПервойТочки-1);
    Если ТипОбъекта    = «ВнешняяОбработка» Тогда
    ИмяОбработки    = Сред(ПолноеИмяФормы,позПервойТочки+1);
    ИмяОбработки    = Лев(ИмяОбработки,Найти(ИмяОбработки,».»)-1);
    ПерезагрузитьВнешнююОбработку(ИмяОбработки);
    текФорма.Закрыть();
    ОткрытьФорму(ПолноеИмяФормы);
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
    
    &НаСервере
    Процедура ПерезагрузитьВнешнююОбработку(ИмяОбработки) Экспорт
    #Если НЕ МобильноеПриложениеСервер Тогда
    
    ВнешниеОбработки.Создать(ВнешниеОбработки.Создать(ИмяОбработки).ИспользуемоеИмяФайла,Ложь);
    #КонецЕсли
    
    КонецПроцедуры
    

    Показать

    Свойства команды:

    <Properties>

    <Name>глShiftF5</Name>

    <Synonym>

    <v8:item>

    <v8:lang>ru</v8:lang>

    <v8:content>Глобальный Shift+F5</v8:content>

    </v8:item>

    </Synonym>

    <Comment/>

    <Group>FormNavigationPanelImportant</Group>

    <Representation>Auto</Representation>

    <ToolTip/>

    <Picture/>

    <Shortcut>Shift+F5</Shortcut>

    <IncludeHelpInContents>false</IncludeHelpInContents>

    <CommandParameterType/>

    <ParameterUseMode>Single</ParameterUseMode>

    <ModifiesData>false</ModifiesData>

    </Properties>

    При открытии нескольких экземпляров внешней обработки перезагружается только текущая активная.

    Reply
  76. Nuuq

    1) УФ — внешняя обработка (отчет)

    2) В УФ создаем команду формы и назначаем ей процедуру «Переоткрыть»

    3) На УФ создаем кнопку формы и назначаем ей команду из п. 2

    Модуль формы

    &НаКлиенте
    Процедура Переоткрыть(Команда)
    
    СтруктураПереоткрыть = Новый Структура();
    ПереоткрытьНаСервере(«Поместить», СтруктураПереоткрыть);
    Если СтруктураПереоткрыть.ФункцияПомещения = «НачатьПомещениеФайла» Тогда
    НачатьПомещениеФайла(,,СтруктураПереоткрыть.ИспользуемоеИмяФайла,Ложь,);
    Иначе
    ПоместитьФайл(,СтруктураПереоткрыть.ИспользуемоеИмяФайла,,Ложь,);
    КонецЕсли;
    ПереоткрытьНаСервере(«Создать», СтруктураПереоткрыть);
    ЭтаФорма.Закрыть();
    ОткрытьФорму(СтруктураПереоткрыть.ПолныйПутьИмениФормы);
    
    КонецПроцедуры
    &НаСервере
    Процедура ПереоткрытьНаСервере(Режим, СтруктураПереоткрыть)
    
    Если Режим = «Поместить» Тогда
    СтруктураПереоткрыть.Очистить();
    СтруктураПереоткрыть.Вставить(«ФункцияПомещения», ?(СокрЛП(Метаданные.РежимИспользованияМодальности) = «НеИспользовать», «НачатьПомещениеФайла», «ПоместитьФайл»));
    СтруктураПереоткрыть.Вставить(«ИспользуемоеИмяФайла», СокрЛП(РеквизитформыВЗначение(«Объект»).ИспользуемоеИмяФайла));
    СтруктураПереоткрыть.Вставить(«ПолныйПутьИмениФормы», СокрЛП(ЭтаФорма.ИмяФормы));
    ИначеЕсли Режим = «Создать» Тогда
    ВнешниеОбработки.Создать(СтруктураПереоткрыть.ИспользуемоеИмяФайла, Ложь);
    КонецЕсли;
    
    КонецПроцедуры

    Показать

    Всем хорошего настроения!

    Reply
  77. ShantinTD

    Всем привет!

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

    Всем СПАСИБО!

    Reply
  78. Arkadiy_B

    (78) Nuuq, что то ругается на

    НачатьПомещениеФайла(,,СтруктураПереоткрыть.ИспользуемоеИмяФайла,Ложь,);

    процедура или функция не найдены

    Reply
  79. LuxVeritatis

    Интересно 🙂 Прекрасная замена Файл-открыть последний (или Alt, ф, стрелка вниз, 1)

    Reply
  80. DrBlack

    Мне понадобилось запускать обработку сначала в режиме мастера настройки (для первоначальной настройки), а потом переходить в обычный режим.

    Проблема в том, что у обработки использовались разные формы, т.е. в «ПередОткрытием» я переопределял основную форму.

    После завершения работы мастера, самым простым способом оказалось просто перезапустить обработку ПРОГРАММНО, так что спасибо автору за готовое решение! 🙂

    Reply
  81. batyrkin

    В предпоследней платформе (8.3.7.1790) как ни бился, не смог сделать переоткрытие внешнего отчета в толстом клиенте с НЕ файловой базой.

    Может у кого есть работающий код? Хочется посмотреть до чего же я не додумался…

    Reply
  82. Knych

    (83) batyrkin, Даже интересно стало. Хотя и, вероятно, уже не актуально, поставил именно эту версию платформуы, не файловый вариант, запустился в толстом клиенте — все работает, как написано например в (78)

    Для личного удобства использовал программное добавление кнопки, полный листинг модуля формы ниже

    &НаСервере
    Процедура ДобавитьКнопкуПерезапуска()
    Если Не РольДоступна(«Администратор») Тогда
    Возврат;
    КонецЕсли;
    НоваяКоманда = ЭтаФорма.Команды.Добавить(«кфПерезапуск»);
    НоваяКоманда.Действие= «кфПерезапустить»;
    НовыйЭлемент = Элементы.Добавить(«кфПерезапустить», Тип(«КнопкаФормы»),Элементы.ФормаКоманднаяПанель);
    НовыйЭлемент.ИмяКоманды = «кфПерезапуск»;
    НовыйЭлемент.Заголовок = «Перезапустить [«+ТекущаяУниверсальнаяДата()+»]»;
    КонецПроцедуры
    
    &НаКлиенте
    Процедура кфПерезапустить(Команда)
    
    СтруктураПереоткрыть = Новый Структура();
    ПереоткрытьНаСервере(«Поместить», СтруктураПереоткрыть);
    Если СтруктураПереоткрыть.ФункцияПомещения = «НачатьПомещениеФайла» Тогда
    НачатьПомещениеФайла(,,СтруктураПереоткрыть.ИспользуемоеИмяФайла,Ложь,);
    Иначе
    ПоместитьФайл(,СтруктураПереоткрыть.ИспользуемоеИмяФайла,,Ложь,);
    КонецЕсли;
    ПереоткрытьНаСервере(«Создать», СтруктураПереоткрыть);
    ЭтаФорма.Закрыть();
    ОткрытьФорму(СтруктураПереоткрыть.ПолныйПутьИмениФормы);
    
    КонецПроцедуры
    
    &НаСервере
    Процедура ПереоткрытьНаСервере(Режим, СтруктураПереоткрыть)
    
    Если Режим = «Поместить» Тогда
    СтруктураПереоткрыть.Очистить();
    СтруктураПереоткрыть.Вставить(«ФункцияПомещения», ?(СокрЛП(Метаданные.РежимИспользованияМодальности) = «НеИспользовать», «НачатьПомещениеФайла», «ПоместитьФайл»));
    СтруктураПереоткрыть.Вставить(«ИспользуемоеИмяФайла», СокрЛП(РеквизитформыВЗначение(«Объект»).ИспользуемоеИмяФайла));
    СтруктураПереоткрыть.Вставить(«ПолныйПутьИмениФормы», СокрЛП(ЭтаФорма.ИмяФормы));
    ИначеЕсли Режим = «Создать» Тогда
    ВнешниеОбработки.Создать(СтруктураПереоткрыть.ИспользуемоеИмяФайла, Ложь);
    КонецЕсли;
    
    КонецПроцедуры
    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ДобавитьКнопкуПерезапуска();
    КонецПроцедуры
    

    Показать

    Для обычных форм на этой же платформе прекрасно отрабатывает код (40)

    Reply
  83. Knych

    (83) batyrkin, Я кажется понял, в чем проблема. Может кому-то пригодится. Вот измененный код процедуры

    &НаКлиенте
    Процедура кфПерезапустить(Команда)
    
    СтруктураПереоткрыть = Новый Структура();
    ПереоткрытьНаСервере(«Поместить», СтруктураПереоткрыть);
    Если СтруктураПереоткрыть.ФункцияПомещения = «НачатьПомещениеФайла» Тогда
    НачатьПомещениеФайла(,,СтруктураПереоткрыть.ИспользуемоеИмяФайла,Ложь,);
    Иначе
    ПоместитьФайл(,СтруктураПереоткрыть.ИспользуемоеИмяФайла,,Ложь,);
    КонецЕсли;
    #Если Не ТолстыйКлиентУправляемоеПриложение Тогда
    ПереоткрытьНаСервере(«Создать», СтруктураПереоткрыть);
    #Иначе
    ВнешниеОбработки.Создать(СтруктураПереоткрыть.ИспользуемоеИмяФайла);
    #КонецЕсли
    ЭтаФорма.Закрыть();
    ОткрытьФорму(СтруктураПереоткрыть.ПолныйПутьИмениФормы);
    
    КонецПроцедуры
    

    Показать

    Reply

Leave a Comment

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