1с стартовать и закрыть
Начиная с версии 8.3.8 фирма 1С изменила подход к завершению работы и закрытию приложения. Новомодные веяния – ли, ошибки при работе с WEB интерфейсом – ли, но теперь со всех обработчиков событий, используемых нами при закрытии – «ПередЗавершениемРаботыСистемы» и «ПриЗавершенииРаботыСистемы», сервер не доступен. Рассмотрим, как теперь работают данные обработчики.
Обработчик: ПередЗавершениемРаботыСистемы(Отказ, ТекстПредупреждения)
Как мы помним возникает перед завершением программы, до закрытия главного окна. Если «Отказ» равен «Ложь», то программа просто закрывается, не выдавая никаких вопросов. В нем можно сделать всяческие проверки, все функции должны быть только клиентские (В процессе завершения работы приложения запрещены серверные вызовы и открытие окон.) и может быть установлен отказ от выхода из программы. И вот тут появляется первый подвох. Установление «Отказ» в Истина не отменяет выход из системы, а только указывает, что нужно выдать платформенный диалог, в котором будет предложено выйти или остаться с текстом из параметра «ТекстПредупреждения»:
Диалог завершения программы
И если пользователь нажмет «Завершить работу», все ваши проверки идут лесом. Платформа просто закрывает приложение не зависимо ни от чего. Отловить этот момент в коде нельзя, это все происходит на уровне платформы.
Если же пользователь нажмет на «Продолжить работу», то возможны два варианта событий:
-
Если вы внутри вызова функций из данной процедуры подключали обработчик ожидания
Ответ на первый глобальный русский вопрос «кто виноват?» понятен. Я постараюсь ответить на второй «что делать?». Если нам надо что то зафиксировать в базе, например информацию о работе пользователей в системе. Кто когда заходил, кто когда вышел.
Решение однако лежит вообще в другой плоскости, а именно, в регламентном задании которое периодически будет опрашивать систему на активных пользователей, и фиксировать что такой то пользователь уже отсутствует в списке активных.
Для опроса системы у нас есть функция ПолучитьСеансыИнформационнойБазы(), которая возвращает массив сеансов. А для фиксации, что пользователя в сеансах уже нет нужно создавать новый регистр. Я предлагаю периодический (в пределах секунды) РС с двумя измерениями «Пользователь» и «НомерСеанса», в ресурсах же должно быть как минимум поле «ЗавершениеСеанса» по которому мы будем понимать что пользователь нами не обработан или обработан но активен.
Структура регистра
Обработчик: ПриЗавершенииРаботыСистемы()
Привожу полный текст справки:
Возникает перед завершением работы в режиме управляемого приложения после закрытия главного окна. В данной процедуре могут быть выполнены действия, необходимые при выходе из программы.
В данной процедуре не допускаются:
- открытие форм и других окон,
- использование серверных вызовов,
- использование асинхронных вызовов.
Вот честно, не понимаю вообще какие действия можно осуществить в данной процедуре? Да мы можем написать кучу кода, что-то сделать с файлами, но ничего сообщить пользователю, что то сделать с базой – мы уже не можем.
Резюме
Резюмируя данную статью хочу поблагодарить фирму 1С, что не дает нам соскучиться и всегда на страже нашего свободного времени.
Как запустить автоматический старт процесса по документу при наступлении определенных условий?
В системе 1С: Документооборот существует понятие бизнес-событий (событий произошедших в программе). Для того чтобы можно было использовать этот механизм, необходимо его включить в настройках программы:
Для классификации таких событий есть специальный справочник «Виды бизнес событий» (сами же события система записывает в регистр сведений «Произошедшие бизнес-события»). Также важными частями механизма бизнес-событий являются детекторы бизнес-событий и обработчики бизнес-событий, но о них ниже.
Создадим вид для бизнес-события, которое будет формироваться при наступлении данного условия.
Теперь нужно добавить "Детектор бизнес-события". Детектор бизнес-события - это как раз та часть механизма, которая отслеживает выполнение условия и создает соответствующее событие в системе.
Добавим новый детектор в справочнике «Детекторы бизнес-событий». В его карточке укажем вид бизнес-события, который создали ранее. В поле «Выражение на встроенном языке» необходимо написать код, который проверяет, есть ли хотя бы один объект, для которого условие истинно. Если есть, то переменной «Результат» нужно присвоить значение Истина. В этом случае система создаст бизнес-событие с указанным видом.
ВАЖНО: Если не установлен флаг «Детектор включен», код детектора исполняться не будет!
В нашем случае нужен запрос, который проверяет, что есть документы с выполненным условием (к документу приложен файл, подписанный электронной подписью и по этому документу нет процессов обработки). Если такие документы есть — значит наше событие произошло. Таким образом событие будет сгенерировано, когда в системе есть один или несколько документов, для которых все условия выполнились, и по ним нужно стартовать процесс.
Код детектора:
ВидыДокументов = Новый Массив;
ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка", Истина));
Запрос = Новый Запрос;
"ВЫБРАТЬ ПЕРВЫЕ 1
| Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Файлы КАК Файлы
| ПО ВнутренниеДокументы.Ссылка = Файлы.ВладелецФайла
| ЛЕВОЕ СОЕДИНЕНИЕ БизнесПроцесс.КомплексныйПроцесс.Предметы КАК КомплексныйПроцессПредметы
| ПО ВнутренниеДокументы.Ссылка = КомплексныйПроцессПредметы.Предмет
| КомплексныйПроцессПредметы.Предмет ЕСТЬ NULL
| И ВнутренниеДокументы.ВидДокумента В(&ВидыДокументов)
| И НЕ ВнутренниеДокументы.ПометкаУдаления
| И Файлы.ПодписанЭП = ИСТИНА
| И НЕ Файлы.ПометкаУдаления";
Если Не РезультатЗапроса.Пустой() Тогда
Далее необходимо выполнить обработку сформированных бизнес-событий. В нашем случае это запуск процессов по документам. Для обработки бизнес-события в программе используется справочник "Дополнительные обработчики-бизнес событий".
В нем также необходимо написать код на встроенном языке, который будет выполнять необходимые действия. В нашем случае фрагмент кода должен находить конкретные документы, для которых выполнились условия, и создавать для них процессы.
ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка", Истина));
Запрос = Новый Запрос;
| Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Файлы КАК Файлы
| ПО ВнутренниеДокументы.Ссылка = Файлы.ВладелецФайла
| ЛЕВОЕ СОЕДИНЕНИЕ БизнесПроцесс.КомплексныйПроцесс.Предметы КАК КомплексныйПроцессПредметы
| ПО ВнутренниеДокументы.Ссылка = КомплексныйПроцессПредметы.Предмет
| КомплексныйПроцессПредметы.Предмет ЕСТЬ NULL
| И ВнутренниеДокументы.ВидДокумента В(&ВидыДокументов)
| И НЕ ВнутренниеДокументы.ПометкаУдаления
| И Файлы.ПодписанЭП = ИСТИНА
| И НЕ Файлы.ПометкаУдаления";
Если Не РезультатЗапроса.Пустой() Тогда
ШаблонПроцесса = Справочники.ШаблоныКомплексныхБизнесПроцессов.НайтиПоНаименованию("Обработка записок", Истина);
Пока Выборка.Следующий() Цикл
БизнесПроцессОбъект.ЗаполнитьПоШаблонуИПредмету(ШаблонПроцесса, Документ, Документ.Подготовил);
Если ПолучитьФункциональнуюОпцию("ИспользоватьФоновыйСтартПроцессов") Тогда
Обработчик бизнес-события и бизнес-событие необходимо связать между собой при помощи команды Подписки в панели навигации обработчика. В открывшемся списке нужно нажать Создать и указать ссылку на созданный ранее вид бизнес-события.
После этого необходимо проверить работу детектора и обработчика, если код написан без ошибок - новые события будут появляться и обрабатываться встроенным механизмом.
Отлаживать же механизм можно частями - проконтролировать появление новых событий можно, открыв регистр сведений «Произошедшие бизнес события» (все события механизм запишет сюда), срабатывание обработчика можно увидеть тут-же по появлению флага «Обработано», а саму правильность кода обработчика — по появлению запланированного результата (в нашем примерe - создан процесс по документу).
Для тестирования программы 1С:Документооборот вам достаточно заполнить форму, нажав на кнопку ниже.
📝 Обратился клиент с ошибкой входа в файловую базу 1С. Со слов, ничего не делали и никаких блокировок не ставили — просто не заходит, нет возможности запуска.
Далее текст для администратора. На кнопке «Выполнить запуск» работает обратный таймер на 1 минуту. И так по кругу.
Возможные причины:
- человеческий фактор — кто-то из пользователей случайно установил блокировку сеансов или нечаянно прервал процесс копирования, принудительно закрыв программу;
- ошибка создания автоматической резервной копии, когда программа препятствует входу пользователей на время процесса, а после копирования не может снять блокировку.
Важно: перед внесением изменений, пожалуйста, сделайте копию каталога ИБ.
🎯 Как решить:
📌 1. Проверьте расположение ИБ и удалите файл 1Cv8.cdn из папки.
Запустите 1С. Если у вас клиент-серверная БД, то откройте консоль сервера, проследуйте в свойства базы и уберите флаг «Блокировка начала сеансов включена».
📌 2. Запустите приложение 1С с параметрами:
/СРазрешитьРаботуПользователей /UC <пароль для разблокировки>
Пример с использованием полного пути:
"%ProgramFiles%\1cv8\common\1cestart.exe" ENTERPRISE /F”C:\Base\UT” /СРазрешитьРаботуПользователей /UC 123
Если Вы не знаете кода разрешения, попробуйте значение по умолчанию «/UCКодРазрешения».
Также, когда происходит автоматическое резервное копирование, система блокирует базу 1С 8.3 и ставит стандартный код разблокировки «РезервноеКопирование».
Поэтому, если процедура «сорвалась» и блокировка осталась, но нет возможности удалить cdn-файл, используйте параметр « /UCРезервноеКопирование ». Тоже вариант для проверки.
После входа откройте « Администрирование — Поддержка и обслуживание — Блокировка работы пользователей » и проверьте, что блокировка снята.
📌 3. Корректировка содержимого 1Cv8.cdn
Откройте файл с помощью текстового редактора (блокнота). После первой фигурной скобки увидите цифру: 1 — признак блокировки, 0 — снятие блокировки.
Поменяйте «1» на «0» и сохраните файл, база запустится в обычном режиме. Также доступна для изменения дата окончания блокировки — на ваше усмотрение.
Поле «Кода для разблокировки» указывается в кавычках после "/UC<код разрешения>". Если код разрешения ранее не был задан, то укажите в поле и сохраните файл (например, "0000"). Далее этот код указывается в строке параметров запуска, как в Варианте 2.
📌 4. Измените дату (время) на компьютере на момент до блокировки.
Метод позволяет зайти в базу и снять блокировку, после чего дата (время) меняются обратно.
✅ Если у вас все получилось, то вы молодцы. Так как самостоятельно решили вопрос, исправив ситуацию.
Или требуется помощь? Тогда напишите нам .
⚡ Подписывайтесь на канал или задавайте вопрос на сайте — постараемся помочь всеми техническими силами. Безопасной и производительной работы в Windows и 1С.
Как в 1С:Документообороте поставить на паузу процесс до выполнения условия?
В статье используются следующие механизмы 1С:Документооборот КОРП версии 2.1.18.11: комплексный процесс в виде схемы, эскалации, этапы обработки документов.
Очень часто комплексный процесс (или ветку процесса) нужно поставить на паузу, пока не выполнится определенное условие. В данной статье показан один из способов реализации данного функционала.
Видео-урок "Как поставить на паузу процесс до выполнения условия" доступен в теме Бизнес-процессы видеокурса Самоучитель 1С:Документооборот для специалистов и администраторов.
Открываем демо версию 1С:Документооборот 8 КОРП под пользователем Администратор.
Открываем Виды документов в разделе НСИ.
Находим вид внутреннего документа Договор аренды оборудования. В нем установлена нужная нам настройка Использовать этапы обработки документа.
И обращаем внимание на этапы обработки документа, заданные у вида документа.
В шаблоне комплексного процесса (КП) сделаем два параллельных вложенных КП. В одной ветке у нас будут этапы 2-5, 8. В другой ветке 6 и 7, причем этап 7 должен начаться только после того, как в параллельной ветке завершится этап 5.
Переходим в раздел Управление процессами и открываем Шаблоны процессов.
Создаем новый комплексный процесс в виде схемы 1с документооборота.
На схему добавим две параллельные ветки (два вложенных комплексных процесса):
- Согласование и подписание договора.
- Получение и оплата счета.
Первая ветка содержит этапы 2, 3, 4, 5, 8.
Вторая ветка содержит этапы 6 и 7.
Однако этап 7 "Оплатить счет" надо запускать только после этапа 5 "Подписания договора" в параллельной ветке.
Для решения этой задачи создадим новую роль Робот. И сделаем промежуточный шаг на эту роль "Ожидание подписания договора".
Позже настроим правила эскалации по выполнению этой задачи, если договор подписан. Но пока вернемся в первую ветку и после шага подписания договора будем проставлять признак выволнения этапа 5 "Подписание у директора".
Чтобы из кода скрипта не искать этап по наименованию (а наименование этапа может со временем измениться), лучше использовать механизм локальных констант. Как их сделать рассказано в видеокурсе для специалистов и администраторов в теме Бизнес-события.
Также локальные константы уже реализованы одной из функций в продукте "Академическое гиперрасширение для 1С:Документооборота".
Мы воспользуемся расширением (его можно бесплатно тестировать 3 дня). Загрузим его на нашу базу и получим демо-лицензию.
После этого открываем локальные константы.
Создадим новую локальную константу ЭтапПодписатьУДиректора.
Далее нам нужно написать скрипт, который проставляет у документа, что этот этап пройден. В том же расширении имеется встроенный эмулятор скриптов. Воспользуемся им для написания скрипта.
Вставляем скрипт в эмулятор скриптов и меняем название константы на ЭтапПодписатьУДиректора. Выбираем любой запущенный комплексный процесс и проверяем, проставилось ли прохождение нашего этапа.
Пройденность этапа заполнилась скриптом. Полный текст скрипта можно взять в библиотеке скриптов. Этот скрипт входит в список тех скриптов, которые находятся в свободном доступе.
Док = Процесс.Предметы[ 0 ].Предмет ; Этап = lvv_ВызовСервера.lvv_ПолучитьЗначениеДопПараметра ( "ЭтапПодписатьУДиректора" ) ; Сообщить ( Этап ) ; НаборЗаписей = РегистрыСведений.ЭтапыОбработкиДокументов.СоздатьНаборЗаписей ( ) ; НаборЗаписей.Отбор.Документ.Установить ( Док ) ; НаборЗаписей.Отбор.Этап.Установить ( Этап ) ; НаборЗаписей.Прочитать ( ) ; Если НаборЗаписей.Количество ( ) = 0 Тогда Сообщить ( 0 ) ; НЗ = НаборЗаписей.Добавить ( ) ; НЗ.Документ = Док ; НЗ.Этап = Этап ; НЗ.ДатаПрохождения = ТекущаяДата ( ) ; НЗ.Пройден = Истина ; ИначеЕсли НаборЗаписей.Количество ( ) = 1 Тогда Сообщить ( 1 ) ; НЗ = НаборЗаписей[ 0 ] ; НЗ.Документ = Док ; НЗ.Этап = Этап ; НЗ.ДатаПрохождения = ТекущаяДата ( ) ; НЗ.Пройден = Истина ; КонецЕсли ; НаборЗаписей.Записать ( ) ;
Читайте также: