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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *