Непереодический независимый РС. Как правильно записать набор в цикле?

1. GradEr1 25.11.19 14:33 Сейчас в теме
Есть непереодический независимый регистр в который записываются данные из ТЗ, наполняемой при чтении текстовых файлов логов.
Регистр:
Измерения: Дата(датавремя), ФизЛицо(справочникссылка);
Ресурс: Вес (Число);
Данные снимаются хаотично, т.е. в файле может быть за день 5 взвешиваний одного человека, может одно, может 234. Один человек - один файл, который наполняется дописываением новых данных в конец. Частота обновления лога - неделя (через неделю данные в файле очищаются и он пишется с нуля).
Данные логов пишутся в ТЗ, после чего ТЗ необходимо записать в регистр.
Проблема в том, что регистр уже может содержать часть данных из файла и нужно дописать только новые данные (ТЗ же каждый раз содержит данные файла целиком).
Можно-ли использовать для записи набор и если да -как правильно это сделать?

НаборЗаписей = РегистрыСведений.КонтрольВеса.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();
Для Каждого Стр из ТабЛогов Цикл			
			НовЗапись= НаборЗаписей.Добавить();
			НовЗапись.Дата = Стр.Дата;	
			НовЗапись.Пользователь = Стр.Пользователь;
                        НовЗапись.Вес = Стр.Вес;
КонецЦикла;
НаборЗаписей.Записать();
Показать
Найденные решения
6. Lenten 25 25.11.19 15:57 Сейчас в теме
(5) с итс:


Назначение и особенности использования менеджера записи регистра сведений
Объект РегистрСведенийМенеджерЗаписи используется для работы с независимыми регистрами сведений (не подчиненными регистратору). Можно сказать, что данный объект является вспомогательным.

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

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

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

С точки зрения производительности использование наборов записей будет максимально эффективным. Использование менеджера записей в некоторых случаях будет столь же эффективным, а в некоторых менее, так как будут выполняться лишние действия.
kotofot; GradEr1; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Lenten 25 25.11.19 14:46 Сейчас в теме
Для Каждого Стр из ТабЛогов Цикл

НаборЗаписей = РегистрыСведений.КонтрольВеса.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Дата.Установить(Стр.Дата);  
НаборЗаписей.Отбор.ФизЛицо.Установить(Стр.Пользователь);  

НаборЗаписей.Прочитать();

Если НаборЗаписей.Количество() = 0 Тогда

    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.ФизЛицо= Стр.Пользователь;
    НоваяЗапись.Дата= Стр.Дата;
    НоваяЗапись.Вес = Стр.Вес;

иначе

НоваяЗапись = НаборЗаписей[0];
НоваяЗапись .ФизЛицо= Стр.Пользователь;
НоваяЗапись .Дата= Стр.Дата;
НоваяЗапись.Вес = Стр.Вес;

КонецЕсли;

НаборЗаписей.Записать();

КонецЦикла;
Показать
GradEr1; user705522_constantin_h; +2 Ответить
3. GradEr1 25.11.19 15:07 Сейчас в теме
Lenten, Благодарю за то, что отписались.
Т.е. если я правильно понимаю, Вы предлагаете каждый раз внутри цикла создавать набор записей с отбором? Что-то мне подсказывает, что это не корректно... может есть "типовое" элегантное решение для такого случая?

Если нет, правильно-ли я понимаю, что замена записи набора на просто запись с замещением является более правильным решением?

Для Каждого Стр из ТабЛогов Цикл           
            НовЗапись = РегистрыСведений.КонтрольВеса.СоздатьМенеджерЗаписи();
            НовЗапись.Дата = Стр.Дата;    
            НовЗапись.Пользователь = Стр.Пользователь;
            НовЗапись.Вес = Стр.Вес;
            НовЗапись.Записать(Истина);
КонецЦикла;
4. Lenten 25 25.11.19 15:41 Сейчас в теме
(3) более типового способа я не помню. И надо понимать что все эти запросы в цикле вредны только при большом объеме данных и длительном выполнении операции. Запросы в цикле есть и типовых примерах 1с, ничего страшного.


касательно вашего кода
вам обязательно в наборе записей делать отбор. Иначе вы будете очищать ВЕСЬ регистр. Это не верно.
5. GradEr1 25.11.19 15:48 Сейчас в теме
(4) Да-да, про набор записей без отбора я понял, благодарю. А вот на счет последнего варианта, не через набор, а через менеджер записи? Так будет правильней или все равно?
6. Lenten 25 25.11.19 15:57 Сейчас в теме
(5) с итс:


Назначение и особенности использования менеджера записи регистра сведений
Объект РегистрСведенийМенеджерЗаписи используется для работы с независимыми регистрами сведений (не подчиненными регистратору). Можно сказать, что данный объект является вспомогательным.

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

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

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

С точки зрения производительности использование наборов записей будет максимально эффективным. Использование менеджера записей в некоторых случаях будет столь же эффективным, а в некоторых менее, так как будут выполняться лишние действия.
kotofot; GradEr1; +2 Ответить
8. Lenten 25 25.11.19 16:01 Сейчас в теме
(5) в вашем случае не думаю что можно сразу много записывать. У вас измерения Дата, ФизЛицо и вы по ним отбираетесь. Кучей можно было бы сделать например данные по 1 физ Лицу, но без даты. Т.е. вы все данные по человеку переписывали бы

НаборЗаписей = РегистрыСведений.КонтрольВеса.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ФизЛицо.Установить(Пользователь);  

НаборЗаписей.Прочитать();

Для каждого Стр из ТабЛогов Цикл  

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись .ФизЛицо= Стр.Пользователь;
НоваяЗапись .Дата= Стр.Дата;
НоваяЗапись.Вес = Стр.Вес;

НаборЗаписей.Записать();
Показать


КонецЦИкла;
7. GradEr1 25.11.19 16:00 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот