Как получить значение реквизита до изменения 1с

Обновлено: 05.07.2024

Общая информация

Начнем с общей теоретической информации о том, что такое история данных и как она устроена.

Описание и возможности

История данных — это механизм позволяющий хранить в базе данных упорядоченные по времени версии объектов конфигурации. Под версией понимаются данные, которые были в объекте на момент редактирования и состояние метаданных на момент редактирования. Хранить историю можно как для всего объекта целиком, так и для отдельных реквизитов — имеется возможность тонкой настройки работы механизма для каждого реквизита, в том числе табличные части.

Включать и выключать историю можно как из конфигуратора, так и средствами встроенного языка, все это дает возможность управлять историей для каждого пользователя отдельно.

Само по себе хранение истории достаточно бесполезная функция, поэтому с историей данных можно выполнять следующие операции:

  • записывать версию данных;
  • получать данные определенной версии;
  • удалять данные определенной версии;
  • получать разницу между двумя версиями одного объекта;
  • прочие полезные возможности.

На момент написания статьи (8.3.13) история данных поддерживается для следующих объектов:

  • общие реквизиты;
  • константы;
  • справочники;
  • документы;
  • бизнес-процессы;
  • задачи;
  • регистры сведений;
  • планы обмена;
  • планы счетов;
  • планы видов характеристик;
  • планы видов расчетов;
  • расширения конфигурации.

Работа с историей данных регулируется правами доступа и отражается в журнале регистрации.

Устройство механизма

История данных хранится в специальных таблицах информационной базы. Кроме самих данных в этих таблицах хранятся метаданные прежних версий объектов. Версии метаданных создаются в момент изменения этих самых метаданных у объекта и никак не связаны с изменением данных объекта.

Также следует помнить, что на данный момент система не отличает включение версионирования для реквизита от создания реквизита и отключение версионирования реквизита от удаления реквизита.

Настройка версирования объектов осуществляется либо из конфигуратора либо при помощи встроенного языка. Конфигуратор логично использовать в тех случаях, когда история данных потребуется во всех режимах работы приложения или на нее завязана какая-то прикладная логика. Использование встроенного языка потребуется для реализации более гибкой системы, например когда пользователя потребуется самому выбирать для каких объектов хранить историю данных.

  • стандартных реквизитов;
  • реквизитов объектов;
  • реквизитов табличных частей;
  • измерений регистров сведений (без возможности отключения);
  • ресурсов регистров сведений.

Использование механизма

Для обращения к истории данных используется свойство глобального контекста ИсторияДанных, методы этого этого свойства будут рассмотрены ниже.

Управление использованием истории данных

Проверка изменения данных при записи объектов

В некоторых случаях при записи объектов возникает необходимость проверки, какие данные объекта были изменены и какие были значения до изменения.

Допустим, при записи документа, может возникнуть потребность проверить, не изменилась ли дата документа, и если дата изменилась, то откорректировать движения документа, которые не обновляются при его проведении (например, вводятся вручную).

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

Правильным способом реализации такой проверки является считывание значений тех реквизитов, изменения которых нужно анализировать, непосредственно из базы данных.

Например, считывание может быть выполнено обращением через ссылку:

Однако следует учитывать, что при обращении к ссылке считывается весь объект целиком. То, что он ранее считывался и находится в кеше, здесь не поможет, так как при работе транзакции используется отдельный кеш. Соответственно, затраты на получение одного или двух реквизитов могут оказаться неоправданно большими. Поэтому можно рекомендовать для считывания отдельных реквизитов использовать запросы. Например:

В этом случае из базы данных будет считан ровно один реквизит, который требуется анализировать.

Заметим, что таким способом можно, например, определить, что объект помечается на удаление. Для этого достаточно проверить, изменение поля ПометкаУдаления .

Однако если нам нужно обработать изменение реквизита после записи документа, например, в обработчике ПриЗаписи , то, разумеется, считывание данных из базы данных не подходит, так как информация в базе данных уже изменена. В этом случае нужно само считывание выполнять в обработчике ПередЗаписью и запоминать считанные значения в переменных модуля. А уже анализ выполнять в обработчике ПриЗаписи .

Добрый день, есть вопрос
Как сделать чтобы реквизит табличной части документа получал данные из реквизита справочника.
Т.е. при изменении "ФИО" в табличной части документа подставлялись значения (ДатаРождения, Должность)из справочника (Сотрудники)

Есть справочник Сотрудники, реквизиты "Должность", "Дата рождения"

Есть документ в нем табличная часть "Налоги" и его реквизиты "ФИО" "Должность" "ДатаРождения"

если просто ссылаться через форму на значения справочника то в документе выводится визуально и ДатаРождения, и Должность, но на печати эти поля пустые и при установке условий они ни как не считываются, а как будто пустые

Прошу в поиск не посылать, т.к. пробывал уже много вариантов в т.ч. программно через функции

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

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

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


Получение реквизита из справочника в табличную часть документа
Здравствуйте, полный нуб в 1с. Прошу больно не пинать. Вопрос самый простой и глупый. Есть документ.

Mujinin, пропишите заполнение этих полей при изменении ФИО. Какая форма? Если управляемая, то значения получать придется на клиенте. Иначе - можно все в одной процедуре.
Пример для управляемой:

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

делал все тоже самое только "ФИО" в

Не подскажите, а как сделать все тоже самое, но только у меня это не строки в ТЧ а реквизиты дока.

Anmut, я бы лучше изменял реквизиты объекта на сервере. Думаю так будет правильнее

нет не правильнее и ведет к снижению производительности. Вы туда сю форму спакуете и отправите, добавите и потом все это полетит назад по сети.

Лучше серверный вызов делать в один раз, получать маленькие данные и заполнить на клиенте. Т.к. объет на форме уже заблокирован вами.

onsamuy --> onsamuy



Просмотр профиля

обычная форма, обычный елемент управления "поле ввода", тип число, без кнопок.
суть в том что при изменении проводится проверка, какая неважно, нужно если проверка не прошла, возвратить значение поля ввода до изменения.

logist --> logist



Просмотр профиля onsamuy --> onsamuy



Просмотр профиля

Пробовал. Странно то, что "СтандартнаяОбработка = Ложь" очищает поле ввода, но не возвращает предыдущее значение.

logist --> logist



Просмотр профиля Zaval --> Zaval



Просмотр профиля

Так не получится. Если окончен ввод в поле - его значение изменено, старое значение в поле затерто.
Если док не новый - то прежнее значение можно прочитать из БД, там оно изменится только после записи документа.
А можно все сделать в самой форме.
В модуль формы добавить переменную СтароеЗначениеХХХ.
К полю подцепить . НачалоВыбора() и в нем сохранять текущее значение в СтароеЗначениеХХХ.
Потом хоть в ПриИзменении() или еще где проверять значение, если не нравится - восстановить из переменной.

logist --> logist



Просмотр профиля

Так не получится. Если окончен ввод в поле - его значение изменено, старое значение в поле затерто.

И НачалоВыбора не сработает если вводить сразу в поле (в топике указано что поле без кнопок).

Zaval --> Zaval



Просмотр профиля

Читайте также: