Разработка и Конфигурация · 11 мин
Как перечитать данные объекта в 1С
Как перечитать данные объекта в 1С: команда «Обновить», метод Прочитать(), обновление формы, работа с программным перечитыванием и типичные ошибки разработчиков.
При работе с 1С нередко возникает ситуация: данные в открытой форме устарели, потому что другой пользователь или фоновый процесс уже изменил объект в базе. Чтобы увидеть актуальные значения, объект нужно перечитать — загрузить данные из базы заново. Это можно сделать как в пользовательском режиме, так и программно из кода встроенного языка.
Способ перечитывания зависит от контекста: пользователю достаточно штатной команды формы, а разработчику нужны методы Прочитать() и ПрочитатьДанные(), понимание разницы между объектом формы и объектом базы данных, а также аккуратность с несохранёнными изменениями. Ниже разобраны все основные сценарии с примерами кода и типичными ошибками.
Как перечитать объект в пользовательском режиме
В управляемых формах 1С:Предприятия 8.3 для обновления данных открытого объекта предусмотрена штатная команда. Откройте форму документа или элемента справочника, перейдите в меню «Ещё» в командной панели и выберите пункт «Обновить». Форма заново загрузит данные из информационной базы, и вы увидите актуальное состояние объекта.
В формах списков (списки документов, справочников, регистров) обновление выполняется командой «Обновить» из того же меню «Ещё» либо клавишей F5, если она назначена в настройках. В динамических списках можно также настроить автообновление с заданным периодом — это удобно для журналов, за которыми следят несколько пользователей одновременно.
Важно понимать: команда «Обновить» заменяет данные в форме содержимым базы. Если вы внесли в форму изменения и не записали объект, при обновлении платформа предложит сохранить или отменить изменения, либо (в зависимости от настроек формы) изменения будут потеряны. Убедитесь, что ценные данные записаны, прежде чем обновлять форму.
Как перечитать объект программно: метод Прочитать()
Основной инструмент разработчика — метод Прочитать() объекта встроенного языка. Он применим к объектам, имеющим представление в базе: справочникам, документам, планам счетов, задачам, бизнес-процессам и другим. Метод загружает данные из базы в объект, полностью замещая текущее содержимое.
ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// ... изменения реквизитов ...
// Отменить изменения и вернуть данные из базы:
ДокументОбъект.Прочитать();
Типовой сценарий: вы получили объект через ПолучитьОбъект(), начали его менять, но по условиям алгоритма решили отказаться от изменений. Вызов Прочитать() вернёт объект в состояние, хранящееся в базе. Это дешевле, чем заново получать объект, и гарантированно сбрасывает все модифицированные реквизиты и табличные части.
Для регистров сведений перечитывание выполняется через набор записей или менеджер записи: нужно установить отбор (для набора) и вызвать Прочитать(). Если отбор не задан, прочитается весь регистр — на больших таблицах это может занять значительное время и память.
Как обновить данные в управляемой форме
Когда требуется перечитать данные именно в открытой форме (например, после программной записи объекта в фоне или в другом сеансе), используются механизмы формы. Основной объект формы типа «ДанныеФормыСтруктура» на базе объекта можно перечитать через преобразование: получить объект методом РеквизитФормыВЗначение("Объект"), вызвать у него Прочитать() и вернуть результат через ЗначениеВРеквизитФормы().
&НаСервере
Процедура ПеречитатьОбъектНаСервере()
ОбъектДанных = РеквизитФормыВЗначение("Объект");
ОбъектДанных.Прочитать();
ЗначениеВРеквизитФормы(ОбъектДанных, "Объект");
КонецПроцедуры
Более лёгкий вариант для форм динамических списков — метод Элементы.Список.Обновить() на клиенте. Он перечитывает только видимые строки списка и не трогает основной реквизит формы, поэтому безопасен для несохранённых данных других элементов.
Если нужно просто уведомить открытые формы об изменении конкретного объекта, используйте оповещения: ОповеститьОбИзменении(Ссылка) на сервере или клиенте. Все формы, отображающие эту ссылку, автоматически перечитают данные. Для произвольных сценариев есть пара методов Оповестить() и обработчик ОбработкаОповещения() в форме-приёмнике.
- 1Получите объект из данных формы: РеквизитФормыВЗначение("Объект")
- 2Вызовите у объекта метод Прочитать()
- 3Верните данные в форму: ЗначениеВРеквизитФормы(ОбъектДанных, "Объект")
- 4Проверьте, что форма отображает актуальные значения, а флаг модифицированности сброшен
Разница между Прочитать(), ПолучитьОбъект() и обновлением формы
Эти подходы часто путают, хотя они решают разные задачи. ПолучитьОбъект() создаёт новый объект в памяти и сразу читает данные по ссылке — это первичная загрузка. Прочитать() работает с уже существующим объектом и перезаписывает его содержимое. Обновление формы (команда «Обновить», ОповеститьОбИзменении) меняет только представление данных в интерфейсе, не затрагивая серверные объекты вашего кода.
| Способ | Когда применять | Ограничения |
|---|---|---|
| Команда «Ещё → Обновить» | Пользователь видит устаревшие данные в форме | Теряются несохранённые изменения формы |
| Прочитать() | Откат изменений объекта в коде, актуализация перед записью | Доступен только на сервере; требует объект, а не ссылку |
| ПолучитьОбъект() | Первичная загрузка объекта по ссылке | Каждый вызов создаёт новый экземпляр — лишняя нагрузка в циклах |
| ОповеститьОбИзменении() | Уведомить открытые формы о записи объекта | Работает только с формами, открытыми в том же сеансе |
| Элементы.Список.Обновить() | Обновить динамический список на форме | Только клиентский контекст, только списки |
Выбор зависит от задачи: внутри транзакции записи логичен Прочитать(), для синхронизации интерфейса — оповещения, а рядовому пользователю достаточно штатной команды формы.
Сравнение вариантов
Подходит для отката изменений и актуализации объекта в серверном коде. Не работает на клиенте и требует наличия объекта, а не ссылки.
Подходит для обновления открытых форм после записи. Не влияет на другие сеансы и фоновые задания.
Подходит для полного перечитывания основного реквизита формы. Требует серверного вызова и осторожности с несохранёнными данными.
Типичные ошибки при перечитывании данных
Самая частая ошибка — попытка вызвать Прочитать() у ссылки. Ссылка — это только идентификатор объекта, у неё нет метода Прочитать(). Сначала нужно получить объект: Объект = Ссылка.ПолучитьОбъект(), и уже у него вызывать перечитывание.
Вторая распространённая проблема — перечитывание объекта внутри обработчика ПередЗаписью или ПриЗаписи того же объекта. Это приводит к рекурсии или к затискиванию записываемых данных. Если нужно сравнить с версией в базе, читайте данные через отдельный запрос или через ПолучитьОбъект() по ссылке в другую переменную — но не перезаписывайте текущий объект.
Третья ошибка — ожидание, что Прочитать() на сервере автоматически обновит форму у пользователя. Серверный объект и данные формы — разные сущности; после серверного перечитывания форму нужно обновить отдельно, иначе пользователь продолжит видеть старые значения.
Как проверить результат и избежать проблем
После перечитывания убедитесь, что объект действительно содержит актуальные данные. Простой способ — проверить значения ключевых реквизитов или сравнить версию данных. Для формы признаком корректного перечитывания служит сброшенный признак модифицированности: если после ЗначениеВРеквизитФормы форма считается изменённой, данные в ней отличаются от базы.
В многопользовательской среде учитывайте блокировки. Если объект в момент вызова Прочитать() заблокирован другим сеансом для изменения, чтение обычно выполняется (управляемые блокировки не мешают чтению), но данные могут быть не самыми свежими до завершения чужой транзакции. Для критичных проверок используйте чтение внутри транзакции с нужным уровнем изоляции.
При массовой обработке не перечитывайте каждый объект «на всякий случай». Если данные уже получены запросом, они актуальны на момент чтения; повторное Прочитать() оправдано только после длительной паузы или при подозрении на параллельные изменения.
Как проверить результат
Совпадают с данными объекта, открытого в отдельном сеансе
Значения не изменились — возможно, перечитан не тот объект или изменения не были записаны в базу
Флаг модифицированности сброшен
Форма «горит» как изменённая — данные формы расходятся с базой
После записи в другом сеансе и обновления форма показывает новые данные
Форма показывает старые данные — не сработало оповещение или обновление
Часто задаваемые вопросы
Чем перечитывание отличается от перепроведения документа?
Перечитывание (Прочитать) только загружает данные из базы в память и ничего не меняет в учёте. Перепроведение — это запись документа с формированием движений по регистрам. Перечитать документ можно сколько угодно без последствий, а перепроведение изменяет состояние учёта.
Можно ли перечитать объект на клиенте без вызова сервера?
Нет, чтение данных из базы выполняется только на сервере. На клиенте доступны лишь обновление отображения динамических списков (Элементы.Список.Обновить()) и обработка оповещений об изменениях. Для полноценного перечитывания объекта нужен серверный вызов.
Что произойдёт, если перечитать объект, который удалили из базы?
Метод Прочитать() вызовет исключение, так как объект с указанной ссылкой не найден. Перед перечитыванием полезно проверять существование объекта запросом или функцией проверки ссылки, особенно в обменах и фоновых заданиях.
Как обновить все открытые формы списка после изменения данных?
Вызовите ОповеститьОбИзменении() с типом или ссылкой — открытые в текущем сеансе формы, отображающие эти данные, обновятся автоматически. Для форм в других сеансах такого штатного механизма нет; там пользователи обновляют списки вручную или через автообновление динамического списка.
Почему после Прочитать() табличная часть осталась со старыми строками?
Такого быть не должно: Прочитать() перезагружает объект целиком, включая табличные части. Если строки старые, скорее всего, перечитан один экземпляр объекта, а отображается другой (например, данные формы не обновлены), либо изменения в базе ещё не были записаны другим сеансом.
Нужно ли перечитывать объект перед записью, чтобы не потерять чужие изменения?
Нет, наоборот: перечитывание перед записью затрёт ваши изменения. Для контроля параллельных изменений платформа использует механизм версионирования объектов — при записи проверяется версия данных, и если объект менялся в другом сеансе, возникает конфликт блокировок. Обрабатывайте это исключение, а не перечитывайте объект заранее.
Что важно запомнить
Пользователь перечитывает объект командой «Ещё → Обновить», разработчик — методом Прочитать() у объекта, а формы синхронизируются оповещениями об изменении. Перед любым перечитыванием сохраняйте несохранённые данные: они будут замещены содержимым базы без возможности восстановления.