База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как работает процедура ВыполнитьОбновлениеДанных в 1С и какие особенности её исп
- В этой теме 1 ответ, 2 участника, последнее обновление 4 часа, 55 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
22 апреля 2026 в 20:29 #36773
Процедура ВыполнитьОбновлениеДанных(ЕстьИзменения, ЕстьУдаленные, РежимОбновления,
ЕстьКритичныеИзменения = Ложь, СписокКритичныхИзменений = «», ОбъектыРасширений = Ложь) ЭкспортЕсли ОбъектыРасширений
И ЗначениеЗаполнено(ПараметрыСеанса.УстановленныеРасширения)
И СтандартныеПодсистемыСервер.УстановленныеРасширенияНедоступны() ТогдаТекстОшибки =
НСтр(«ru=’Невозможно обновить идентификаторы объектов расширений в сеансе
|неразделенного пользователя, т.к. расширения не подключены.’
|;uk=’Неможливо оновити ідентифікатори об»єктів розширень в сеансі
|неподіленого користувача, тому що розширення не підключені.'»);ВызватьИсключениеПоОшибке(Истина, ТекстОшибки);
Возврат;
КонецЕсли;ПроверкаИспользования(ОбъектыРасширений);
УстановитьПривилегированныйРежим(Истина);
Если ТипЗнч(РежимОбновления) = Тип(«Булево») Тогда
РежимОбновления = ?(РежимОбновления, «ТолькоПроверка», «Полный»);
КонецЕсли;
ТолькоПроверка = (РежимОбновления = «ТолькоПроверка»);СвойстваРасширений = ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресСвойствРасширений);
Если СвойстваРасширений.ИменаОбъектов.Индексы.Количество() = 0 Тогда
СвойстваРасширений.ИменаОбъектов.Индексы.Добавить(«ПолноеИмя»);
КонецЕсли;ЕстьТекущиеИзменения = Ложь;
Если Не ОбъектыРасширений Тогда
ЗаменитьДублиПодчиненногоУзлаНайденныеПриЗагрузке(ТолькоПроверка, ЕстьТекущиеИзменения);
КонецЕсли;Если Не ОбъектыРасширений
Или Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() ТогдаОбновитьДанные(ЕстьТекущиеИзменения, ЕстьУдаленные, РежимОбновления,
ЕстьКритичныеИзменения, СписокКритичныхИзменений, СвойстваРасширений, ОбъектыРасширений);Если ЕстьТекущиеИзменения Тогда
ЕстьИзменения = Истина;
КонецЕсли;
КонецЕсли;Если Не ТолькоПроверка
И Не (РежимОбновления <> «Полный» И ЕстьКритичныеИзменения) ТогдаЕсли Не ОбъектыРасширений Тогда
СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы(
«ПараметрыБазовойФункциональности», «ИдентификаторыОбъектовМетаданных»);
КонецЕсли;
КонецЕсли;КонецПроцедуры
-
22 апреля 2026 в 20:29 #36774
Процедура
1С (Код)12ВыполнитьОбновлениеДанных(ЕстьИзменения, ЕстьУдаленные, РежимОбновления,ЕстьКритичныеИзменения = Ложь, СписокКритичныхИзменений = "", ОбъектыРасширений = Ложь) Экспортреализует логику обновления данных справочника
ИдентификаторыОбъектовМетаданныхс учётом разных режимов и условий. Разберу по шагам, что происходит:—
### 1. Проверка условий для объектов расширений
1С (Код)123Если ОбъектыРасширенийИ ЗначениеЗаполнено(ПараметрыСеанса.УстановленныеРасширения)И СтандартныеПодсистемыСервер.УстановленныеРасширенияНедоступны() Тогда— Если обновление касается объектов расширений (
ОбъектыРасширений = Истина),
— и в сеансе есть установленные расширения,
— но при этом расширения недоступны (например, сеанс неразделённого пользователя, где расширения не подключены),то:
1С (Код)123ТекстОшибки = НСтр("ru='Невозможно обновить идентификаторы объектов расширений в сеансе неразделенного пользователя, т.к. расширения не подключены.';uk='...'");ВызватьИсключениеПоОшибке(Истина, ТекстОшибки);Возврат;— Генерируется исключение с понятным сообщением, и процедура завершается.
—
### 2. Проверка использования объектов расширений
1С (Код)1ПроверкаИспользования(ОбъектыРасширений);— Вызов процедуры, которая, вероятно, проверяет, можно ли обновлять данные с учётом того, что это объекты расширений.
—
### 3. Установка привилегированного режима
1С (Код)1УстановитьПривилегированныйРежим(Истина);— Для выполнения обновления с повышенными правами.
—
### 4. Обработка параметра
РежимОбновления1С (Код)1234Если ТипЗнч(РежимОбновления) = Тип("Булево") ТогдаРежимОбновления = ?(РежимОбновления, "ТолькоПроверка", "Полный");КонецЕсли;ТолькоПроверка = (РежимОбновления = "ТолькоПроверка");— Если
РежимОбновленияпередан как булево, то преобразуется в строку:
—Истина→"ТолькоПроверка"
—Ложь→"Полный"
— Устанавливается флагТолькоПроверкадля дальнейшей логики.—
### 5. Получение свойств расширений из временного хранилища
1С (Код)1234СвойстваРасширений = ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресСвойствРасширений);Если СвойстваРасширений.ИменаОбъектов.Индексы.Количество() = 0 ТогдаСвойстваРасширений.ИменаОбъектов.Индексы.Добавить("ПолноеИмя");КонецЕсли;— Загружаются свойства расширений, если индексы пусты — добавляется индекс по полному имени.
—
### 6. Обработка дублей и текущих изменений
1С (Код)1234ЕстьТекущиеИзменения = Ложь;Если Не ОбъектыРасширений ТогдаЗаменитьДублиПодчиненногоУзлаНайденныеПриЗагрузке(ТолькоПроверка, ЕстьТекущиеИзменения);КонецЕсли;— Если не объекты расширений, вызывается процедура, которая, вероятно, устраняет дубли в подчинённых узлах и при этом может установить флаг
ЕстьТекущиеИзменения.—
### 7. Основное обновление данных
1С (Код)12345678910Если Не ОбъектыРасширенийИли Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() ТогдаОбновитьДанные(ЕстьТекущиеИзменения, ЕстьУдаленные, РежимОбновления,ЕстьКритичныеИзменения, СписокКритичныхИзменений, СвойстваРасширений, ОбъектыРасширений);Если ЕстьТекущиеИзменения ТогдаЕстьИзменения = Истина;КонецЕсли;КонецЕсли;— Если не объекты расширений или текущий узел не подчинённый узел РИБ (регистра информации базы), то вызывается процедура
ОбновитьДанныес передачей всех параметров.
— Если в процессе обновления были изменения, устанавливается флагЕстьИзменения.—
### 8. Подтверждение обновления параметра работы программы
1С (Код)12345678Если Не ТолькоПроверкаИ Не (РежимОбновления <> "Полный" И ЕстьКритичныеИзменения) ТогдаЕсли Не ОбъектыРасширений ТогдаСтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы("ПараметрыБазовойФункциональности", "ИдентификаторыОбъектовМетаданных");КонецЕсли;КонецЕсли;— Если режим не только проверка и либо режим полный, либо нет критичных изменений,
— и если не объекты расширений,
— то вызывается метод подтверждения обновления параметра работы программы, связанного с идентификаторами объектов метаданных.—
## Итог
— Процедура контролирует обновление идентификаторов объектов метаданных, учитывая особенности работы с расширениями.
— Обрабатывает режимы обновления (проверка или полный).
— Устраняет дубли, обновляет данные, подтверждает изменения.
— Защищает от попыток обновления расширений в неподходящих сеансах.
— Использует привилегированный режим для выполнения операций.—
Если нужна конкретика по внутренним процедурам (
ПроверкаИспользования,ЗаменитьДублиПодчиненногоУзлаНайденныеПриЗагрузке,ОбновитьДанные), нужно смотреть их код.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.