Как добавить данные в регистр сведений, заблокированный при обновлении базы 1С?

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

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

Проанализируем ситуацию: почему регистр заблокирован?

Когда запускается легальное обновление информационной базы, система переходит в особый режим. Обработчики обновления (как основные, так и отложенные) работают с данными, и чтобы обеспечить целостность, БСП блокирует возможность интерактивного изменения регистров для пользователей. Более того, даже программная запись может быть заблокирована, если она выполняется в обычном режиме. Если обработчик «падает» с ошибкой из-за отсутствия записи, мы попадаем в замкнутый круг: данные нельзя добавить, потому что идет обновление, а обновление не завершается, потому что нет данных.

Способ 1: Использование свойства ОбменДанными.Загрузка

Рассмотрим основной программный метод, который упоминается опытными разработчиками. Свойство ОбменДанными.Загрузка объекта или набора записей — это специальный флаг, который сообщает системе, что запись производится в режиме загрузки данных. Рассмотрим, как это работает на практике.

Когда вы устанавливаете ОбменДанными.Загрузка = Истина, происходят следующие важные изменения:

  1. Игнорируются прикладные проверки в процедурах ПередЗаписью и ПриЗаписи, реализованные в модулях набора записей.
  2. Система позволяет записывать данные, даже если установлена «мягкая» блокировка, характерная для этапа обновления.
  3. Отключается автоматическое формирование связанных движений (если они предусмотрены логикой).

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


// Создаем набор записей для целевого регистра
НаборЗаписей = РегистрыСведений.ВашРегистрСведений.СоздатьНаборЗаписей();

// Обязательно устанавливаем отбор по измерениям, если нужно добавить или заменить конкретную строку
НаборЗаписей.Отбор.Менеджер.Установить(СсылкаНаМенеджера);

// Создаем новую запись
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Менеджер = СсылкаНаМенеджера;
НоваяЗапись.Значение = ИскомыйПоказатель;

// Устанавливаем режим загрузки для обхода блокировок обновления
НаборЗаписей.ОбменДанными.Загрузка = Истина;

// Записываем данные в базу
Попытка
    НаборЗаписей.Записать();
    Сообщить("Данные успешно добавлены в заблокированный регистр.");
Исключение
    Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;

Способ 2: Использование привилегированного режима

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

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


УстановитьПривилегированныйРежим(Истина);

Набор = РегистрыСведений.НужныйРегистр.СоздатьНаборЗаписей();
// ... настройка отборов и добавление данных ...
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();

УстановитьПривилегированныйРежим(Ложь);

Способ 3: Временное снятие блокировки через Параметры работы программы

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

Проанализируем регистр сведений ПараметрыРаботыПрограммы. Именно в нем БСП хранит состояния различных подсистем. Найдите записи, связанные с ключами "ОбновлениеИнформационнойБазы" или "БлокировкаРаботыПользователей". Внимание: этот метод требует крайней осторожности. Изменение этих параметров может позволить другим пользователям зайти в базу, что во время обновления недопустимо.

  1. Найдите нужный параметр в регистре ПараметрыРаботыПрограммы.
  2. Временно очистите значение или установите статус "Завершено".
  3. Внесите данные в целевой регистр через стандартную форму или обработку.
  4. Обязательно верните значение параметра в исходное состояние, чтобы продолжить процедуру обновления корректно.

Способ 4: Управление очередью обработчиков обновления

Если обработчик обновления «валится» с ошибкой, он помечается в системе как «Ошибка выполнения». В современных версиях БСП существует регистр ОчередьОбработчиковОбновления. Рассмотрим, как это использовать для ручного вмешательства:

  1. Перейдите в регистр сведений ОчередьОбработчиковОбновления (через «Все функции» или «Функции для технического специалиста»).
  2. Найдите запись обработчика, который не может завершиться.
  3. Измените его статус на «Приостановлен» или «Выполнен». Это может снять жесткую блокировку системы на изменение данных, связанных с этим этапом.
  4. Добавьте необходимые данные в ваш регистр с использованием Способа 1.
  5. Верните статус обработчика на «Не выполнено» и запустите процедуру обновления заново (например, через форму «Поддержка и обслуживание» — «Обновление программы»).

Способ 5: Работа через внешнюю обработку в монопольном режиме

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

Создайте внешнюю обработку, в модуле которой будет прописан код из Способа 1. Запустите 1С в режиме «Толстый клиент (обычное приложение)», если это возможно, или воспользуйтесь параметром запуска /C ЗапуститьОбновлениеИнформационнойБазы. В некоторых случаях это позволяет «проскочить» проверку блокировки интерфейса и выполнить программный код обработки.

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

Подведем итог: наиболее правильным и безопасным методом является создание небольшой внешней обработки, которая использует ОбменДанными.Загрузка = Истина и объект РегистрСведенийНаборЗаписей. Это позволяет добавить данные на уровне платформы, игнорируя большинство прикладных блокировок БСП, и дает возможность обработчику обновления успешно завершить свою работу при следующем запуске.

← На главную