[Tray1C] Сворачивание 1С в системный трей




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

99 Comments

  1. Душелов

    Посмотрел я на форум http://infostart.ru/forum/messages/forum14/topic7872/message56011/#message56011, а так же работы других авторов…

    И решил набросать свое…

    Reply
  2. Душелов

    В архиве пока пример для 8-ки, для 7-ки в процессе…

    Reply
  3. Душелов

    Горячие клавиши добавлю сегодня.

    Может еще какие идеи появятся?

    Reply
  4. Душелов

    Еще раз поблагодарю автора иконок, какие я использовал: http://infostart.ru/projects/2328/

    Reply
  5. Душелов

    Добавил пример для 7.7

    Reply
  6. coder1cv8

    Боян! )

    Reply
  7. Душелов

    (6) Типа того 😉 Пока боян, еще пару бантиков добавлю — будет другое 😉

    Reply
  8. vovan519

    Душелов, думаю пора делать одну компоненту. Что то типа формекса. Сделать описание. Думаю всем будет удобнее. Как тебе такая идея?

    Reply
  9. Душелов

    (8) Я уже думал над этим… Но АктивИксы туда не запихнешь — они отдельные, а просто компонент у меня мало.

    Reply
  10. artbear

    (9) А почему это вдруг АктивИкс-ы нельзя запихнуть в одну длл-ку?

    или ты говоришь, что ВК и АктивИкс в одной длл-ке не живут?

    Reply
  11. Душелов

    > ВК и АктивИкс в одной длл-ке не живут

    Именно, технологии разные.

    Reply
  12. ValeriVP

    я могу ошибаться, но почему не живут? интерфейсы же разные

    Reply
  13. MrDen

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

    Reply
  14. adun

    (3) …а не удобнее сами свойства перенести в Сервис->Параметры?

    Reply
  15. Душелов

    (13) Редиректо окно сообщений вряд ли получится.

    Всплывающие окна будут уже в новой версии

    (14) Нет, не удобнее.

    Reply
  16. Megas

    не бейте новичка а как это установить ?

    Reply
  17. Altair777

    (16) см (0)

    *** Для работы компоненты потребуется установленный Microsoft .NET Framework 2.0, который можно скачать отсюда.

    и зарегистрировать компоненту в Windows — запустить reg.bat

    Reply
  18. Megas

    Microsoft .NET Framework 2.0 установлен

    куда эту папку запихать или файлы из нее

    Reply
  19. Altair777

    (18) куда хочешь. Поручик Ржевский, молчать! 🙂

    Я просто в каталоге C:Program Files1С сделал подкаталог

    Reply
  20. Megas

    видать не фига я не понимаю все сделал как написано, что и где должно появиться. не вижу изменений

    1. Microsoft .NET Framework 2.0

    2. папку сунул в C:Program Files1Cv77

    3. запустил reg.bat

    и дальше ? )

    Reply
  21. Душелов

    А дальше можно хотя бы попытаться открыть обработку.

    Reply
  22. Altair777

    (20) попробуй обработочку запустить 🙂

    Reply
  23. CheBurator

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

    Reply
  24. Megas

    если это операцииобработка то там ее нету .

    Reply
  25. Megas

    все разобрался

    спасибо полезная штукень

    Reply
  26. Altair777

    (24) в архиве 6 файлов

    Tray1CDushelov.Tray1C.dll

    Tray1C
    eadme.txt

    Tray1C
    eg.bat

    Tray1Cunreg.bat

    Tray1CСистемныйТрей.epf

    Tray1CСистемныйТрей.ert

    Reply
  27. Душелов

    (23) Думаю, что свернет на сервере… Хотя не знаю…. Надо пробовать.

    Reply
  28. CheBurator

    (27) вот как раз вопрос: при таком запуске 1Ски — трея-то нет…?

    Reply
  29. Душелов

    (28) Значит окно терминалки надо захватывать другими средствами 😉

    Reply
  30. bro

    Ошибка регистрации на Windows Vista: Не удалось найти входную сборку Dushelov.Tray1C.dll или одну из ее зависимых компонент…

    Что делать?

    Reply
  31. skom

    уже пару лет пользуюсь компонентой

    hide1c.dll

    делает все то же самое.

    тока меньше вкусностей…в ней.

    идея — зачет

    Reply
  32. Gamm

    У hide1c есть большой плюс — размер 44 кб и больше ничего не надо.

    Хотя возможности добавлять собственное меню ей не хватает.

    Reply
  33. Rumpel_Shtilken

    Любопытная приблуда. Спасибо за то, что не забываете 1Cv77 !

    Сам я пользую Hide1C.dll — сворачивает/разворачивает окно 1С в/из трей, можно задавать: пароль на разворот, мигание иконки, частоту мигания иконки, всплывающую подсказку для иконки. Для работы не требует НетФреймворка и пр., регить в реестре не обязательно. Практически, 1С-ка работает в фоне. Нет многих вещей, таких как в Tray1C, но очень удобная штука и весит 45056 байт.

    Reply
  34. Душелов

    (30) Висты нет под рукой — посмотреть не на чем…

    hide1c- хорошо. Но не для моих нужд.

    Reply
  35. bro

    (30) Аналогичная ошибка возникает и на отдельных XP

    Reply
  36. Душелов

    (28) Кстати, только что запустил у себя в цитриксе — терминальное окно нормально сворачивается в трей.

    (35) Фреймворк свежий стоит? Админские права?

    Reply
  37. andrewalexk

    🙂

    не понял..

    а чем эта Вк лучше ВК hide1c

    да еще и с фреймворк 2.0…

    Reply
  38. Душелов

    (37) Ничем. Даже хуже.

    Reply
  39. Aleksey.Bochkov

    Может немного не в тему, но все же… Никак не могу найти способ сделать динамическое меню для 8-ки. Цель — создать список пунктов меню, скажем после пункта «Операции», средствами языка, который мог бы изменять без перезапуска программы… Для 7-ки юзал RWidjets, после перехода на 8-ку в ступоре 🙁

    Reply
  40. dinamyc

    Можно попробовать вот так regsvr32 С:путь к файлу Tray1C.dll

    нормально все работает

    Reply
  41. Душелов

    (40) Кстати да… В батнике reg.bat прописать полный путь к длл-ке и запустить его.

    Reply
  42. Душелов

    (39) Наверное сделать можно… Смотреть надо… То, что есть — пока не встречал.

    Reply
  43. Душелов

    Добавил 2 новых метода:

    — Трей.УстановитьЗаголовокОкна(ЗаголовокОкна); //устанавливает произвольные текст в заголовок окна 1С

    — Трей.ВсплывающееСообщение(ТекстСообщения, ТекстЗаголовока, Таймаут, Линк); //НомерИконки — от 0 до 3,

    //Линк — строка, которая будет передана в событии нажатие на сообщение

    На всплывающем сообщении, в принципе, можно размещать все, что угодно, даже картинки…

    Reply
  44. Душелов

    > можно размещать все

    Точнее можно сделать размещение разных данных…

    Reply
  45. andrewalexk

    (38)

    🙂

    аа..

    велосипеды..

    понимаю..

    Reply
  46. Душелов

    (45) Ага, типа того 🙂

    Reply
  47. Душелов

    Обновил.

    Добавлено:

    — возможность всплывающего окна (не зависимо свернута 1С или нет) любого окна из самой 1С, т.е. любую форму, обработку и т.п.

    Reply
  48. Душелов

    Окно берется по заголовку, советую использовать формы, у которых отключена возможность изменения размера.

    Reply
  49. Душелов

    — добавлен показ окна служебных сообщений при появлении в нем сообщений (пока для 1С 8.х)

    И вывод произвольного окна работает пока только для 8-ки… В 7-ке, как оказалось, другая структура окон…

    Reply
  50. CaSH_2004

    Горячая благодарность тебе от меня лично и от всех кто искал такую штуку (седня наткнулся т.к. уже сам решил попробовать написать)

    > Может еще какие идеи появятся?

    1. думаю было бы полезно сделать для всех окон (всплывающих и сообщений) возможность баловаться со шрифтом (цвет, размер, жирный или курсив), например как HTML или как ты сделал [RichTextBox1C]

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

    Reply
  51. Душелов

    (50)

    1. Для этого я сделал возможность вывода собственного окна, а там делай, как хочешь.

    2. Как бы они и должны встраываться.

    Reply
  52. ProkopyukIN

    А можно сделать так, чтоб все открытые базы сворачивались в одну иконку, а потом выбирать какую открыть. А то допустим работаю я с 5-6 базами — пол трея в 1С 🙂

    Reply
  53. Abadonna

    (52) > А то допустим работаю я с 5-6 базами

    Прям Юлий Цезарь. Подозреваю, что это не «работаю», а болезнь под названием «открыл — фиг закрою, даже если не надо». У меня юзвери за это получают довольно болезненные подарки

    Reply
  54. ProkopyukIN

    нет. в этом случае ты не прав. у меня две рабочие базы ЗиУП и Бух 1.6, две тестовые, плюс к каждой часто приходится конфигуратор держать. А еще со второй работы УПП стоит. Частенько открыто по 5-6 баз, а то и больше. Так что… Было бы удобно в одной иконке все держать.

    Reply
  55. Abadonna

    (54) У меня рабочих баз с десяток+ почти столько же отладочных.

    Но привычка закрывать, если в ДАННЫЙ момент оно не надо — в крови 😉

    Reply
  56. Душелов

    (52) Сделать можно все, только я считаю это не нужным.

    Reply
  57. Душелов

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

    Reply
  58. stas&k

    что то не пойму а нафига оно? если есть куча приблуд бесплатных которые сворачивают любой софт в трей хоть косынку хоть Ворд

    Reply
  59. Душелов

    (58) Не за чем.

    Reply
  60. Душелов

    Подарок на день программиста (вчера 22.04) — выкладываю снова в бесплатный доступ 😉

    Reply
  61. Арчибальд

    (60)А мы с плюсиком на это 😉

    Reply
  62. zzmail

    Неплохие возмождности

    Reply
  63. JohnyDeath

    (62) братишка плюсанул? 😉

    Василий, извини за ОФФ. Не удержался… ))

    Reply
  64. MNevgeny

    Это самое лучшее изобретение в этом направлении !

    Reply
  65. Душелов

    — добавлена возможность вывода языка ввода в строке состояния 1С 8.х

    Reply
  66. Kolumb

    За возможность вывода языка ввода в строке состояния 1С 8.х респект и уважуха.

    Подскажите еще, может ли эта ДЛЛка всплывать форму и не прятать ее до нажатия кнопок этой формы (срабатывания обработчиков нажатия кнопок)?

    Reply
  67. Душелов

    (66) Не совсем понял, что имеется в виду… Это же модальное окно?..

    Reply
  68. Kolumb

    (67) Надо так:

    1С свернута или перекрыта другим приложением. Пользователь отвлекся от компа. В системе происходит какое-то событие, после которого у пользователя всплывает окно (поверх остальных окон, не взирая на то, что сама 1С свернута) и не прячется до тех пор, пока пользователь не выполнит какое-то действие на этой форме.

    Reply
  69. Душелов

    (68) Подобное сделать можно, аналогично Трей.ВсплывающееОкно(ЗаголовокОкна, Таймаут, Линк);

    Reply
  70. Kolumb

    (69) Так это можно делать уже, или для этого еще что-то нужно доделывать?

    Reply
  71. Душелов

    (70) Надо дорабатывать компоненту. Когда-нибудь, возможно, я это сделаю.

    Reply
  72. Kolumb

    (71) Еще одна засада. У некоторых пользователей отключен рабочий стол (explorer не запущен). В таком случае компонента не подключается, а язык ввода как раз в таком случае очень нужен.

    Reply
  73. Душелов

    (72) Не подключается как? Что пишет?

    Reply
  74. Kolumb

    (73) {Обработка.АРМДосьеСерии.Форма.Форма(11)}: Ошибка при вызове метода контекста (ПодключитьВнешнююКомпоненту): Ошибка при подключении внешней компоненты

    ПодключитьВнешнююКомпоненту(ИмяВК);

    по причине:

    Ошибка при подключении внешней компоненты

    Reply
  75. Душелов

    А другие ВК подключаются?

    Reply
  76. Kolumb

    Другая ВК, работающая с клавиатурой, подключается без проблем при отключенном рабочем столе.

    Reply
  77. IronDemon

    В Windows 7 не под админом работает?

    Reply
  78. haverlon

    На Microsoft .NET Framework 3.5 не работает ?

    а то ngen ругается и не регистрирует.

    Reply
  79. MagicCat

    Пишу код:

    ИмяВК=»AddIn.Tray1C»;
    
    Попытка
    ПодключитьВнешнююКомпоненту(ИмяВК);
    Исключение
    Сообщить(«Не удалось подключить компоненту » + ИмяВК);
    КонецПопытки;
    
    Попытка
    Трей = Новый(ИмяВК);
    Трей.Показать();
    Трей.СкрытьОкно();
    Исключение
    Сообщить(«Ошибка создания объекта внешней компоненты: » + ИмяВК);
    КонецПопытки;
    

    Показать

    Отлично срабатывает, окно 1С скрывается, иконка в трее появляется. Но при попытке развернуть окно 1С назад (по иконке в трее «открыть» или dbl click) вылетает JIT отладчик с сообщением:

    ************** Текст исключения **************
    System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
    в IAsyncEvent.ExternalEvent(String bstrSource, String bstrMessage, String bstrData)
    в Dushelov.Tray1C.MessageTo1C(String caption, String message)
    в Dushelov.Tray1C.MaximizeWindow()
    в Dushelov.Tray1C.OpenWindow()
    в Dushelov.Tray1C.notifyIcon_DoubleClick(Object sender, EventArgs e)
    в System.Windows.Forms.NotifyIcon.OnDoubleClick(EventArgs e)
    в System.Windows.Forms.NotifyIcon.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
    в System.Windows.Forms.NotifyIcon.WndProc(Message& msg)
    в System.Windows.Forms.NotifyIcon.NotifyIconNativeWindow.WndProc(Message& m)
    в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    
    
    ************** Загруженные сборки **************
    mscorlib
    Версия сборки: 2.0.0.0
    Версия Win32: 2.0.50727.3082 (QFE.050727-3000)
    CodeBase: file:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
    —————————————-
    Dushelov.Tray1C
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    

    Показать

    Reply
  80. SiniaTabletka

    1c 8.2

    окно управляемого приложения не сворачивает в трей 😐 (обычное сворачивает)

    а очень хочется 🙁

    Reply
  81. f333

    да, на 8.2 запускается, но нормально работать не хочет

    Reply
  82. Гон

    А можно установить размер всплывающего сообщения?

    Когда-то (может года 2 назад)я выводил всплывающие окна ПРОИЗВОЛЬНОГО размера из 1С!! Это так здорово! Но какой компонентой?

    В твоей нет таких настроек? Тогда не нужно было…

    Reply
  83. anakonda

    Хорошая вещь. Давно пользуюсь

    Reply
  84. malina-da

    Интересная вещь, но все равно нужно под себя и свои нужды доработать

    Reply
  85. golunov

    спасибо полезная вещь. Можно использовать в качестве системных сообщений. Есть недостаток- если добавить в конгфигурацию подключение то при отладке системы в трее могут появиться несколько иконнок. А вообще прикольно.

    Reply
  86. iotkin

    что то не пойму а зачем это надо?

    Reply
  87. Lexush

    Интересная наработка, все упрощают и украшают бедным пользователям трудную и нудную работу с 1С, скоро вместо всех этих наворотов, какой нибудь супер специалист нарисует в системном трее большую кнопку «ХОЧУ», по нажатию которой будет выпадать меню с решением большинства житейских проблем. Спасибо автору за продвижение светлых идей.

    Reply
  88. Екатерина2011

    ИМХО фигня, нафиг не нужная. Никто не делал разработки по заполнению нового годового баланса, вот это реально стоящая весч был бы.

    Reply
  89. Varies

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

    А разработка классная, особенно удобно было бы использовать с 1С Документооборот 8 или УТ 11, где при поступлении задачи можно помигать в трее 🙂

    Reply
  90. serpisal

    Хорошее решение, открытых окон всегда много выполнять какие-то рутинные действия удобнее, когда необходимо реагировать на результат действий в других окнах.

    Reply
  91. CaSH_2004

    (1) Метод УстановитьЗаголовокОкна() не работает в 1С:Предприятие 8.2 (8.2.15.289), в 8.2.13 работал, интересно с чем связано? Вернее не работает если запущено Предприятие из Конфигуратора! А если такпросто базу запустить то работает

    Можете исправить? Заодно не работает и сворачивание в трэй, но это не так важно, по большому счету оно даже иногда мешает — забываеш закрыть базу перед выключением ПК.

    Сказка было бы если б 1С в ОбработкаВнешнегоСобытия() отлавливала события Windows такие как выключение и прочее, насколько знаю ОС генерирует их и нормальные программы обрабатывают — типа предлагают сохранить открытые документы (Ворд, Блокнот) но 1С почему то решила пойти по своему пути 🙂 Или может я не в курсе есть такой типовой метод?

    Reply
  92. loginfo

    Пробую запустить вашу обработку для Документооборота (8.2) таким образом:

    в поле расположения ярлыка добавляю запись

    «C:Program Files1cv828.2.15.289in1cv8.exe» /IBName «Документооборот» /N «Администратор» /p «888» /Execute «D:Tray1CСистемныйТрей.epf». Запускается программа с пустой вкладкой обработки. Так запустить не получится?

    Reply
  93. loginfo

    Обработка не работает для управляемых форм

    Reply
  94. Гость

    автору светлая память. покойся с миром……

    Reply
  95. ea_len

    Супер! Мне пригодилось!

    Reply
  96. apostal86

    Для регистрации в файле reg.bat к файлу Tray1C.dll прописать путь полностью и, например, в Windows 7 запускать reg.dat от имени администратора

    Reply
  97. yura.olesik

    Добрый день! Использую вк в рознице, но проблемка в том что после использования ВК после закрытия программы она остается в диспетчере задач. В чем может быть проблемма?

    Reply
  98. Muller2306

    Добрый день.

    После использования ВК панели инструментов перестали перетаскиваться…

    Reply
  99. BoBaH

    (92) Varies, доброго времени суток! Вы не нашли решение вопроса «помигать при создании задачи в документобороте»?

    Reply

Leave a Comment

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