Как автоматически подтверждать базу 1С как копию при первом входе и избежать ошибок пользователей?

Программист 1С v8.3 (Управляемые формы)
← На главную

При работе с информационными базами 1С, особенно в сценариях ежедневного копирования для тестирования или обучения, часто возникает необходимость автоматически подтверждать базу как копию при первом входе. Эта проблема усугубляется, когда пользователи могут по ошибке нажать кнопку «База перемещена» вместо «Это копия», что может привести к нежелательным последствиям, таким как активация регламентных заданий или синхронизации данных в копии.

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

Автоматическое подтверждение базы как копии с помощью программного вызова

Самый прямой и эффективный способ автоматического выбора опции «Это копия» — это программное взаимодействие с системной формой, которая отображает данный запрос. В системе 1С:Предприятие за это диалоговое окно отвечает общая форма ОбщаяФорма.БлокировкаРаботыСВнешнимиРесурсами.

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


ОткрытьФорму("ОбщаяФорма.БлокировкаРаботыСВнешнимиРесурсами", Новый Структура("ПринятиеРешенияОБлокировке", Истина));

Разберем подробнее, как мы можем использовать это для автоматизации процесса. Специальный параметр ПринятиеРешенияОБлокировке, установленный в Истина, позволяет системе автоматически принять решение о блокировке внешних ресурсов, имитируя нажатие кнопки «Это копия информационной базы».

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

Рассмотрим пример кода для такой внешней обработки:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Программно вызываем форму блокировки внешних ресурсов
    // с параметром, указывающим на автоматическое принятие решения
    ОткрытьФорму("ОбщаяФорма.БлокировкаРаботыСВнешнимиРесурсами", Новый Структура("ПринятиеРешенияОБлокировке", Истина));
    
    // Предотвращаем дальнейшее открытие самой внешней обработки,
    // так как её единственная задача — выполнить вызов формы.
    Отказ = Истина;
КонецПроцедуры

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

Выясним причину появления этого окна. Факт перемещения или копирования файловых информационных баз определяется по служебному файлу DoNotCopy.txt. Этот файл автоматически создается программой в каталоге базы и содержит идентификатор информационной базы. Если данный файл отсутствует, поврежден или его содержимое не соответствует текущему расположению/идентификатору базы, система инициирует запрос о перемещении/копировании.

Важно понимать, что при выборе «Это копия информационной базы» система не просто помечает базу как копию. Она также блокирует работу со всеми внешними ресурсами, такими как синхронизация данных, отправка почты, выгрузка в облачные сервисы и другие регламентные операции. Это сделано для того, чтобы предотвратить конфликты с основной рабочей базой и обеспечить безопасность данных. В заголовке программы также появляется надпись «[КОПИЯ]», визуально сигнализирующая о режиме работы.

Данный функционал блокировки работы с внешними ресурсами является частью Библиотеки стандартных подсистем (БСП) и активно используется во многих типовых конфигурациях 1С.

Предотвращение некорректной работы с внешними ресурсами в копиях

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

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

Рассмотрим пример кода, который можно использовать в расширении:


// В модуле объекта расширения или в отдельном общем модуле расширения
// с установленным свойством "ВызовСервера" или "КлиентСервер"
Процедура ПередНачаломРаботыСистемы(Отказ) Экспорт
    // Определяем эталонную строку соединения для рабочей (НЕ копии) базы.
    // Эту строку необходимо получить из рабочей базы или задать константой/параметром.
    // Пример: "Srvr=Server1C;Ref=WorkingBase;" или "File=C:\Databases\WorkingBase;"
    
    // Рекомендуется получать эту строку динамически или хранить в константе расширения
    // или параметре сеанса, чтобы избежать жесткой привязки в коде.
    // Для примера используем вспомогательную функцию.
    Перем ЭталоннаяСтрокаСоединенияРабочейБазы;
    ЭталоннаяСтрокаСоединенияРабочейБазы = ПолучитьСтрокуСоединенияРабочейБазы(); // Предполагаем наличие такой функции

    Если ЭталоннаяСтрокаСоединенияРабочейБазы = Неопределено ИЛИ ПустаяСтрока(ЭталоннаяСтрокаСоединенияРабочейБазы) Тогда
        // Если эталонная строка не задана, возможно, это сама рабочая база или ошибка конфигурации.
        // Вы можете добавить логирование или другое действие.
        Возврат;
    КонецЕсли;

    // Получаем текущую строку соединения информационной базы
    ТекущаяСтрокаСоединения = СтрокаСоединенияИнформационнойБазы();

    // Сравниваем текущую строку соединения с эталонной.
    // Если они отличаются, значит, это, скорее всего, копия или перемещенная база.
    Если ТекущаяСтрокаСоединения <> ЭталоннаяСтрокаСоединенияРабочейБазы Тогда
        // Принудительно запрещаем работу с внешними ресурсами для этой базы
        БлокировкаРаботыСВнешнимиРесурсами.ЗапретитьРаботуСВнешнимиРесурсами();
        // Опционально: можно вывести сообщение пользователю
        // Сообщить("Внимание! Это копия информационной базы. Работа с внешними ресурсами заблокирована.");
    КонецЕсли;
КонецПроцедуры

// Пример вспомогательной функции для получения эталонной строки соединения
// Эту функцию необходимо реализовать таким образом, чтобы она возвращала
// точную строку соединения с вашей основной рабочей базой данных.
// Например, это может быть константа в расширении, параметр сеанса, или
// значение, загружаемое из внешнего файла/сервиса.
// ЗАМЕНИТЕ ЭТОТ КОД НА РЕАЛЬНУЮ ЛОГИКУ ПОЛУЧЕНИЯ СТРОКИ ВАШЕЙ РАБОЧЕЙ БАЗЫ!
Функция ПолучитьСтрокуСоединенияРабочейБазы()
    // Пример для файловой базы:
    // Возврат "File=C:\Databases\WorkingBase;";
    // Пример для клиент-серверной базы:
    // Возврат "Srvr=\"your-1c-server\";Ref=\"YourWorkingBaseName\";"; 
    
    // В данном примере возвращаем заглушку, которую НЕОБХОДИМО ЗАМЕНИТЬ
    Возврат ""; 
КонецФункции

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

Визуальное информирование пользователей о режиме копии

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

Один из участников форума поделился своим опытом:

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

Например, можно изменить цвет фона интерфейса копии на синий (вместо стандартного желтого или белого), как было предложено в сообщении 7. Это делается путем изменения стиля оформления в расширении. Таким образом, каждый пользователь сразу видит, с какой базой он работает – с рабочей или с копией.

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

Заключение

Мы проанализировали несколько подходов к решению проблемы некорректного подтверждения режима копии базы 1С:Предприятие. Наиболее эффективным является программное автоматическое нажатие кнопки «Это копия» при первом запуске, которое достигается вызовом формы ОбщаяФорма.БлокировкаРаботыСВнешнимиРесурсами с соответствующим параметром.

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

← На главную