Как добиться 100% защиты архивов баз 1С от шифровальщиков

  оглавление  Учимся писать скрипты на OneScript

Обновлятор-1с. Учимся писать пакетные (batch) скрипты

О чём вообще идёт речь?

Речь идёт  о возможности написания пакетных скриптов для автоматизации операций над группой баз вот на этой вкладке обновлятора:

Что такое пакетный скрипт?

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

Такие файлы обычно имеют расширение bat или cmd.

Я сам подсматриваю синтаксис таких скриптов здесь и здесь.

Зачем писать и запускать эти скрипты именно в обновляторе?

Потому что обновлятор берёт на себя ряд непростых вещей, чтобы упростить написание таких скриптов в части взаимодействия с пакетным режимом конфигуратора и в целом с базами.

А именно.

Список баз для обработки

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

Передача параметров базы

При выполнении скрипта обновлятор сам передаёт в него необходимые параметры с информацией о текущей базе:

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

Примеры таких скриптов мы можем найти в списке шаблонов обновлятора:

Предварительная архивация базы

При необходимости обновлятор обеспечит создание резервной копии перед выполнением скрипта:

Эта резервная копия будет согласована с общей системой архивации, то есть её также можно подвергать "тюнингу" в дополнительных настройках обновлятора. Такая копия всегда будет иметь метку "перед опасной операцией".

Блокировка, разблокировка базы

При необходимости обновлятор выполнит полную блокировку базы перед выполнением вашего скрипта и разблокировку после:

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

Нужно "разрулить" текущие подключения пользователей, административные подключения, выполнение фоновых задач. И всё это через общение напрямую с кластером 1с.

Сохранение отчётов

Обновлятор сохраняет историю выполнения таких скриптов в менеджере отчётов.

Как в общем виде:

Так и в детальном:

Кстати, вы обратили внимание, что в отчётах скрываются имя и пароль пользователя, под которым выполнялся пакетный запуск конфигуратора? Эта конфиденциальная информация намеренно заменяется на символ звёздочка.

Уведомление на почту

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

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

Запуск скрипта по расписанию

Для добавления скрипта в запуск по расписанию следует сохранить сам скрипт:

Далее у нас есть 2 варианта:

Быстрый, но неудобный способ

При сохранении скрипта мы можем установить опцию "Настроить однократный запуск скрипта ...":

И далее уже отредактировать расписание этого задания непосредственно в планировщике Windows.

Чуть более медленный, но самый удобный способ

После того как вы сохранили скрипт (не добавляя его в планировщик Windows) вернитесь в главное окно Обновлятора на закладку "Настройки программы".

Далее нажмите кнопку "Расписание"...

И создайте задачу с типом операции "Запуск скрипта":

Укажите ваш сохраненный скрипт по ссылке "выбрать скрипт для запуска...".

Облачный мониторинг

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

Многопоточное выполнение скриптов

О том как запускать скрипт параллельно для нескольких баз подробно рассказывается здесь.

Что ещё полезно изучить перед написанием скриптов?

Ну, конечно же, пакетные команды конфигуратора. Куда же без них... :)

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

Чтобы увидеть все возможные команды именно для нашей версии 1с - заходим в конфигуратор и выбираем пункт меню "Справка"-"Содержание справки":

В открывшемся окне нас интересует вот эта ветка:

Здесь есть всё, информация исчерпывающая. Возможно не будет хватать примеров использования, поэтому к справке конфигуратора советую переходить уже после того как освоитесь с выполнением простейших пакетных команд согласно всё той же статьи Инфостарта.

Ну, поехали!

Хватит говорить про скрипты - давайте их писать :)

Выводим на экран имя базы

Для этого нам понадобится команда echo (именно она отвечает за вывод на экран) и параметр %base_name% (его нам передаёт в скрипт обновлятор).

Так и напишем:

И запустим наш скрипт над выбранной группой баз:

Пересчитываем итоги

Здесь уже речь идёт о том, чтобы выполнить пакетную команду конфигуратора, которая называется IBCheckAndRepair с ключом RecalcTotals.

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

Вместо этого мы просто напишем:

%run_1c_d% /IBCheckAndRepair -RecalcTotals

%run_1c_d% это параметр скрипта, который включает в себя пакетный вызов конфигуратора к текущей базе, для которой выполняется скрипт.

Почему он называется именно run_1c_d? Это сокращение "run 1c designer". Designer означает режим конфигуратора.

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

Делаем выгрузку базы

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

Получается наша команда могла бы быть такой:

%run_1c_d% /DumpIB "x:\work\base.dt"

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

Именно для этих целей в скрипт передаётся параметр %stamp% - имя файла, уникальное для текущей базы и текущего момента времени.

Эта метка включает в себя имя базы и текущую дату и время.

Чтобы сделать наш скрипт универсальным перепишем его вот так:

%run_1c_d% /DumpIB "x:\work\%stamp%.dt"

Вы спросите - откуда я беру все эти полезные параметры для скрипта?

А я ещё раз напомню вам вот об этом меню:

Открываем базу с запуском внешней обработки

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

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

А затем пишем следующий пакетный скрипт:

%run_1c_e% /Execute "c:\Report.epf"

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

За запуск базы в режиме предприятия отвечает параметр run_1c_e. Почему он называется именно так? Это сокращение от "run 1c enterprise". Enterprise означает запуск базы в режиме предприятия (пользовательский режим).

Выполняем регламентные задачи

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

Да, пакетный режим не позволяет, но вот обновлятор это делать умеет и я вынес эту (и некоторые другие) возможности в специальные команды, доступные для выполнения из пакетного скрипта.

Речь идёт вот об этой группе команд:

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

Например, вот так будет выглядеть команда запуска регламентного задания "ЗагрузкаКурсовВалют":

@jobs_run(
    only_using:False,
    jobs:", ЗагрузкаКурсовВалют",
    wait_for_completion: False
)

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

Подробное пояснение по командам, которые начинаются с @

В чём их смысл

Эти команды на самом деле не исполняются командным интерпретатором системы.

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

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

Строгий формат

Такие команды (все они выбираются из меню 'Обновлятор'-'Методы') имеют строгий формат написания, чтобы обновлятор смог их найти и разобрать в общем тексте пакетного скрипта:

  1. Их вызов всегда начинается с новой строки.
  2. Их имя всегда начинается с @
  3. Если у команды есть параметры, то вызов записывается вот в таком формате:
    @имя_команды(
    имя_параметра_1: "значение",
    имя_параметра_2: "значение"
    )
    Обратите внимание, что:
    - каждый новый параметр написан с новой строки
    - закрывающая список параметров круглая скобка также вынесена на отдельную строку
Возможность сочетания с другими командами интепретатора

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

Для обновления БД из шаблонов мы выбираем такой скрипт:

%run_1c_d% /UpdateDBCfg

Эта команда будет передана командному интепретатору системы на выполнение.

А для выполнения обработчиков обновления нам придётся воспользоваться специальной командой для обновлятора, которая начинается с @, выбрав её из меню 'Обновлятор'-'Методы':

@run_update_handlers()

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

И если мы напишем такой скрипт...

%run_1c_d% /UpdateDBCfg
@run_update_handlers()

..., то не получим ожидаемого поведения. Обновлятор сначала выполнит команду run_update_handlers и только затем передаст командному интерпретатору оставшуюся часть скрипта (%run_1c_d% /UpdateDBCfg).

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

Теперь такая возможность появилась в виде специальной команды, которая выбирается из меню 'Обновлятор'-'Методы'-'Выполнение пакетного скрипта'.

Вот как выглядит эта команда:

@run_cmd(
    script: "текст скрипта здесь",
    keep_sessions_lock: "false"
)

При помощи неё мы сможем переписать наш скрипт (для обновления БД и выполнения обработчиков обновления) вот так:

@run_cmd(
    script: "%run_1c_d% /UpdateDBCfg",
    keep_sessions_lock: "false"
)
@run_update_handlers()

И теперь всё будет работать именно так, как мы задумали.

Подробнее о параметре keep_sessions_lock можно прочитать здесь.

Внимание! При вставке команд, начинающихся с @ обновлятор вставляет также в текст подсказку-ссылку на эту статью. Подсказка перестанет вставляться автоматически через некоторое время после использования таких команд.

Как мне придумывать свои скрипты?

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

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

 Я написал классный скрипт и хочу поделиться

Для этого я завёл специальный проект на github, где собираю полезные скрипты от пользователей обновлятора, чтобы как можно большее количество людей смогло использовать их в своей работе.

Хотите прислать мне свой скрипт? Прошу вас сюда (ссылка).

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



Владимир Милькин
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:



Как добиться 100% защиты архивов баз 1С от шифровальщиков

  оглавление  Учимся писать скрипты на OneScript