Считывает объект из базы данных.
Синтаксис
Прочитать()Полное описание, параметры и ограничения
ПланВидовХарактеристикОбъект.<Имя плана видов характеристик>.Прочитать (ChartOfCharacteristicTypesObject.<Chart of characteristic types name>.Read)
ПланВидовХарактеристикОбъект.<Имя плана видов характеристик> (ChartOfCharacteristicTypesObject.<Chart of characteristic types name>)
Прочитать (Read)
Доступен, начиная с версии 8.0.
Синтаксис:
Прочитать()
Описание:
Считывает объект из базы данных.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Примечание:
Позволяет прочесть данные заново. Недопустим для нового объекта.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Характеристика B: иерархия, перечитывание и блокировка своего экземпляра
Работаем с настоящим сохранённым B своего плана: отличаем локальную правку от базы и собственную блокировку от общей занятости записи.
Где и как запускать
Полный обычный клиентский общий модуль УчебныеМенеджерыПланов85 → Общие модули → УчебныеМенеджеры85. Пульт отдельным модулем ниже; не выполнялся.
Подготовка
Используйте НОВУЮ собственную файловую базу 8.5.1.1343 с именем конфигурации УчебныеМенеджерыПланов85, совместимость НеИспользовать, обычное приложение и толстый клиент. Нет расширений, разделителей, общих реквизитов, обработчиков, фоновых прикладных заданий и других сеансов, меняющих записи. Рабочие БП/КА2/УТ запрещены. Стенд и код здесь не запускались: runtimeVerifiedScenarios=0.
Планы счетов → УчебныеСчета85: многоуровневый план, код Строка(10), маска пустая, наименование 100, уникальность кода включена, без предопределённых счетов, видов субконто и признаков учёта. Собственный реквизит УчебныйКлюч85: Строка(10), переменная длина, Индексировать. Модули пустые.
Планы видов характеристик → УчебныеСвойства85: иерархия групп и элементов, код Строка(10), наименование 100, тип характеристик только Строка(30), без предопределённых элементов. Реквизит УчебныйКлюч85: Строка(10), Индексировать, применяется к группам и элементам. Модули пустые.
В обоих планах вручную подготовьте ровно четыре записи: G — код 01, наименование Учебный родитель, ключ G, пустой родитель; A — код 10, наименование Учебный верхний A, ключ A, пустой родитель; B — код 30, наименование Учебный дочерний B, ключ B, родитель G; C — код 20, наименование Учебный верхний C, ключ C, пустой родитель. Все записи обычные, не предопределённые, без пометки удаления. У характеристик G — группа, остальные элементы. У счетов G — родительский счёт, а не группа.
В собственных счетах заранее вручную задайте Вид: G и A — Активный, B — Пассивный, C — АктивноПассивный. Забалансовый=Ложь, строк видов субконто нет. Сначала сохраните эту собственную подготовку. Код урока счёт не записывает и не проводит бухгалтерских операций.
Общий модуль УчебныеМенеджеры85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет, остальные клиентские флаги=Нет. Вставьте полный основной модуль одного выбранного урока. Обработка УчебныеМенеджеры85 → обычная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие. Полный модуль этой формы приведён отдельно.
Дополнительно у УчебныеСвойства85 создайте обычную форму Элемент85, у УчебныеСчета85 — Счет85. Мастер формы объекта, назначить основной, модуль пустой. Для счетов собственный макет Шаблон85 типа Табличный документ с текстом План счетов в R1C1; не файл и не макет рабочей конфигурации.
Вставьте один полный вариант общего модуля УчебныеМенеджеры85, модуль Пульта отдельно ниже. F7 и обновление только собственной новой базы. Приготовленные G/A/B/C и их модули остаются прежними, других сеансов нет. Не совмещайте одноимённые процедуры разных уроков.
Будущий код читает свои записи, правит имя только в памяти, перечитывает его и кратковременно блокирует только собственный B. Это приобретение/снятие блокировки, не безэффектное чтение; предметные данные не записываются. Форма получается закрытой, не открывается. Здесь 1С и блокировки не запускались.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойКонтекст();
ПроверитьСвоюПодготовку();
Менеджер = ПланыВидовХарактеристик.УчебныеСвойства85;
Родитель = Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "G");
Ребенок = Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "B", Родитель);
Если Родитель.Пустая() Или Ребенок.Пустая() Тогда
ВызватьИсключение "Подготовьте настоящие собственные G и B";
КонецЕсли;
ОбъектB = Ребенок.ПолучитьОбъект();
Если ОбъектB = Неопределено Тогда
ВызватьИсключение "Собственная запись B исчезла";
КонецЕсли;
Если ТипЗнч(ОбъектB) <> Тип("ПланВидовХарактеристикОбъект.УчебныеСвойства85") Или ОбъектB.ЭтоНовый()
Или ОбъектB.Ссылка <> Ребенок Или ОбъектB.Родитель <> Родитель Тогда
ВызватьИсключение "Нужен настоящий сохранённый объект B собственного плана";
КонецЕсли;
Если Не ОбъектB.ПринадлежитЭлементу(Родитель) Или ОбъектB.ПринадлежитЭлементу(Ребенок) Тогда
ВызватьИсключение "B должен принадлежать G, но не самому себе";
КонецЕсли;
ОбъектG = Родитель.ПолучитьОбъект();
Если ОбъектG = Неопределено Тогда
ВызватьИсключение "Собственная группа G исчезла";
КонецЕсли;
Если Не ОбъектG.ЭтоГруппа Или ОбъектB.ЭтоГруппа Или ОбъектG.Уровень() <> 0 Или ОбъектB.Уровень() <> 1 Тогда
ВызватьИсключение "Нужны корневая группа G и вложенный элемент B";
КонецЕсли;
ПолноеИмя = ОбъектB.ПолноеНаименование();
Если ПолноеИмя <> "Учебный родитель/Учебный дочерний B" Тогда
ВызватьИсключение "Полное наименование должно включать реального родителя и B через /";
КонецЕсли;
Сообщить(ПолноеИмя);
ИсходноеИмя = ОбъектB.Наименование;
Если ИсходноеИмя <> "Учебный дочерний B" Или ОбъектB.Модифицированность() Тогда
ВызватьИсключение "Нужен чистый прочитанный объект своей записи B";
КонецЕсли;
ОбъектB.Наименование = "Несохранённый черновик B";
Если Не ОбъектB.Модифицированность() Тогда
ВызватьИсключение "Локальная правка должна изменить состояние данного экземпляра";
КонецЕсли;
ОбъектB.Прочитать();
Если ОбъектB.Наименование <> ИсходноеИмя Или ОбъектB.Модифицированность() Тогда
ВызватьИсключение "Прочитать должен вернуть сохранённое имя и чистый объект";
КонецЕсли;
ДругойЭкземплярB = Ребенок.ПолучитьОбъект();
Если ДругойЭкземплярB = Неопределено Тогда
ВызватьИсключение "Собственная запись исчезла до опыта с блокировкой";
КонецЕсли;
ДругойЭкземплярB.Наименование = "Второй несохранённый экземпляр B";
Если ОбъектB.Наименование <> ИсходноеИмя Тогда
ВызватьИсключение "Для опыта нужны два независимых экземпляра объекта";
КонецЕсли;
ДругойЭкземплярB.Прочитать();
Если ДругойЭкземплярB.Наименование <> ИсходноеИмя Или ДругойЭкземплярB.Модифицированность() Тогда
ВызватьИсключение "Перечитывание второго экземпляра не подтвердилось";
КонецЕсли;
Если ОбъектB.Заблокирован() Или ДругойЭкземплярB.Заблокирован() Тогда
ВызватьИсключение "Не используем ранее заблокированные экземпляры";
КонецЕсли;
СвояБлокировка = Ложь;
Попытка
ОбъектB.Заблокировать();
СвояБлокировка = Истина;
Если Не ОбъектB.Заблокирован() Или ДругойЭкземплярB.Заблокирован() Тогда
ВызватьИсключение "Заблокирован относится к конкретному экземпляру встроенного языка";
КонецЕсли;
Сообщить("У своего экземпляра B блокировка есть; у второго экземпляра признак Ложь. Это не проверка отсутствия чужой блокировки базы.");
Исключение
Если СвояБлокировка Тогда
ОбъектB.Разблокировать();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
ОбъектB.Разблокировать();
Если ОбъектB.Заблокирован() Тогда
ВызватьИсключение "Снятие своей блокировки не подтвердилось";
КонецЕсли;
КлючОкна = Новый УникальныйИдентификатор;
Окно = ОбъектB.ПолучитьФорму("Элемент85", , КлючОкна);
Если Окно = Неопределено Тогда
ВызватьИсключение "Подготовьте обычную форму собственного объекта";
КонецЕсли;
Если ТипЗнч(Окно) <> Тип("Форма") Или Окно.Открыта() Или Окно.КлючУникальности <> КлючОкна Тогда
ВызватьИсключение "Нужна новая собственная закрытая обычная форма, не чужое окно";
КонецЕсли;
Сообщить("Получена своя форма экземпляра B; Открыть и Записать не вызывались.");
ПроверитьСвоюПодготовку();
КонецПроцедуры
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеМенеджерыПланов85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоюПодготовку()
ПроверитьСвойКонтекст();
Менеджер = ПланыВидовХарактеристик.УчебныеСвойства85;
Родитель = Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "G");
Если Родитель.Пустая() Тогда
ВызватьИсключение "Не подготовлен собственный родитель G";
КонецЕсли;
Коды = Новый Структура("G,A,B,C", "01", "10", "30", "20");
Имена = Новый Структура("G,A,B,C", "Учебный родитель", "Учебный верхний A", "Учебный дочерний B", "Учебный верхний C");
Ключи = Новый Массив;
НачальныйУровень = Неопределено;
Выборка = Менеджер.ВыбратьИерархически(,,"Код Возр");
Пока Выборка.Следующий() Цикл
Ключ = Выборка.УчебныйКлюч85;
ОжидаемыйКод = Неопределено;
ОжидаемоеИмя = Неопределено;
Если Не Коды.Свойство(Ключ, ОжидаемыйКод) Или Не Имена.Свойство(Ключ, ОжидаемоеИмя)
Или Ключи.Найти(Ключ) <> Неопределено Тогда
ВызватьИсключение "Лишняя запись или повтор своего учебного ключа";
КонецЕсли;
Ключи.Добавить(Ключ);
Если Выборка.Код <> ОжидаемыйКод Или Выборка.Наименование <> ОжидаемоеИмя Тогда
ВызватьИсключение "Не совпали код или имя собственной подготовки";
КонецЕсли;
Если Выборка.Ссылка.Пустая() Или Выборка.Ссылка <> Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", Ключ) Тогда
ВызватьИсключение "Выборка должна указывать на ту же собственную записанную ссылку";
КонецЕсли;
ОжидаемыйРодитель = Менеджер.ПустаяСсылка();
Если Ключ = "B" Тогда
ОжидаемыйРодитель = Родитель;
КонецЕсли;
Если Выборка.Родитель <> ОжидаемыйРодитель Или Выборка.ПометкаУдаления
Или Выборка.Предопределенный Или Выборка.ИмяПредопределенныхДанных <> "" Тогда
ВызватьИсключение "Нужны собственные обычные записи с подготовленной иерархией";
КонецЕсли;
ВерсияДо = Выборка.ВерсияДанных;
Если ТипЗнч(ВерсияДо) <> Тип("Строка") Тогда
ВызватьИсключение "ВерсияДанных выборки должна быть строкой, а не датой или бинарными данными";
КонецЕсли;
Уровень = Выборка.УровеньВВыборке();
Если НачальныйУровень = Неопределено Тогда
НачальныйУровень = Уровень;
КонецЕсли;
ОжидаемаяРазница = 0;
Если Ключ = "B" Тогда
ОжидаемаяРазница = 1;
КонецЕсли;
Если Уровень - НачальныйУровень <> ОжидаемаяРазница Тогда
ВызватьИсключение "B должен быть на один уровень глубже корневых G/A/C";
КонецЕсли;
Если Выборка.ЭтоГруппа <> (Ключ = "G") Тогда
ВызватьИсключение "G должен быть группой, A/B/C — элементами";
КонецЕсли;
Если Выборка.ЭтоГруппа Тогда
Сообщить("Группа G: ТипЗначения не используется как тип значения характеристики");
Иначе
ТипХарактеристики = Выборка.ТипЗначения;
Если ТипЗнч(ТипХарактеристики) <> Тип("ОписаниеТипов")
Или Не ТипХарактеристики.СодержитТип(Тип("Строка"))
Или ТипХарактеристики.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Для собственного элемента нужен подготовленный строковый тип характеристики";
КонецЕсли;
Сообщить("Элемент " + Ключ + ": тип значения допускает строку, не число");
КонецЕсли;
Объект = Выборка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
ВызватьИсключение "ПолучитьОбъект может вернуть Неопределено для исчезнувшей записи";
КонецЕсли;
Если Объект.Наименование <> ОжидаемоеИмя Тогда
ВызватьИсключение "Имя прочитанного объекта не совпало с подготовкой";
КонецЕсли;
Объект.Наименование = "Локальный черновик " + Ключ;
Если Объект.Наименование = Выборка.Наименование Тогда
ВызватьИсключение "Локальное изменение объекта не должно менять поле читаемой выборки";
КонецЕсли;
Повторная = Менеджер.Выбрать(,Новый Структура("УчебныйКлюч85", Ключ));
Если Не Повторная.Следующий() Тогда
ВызватьИсключение "Собственная запись исчезла при повторном чтении";
КонецЕсли;
Если Повторная.Наименование <> ОжидаемоеИмя Или Повторная.ВерсияДанных <> ВерсияДо Тогда
ВызватьИсключение "Новое чтение не подтвердило отсутствие изменения собственной записи";
КонецЕсли;
Объект.Наименование = ОжидаемоеИмя;
Сообщить(Ключ + ": " + Выборка.Код + " — " + Выборка.Наименование
+ "; уровень " + Строка(Уровень) + "; версия " + ВерсияДо + "; локальная правка не записана");
КонецЦикла;
Если СтрСоединить(Ключи, ",") <> "G,B,A,C" Тогда
ВызватьИсключение "Нужен полный иерархический обход G,B,A,C";
КонецЕсли;
Сообщить("Все четыре паспорта проверены. Записать не вызывался; изменение объекта осталось в памяти.");
КонецПроцедурыУчебныеМенеджеры85.Пульт
УчебныеМенеджерыПланов85 → Обработки → УчебныеМенеджеры85 → Пульт → Модуль
Полный модуль собственной обычной формы; не выполнялся.
Процедура ВыполнитьНажатие(Кнопка)
УчебныеМенеджеры85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Общий проверяющий код повторно использует подготовку четырёх паспортов из урока выборки. Сверяются реальные ссылки/имена/родители/версии и точный состав G/A/B/C; новый объект или неизвестный ИсходныйОбъект не передаётся.
B получен поиском собственного индексированного ключа и ПолучитьОбъект. Nullable результат, точный прикладной тип, сохранённость, Ссылка и Родитель проверены перед дальнейшими действиями.
ПринадлежитЭлементу(G)=Истина, ПринадлежитЭлементу(B)=Ложь. Это подчинение по всей иерархии, а не сравнение ссылки B с G. У плана счетов G обычный родительский счёт, не группа справочника.
Имя меняется в памяти экземпляра. Прочитать применяется только к сохранённому объекту и возвращает данные из базы: исходное имя и чистое состояние. Это не Записать и не сохранение черновика.
Получаем два экземпляра одной своей ссылки и проверяем независимость локальной правкой второго: первый сохраняет имя, второй перечитывается. Если независимость не подтверждена, блокировку не берём. Заблокирован проверяет конкретный объект встроенного языка, не общую занятость записи в базе.
Заблокировать вызывается только после своей подготовки. Успешное приобретение отмечается флагом; на ошибочном пути снимается только наша приобретённая блокировка, затем ошибка передаётся дальше. На успешном пути Разблокировать вызывается отдельно, состояние перепроверяется.
ПолучитьФорму получает имя собственной обычной формы, пустого владельца и новый уникальный ключ. Проверяем Неопределено/тип/закрытость/ключ. Получение формы экземпляра объекта не равно получению формы по ссылке; Открыть не вызывается.
После снятия своей блокировки повторная проверка четырёх записей подтверждает неизменный состав и сохранённые имена. Если блокировку снять не удалось, опыт не считается успешным; отсутствие чужих блокировок таким кодом не доказано.
У характеристик G корень уровня 0, B дочерний уровня 1. ПолноеНаименование B проверяется как Учебный родитель/Учебный дочерний B. Это полный путь по именам, не код, UUID или имя вида метаданных.
Как проверить результат
Будущий ручной тест: F7, свой Пульт, одна сессия. В начале и конце должны пройти четыре паспорта собственных записей, состав неизменен.
Проверить принадлежность B реальному G и непринадлежность самому B. Для характеристики отдельно уровень G=0/B=1 и полный путь через /. Для счёта — только собственный текст макета.
После локального имени проверить Модифицированность, затем после Прочитать — исходное имя и чистое состояние. В стандартном списке сохранённое B всегда имеет исходное имя.
Внутри опыта блокировка первого экземпляра True, второго False; после снятия первого False. Это будущие проверки API, не полученные здесь результаты и не диагностика блокировок рабочей базы.
Полученная форма должна остаться закрытой. Не нажимать Записать, Открыть, печать или файловое сохранение. Закрыть только Пульт после завершения.
Ожидаемый результат
Будущий опыт показывает настоящую иерархию собственного B, отбрасывает несохранённую правку перечитыванием и приобретает/снимает только свою блокировку. Форма остаётся закрытой, записи не меняются; runtimeVerifiedScenarios=0.
На что обратить внимание
Заблокирован=False второго экземпляра не доказывает отсутствие блокировки у другого объекта/пользователя. Вторую конкурентную блокировку здесь не пытаемся брать.
Прочитать недопустим для нового объекта и отбрасывает текущие несохранённые изменения. Не используйте его как способ сохранить правку.
ПолучитьФорму и макет здесь доступны в толстом обычном клиенте. Не переносите основной модуль в тонкий клиент или управляемую форму с директивами.
Только новая собственная база с пустыми обработчиками и единственной сессией. Это не блокировка/разблокировка чужих объектов; никакая операция 1С здесь не выполнялась.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.