База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как работает процедура ВыполнитьОбновлениеДанных в 1С и какие особенности её исп › Ответ в теме: Как работает процедура ВыполнитьОбновлениеДанных в 1С и какие особенности её исп
Процедура
|
1 2 |
ВыполнитьОбновлениеДанных(ЕстьИзменения, ЕстьУдаленные, РежимОбновления, ЕстьКритичныеИзменения = Ложь, СписокКритичныхИзменений = "", ОбъектыРасширений = Ложь) Экспорт |
реализует логику обновления данных справочника ИдентификаторыОбъектовМетаданных с учётом разных режимов и условий. Разберу по шагам, что происходит:
—
### 1. Проверка условий для объектов расширений
|
1 2 3 |
Если ОбъектыРасширений И ЗначениеЗаполнено(ПараметрыСеанса.УстановленныеРасширения) И СтандартныеПодсистемыСервер.УстановленныеРасширенияНедоступны() Тогда |
— Если обновление касается объектов расширений (ОбъектыРасширений = Истина),
— и в сеансе есть установленные расширения,
— но при этом расширения недоступны (например, сеанс неразделённого пользователя, где расширения не подключены),
то:
|
1 2 3 |
ТекстОшибки = НСтр("ru='Невозможно обновить идентификаторы объектов расширений в сеансе неразделенного пользователя, т.к. расширения не подключены.';uk='...'"); ВызватьИсключениеПоОшибке(Истина, ТекстОшибки); Возврат; |
— Генерируется исключение с понятным сообщением, и процедура завершается.
—
### 2. Проверка использования объектов расширений
|
1 |
ПроверкаИспользования(ОбъектыРасширений); |
— Вызов процедуры, которая, вероятно, проверяет, можно ли обновлять данные с учётом того, что это объекты расширений.
—
### 3. Установка привилегированного режима
|
1 |
УстановитьПривилегированныйРежим(Истина); |
— Для выполнения обновления с повышенными правами.
—
### 4. Обработка параметра РежимОбновления
|
1 2 3 4 |
Если ТипЗнч(РежимОбновления) = Тип("Булево") Тогда РежимОбновления = ?(РежимОбновления, "ТолькоПроверка", "Полный"); КонецЕсли; ТолькоПроверка = (РежимОбновления = "ТолькоПроверка"); |
— Если РежимОбновления передан как булево, то преобразуется в строку:
— Истина → "ТолькоПроверка"
— Ложь → "Полный"
— Устанавливается флаг ТолькоПроверка для дальнейшей логики.
—
### 5. Получение свойств расширений из временного хранилища
|
1 2 3 4 |
СвойстваРасширений = ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресСвойствРасширений); Если СвойстваРасширений.ИменаОбъектов.Индексы.Количество() = 0 Тогда СвойстваРасширений.ИменаОбъектов.Индексы.Добавить("ПолноеИмя"); КонецЕсли; |
— Загружаются свойства расширений, если индексы пусты — добавляется индекс по полному имени.
—
### 6. Обработка дублей и текущих изменений
|
1 2 3 4 |
ЕстьТекущиеИзменения = Ложь; Если Не ОбъектыРасширений Тогда ЗаменитьДублиПодчиненногоУзлаНайденныеПриЗагрузке(ТолькоПроверка, ЕстьТекущиеИзменения); КонецЕсли; |
— Если не объекты расширений, вызывается процедура, которая, вероятно, устраняет дубли в подчинённых узлах и при этом может установить флаг ЕстьТекущиеИзменения.
—
### 7. Основное обновление данных
|
1 2 3 4 5 6 7 8 9 10 |
Если Не ОбъектыРасширений Или Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда ОбновитьДанные(ЕстьТекущиеИзменения, ЕстьУдаленные, РежимОбновления, ЕстьКритичныеИзменения, СписокКритичныхИзменений, СвойстваРасширений, ОбъектыРасширений); Если ЕстьТекущиеИзменения Тогда ЕстьИзменения = Истина; КонецЕсли; КонецЕсли; |
— Если не объекты расширений или текущий узел не подчинённый узел РИБ (регистра информации базы), то вызывается процедура ОбновитьДанные с передачей всех параметров.
— Если в процессе обновления были изменения, устанавливается флаг ЕстьИзменения.
—
### 8. Подтверждение обновления параметра работы программы
|
1 2 3 4 5 6 7 8 |
Если Не ТолькоПроверка И Не (РежимОбновления <> "Полный" И ЕстьКритичныеИзменения) Тогда Если Не ОбъектыРасширений Тогда СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( "ПараметрыБазовойФункциональности", "ИдентификаторыОбъектовМетаданных"); КонецЕсли; КонецЕсли; |
— Если режим не только проверка и либо режим полный, либо нет критичных изменений,
— и если не объекты расширений,
— то вызывается метод подтверждения обновления параметра работы программы, связанного с идентификаторами объектов метаданных.
—
## Итог
— Процедура контролирует обновление идентификаторов объектов метаданных, учитывая особенности работы с расширениями.
— Обрабатывает режимы обновления (проверка или полный).
— Устраняет дубли, обновляет данные, подтверждает изменения.
— Защищает от попыток обновления расширений в неподходящих сеансах.
— Использует привилегированный режим для выполнения операций.
—
Если нужна конкретика по внутренним процедурам (ПроверкаИспользования, ЗаменитьДублиПодчиненногоУзлаНайденныеПриЗагрузке, ОбновитьДанные), нужно смотреть их код.