Имя: Пароль:
1C
1С v8
Как получить быстро реквизит версии объекта?
0 Mechanik21
 
01.09.22
14:46
Пишу сводный отчёт по изменениям пользователями документов.
В частности показываю, как менялась сумма документов и кто её менял. Делаю запрос к регистру сведений Версии объектов.
Сейчас реквизиты объекта получаю так:

ДвоичныеДанные = ВерсионированиеОбъектов.СведенияОВерсииОбъекта(Строка.Объект.Ссылка, Строка.НомерВерсии).ВерсияОбъекта;
Результат = ВерсионированиеОбъектов.РазборПредставленияОбъектаXML(ДвоичныеДанные, Строка.Объект.Ссылка);

из-за большого объёма информации работает медленно. Можно ли более быстро получить значения реквизитов версии?
1 1Сергей
 
01.09.22
14:48
Попробуй писать запрос быстрее
2 Kassern
 
01.09.22
14:49
(0) создайте свой регистр и фиксируйте там изменение сумм. Будете очень быстро получать данные, нежели каждый раз из ДД читать версию и выцеплять от туда суммы
3 timurhv
 
01.09.22
14:51
(0) Перейти на платформенную историю? Там можно сразу наложить отбор
ИсторияДанных.ВыбратьВерсии(<Отбор>, <Колонки>, <Порядок>, <МаксимальноеКоличество>)
Параметры:
<Отбор> (обязательный)
Тип: Структура.
Структура, содержащая условия отбора версий. В качестве пары "Ключ" - "Значение" используются:
Метаданные (Metadata) - значение типа ОбъектМетаданных: Справочник, ОбъектМетаданных: Документ, ОбъектМетаданных: РегистрСведений, ОбъектМетаданных: БизнесПроцесс, ОбъектМетаданных: Задача, ОбъектМетаданных: ПланСчетов, ОбъектМетаданных: ПланВидовХарактеристик, ОбъектМетаданных: ПланОбмена, ОбъектМетаданных: ПланВидовРасчета, ОбъектМетаданных: Константа.
Данные (Data) - значение типа СправочникСсылка.<Имя справочника>, ДокументСсылка.<Имя документа>, РегистрСведенийКлючЗаписи.<Имя регистра сведений>, БизнесПроцессСсылка.<Имя бизнес-процесса>, ЗадачаСсылка.<Имя задачи>, ПланСчетовСсылка.<Имя плана счетов>, ПланВидовХарактеристикСсылка.<Имя плана видов характеристик>, ПланОбменаСсылка.<Имя плана обмена>, ПланВидовРасчетаСсылка.<Имя плана видов расчета>, КонстантаКлючЗначения.<Имя константы>. Используется для отбора версий конкретного объекта данных или записи регистра сведений. Если для объекта метаданных настроено ограничение прав доступа на уровне записей (RLS) или нет права "ЧтениеИсторииОтсутствующихДанных", то выполняется чтение данных. Если данные отсутствуют, генерируется исключение.
ЗначенияПолей (FieldValues) - значение типа Массив. Отбор по значению поля. Массив содержит элементы типа Структура, описывающие условия, накладываемые на данные версии. Отбираются версии, которые удовлетворяют всем условиям списка (условия объединяются по И):
Поле (Field) - значение типа Строка. Обязательный. Предназначен для поиска версий, содержащих указанное поле. Если указана табличная часть, то выполняется поиск по всем дочерним полям.
4 Mechanik21
 
01.09.22
14:53
(3) Это интересно.
спасибо, попробую
5 timurhv
 
01.09.22
14:55
(4) Только это будет работать с момента включения галочки у документа в конфигураторе.
6 СеменовСемен
 
01.09.22
16:46
(3) так зачем отбор, когда уже прям нужная версия есть. Долго идет десериализация. но от нее не избавишься
7 timurhv
 
01.09.22
17:07
(6) Это платформенный механизм "ИсторияДанных", не БСП и не общий модуль.

В БСП в двоичных данных хранится полная версия объекта (если хоть 1 реквизит был изменен, иначе просто сохраняется в истории кто записывал с прошлым хэшем без создания снимка версии. При сравнении берется предыдущая запись с измененной частью по хэшу).
В платформенном механизме только изменения, если это создание, то полный снимок.

Плюс БСП что можно удалять старые версии, минус - очень сильно проседает скорость записи документа (если не наверчена тяжелая бизнес-логика). Ну и как у товарища, нельзя быстро прочитать изменения по реквизиту документа.
Плюс платформы - можно накладывать отборы, высокая скорость записи (практически не отличается от голой записи документа, погрешность 1%), хранится только изменение. Минус - нельзя удалять версии, иначе переход в пользовательском режиме на нужную версию будет невозможен (нет 1-ого снимка, мы храним только изменения, хотя текущая версия есть в таблицах, не знаю почему не довели в 1С до ума), нужно писать код.
8 Kassern
 
01.09.22
17:08
(7) а где хранятся изменения объектов на уровне платформы?
9 timurhv
 
01.09.22
17:39
(8)
dbo._DataHistoryVersions - версии (создание, изменение, удаление)
dbo._DataHistoryLatestVersions* - последний снимок объекта
dbo._DataHistoryMetadata - вроде, настройки метаданных как в конфигураторе
dbo._DataHistorySettings - вроде, пользовательские настройки (можно их переопределить в пользовательском режиме)
dbo._DataHistoryQueue* - очередь изменений, после записи объекта они попадают сюда, после вызова ИсторияДанных.ОбновитьИсторию записываются в dbo._DataHistoryVersions