В практике администраторов и разработчиков 1С нередко возникает ситуация, когда процесс обновления конфигурации «зависает» или завершается с ошибкой из-за того, что в некотором регистре сведений отсутствуют необходимые данные. Ситуация осложняется тем, что подсистема «Библиотека стандартных подсистем» (БСП) на время выполнения обработчиков обновления устанавливает блокировку на редактирование данных. В этом материале мы подробно разберем, как обойти эти ограничения и внести нужные записи, чтобы обновление могло успешно завершиться.
Когда запускается легальное обновление информационной базы, система переходит в особый режим. Обработчики обновления (как основные, так и отложенные) работают с данными, и чтобы обеспечить целостность, БСП блокирует возможность интерактивного изменения регистров для пользователей. Более того, даже программная запись может быть заблокирована, если она выполняется в обычном режиме. Если обработчик «падает» с ошибкой из-за отсутствия записи, мы попадаем в замкнутый круг: данные нельзя добавить, потому что идет обновление, а обновление не завершается, потому что нет данных.
Рассмотрим основной программный метод, который упоминается опытными разработчиками. Свойство ОбменДанными.Загрузка объекта или набора записей — это специальный флаг, который сообщает системе, что запись производится в режиме загрузки данных. Рассмотрим, как это работает на практике.
Когда вы устанавливаете ОбменДанными.Загрузка = Истина, происходят следующие важные изменения:
ПередЗаписью и ПриЗаписи, реализованные в модулях набора записей.Разберем пример кода для внесения записи в регистр сведений:
// Создаем набор записей для целевого регистра
НаборЗаписей = РегистрыСведений.ВашРегистрСведений.СоздатьНаборЗаписей();
// Обязательно устанавливаем отбор по измерениям, если нужно добавить или заменить конкретную строку
НаборЗаписей.Отбор.Менеджер.Установить(СсылкаНаМенеджера);
// Создаем новую запись
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Менеджер = СсылкаНаМенеджера;
НоваяЗапись.Значение = ИскомыйПоказатель;
// Устанавливаем режим загрузки для обхода блокировок обновления
НаборЗаписей.ОбменДанными.Загрузка = Истина;
// Записываем данные в базу
Попытка
НаборЗаписей.Записать();
Сообщить("Данные успешно добавлены в заблокированный регистр.");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
Если блокировка вызвана проверками прав доступа, которые ужесточаются в период обновления, программный код может не сработать даже с флагом ОбменДанными.Загрузка. В этом случае нам поможет установка привилегированного режима. Выясним, как правильно его использовать.
Привилегированный режим позволяет выполнять операции с данными без проверки прав доступа текущего пользователя. Это полезно, если подсистема безопасности БСП блокирует запись для всех, кроме фоновых заданий обновления. Для реализации этого способа код записи следует вынести в серверный модуль или обернуть в процедуру с явным вызовом:
УстановитьПривилегированныйРежим(Истина);
Набор = РегистрыСведений.НужныйРегистр.СоздатьНаборЗаписей();
// ... настройка отборов и добавление данных ...
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();
УстановитьПривилегированныйРежим(Ложь);
Посмотрим на ситуацию глубже. Информация о том, что программа находится в состоянии обновления, хранится в специальных служебных регистрах. Если нам нужно добавить данные вручную через интерфейс (что крайне редко, но бывает необходимо), мы можем временно изменить статус обновления.
Проанализируем регистр сведений ПараметрыРаботыПрограммы. Именно в нем БСП хранит состояния различных подсистем. Найдите записи, связанные с ключами "ОбновлениеИнформационнойБазы" или "БлокировкаРаботыПользователей". Внимание: этот метод требует крайней осторожности. Изменение этих параметров может позволить другим пользователям зайти в базу, что во время обновления недопустимо.
ПараметрыРаботыПрограммы.Если обработчик обновления «валится» с ошибкой, он помечается в системе как «Ошибка выполнения». В современных версиях БСП существует регистр ОчередьОбработчиковОбновления. Рассмотрим, как это использовать для ручного вмешательства:
ОчередьОбработчиковОбновления (через «Все функции» или «Функции для технического специалиста»).Иногда система блокирует запуск в обычном режиме (Enterprise), если обновление критически повреждено. В таких случаях мы рекомендуем использовать запуск в толстом клиенте с использованием внешней обработки.
Создайте внешнюю обработку, в модуле которой будет прописан код из Способа 1. Запустите 1С в режиме «Толстый клиент (обычное приложение)», если это возможно, или воспользуйтесь параметром запуска /C ЗапуститьОбновлениеИнформационнойБазы. В некоторых случаях это позволяет «проскочить» проверку блокировки интерфейса и выполнить программный код обработки.
Важно помнить: при добавлении данных в регистр, заблокированный обновлением, вы берете на себя ответственность за логическую целостность данных. Всегда делайте резервную копию базы данных перед любыми манипуляциями со служебными регистрами или принудительной записью данных в обход стандартных механизмов.
Подведем итог: наиболее правильным и безопасным методом является создание небольшой внешней обработки, которая использует ОбменДанными.Загрузка = Истина и объект РегистрСведенийНаборЗаписей. Это позволяет добавить данные на уровне платформы, игнорируя большинство прикладных блокировок БСП, и дает возможность обработчику обновления успешно завершить свою работу при следующем запуске.