Своя настройка начала 2020: короткие 19/20 → реальные даты 2119/2020 и нормальный возврат

Учебные задачи

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

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

Полный модуль собственной управляемой формы; единственный толстый управляемый клиент 8.5.1.1343 в новой собственной файловой CF/VM. Код меняет параметр базы и состояние своего сеанса только по личному одноразовому согласию.

Подготовка

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

  2. Вручную создать новый каталог базы C:\1c-labs\OwnCentury85_6d838d17-22a3-4f49-bf0b-156c18a64191\IB. Если путь или база уже существуют, их не использовать и не очищать. Регистрация File="C:\1c-labs\OwnCentury85_6d838d17-22a3-4f49-bf0b-156c18a64191\IB";. Метки помогают не перепутать стенд, но не доказывают владение.

  3. Конфигуратор: Имя=УчебноеСтолетие85; Версия=6d838d17-22a3-4f49-bf0b-156c18a64191; Режим совместимости=Не использовать; Основной режим запуска=Управляемое приложение. Без разделителей, фоновых заданий, обменов и чужих сервисов.

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

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

  6. Реквизиты формы: СогласенНаОпыт85 — Булево, ручной флажок; Состояние85 — Строка неограниченной длины, поле только для просмотра. До своего разрешения наблюдать фактический флажок Ложь; не задавать недоказанные свойства начального значения редактора. Фаза85 — внутренняя переменная модуля, не реквизит.

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

  8. Создать команду формы ПроверитьКороткиеГоды85 и настоящую кнопку с этим ИмяКоманды. Действие — одноимённая процедура с параметром Команда. Не вызывать обработчик или функцию вручную вместо опыта.

  9. Вручную обновить только собственную учебную CF и проверить компиляцию. Закрыть Конфигуратор; запустить единственный собственный сеанс толстого управляемого клиента 8.5.1.1343 под своим администратором. Других пользователей/писателей нет; их сеансы код не завершает.

  10. Флажок разрешает весь опыт: свою блокировку, сохранение начала 2020 и возврат настройки только после полного успеха. После STOP исход может остаться частичным; не повторять опыт, не открывать новую форму ради обхода запрета и не превращать лабораторию в рабочую базу.

&НаКлиенте
Перем Фаза85;

&НаКлиенте
Процедура ПроверитьКороткиеГоды85(Команда)
    Попытка
        Если Фаза85 <> Неопределено Тогда
            ВызватьИсключение "Повтор опыта в этом экземпляре запрещён";
        КонецЕсли;
        Если ТипЗнч(СогласенНаОпыт85) <> Тип("Булево") Или СогласенНаОпыт85 <> Истина Тогда
            ВызватьИсключение "Сначала подтвердите личное согласие на собственный опыт";
        КонецЕсли;
        СогласенНаОпыт85 = Ложь;
        Фаза85 = "НЕИЗВЕСТНО";
        Состояние85 = "НЕИЗВЕСТНО: изменение своей настройки ещё не подтверждено";
        #Если ТолстыйКлиентУправляемоеПриложение Тогда
        Если СтрокаСоединенияИнформационнойБазы()
                <> "File=""C:\1c-labs\OwnCentury85_6d838d17-22a3-4f49-bf0b-156c18a64191\IB"";" Тогда
            ВызватьИсключение "Нужен точно подготовленный собственный новый стенд";
        КонецЕсли;
        Если ИмяФормы <> "ОбщаяФорма.УчебноеСтолетие85"
            Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
            Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать
            Или ТипЗнч(Состояние85) <> Тип("Строка") Тогда
            ВызватьИсключение "Нужна собственная подготовленная форма без сохранения её полей";
        КонецЕсли;
        Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ПроверитьКороткиеГоды85" Тогда
            ВызватьИсключение "Нужна настоящая одноимённая команда собственной формы";
        КонецЕсли;
        Доступ85 = РольДоступна("АдминистраторУчебногоСтолетия85");
        Если ТипЗнч(Доступ85) <> Тип("Булево") Или Доступ85 <> Истина Тогда
            ВызватьИсключение "Нужна вручную подготовленная собственная роль";
        КонецЕсли;
        НачальныйМонопольный85 = МонопольныйРежим();
        Если ТипЗнч(НачальныйМонопольный85) <> Тип("Булево") Или НачальныйМонопольный85 <> Ложь Тогда
            ВызватьИсключение "Ранее установленный монопольный режим не меняем";
        КонецЕсли;
        ИсходноеНачало85 = ПолучитьНачалоСтолетияИнформационнойБазы();
        Если ИсходноеНачало85 <> Неопределено Тогда
            Если ТипЗнч(ИсходноеНачало85) <> Тип("Число") Тогда
                ВызватьИсключение "Исходная настройка должна быть Числом или Неопределено";
            КонецЕсли;
            Если Цел(ИсходноеНачало85) <> ИсходноеНачало85
                Или ИсходноеНачало85 < 1 Или ИсходноеНачало85 > 9900 Или ИсходноеНачало85 = 2020 Тогда
                ВызватьИсключение "Для этого опыта нужно другое целое начало или неустановленная настройка";
            КонецЕсли;
        КонецЕсли;
        УстановитьМонопольныйРежим(Истина);
        МонопольныйПослеУстановки85 = МонопольныйРежим();
        Если ТипЗнч(МонопольныйПослеУстановки85) <> Тип("Булево") Или МонопольныйПослеУстановки85 <> Истина Тогда
            ВызватьИсключение "Собственная монопольная блокировка не подтверждена";
        КонецЕсли;
        НачалоПослеБлокировки85 = ПолучитьНачалоСтолетияИнформационнойБазы();
        Если ТипЗнч(НачалоПослеБлокировки85) <> ТипЗнч(ИсходноеНачало85)
            Или НачалоПослеБлокировки85 <> ИсходноеНачало85 Тогда
            ВызватьИсключение "Исходная настройка изменилась до опыта";
        КонецЕсли;
        УстановитьНачалоСтолетияИнформационнойБазы(2020);
        ФактическоеНачало85 = ПолучитьНачалоСтолетияИнформационнойБазы();
        Если ТипЗнч(ФактическоеНачало85) <> Тип("Число") Или ФактическоеНачало85 <> 2020 Тогда
            ВызватьИсключение "Реальное сохранённое начало 2020 не подтверждено новым чтением";
        КонецЕсли;
        КороткийПервый85 = 19;
        КороткийВторой85 = 20;
        ПерваяДата85 = ПолнаяДатаКороткогоГода85(ФактическоеНачало85, КороткийПервый85);
        ВтораяДата85 = ПолнаяДатаКороткогоГода85(ФактическоеНачало85, КороткийВторой85);
        Если ТипЗнч(ПерваяДата85) <> Тип("Дата") Или ТипЗнч(ВтораяДата85) <> Тип("Дата")
            Или ПерваяДата85 <> '21190115120000' Или ВтораяДата85 <> '20200115120000' Тогда
            ВызватьИсключение "Полные реальные даты нашего алгоритма не подтверждены";
        КонецЕсли;
        ПервыйГод85 = Год(ПерваяДата85);
        ВторойГод85 = Год(ВтораяДата85);
        Если ТипЗнч(ПервыйГод85) <> Тип("Число") Или ТипЗнч(ВторойГод85) <> Тип("Число")
            Или ПервыйГод85 <> 2119 Или ВторойГод85 <> 2020 Тогда
            ВызватьИсключение "Нативное чтение годов фактических дат не подтвердило вычисление";
        КонецЕсли;
        УстановитьНачалоСтолетияИнформационнойБазы(ИсходноеНачало85);
        ВосстановленноеНачало85 = ПолучитьНачалоСтолетияИнформационнойБазы();
        Если ТипЗнч(ВосстановленноеНачало85) <> ТипЗнч(ИсходноеНачало85)
            Или ВосстановленноеНачало85 <> ИсходноеНачало85 Тогда
            ВызватьИсключение "Возврат всего исходного типа и значения настройки не подтверждён";
        КонецЕсли;
        УстановитьМонопольныйРежим(Ложь);
        МонопольныйПослеВозврата85 = МонопольныйРежим();
        Если ТипЗнч(МонопольныйПослеВозврата85) <> Тип("Булево") Или МонопольныйПослеВозврата85 <> Ложь Тогда
            ВызватьИсключение "Снятие только собственной блокировки не подтверждено";
        КонецЕсли;
        Фаза85 = "ПОДТВЕРЖДЕНО";
        Состояние85 = "Наш алгоритм проверен: начало=" + Строка(ФактическоеНачало85)
            + "; короткий год " + Строка(КороткийПервый85) + " → " + Строка(ПервыйГод85)
            + "; дата=" + Строка(ПерваяДата85)
            + "; короткий год " + Строка(КороткийВторой85) + " → " + Строка(ВторойГод85)
            + "; дата=" + Строка(ВтораяДата85)
            + "; исходная настройка возвращена=" + Строка(ВосстановленноеНачало85 = ИсходноеНачало85)
            + "; монопольный режим=" + Строка(МонопольныйПослеВозврата85);
        #Иначе
        ВызватьИсключение "Нужен толстый управляемый клиент";
        #КонецЕсли
    Исключение
        Фаза85 = "STOP";
        СогласенНаОпыт85 = Ложь;
        Состояние85 = "STOP: исход неизвестен; настройка или блокировка могут остаться изменёнными. Нет автоматического возврата, очистки или повторов";
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция ПолнаяДатаКороткогоГода85(Начало, КороткийГод)
    Если ТипЗнч(Начало) <> Тип("Число") Или Начало <> 2020 Тогда
        ВызватьИсключение "Нужен настоящий параметр 2020 из нового чтения";
    КонецЕсли;
    Если ТипЗнч(КороткийГод) <> Тип("Число") Тогда
        ВызватьИсключение "Собственный короткий год должен быть настоящим числом";
    КонецЕсли;
    Если Цел(КороткийГод) <> КороткийГод Или КороткийГод < 0 Или КороткийГод > 99 Тогда
        ВызватьИсключение "Наш алгоритм принимает только целое число 0..99";
    КонецЕсли;
    КонецОкна = Начало + 99;
    БазовыйВек = Цел(Начало / 100) * 100;
    ПолныйГод = БазовыйВек + КороткийГод;
    Если ПолныйГод < Начало Тогда
        ПолныйГод = ПолныйГод + 100;
    КонецЕсли;
    Если ТипЗнч(ПолныйГод) <> Тип("Число") Или Цел(ПолныйГод) <> ПолныйГод
        Или ПолныйГод < Начало Или ПолныйГод > КонецОкна Тогда
        ВызватьИсключение "Вычисленный год вышел за наше собственное окно";
    КонецЕсли;
    ПолнаяДата = Дата(ПолныйГод, 1, 15, 12, 0, 0);
    Если ТипЗнч(ПолнаяДата) <> Тип("Дата") Тогда
        ВызватьИсключение "Нативная Дата не создала настоящий полный результат";
    КонецЕсли;
    ФактическийГод = Год(ПолнаяДата);
    Если ТипЗнч(ФактическийГод) <> Тип("Число") Или ФактическийГод <> ПолныйГод Тогда
        ВызватьИсключение "Год фактической даты не равен нашему вычисленному году";
    КонецЕсли;
    Возврат ПолнаяДата;
КонецФункции

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

  1. Первое настоящее нажатие расходует согласие и сразу показывает НЕИЗВЕСТНО, до чтения состояния базы. Проверяются версия, CF, File строка, своя форма/команда/роль; эти признаки не являются доказательством владения или атомарности.

  2. Сначала читается настоящий Булево Ложь у МонопольныйРежим(). Уже включённый режим не трогаем. Исходное начало сохраняется целиком: Число или Неопределено; для этого опыта принимаются только другое целое начало 1..9900 либо отсутствие настройки, не уже 2020.

  3. УстановитьМонопольныйРежим(Истина) — настоящий setter, не МонопольныйРежим(Истина). Успех проверяется новым чтением Булево Истина. Ещё раз читается исходное начало и сравнивается весь тип и значение, прежде чем менять настройку.

  4. УстановитьНачалоСтолетияИнформационнойБазы(2020) действительно сохраняет параметр собственной новой базы. Новый getter должен реально вернуть Число2020; именно этот результат передаётся в оба вычисления.

  5. Наши два собственных входа — числа 19 и 20. Наше, явно выбранное правило: интервал[начало, начало+99]. Базовый век=Цел(начало/100)*100; кандидат=век+короткий год; если он меньше начала, прибавить100. При фактическом начале2020 получаются 2119 и 2020.

  6. Функция проверяет целые 0..99 и границы собственного окна, затем передаёт вычисленный полный год в Дата(год,1,15,12,0,0). Проверяются настоящий тип Дата и Год от этого фактического результата. Это не встроенный разбор короткой даты платформой.

  7. Основная команда проверяет весь результат против полных собственных литералов 15.01.2119 12:00:00 и 15.01.2020 12:00:00 и снова читает реальные годы. Ожидаемые литералы только проверяют расчёт, не подменяют реальные даты.

  8. Только после полного успеха setter получает именно сохранённое ИсходноеНачало85. Здесь нативный union явно допускает настоящее Неопределено; оно не подменяется числом 1950. Новым getter проверяется весь исходный тип и значение.

  9. Только на нормальном пути снимается собственный монопольный режим и новым чтением подтверждается Булево Ложь. После этого поле показывает фактическое начало, оба входа/полных года/дат, сравнение восстановления и реальный режим.

  10. При исключении — только STOP, потраченное согласие и предупреждение о неизвестном исходе. Нет чтения настроек после ошибки, автоматического восстановления, снятия блокировки, очистки или следующего шага.

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

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

  2. Нормальный будущий опыт: в собственном отладчике ФактическоеНачало85 — Число 2020 из нового getter, а не присвоенная константа. Обе функции получают именно эту переменную и реальные собственные19/20.

  3. ПерваяДата85 должна реально равняться 15.01.2119 12:00:00, ВтораяДата85 — 15.01.2020 12:00:00; обе имеют тип Дата. ПервыйГод85/ВторойГод85 — реальные результаты Год, числа 2119/2020.

  4. Если исходно Неопределено, после полностью успешного нормального возврата getter снова реально Неопределено, не 1950. Если исходно другое допустимое целое число, возвращён тот же тип и всё число.

  5. Успешный путь подтверждает МонопольныйПослеУстановки85=Булево Истина и МонопольныйПослеВозврата85=Булево Ложь. Отсутствие исключения у setter само по себе не заменяет эти чтения.

  6. Только в ещё одной НОВОЙ собственной лаборатории изменить один собственный короткий вход на 100 или дробное число. Проверка нашего правила должна остановить опыт; после ошибки настройка/блокировка могут остаться изменёнными, автоматического возврата нет.

  7. Неверная роль, уже включённый режим, иной CF/File путь, повтор кнопки или несовпадение нового getter означают STOP. Конкретные отказы и поведение после перезапуска здесь ещё не воспроизведены; не проверять их на чужих базах.

  8. После STOP не обходить запрет новым экземпляром формы и не восстанавливать настройки автоматически. Отдельный будущий опыт возможен лишь после явной ручной подготовки новой собственной лаборатории.

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

Будущий полностью успешный ручной опыт должен показать реальное начало 2020 из нового чтения, собственные 19→2119 и 20→2020, фактические 15.01.2119 12:00:00/15.01.2020 12:00:00 типа Дата, полный возврат исходного Числа/Неопределено и реальный монопольный режим Ложь. Это наш алгоритм, не встроенный разбор короткой даты или обещание обновления сеанса.

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

  1. Это наш собственный алгоритм обработки двух коротких годов по реально прочитанному параметру базы. Он НЕ доказывает, как ВвестиДату разворачивает двузначный год, и НЕ обещает обновление НачалоСтолетияСеанса после setter.

  2. Никакого Дата("dd.mm.yy"): используются только полные вычисленные годы и шесть числовых составляющих. Литералы ожидаемых дат содержат четыре цифры года. Собственное окно 2020..2119 — правило урока, не приписанное платформе описание.

  3. Setter документирует Число 1..9900 или Неопределено и default Неопределено. Отмена настройки использует эффективное 1950, но getter неустановленной настройки возвращает Неопределено. Наши проверки целочисленности — собственное ограничение опыта, не недоказанное отдельное требование native API.

  4. Оба метода настройки доступны серверу, толстому клиенту и внешнему соединению; здесь выбран только толстый управляемый клиент. Основной блок не переносить в тонкий/веб-клиент или обычный клиент без изменения подготовки и проверки.

  5. Нельзя обещать, что наш алгоритм создаст Дату для каждого 1..9900 из диапазона setter. Положительный маршрут ограничен реально прочитанным 2020 и собственными 19/20; это не готовый общий импортёр внешних строк.

  6. Настройка реально сохраняется в базе, это не работа только в памяти. Монопольная блокировка относится к собственной текущей области/сеансу; CF без разделителей. Режим не завершает чужие сеансы и не обещает атомарный откат.

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

  8. Строка числа/даты зависит от национальных установок. Проверяются реальные типы и полные значения; текст отчёта не является машинным форматом или доказательством доставки/долговечности после сбоя.

  9. Не читались реальные пользовательские пароли, не менялись рабочие базы и не выполнялись GUI, компилятор, 1С или её API. Все положительные наблюдения остаются будущими ручными проверками.

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

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

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

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

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