Исходный ключ записи: модель формы не равна сохранённой записи

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

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

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

Полный модуль управляемой формы УчебныеДанныеФорм85 → Обработки → УчебныеДанные85 → Формы → Пульт. Сервер с контекстом; в 1С не выполнялся.

Подготовка

  1. Создайте НОВУЮ отдельную файловую базу платформы 8.5.1.1343 с конфигурацией УчебныеДанныеФорм85, совместимость НеИспользовать, управляемое приложение. Не используйте УТ, КА, УНФ, БП или рабочую базу. Здесь 1С не запускалась: runtimeVerifiedScenarios=0.

  2. В своей конфигурации создайте обработку УчебныеДанные85. Реквизит Примечание — Строка (80); табличная часть Строки: Код — Строка (8), Товар — Строка (64), Количество — Число (10,0). Обработчики модуля объекта оставьте пустыми. Эти данные существуют в экземпляре обработки в памяти, не в справочнике или документе.

  3. Создайте у обработки пустую управляемую основную форму Пульт. Для первых четырёх уроков удалите автоматически предложенный реквизит Объект и его элементы, если мастер их создал: у формы не должно быть основного реквизита. Не добавляйте учебные реквизиты и таблицы вручную — модуль создаёт их пакетно при создании формы.

  4. В форме создайте команду Выполнить, действие Выполнить; перетащите команду на форму кнопкой. Событию ПриСозданииНаСервере назначьте одноимённую процедуру. Вставляйте ПОЛНЫЙ модуль выбранного урока целиком вместо предыдущего, не пять модулей одновременно и не внутрь обработчика.

  5. Сделайте F7 и обновление только своей учебной базы; откройте Пульт из списка собственных обработок в тонком либо управляемом толстом клиенте. Не выбирайте команды сохранения обработки, печати или записи объектов. Кнопка вызывает сервер с контекстом формы, обычные ТаблицаЗначений и объект обработки на тонкий клиент не передаются.

  6. Каждое нажатие первых четырёх уроков заново готовит собственные известные данные. Закройте и откройте Пульт после замены модуля. Подготовка регистра требуется только уроку исходного ключа; сохранение настроек допускается только в последнем уроке и только в новом стенде.

  7. ТОЛЬКО ДЛЯ ЭТОГО УРОКА: в новой своей конфигурации создайте независимый непериодический регистр сведений Уч85Параметры: измерение Код Строка (16), ресурс Количество Число (10,0), без общих реквизитов, разделителей и обработчиков. Обновите только новый стенд.

  8. Через стандартный список своего регистра вручную добавьте ровно свою запись Код=snapshot-A, Количество=17. Не переносите рабочие данные. Закройте редактор записи; затем открывайте учебный Пульт в единственной сессии. Ни создание этой записи, ни применение метаданных здесь не выполнялись.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьСвойКонтекст();
    Реквизиты = Новый Массив;
    Реквизиты.Добавить(Новый РеквизитФормы("Уч85Запись", Новый ОписаниеТипов("РегистрСведенийМенеджерЗаписи.Уч85Параметры")));
    ЭтотОбъект.ИзменитьРеквизиты(Реквизиты);
    Для Каждого ИмяПоля Из СтрРазделить("Код,Количество", ",") Цикл
        Поле = ЭтотОбъект.Элементы.Добавить("Уч85Запись" + ИмяПоля, Тип("ПолеФормы"));
        Поле.Вид = ВидПоляФормы.ПолеВвода;
        Поле.ПутьКДанным = "Уч85Запись." + ИмяПоля;
        Поле.ТолькоПросмотр = Истина;
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Выполнить(Команда)
    Сообщить(ВыполнитьНаСервере());
КонецПроцедуры

&НаСервере
Функция ВыполнитьНаСервере()
    ПроверитьСвойКонтекст();
    Прочитанная = ПрочитатьСвоюЗапись();
    ЭтотОбъект.ЗначениеВРеквизитФормы(Прочитанная, "Уч85Запись");
    ДанныеЗаписи = ЭтотОбъект.Уч85Запись;
    Если ТипЗнч(ДанныеЗаписи) <> Тип("ДанныеФормыСтруктура") Тогда
        ВызватьИсключение "Ключ читается из модели записи, не таблицы значений или черновика обработки";
    КонецЕсли;
    ИсходныйКлюч = ДанныеЗаписи.ИсходныйКлючЗаписи;
    Если ТипЗнч(ИсходныйКлюч) <> Тип("РегистрСведенийКлючЗаписи.Уч85Параметры")
        Или ИсходныйКлюч.Пустой() Или ИсходныйКлюч.Код <> "snapshot-A" Тогда
        ВызватьИсключение "Нужен непустой ключ именно своей считанной записи";
    КонецЕсли;
    ДанныеЗаписи.Количество = 99;
    Если ДанныеЗаписи.ИсходныйКлючЗаписи.Код <> "snapshot-A" Тогда
        ВызватьИсключение "Изменение ресурса формы не должно подменять исходное измерение ключа";
    КонецЕсли;
    ПовторноПрочитанная = ПрочитатьСвоюЗапись();
    Если ДанныеЗаписи.Количество <> 99 Или ПовторноПрочитанная.Количество <> 17 Тогда
        ВызватьИсключение "Данные формы и повторное чтение своей базы нужно различать";
    КонецЕсли;
    Возврат "Исходный ключ: snapshot-A. В модели формы 99, в заново прочитанной своей записи 17. Ничего не записано.";
КонецФункции

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

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

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

  1. В отдельном новом стенде вручную создаётся свой регистр и одна запись. Пример только читает её; это не подмена источника пустой структурой или unrecorded-объектом.

  2. Сервер создаёт менеджер записи именно Уч85Параметры, задаёт измерение Код=snapshot-A и выполняет Прочитать. После чтения обязательно проверяются Выбран и известные значения.

  3. Метод формы ЗначениеВРеквизитФормы создаёт данные записи в Уч85Запись. Проверяем ДанныеФормыСтруктура; свойство ИсходныйКлючЗаписи существует только у данных, полученных из записей регистра сведений.

  4. ИсходныйКлючЗаписи только читается. Его класс должен быть РегистрСведенийКлючЗаписи.Уч85Параметры, ключ непустой, измерение Код равно snapshot-A.

  5. Меняем ресурс Количество на 99 в собственной модели формы, не измерение ключа. Исходный Код по-прежнему snapshot-A; readonly-поле и свойства ключа не переприсваиваются.

  6. Новый независимый менеджер снова читает точно ту же учебную запись и требует прежние 17. Видимые 99 не выдаются за запись базы и не влияют на проверку сохранённого значения.

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

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

  1. Будущий тест: одна своя подготовленная запись snapshot-A/17, F7, Выполнить. На форме Код snapshot-A, Количество 99; повторное чтение базы 17.

  2. Если запись отсутствует или её ресурс не 17, урок должен остановиться до преобразования и чтения ключа. Не создавайте запись программно вместо отказа.

  3. Тип исходного ключа относится только к Уч85Параметры, Пустой()=Ложь, измерение Код=snapshot-A. Строка snapshot-A сама не является объектом ключа.

  4. Нажмите повторно: чтение снова даёт 17, затем локальная модель снова становится 99. Нет накопления изменений базы.

  5. Будущий ручной контроль через список своего регистра должен по-прежнему показать 17. Здесь база не открывалась, два чтения и UI ещё предстоит проверить.

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

Будущий результат: настоящий исходный ключ собственной записи и наглядное различие между 99 в форме и 17 в базе.

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

  1. Нельзя читать ИсходныйКлючЗаписи у произвольной структуры формы или модели обработки. Специальный источник здесь — реально прочитанная запись своего регистра.

  2. Ключ и его измерения readonly. Изменение ресурса не является изменением ключа и не сохраняет запись без явного Записать.

  3. Нет транзакции: между двумя чтениями другая сессия могла бы изменить данные. Стенд одиночный и собственный; пример не заявляет изоляцию или защиту от гонки.

  4. Ручная подготовка одной учебной записи — единственное необходимое сохранение бизнес-данных на новом стенде. Сам приведённый модуль не пишет регистр и не делает очистку чужих записей.

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

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

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

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

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