Глобальный контекст.УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы

Методы · SetInfoBasePredefinedDataUpdate

Устанавливает новое значение режима обновления предопределенных данных для информационной базы. Для выполнения требуются права администратора информационной базы. Фактический режим обновления определяется в следующем порядке: Если для объекта метаданных в данных установлен режим обновления, отличный от Авто, то используется это значение. Иначе, если для объекта метаданных в конфигурации установлен режим обновления, отличный от Авто, то используется это значение. Иначе, если для информационной базы установлен режим обновления, отличный от Авто, то используется это значение. Иначе, если это периферийный узел РИБ, то предопределенные данные не будут обновлены. Если проверка выполняется для центрального узла РИБ, или для базы не являющейся РИБ, обновление предопределенных данных будет выполнено. Метод доступен только из сеанса, в котором не используется ни один разделитель.

Синтаксис

УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(<ОбновлениеПредопределенныхДанных>)
Полное описание, параметры и ограничения

Глобальный контекст.УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы (Global context.SetInfoBasePredefinedDataUpdate)

Глобальный контекст (Global context)

УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы (SetInfoBasePredefinedDataUpdate)

Доступен, начиная с версии 8.3.4.

Синтаксис:
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(<ОбновлениеПредопределенныхДанных>)
Параметры:

<ОбновлениеПредопределенныхДанных> (необязательный)
Тип: ОбновлениеПредопределенныхДанных.
Новый режим обновления предопределенных данных.
Значение по умолчанию: Авто.
Описание:

Устанавливает новое значение режима обновления предопределенных данных для информационной базы. Для выполнения требуются права администратора информационной базы.
Фактический режим обновления определяется в следующем порядке:
Если для объекта метаданных в данных установлен режим обновления, отличный от Авто, то используется это значение.

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

Иначе, если для информационной базы установлен режим обновления, отличный от Авто, то используется это значение.

Иначе, если это периферийный узел РИБ, то предопределенные данные не будут обновлены. Если проверка выполняется для центрального узла РИБ, или для базы не являющейся РИБ, обновление предопределенных данных будет выполнено.
Метод доступен только из сеанса, в котором не используется ни один разделитель.

Доступность:

Сервер, толстый клиент, мобильное приложение (сервер), мобильный автономный сервер.
Вызов метода выполняет обращение к серверу.

Примечание:
В режиме совместимости конфигурации Версия8_3_4 метод доступен как из сеанса, в котором используется хотя бы один разделитель, так и из сеанса, в котором не используется ни один разделитель.
В режиме совместимости конфигурации Версия8_3_3 необходимость обновлять определяется следующим образом:
Обновление не будет производиться:
если в метаданных или в данных установлено НеОбновлятьАвтоматически,

если в метаданных или в данных установлено Авто, и текущий узел является периферийным.

В противном случае предопределенные данные будут обновлены и/или созданы при первом обращении к данным.

См. также:
Глобальный контекст, метод ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы

Использование в версии:

Доступен, начиная с версии 8.3.4.

Методическая информация

Практические примеры

Три запуска: запрет → собственный предопределённый товар → нормальный возврат режима базы

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

Где и как запускать

Полный модуль своей управляемой формы: настоящие клиентские команды, серверные административные шаги и проверки. Единственный толстый управляемый клиент 8.5.1.1343; новая полностью собственная файловая CF, не рабочая база.

Подготовка

  1. Это будущий ручной административный опыт только в НОВОЙ полностью собственной пустой файловой базе 8.5.1.1343. Не рабочая база, не её копия. Сейчас база, CF, форма, компилятор и 1С не создавались/не запускались.

  2. Вручную создать новый собственный путь C:\1c-labs\OwnPredefined85_15467493-4ecf-4d11-9e84-07f2e9733581\IB. Если путь/база уже существуют, их не использовать и не очищать. File="C:\1c-labs\OwnPredefined85_15467493-4ecf-4d11-9e84-07f2e9733581\IB";. Метки предотвращают случайную путаницу, но не доказывают владение и не дают разрешения на чужую базу.

  3. Конфигуратор: Имя=УчебноеОбновлениеПредопределенных85; Версия=15467493-4ecf-4d11-9e84-07f2e9733581; совместимость Не использовать; основной режим Управляемое приложение. На первом этапе справочников нет. Не добавлять разделители, планы обмена, другие объекты данных, фоновые задания, расширения или чужие модули.

  4. Общие → Роли: АдминистраторУчебногоОбновления85, вручную все права, в том числе администратора информационной базы. Администрирование → Пользователи: свой новый учебный пользователь с этой ролью. Пароль выбрать самостоятельно вне кода. Во время каждого шага единственный свой сеанс; Конфигуратор закрыт, чужих писателей нет.

  5. Константы: УчебныйИсходныйРежим85 — Строка(12), УчебныйЭтап85 — Строка(40). Их модули пустые. Первым чтением должны фактически наблюдаться две пустые Строки; это проверка, не обещание редакторского начального значения. Другой результат требует другого нового стенда, не обнуления старых констант.

  6. Общие → Общие формы: управляемая УчебноеОбновление85, разместить на начальной странице. Вставить основной блок ЦЕЛИКОМ в пустой модуль формы. Клиентские команды и серверные функции остаются в одном настоящем модуле формы, не в разных общих модулях.

  7. Реквизиты формы: СогласенНаШаг85 — Булево, ручной флажок; ИсходНеизвестен85 — Булево, поле просмотра; Состояние85 — Строка неограниченной длины, многострочное поле просмотра. ШагСеанса85 — внутренняя клиентская переменная, не реквизит. Не назначать события формы вместо команд.

  8. Отключить два разных режима сохранения формы: АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать и СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать; это enum, не Булево.

  9. Создать три команды формы и настоящие кнопки: Запретить85, Разрешить85, ПроверитьИВосстановить85. Для каждой Действие — одноимённая процедура с параметром Команда, кнопка ИмяКоманды — нужная команда. Обработчики/серверные функции вручную не вызывать.

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

  11. После подтверждённого шага 1 закрыть клиент. В Конфигураторе впервые добавить неиерархический УчебныеРежимы85: Код Строка(10), Наименование(100), без владельцев, табличных частей и иных реквизитов. Его ОбновлениеПредопределенныхДанных=Авто. Объект/менеджер без собственного кода.

  12. В списке предопределённых элементов этого каталога добавить только УчебныйТовар85 с кодом OWN00001 и наименованием Учебный товар до обновления. В режиме Предприятия строки вручную не создавать. Снова вручную ОБНОВИТЬ КОНФИГУРАЦИЮ БАЗЫ ДАННЫХ, закрыть Конфигуратор, открыть второй свой клиент; согласиться и выполнить только Разрешить85.

  13. После подтверждённого шага 2 закрыть клиент. В том же предопределённом элементе сохранить имя УчебныйТовар85, изменить код на OWN00002 и наименование на Учебный товар после обновления. Снова вручную обновить конфигурацию базы данных. Открыть третий свой клиент, согласиться и выполнить только ПроверитьИВосстановить85.

  14. Это постоянные административные изменения: режим базы, данные двух своих констант, собственные метаданные и предопределённая запись. Возвращается только исходный режим базы при полном нормальном успехе. При STOP не повторять, не обходить запрет новой формой, не ремонтировать этап/снимок и не выполнять автоматическую очистку.

&НаКлиенте
Перем ШагСеанса85;

&НаКлиенте
Процедура Запретить85(Команда)
    ВыполнитьСвойШаг85(Команда, "Запретить85", "OFF");
КонецПроцедуры

&НаКлиенте
Процедура Разрешить85(Команда)
    ВыполнитьСвойШаг85(Команда, "Разрешить85", "ON");
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьИВосстановить85(Команда)
    ВыполнитьСвойШаг85(Команда, "ПроверитьИВосстановить85", "RESTORE");
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьСвойШаг85(Команда, ИмяКоманды, Шаг)
    Попытка
        Если ШагСеанса85 <> Неопределено Тогда
            ВызватьИсключение "В этом экземпляре разрешён только один шаг";
        КонецЕсли;
        Если ТипЗнч(СогласенНаШаг85) <> Тип("Булево") Или СогласенНаШаг85 <> Истина Тогда
            ВызватьИсключение "Сначала подтвердите согласие на свой административный шаг";
        КонецЕсли;
        ИсходноеСогласие85 = СогласенНаШаг85;
        СогласенНаШаг85 = Ложь;
        ШагСеанса85 = "НЕИЗВЕСТНО";
        ИсходНеизвестен85 = Истина;
        Состояние85 = "НЕИЗВЕСТНО: не повторять шаг до подтверждённого результата";
        #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> ИмяКоманды Тогда
            ВызватьИсключение "Нужна настоящая одноимённая команда своей формы";
        КонецЕсли;
        Если ИмяФормы <> "ОбщаяФорма.УчебноеОбновление85"
            Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
            Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
            ВызватьИсключение "Нужна своя форма без сохранения её полей";
        КонецЕсли;
        Протокол85 = ВыполнитьШагНаСервере85(Шаг, ИсходноеСогласие85);
        Если ТипЗнч(Протокол85) <> Тип("Строка") Или Протокол85 = "" Тогда
            ВызватьИсключение "Полный серверный результат не получен";
        КонецЕсли;
        ИсходНеизвестен85 = Ложь;
        ШагСеанса85 = "ПОДТВЕРЖДЕНО";
        Состояние85 = Протокол85;
        #Иначе
        ВызватьИсключение "Нужен толстый управляемый клиент";
        #КонецЕсли
    Исключение
        СогласенНаШаг85 = Ложь;
        ИсходНеизвестен85 = Истина;
        ШагСеанса85 = "STOP";
        Состояние85 = "STOP: возможен частичный исход. Не повторять, не ремонтировать этапы, не возвращать режим автоматически";
    КонецПопытки;
КонецПроцедуры

&НаСервере
Функция ВыполнитьШагНаСервере85(Шаг, Знач ИсходноеСогласие85)
    Если ТипЗнч(ИсходноеСогласие85) <> Тип("Булево") Или ИсходноеСогласие85 <> Истина
        Или ТипЗнч(СогласенНаШаг85) <> Тип("Булево") Или СогласенНаШаг85 <> Ложь
        Или ТипЗнч(ИсходНеизвестен85) <> Тип("Булево") Или ИсходНеизвестен85 <> Истина Тогда
        ВызватьИсключение "Нужны фактическое согласие, уже снятый флажок и состояние неизвестного исхода";
    КонецЕсли;
    ПроверитьСвойСтенд85();
    Этап = Константы.УчебныйЭтап85.Получить();
    СохраненныйКод = Константы.УчебныйИсходныйРежим85.Получить();
    Если ТипЗнч(Этап) <> Тип("Строка") Или ТипЗнч(СохраненныйКод) <> Тип("Строка") Тогда
        ВызватьИсключение "Нужны фактические строковые значения своих констант";
    КонецЕсли;
    Если Шаг = "OFF" Тогда
        Если Этап <> "" Или СохраненныйКод <> "" Или Метаданные.Справочники.Количество() <> 0 Тогда
            ВызватьИсключение "Первый шаг разрешён только до создания своего каталога";
        КонецЕсли;
        ЗаписатьСвойЭтап85("START_UNKNOWN");
        ИсходныйРежим = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
        ИсходныйКод = КодРежима85(ИсходныйРежим);
        Константы.УчебныйИсходныйРежим85.Установить(ИсходныйКод);
        НовыйСохраненныйКод = Константы.УчебныйИсходныйРежим85.Получить();
        Если ТипЗнч(НовыйСохраненныйКод) <> Тип("Строка") Или НовыйСохраненныйКод <> ИсходныйКод Тогда
            ВызватьИсключение "Полное сохранение своего исходного режима не подтверждено";
        КонецЕсли;
        ПередЗапретом = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
        Если КодРежима85(ПередЗапретом) <> ИсходныйКод Или ПередЗапретом <> ИсходныйРежим Тогда
            ВызватьИсключение "Исходный режим изменился до своего перехода";
        КонецЕсли;
        УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически);
        ЗапрещенныйРежим = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
        Если КодРежима85(ЗапрещенныйРежим) <> "NOUPDATE" Тогда
            ВызватьИсключение "Реальный запрет обновления не подтверждён";
        КонецЕсли;
        ЗаписатьСвойЭтап85("BASE_OFF_READY|" + НовыйСохраненныйКод);
        ИсходНеизвестен85 = Ложь;
        Возврат "Шаг 1 подтверждён: исходный режим=" + НовыйСохраненныйКод
            + "; текущий=" + КодРежима85(ЗапрещенныйРежим)
            + ". Закройте клиент; добавьте только свой каталог/предопределённый элемент и вручную обновите структуру базы";
    ИначеЕсли Шаг = "ON" Или Шаг = "RESTORE" Тогда
        ИсходныйРежим = РежимИзКода85(СохраненныйКод);
        Если Шаг = "ON" Тогда
            ОжидаемыйЭтап = "BASE_OFF_READY|" + СохраненныйКод;
            ОжидаемыйРежим = ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически;
            ОжидаемыйКод = "NOUPDATE";
        Иначе
            ОжидаемыйЭтап = "BASE_ON_READY|" + СохраненныйКод;
            ОжидаемыйРежим = ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически;
            ОжидаемыйКод = "UPDATE";
        КонецЕсли;
        Если Этап <> ОжидаемыйЭтап Тогда
            ВызватьИсключение "Фактический сохранённый этап не разрешает этот шаг";
        КонецЕсли;
        ПроверитьСвоёОбъявление85();
        ТекущийРежим = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
        Если КодРежима85(ТекущийРежим) <> ОжидаемыйКод Или ТекущийРежим <> ОжидаемыйРежим Тогда
            ВызватьИсключение "Фактический режим базы не соответствует этапу";
        КонецЕсли;
        Менеджер = Справочники.УчебныеРежимы85;
        Если Шаг = "ON" Тогда
            ЗаписатьСвойЭтап85("OFF_VERIFY_UNKNOWN|" + СохраненныйКод);
            Выборка = Менеджер.Выбрать();
            ЕстьСтрока = Выборка.Следующий();
            Если ТипЗнч(ЕстьСтрока) <> Тип("Булево") Или ЕстьСтрока <> Ложь Тогда
                ВызватьИсключение "При запрете ожидался реально пустой свой каталог; ничего не удаляем";
            КонецЕсли;
            Менеджер.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.Авто);
            ВычисленныйЗапрет = Менеджер.ПолучитьОбновлениеПредопределенныхДанных();
            Если КодРежима85(ВычисленныйЗапрет) <> "NOUPDATE" Тогда
                ВызватьИсключение "Явное собственное Авто не применило текущий запрет базы";
            КонецЕсли;
            ПередРазрешением = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
            Если КодРежима85(ПередРазрешением) <> "NOUPDATE" Тогда
                ВызватьИсключение "Режим изменился до разрешения";
            КонецЕсли;
            УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
            РазрешенныйРежим = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
            ВычисленноеРазрешение = Менеджер.ПолучитьОбновлениеПредопределенныхДанных();
            Если КодРежима85(РазрешенныйРежим) <> "UPDATE"
                Или КодРежима85(ВычисленноеРазрешение) <> "UPDATE" Тогда
                ВызватьИсключение "Сохранённый и вычисленный режимы разрешения не подтверждены";
            КонецЕсли;
            ЗаписатьСвойЭтап85("BASE_ON_READY|" + СохраненныйКод);
            ИсходНеизвестен85 = Ложь;
            Возврат "Шаг 2 подтверждён: своё объявление есть, фактических строк нет; режим базы="
                + КодРежима85(РазрешенныйРежим)
                + ". Закройте клиент; измените код/наименование того же элемента и вручную обновите структуру базы";
        Иначе
            ВычисленныйРежим = Менеджер.ПолучитьОбновлениеПредопределенныхДанных();
            Если КодРежима85(ВычисленныйРежим) <> "UPDATE" Тогда
                ВызватьИсключение "Свой каталог не использует разрешение базы";
            КонецЕсли;
            ЗаписатьСвойЭтап85("ON_VERIFY_UNKNOWN|" + СохраненныйКод);
            Выборка = Менеджер.Выбрать();
            ЕстьСтрока = Выборка.Следующий();
            Если ТипЗнч(ЕстьСтрока) <> Тип("Булево") Или ЕстьСтрока <> Истина Тогда
                ВызватьИсключение "Реальная строка ещё не создана; это не успешный опыт";
            КонецЕсли;
            ФактическаяСсылка = Выборка.Ссылка;
            ЕстьВтораяСтрока = Выборка.Следующий();
            Если ТипЗнч(ЕстьВтораяСтрока) <> Тип("Булево") Или ЕстьВтораяСтрока <> Ложь Тогда
                ВызватьИсключение "Ожидалась ровно одна фактическая собственная строка";
            КонецЕсли;
            ПредопределеннаяСсылка = Менеджер.УчебныйТовар85;
            Если ТипЗнч(ФактическаяСсылка) <> Тип("СправочникСсылка.УчебныеРежимы85")
                Или ТипЗнч(ПредопределеннаяСсылка) <> Тип("СправочникСсылка.УчебныеРежимы85")
                Или ФактическаяСсылка <> ПредопределеннаяСсылка Тогда
                ВызватьИсключение "Настоящие ссылки из базы и собственного менеджера не совпали";
            КонецЕсли;
            ПустаяСсылка = ПредопределеннаяСсылка.Пустая();
            Признак = ПредопределеннаяСсылка.Предопределенный;
            ИмяЭлемента = ПредопределеннаяСсылка.ИмяПредопределенныхДанных;
            КодЭлемента = ПредопределеннаяСсылка.Код;
            НаименованиеЭлемента = ПредопределеннаяСсылка.Наименование;
            Если ТипЗнч(ПустаяСсылка) <> Тип("Булево") Или ПустаяСсылка <> Ложь
                Или ТипЗнч(Признак) <> Тип("Булево") Или Признак <> Истина
                Или ТипЗнч(ИмяЭлемента) <> Тип("Строка") Или ИмяЭлемента <> "УчебныйТовар85"
                Или ТипЗнч(КодЭлемента) <> Тип("Строка") Или КодЭлемента <> "OWN00002"
                Или ТипЗнч(НаименованиеЭлемента) <> Тип("Строка")
                Или НаименованиеЭлемента <> "Учебный товар после обновления" Тогда
                ВызватьИсключение "Полные реальные свойства предопределённой строки не подтверждены";
            КонецЕсли;
            ПередВозвратом = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
            СвежийИсходныйКод = Константы.УчебныйИсходныйРежим85.Получить();
            Если КодРежима85(ПередВозвратом) <> "UPDATE"
                Или ТипЗнч(СвежийИсходныйКод) <> Тип("Строка") Или СвежийИсходныйКод <> СохраненныйКод Тогда
                ВызватьИсключение "Режим или собственный исходный снимок изменился до возврата";
            КонецЕсли;
            РежимДляВозврата = РежимИзКода85(СвежийИсходныйКод);
            Если РежимДляВозврата <> ИсходныйРежим Тогда
                ВызватьИсключение "Полное обратное сопоставление исходного режима не совпало";
            КонецЕсли;
            УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(РежимДляВозврата);
            ВосстановленныйРежим = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
            Если КодРежима85(ВосстановленныйРежим) <> СвежийИсходныйКод
                Или ВосстановленныйРежим <> ИсходныйРежим Тогда
                ВызватьИсключение "Полный исходный режим базы не восстановлен";
            КонецЕсли;
            ЗаписатьСвойЭтап85("COMPLETE|" + СвежийИсходныйКод);
            ИсходНеизвестен85 = Ложь;
            Возврат "Шаг 3 подтверждён: реальная строка " + ИмяЭлемента + "; код=" + КодЭлемента
                + "; наименование=" + НаименованиеЭлемента
                + "; предопределённый=" + Строка(Признак)
                + "; исходный режим базы восстановлен=" + КодРежима85(ВосстановленныйРежим)
                + ". Строка, собственные метаданные и константы остаются; это не откат базы";
        КонецЕсли;
    Иначе
        ВызватьИсключение "Неизвестный шаг не разрешает никаких изменений";
    КонецЕсли;
КонецФункции

&НаСервере
Процедура ПроверитьСвойСтенд85()
    Если СтрокаСоединенияИнформационнойБазы()
            <> "File=""C:\1c-labs\OwnPredefined85_15467493-4ecf-4d11-9e84-07f2e9733581\IB"";" Тогда
        ВызватьИсключение "Нужен точно подготовленный собственный новый файловый стенд";
    КонецЕсли;
    Доступ = РольДоступна("АдминистраторУчебногоОбновления85");
    Если ТипЗнч(Доступ) <> Тип("Булево") Или Доступ <> Истина Тогда
        ВызватьИсключение "Нужна собственная административная роль";
    КонецЕсли;
    Если Метаданные.Константы.Количество() <> 2
        Или Метаданные.ОбщиеРеквизиты.Количество() <> 0
        Или Метаданные.ПланыОбмена.Количество() <> 0 Тогда
        ВызватьИсключение "Нужны только две свои константы, без разделителей и обменов";
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПроверитьСвоёОбъявление85()
    Если Метаданные.Справочники.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен только собственный единственный каталог";
    КонецЕсли;
    ОписаниеКаталога = Метаданные.Справочники.УчебныеРежимы85;
    Если ОписаниеКаталога.ОбновлениеПредопределенныхДанных
        <> Метаданные.СвойстваОбъектов.ОбновлениеПредопределенныхДанных.Авто Тогда
        ВызватьИсключение "Собственная metadata политика должна быть Авто";
    КонецЕсли;
    Имена = ОписаниеКаталога.ПолучитьИменаПредопределенных();
    Если ТипЗнч(Имена) <> Тип("ФиксированныйМассив") Или Имена.Количество() <> 1 Тогда
        ВызватьИсключение "Нужно ровно одно реальное объявление предопределённого элемента";
    КонецЕсли;
    Имя = Имена[0];
    Если ТипЗнч(Имя) <> Тип("Строка") Или Имя <> "УчебныйТовар85" Тогда
        ВызватьИсключение "Фактически объявлено другое имя";
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаписатьСвойЭтап85(НовыйЭтап)
    Константы.УчебныйЭтап85.Установить(НовыйЭтап);
    ПрочитанныйЭтап = Константы.УчебныйЭтап85.Получить();
    Если ТипЗнч(ПрочитанныйЭтап) <> Тип("Строка") Или ПрочитанныйЭтап <> НовыйЭтап Тогда
        ВызватьИсключение "Постоянный собственный этап не подтверждён повторным чтением";
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция КодРежима85(Режим)
    Если ТипЗнч(Режим) <> Тип("ОбновлениеПредопределенныхДанных") Тогда
        ВызватьИсключение "Нужен фактически прочитанный нативный режим";
    КонецЕсли;
    Если Режим = ОбновлениеПредопределенныхДанных.Авто Тогда
        Возврат "AUTO";
    ИначеЕсли Режим = ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически Тогда
        Возврат "UPDATE";
    ИначеЕсли Режим = ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически Тогда
        Возврат "NOUPDATE";
    Иначе
        ВызватьИсключение "Неизвестный enum не сохраняем и не используем";
    КонецЕсли;
КонецФункции

&НаСервере
Функция РежимИзКода85(Код)
    Если ТипЗнч(Код) <> Тип("Строка") Тогда
        ВызватьИсключение "Нужен фактически прочитанный собственный строковый снимок";
    КонецЕсли;
    Если Код = "AUTO" Тогда
        Возврат ОбновлениеПредопределенныхДанных.Авто;
    ИначеЕсли Код = "UPDATE" Тогда
        Возврат ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически;
    ИначеЕсли Код = "NOUPDATE" Тогда
        Возврат ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически;
    Иначе
        ВызватьИсключение "Неизвестный код исходного режима запрещает продолжение";
    КонецЕсли;
КонецФункции

Разбор по шагам

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

  2. В шаге 1 сервер проверяет свой стенд и пустые собственные константы, сохраняет этап START_UNKNOWN. Глобальный getter читает УСТАНОВЛЕННЫЙ enum базы. Все три значения явно переводятся в свои коды AUTO/UPDATE/NOUPDATE и сохраняются с повторным чтением; исходное Авто не предполагается.

  3. Первый глобальный setter получает явное НеОбновлятьАвтоматически; новое чтение подтверждает запрет. Только затем сохраняется BASE_OFF_READY со своим исходным кодом и разрешается ручное добавление каталога.

  4. Во втором запуске сохранённый этап, режим базы и собственное объявление должны совпасть. Имена из метаданных — настоящий ФиксированныйМассив строк; одно объявление ещё не означает одну запись в базе. Настоящая выборка должна вернуть Булево Ложь.

  5. Впервые созданному собственному каталогу явно назначается per-manager Авто. Его getter показывает ВЫЧИСЛЕННЫЙ запрет, наследуемый от базы. Мы не выдаём вычисленный результат за снимок сырой настройки менеджера и не восстанавливаем неизвестное старое per-manager состояние.

  6. Глобальный setter разрешает обновление. Новые глобальный и manager getter подтверждают реальные установленный и вычисленный режимы UPDATE. Это ещё не доказательство создания строки: после BASE_ON_READY клиент закрывается, а Code/Name собственного элемента меняются вручную с обновлением структуры.

  7. В третьем запуске новая выборка действительно обязана иметь одну строку: первое Следующий — Истина, второе — Ложь. Только после этого читается настоящее свойство собственного менеджера УчебныйТовар85; обе реальные ссылки должны совпасть.

  8. Пустая, Предопределенный, ИмяПредопределенныхДанных, Код и Наименование проверяются по фактическим типам и полным значениям. Код OWN00002 и новое наименование доказывают полезный результат будущего собственного обновления, а не только чтение пустого объекта.

  9. Свой исходный код перечитывается из базы и обратно сопоставляется ровно одному исходному enum. Только после полного результата глобальный setter получает это значение, а новое чтение доказывает полный возврат. Затем сохраняется COMPLETE; вывод использует реально прочитанные Code/Name/признак/режим.

  10. На ошибочном пути клиент показывает STOP без вызовов native восстановления, удаления, нового чтения или следующего шага. Свои этапы помогают остановиться после частичного результата, но не являются защитой от подмены или гарантией атомарной записи.

Как проверить результат

  1. Без согласия нажать любую кнопку: STOP до обращения к серверу, режим и константы этим вызовом не изменяются. Не объявлять такое нажатие успешным опытом.

  2. В первом собственном запуске после согласия должны подтвердиться actual исходный enum, сохранённый конечный код, новый NOUPDATE и BASE_OFF_READY|тот_же_код. Конкретный исходный режим заранее не задан; проверять в своём отладчике, не менять его ради ожидания Авто.

  3. После первого ручного обновления структуры второй запуск должен увидеть одно объявление УчебныйТовар85 и реальную пустую выборку. Если есть строка, режим изменился или этап иной, STOP без удаления/повтора; предположение о времени создания не подменяет проверку.

  4. В шаге 2 вычисленный manager режим при явно заданном Авто сначала NOUPDATE, затем UPDATE вместе с raw глобальным UPDATE. До ручного второго обновления не требовать немедленного появления строки.

  5. После второго ручного обновления третий запуск должен реально получить ровно одну строку и две совпадающие собственные ссылки. Поля: Предопределенный=Истина, ИмяПредопределенныхДанных=УчебныйТовар85, Код=OWN00002, Наименование=Учебный товар после обновления.

  6. Итоговый протокол должен показывать именно фактические поля строки и восстановленный исходный код; COMPLETE|тот_же_код прочитан заново. Предопределённая строка, своя схема и две константы остаются — не искать их автоматического удаления.

  7. Повтор кнопки в текущем экземпляре и неправильный порядок кнопок должны давать STOP. После сохранённого COMPLETE первый шаг недопустим и в другом экземпляре; не редактировать константы, чтобы обойти это.

  8. Только в другом новом собственном стенде можно подготовить неверное metadata-имя, лишнюю собственную строку или не выполнить ручное обновление структуры. Урок должен отказаться; точные отказы пока не воспроизводились, рабочие базы для этого не использовать.

  9. Отказ прав, сбой сервера или потеря ответа означают неизвестный исход: не повторять шаг и не восстанавливать профиль в обработчике. Наличие старого видимого marker после ошибки записи не доказывает отсутствие других изменений.

Ожидаемый результат

Будущий полный ручной опыт: первый режим NOUPDATE, одно metadata-объявление и ноль фактических строк; затем UPDATE, ровно одна реальная собственная предопределённая строка OWN00002 с новым именованием; полный нормальный возврат исходного raw enum. Итог читает actual поля, а не собственные заглушки. Строка, метаданные и константы остаются. При несовпадении — STOP, не успешный пример.

На что обратить внимание

  1. Raw глобальный getter и вычисленный getter каталога различаются. Полностью сохраняется установленный режим всей базы, не effective режим менеджера и не исходная политика метаданных.

  2. Runtime enum для GLOBAL/manager методов: ОбновлениеПредопределенныхДанных.Авто/НеОбновлятьАвтоматически/ОбновлятьАвтоматически. Metadata enum достигается через Метаданные.СвойстваОбъектов.ОбновлениеПредопределенныхДанных.Авто. Одинаковые короткие имена в справке не делают эти маршруты взаимозаменяемыми.

  3. Приоритет: данные объекта → метаданные объекта → режим базы → вид узла РИБ. Свой каталог создан впервые и явно получает manager Авто; старые произвольные per-manager настройки не снимались и не восстанавливаются.

  4. Metadata.Предопределенные всегда Неопределено; это не коллекция и не producer данных. Объявленные имена получаем настоящим ПолучитьИменаПредопределенных, а существование доказывает реальная выборка с совпадающей ссылкой.

  5. GLOBAL setter документирует необязательный enum и default Авто, но здесь все вызовы явные. У manager setter текстовый default Автоматически неоднозначен; используем явное runtime Авто. Ни одного native noarg setter нет.

  6. Фраза о создании при первом обращении к данным относится к примечанию совместимости Версия8_3_3. Её не переносим в 8.5 с выключенной совместимостью и не обещаем немедленное создание после setter.

  7. Создание/обновление при реструктуризации описано metadata enum; применение режима базы к своему metadata-Авто каталогу следует цепочке приоритета. Конкретный результат в 1С не проверен. Отсутствие строки или иных полных фактических свойств — STOP, не пройденная демонстрация.

  8. Администратор базы и сеанс без разделителей обязательны. Монопольный режим выбранными методами не требуется; его не устанавливаем. Единственный собственный сеанс и отсутствие других писателей заданы ручной подготовкой, не обещается защита от конкурентного изменения.

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

  10. Восстановление исходного режима — только часть полностью успешного нормального маршрута. Созданные строки, metadata и служебные константы не откатываются. Catch не вызывает native cleanup/restore/get и не скрывает частичный исход сообщением об успехе.

  11. Код не выполнялся в 1С и не компилировался. Не запускались платформа/GUI, не изменялась никакая база и не создавались резервные копии. Положительные наблюдения и реальные отказы остаются будущими ручными проверками.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.