Прочитаем одну заранее подготовленную собственную запись регистра, получим её настоящий исходный ключ и изменим ресурс только в модели формы.
Где и как запускать
Полный модуль управляемой формы УчебныеДанныеФорм85 → Обработки → УчебныеДанные85 → Формы → Пульт. Сервер с контекстом; в 1С не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую базу платформы 8.5.1.1343 с конфигурацией УчебныеДанныеФорм85, совместимость НеИспользовать, управляемое приложение. Не используйте УТ, КА, УНФ, БП или рабочую базу. Здесь 1С не запускалась: runtimeVerifiedScenarios=0.
В своей конфигурации создайте обработку УчебныеДанные85. Реквизит Примечание — Строка (80); табличная часть Строки: Код — Строка (8), Товар — Строка (64), Количество — Число (10,0). Обработчики модуля объекта оставьте пустыми. Эти данные существуют в экземпляре обработки в памяти, не в справочнике или документе.
Создайте у обработки пустую управляемую основную форму Пульт. Для первых четырёх уроков удалите автоматически предложенный реквизит Объект и его элементы, если мастер их создал: у формы не должно быть основного реквизита. Не добавляйте учебные реквизиты и таблицы вручную — модуль создаёт их пакетно при создании формы.
В форме создайте команду Выполнить, действие Выполнить; перетащите команду на форму кнопкой. Событию ПриСозданииНаСервере назначьте одноимённую процедуру. Вставляйте ПОЛНЫЙ модуль выбранного урока целиком вместо предыдущего, не пять модулей одновременно и не внутрь обработчика.
Сделайте F7 и обновление только своей учебной базы; откройте Пульт из списка собственных обработок в тонком либо управляемом толстом клиенте. Не выбирайте команды сохранения обработки, печати или записи объектов. Кнопка вызывает сервер с контекстом формы, обычные ТаблицаЗначений и объект обработки на тонкий клиент не передаются.
Каждое нажатие первых четырёх уроков заново готовит собственные известные данные. Закройте и откройте Пульт после замены модуля. Подготовка регистра требуется только уроку исходного ключа; сохранение настроек допускается только в последнем уроке и только в новом стенде.
ТОЛЬКО ДЛЯ ЭТОГО УРОКА: в новой своей конфигурации создайте независимый непериодический регистр сведений Уч85Параметры: измерение Код Строка (16), ресурс Количество Число (10,0), без общих реквизитов, разделителей и обработчиков. Обновите только новый стенд.
Через стандартный список своего регистра вручную добавьте ровно свою запись Код=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";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедурыРазбор по шагам
В отдельном новом стенде вручную создаётся свой регистр и одна запись. Пример только читает её; это не подмена источника пустой структурой или unrecorded-объектом.
Сервер создаёт менеджер записи именно Уч85Параметры, задаёт измерение Код=snapshot-A и выполняет Прочитать. После чтения обязательно проверяются Выбран и известные значения.
Метод формы ЗначениеВРеквизитФормы создаёт данные записи в Уч85Запись. Проверяем ДанныеФормыСтруктура; свойство ИсходныйКлючЗаписи существует только у данных, полученных из записей регистра сведений.
ИсходныйКлючЗаписи только читается. Его класс должен быть РегистрСведенийКлючЗаписи.Уч85Параметры, ключ непустой, измерение Код равно snapshot-A.
Меняем ресурс Количество на 99 в собственной модели формы, не измерение ключа. Исходный Код по-прежнему snapshot-A; readonly-поле и свойства ключа не переприсваиваются.
Новый независимый менеджер снова читает точно ту же учебную запись и требует прежние 17. Видимые 99 не выдаются за запись базы и не влияют на проверку сохранённого значения.
Ключ — набор значений измерений, а не долговечная ссылка. По справке имеет смысл только пока запись существует и не перезаписывалась; никакие адреса/идентификаторы обмена из него не строятся.
Как проверить результат
Будущий тест: одна своя подготовленная запись snapshot-A/17, F7, Выполнить. На форме Код snapshot-A, Количество 99; повторное чтение базы 17.
Если запись отсутствует или её ресурс не 17, урок должен остановиться до преобразования и чтения ключа. Не создавайте запись программно вместо отказа.
Тип исходного ключа относится только к Уч85Параметры, Пустой()=Ложь, измерение Код=snapshot-A. Строка snapshot-A сама не является объектом ключа.
Нажмите повторно: чтение снова даёт 17, затем локальная модель снова становится 99. Нет накопления изменений базы.
Будущий ручной контроль через список своего регистра должен по-прежнему показать 17. Здесь база не открывалась, два чтения и UI ещё предстоит проверить.
Ожидаемый результат
Будущий результат: настоящий исходный ключ собственной записи и наглядное различие между 99 в форме и 17 в базе.
На что обратить внимание
Нельзя читать ИсходныйКлючЗаписи у произвольной структуры формы или модели обработки. Специальный источник здесь — реально прочитанная запись своего регистра.
Ключ и его измерения readonly. Изменение ресурса не является изменением ключа и не сохраняет запись без явного Записать.
Нет транзакции: между двумя чтениями другая сессия могла бы изменить данные. Стенд одиночный и собственный; пример не заявляет изоляцию или защиту от гонки.
Ручная подготовка одной учебной записи — единственное необходимое сохранение бизнес-данных на новом стенде. Сам приведённый модуль не пишет регистр и не делает очистку чужих записей.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.