Прочитать загружает данные из базы в существующий экземпляр. Различаем локальную правку, записанное значение и непрозрачную строку ВерсияДанных.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.
Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.
Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.
Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.
Создайте серверный общий модуль УчебныеЗадачи и команду учебной обработки, вызывающую ВыполнитьПример() Экспорт. Каждый фрагмент выполняйте отдельно, не склеивайте их в одну процедуру.
Запускайте строго в новой пустой базе Учебная85, с пустыми модулями объектов и без подписок. Здесь временно записываются только созданные самим примером объекты.
Отмена транзакции выполняется и при успехе, и при ошибке. Не заменяйте её фиксацией и не запускайте внутри транзакции вызывающего кода.
Откат базы не отменяет письма, HTTP-запросы и другие внешние действия обработчиков. Поэтому копия рабочей конфигурации с неизвестными обработчиками не заменяет эту подготовку.
Если Метаданные.Справочники.Найти("УчебныеТовары") = Неопределено Тогда
ВызватьИсключение "Сначала создайте учебный справочник по подготовке";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Запустите учебную задачу вне чужой транзакции";
КонецЕсли;
Ссылка = Справочники.УчебныеТовары.ПолучитьСсылку(Новый УникальныйИдентификатор);
НачатьТранзакцию();
Попытка
Товар = Справочники.УчебныеТовары.СоздатьЭлемент();
Товар.УстановитьСсылкуНового(Ссылка);
Товар.Наименование = "Записанная учебная книга";
Товар.Артикул = "A-01";
Товар.Цена = 250;
Товар.Записать();
Наблюдаемый = Ссылка.ПолучитьОбъект();
Если Наблюдаемый = Неопределено Тогда
ВызватьИсключение "Собственный записанный товар не найден";
КонецЕсли;
ВерсияДо = Наблюдаемый.ВерсияДанных;
Наблюдаемый.Наименование = "Только в памяти";
Сообщить(Наблюдаемый.Модифицированность());
Наблюдаемый.Прочитать();
Сообщить(Наблюдаемый.Наименование = "Записанная учебная книга");
Сообщить(Не Наблюдаемый.Модифицированность());
Сообщить(Наблюдаемый.ВерсияДанных = ВерсияДо);
Сообщить(ТипЗнч(ВерсияДо) = Тип("Строка"));
ОтменитьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Сообщить(Не ТранзакцияАктивна());
Сообщить(Ссылка.ПолучитьОбъект() = Неопределено);Разбор по шагам
Записываем только собственный новый объект в отменяемой транзакции и получаем отдельный экземпляр по его ссылке.
Сохраняем строку версии как непрозрачное значение. Это не дата и не номер выпуска конфигурации.
Присваивание Наименование изменяет объект в памяти; Записать для этой правки не вызывается.
Прочитать заменяет локальные значения записанными. В этом уроке других записей между чтениями нет, поэтому версия остаётся прежней.
Как проверить результат
Пять сравнений внутри транзакции Истина; после отката собственный товар отсутствует.
Несохранённое Только в памяти исчезло, записанное наименование восстановлено.
Ожидаемый результат
Показано перечитывание существующего учебного объекта без сохранения локальной правки.
На что обратить внимание
Не вызывайте Прочитать до записи нового объекта: строки в базе ещё нет.
Прочитать может уничтожить несохранённые изменения пользователя; в интерфейсе это требует явного решения.
Сравнение версий здесь не моделирует гонку двух реальных сеансов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.