Имя: Пароль:
1C
1С v8
Загрузка данных в регистр сведений.
0 lirt82
 
27.02.26
08:14
Всем привет. Конфигурация самописная, имеется сформированная таблица значений ДанныеСВебсайта, которая содержит информацию об адресах сотрудников компании (колонка Сотрудник, АдресПроживания, ГородПроживания и т.п.), данные в таблице актуальные, так как вводятся изначально на сайте компании и полученные в моменте через http-запрос в обработке.
Необходимо данные из ТЗ "ДанныеСВебсайта" актуализировать с самописным независимым периодическим регистром сведений "АдресаСотрудниковКомпании". У этого регистра 1 измерение "Сотрудник" тип справочник ссылка сотрудники и несколько ресурсов Город, Адрес и т.д.
Можно было сразу загрузить ТЗ в регистр НаборАдресовСотрудников.Загрузить(ДанныеСВебсайта); но в этом случае затрутся все записи регистра, этого нельзя допускать так как регистр должен хранить историю. Также в регистре есть записи сделанные вручную пользователем(их нужно проверить на актуальность (срезом последних)).
В итоге как правильно скрестить обе таблицы (таблица данных с вебсайта с таблицей регистра сведений) и актуализировать записи если они есть (напрм. в регистре сведении может быть запись с актуальным адресом но с пустым значением ресурса Город) или отсутствие записи тогда добавляем новую.
Таблица с вебсайта содержит больше тысячи строк следовательно как сделать скрещивание производительным, желательно без обхода в цикле результата и тысяч раз обращении в базе к набору для поиска, записи изменении?
Такая актуализация данных сайта с данными в базе будет происходить на постоянной основе.
1 Fish
 
гуру
27.02.26
08:19
Соединение в запросе.
2 Fish
 
гуру
27.02.26
08:21
+(1) А вообще, данных недостаточно. Например, что значит "актуализировать записи если они есть", если регистр периодический и "регистр должен хранить историю"?
Не очень понятно.
3 AAA
 
27.02.26
08:33
Я тоже ничего не понял. Если периодический, то обновляйте запись или записи на требуемую дату. А с точки зрения объема 1000 записей в файле это смешно, чтобы над этим морочиться, если конечно грузите не каждые 10 сек
4 Stepashkin
 
27.02.26
08:39
(0) Запрос с параметром в виде ТЗ с соединением.
5 Мультук
 
гуру
27.02.26
08:41
(0)



0) Загружаем таблицу значений в ВТ_ТАБ

1) Получаем срез последних регистра в ВТ_СРЕЗ

2) Объединяем два запроса

2.1) Измененные записи

ВЫБРАТЬ
  ....

ИЗ 
   ВТ_СРЕЗ как т1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТАБ как т2 
ПО т1.Сотрудник = т2.Сотрудник
ГДЕ
   т1.АдресПроживания <> т2.АдресПроживания
   или т.п.


2.2) Новые записи


ВЫБРАТЬ
  ....

ИЗ 
   ВТ_ТАБ как т2 ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СРЕЗ как т1 
ПО т1.Сотрудник = т2.Сотрудник
ГДЕ
   т1.Сотрудник is NULL


3) Результат запроса вносим в регистр с помощью МенеджерЗаписи

P.S.
Считаем что, то что пришло с сайта, априори важнее/правильнее, того что в регистре.

P.P.S.
Если не секрет, чем вы занимались (судя по профилю) последние 16 лет ?
6 Stepashkin
 
27.02.26
08:42
(5) Я тоже удивился.
7 lirt82
 
27.02.26
09:17
(5) 3) Результат запроса вносим в регистр с помощью МенеджерЗаписи
обходя результат запроса в цикле и по количеству строк в результате столько же раз устанавливаем отбор для менеджера.
8 Fish
 
гуру
27.02.26
09:18
(7) И что тебя смущает?
9 lirt82
 
27.02.26
09:48
(8) количество обращении к базе в цикле
10 Fish
 
гуру
27.02.26
09:53
(9) Сгруппируй по периодам и пиши наборами. Но при смехотворном количестве +-1000 строк, имхо, нет смысла заморачиваться с этим.
11 Stepashkin
 
27.02.26
09:57
(10) Да, 1000 строк ни о чем.
12 Fish
 
гуру
27.02.26
10:04
К тому же, на последних платформах, при записи набора можно использовать режим замещения Добавление или Слияние.
13 Мультук
 
гуру
27.02.26
10:08
(7)

тт = ТекущаяДата();

Для строка из тз Цикл

   мен = РегистрСведений.МойНяшныйРегистр.СоздатьМенеджерЗаписи();
   ЗаполнитьЗначенияСвойств(мен, строка); 
   мен.Период = тт;
   мен.Записать();

КонецЦикла;


Да, неявные отборы тут есть.
Но увы.

Можно поступить по новому, но для этого нужно читать вот это и пробовать

https://infostart.ru/1c/articles/2508120/
14 lirt82
 
27.02.26
12:30
(5) пункт 2) соединить 2 таблицы или ОБЪЕДИНИТЬ ВСЕ?
разобрался, получилось как нужно.
Мультук реально гуру.
15 Stepashkin
 
27.02.26
13:39
(14) ОБЪЕДИНИТЬ - это когда данные из второй таблицы добавляются в первую таблицу, СОЕДИНЕНИЕ соединяет две таблицы по условию.
16 Garykom
 
гуру
27.02.26
13:50
(0)
В итоге как правильно скрестить обе таблицы

Нанять программиста?
17 Garykom
 
гуру
27.02.26
14:29
(5) Имхо не надо делать все это запросами и разом с кучей записей
Особенно когда уровня не хватает

Уко ну напишите сначала добавлени/обновление нужных записей простым кодом в цикле
Отладьте все, запустите в прод

И вот когда уже будут жаловаться на тормоза - начинайте попытки оптимизировать
Только обязательно учитывать возможные глюки соединений, когда упс и дубли по ключам ))
18 lirt82
 
27.02.26
14:41
(17) до прода не дойдет :) на стадии кода ревью завернут с замечаниями. Кстати вариант с кодом в цикле я сделал и протестил самостоятельно.
19 ass1c
 
27.02.26
15:40
Можно попробовать пойти еще дальше. Эту относительно новую фишку платформы еще не использовал, но "возможно" она существенно ускоряет процесс изменения записей:

РежимЗамещения (ReplacementMode)
Доступен, начиная с версии 8.3.25.
Описание:
Определят набор возможных режимов замещения при записи набора записей регистра сведений.
Значения:

Добавление (Append)
Замещение (Replace)
Обновление (Update)
Слияние (Merge)
Удаление (Delete)


        НаборЗаписей = РегистрыНакопления._ДемоОстаткиТоваровВМестахХранения.СоздатьНаборЗаписей();
        НаборЗаписей.РасширенныеРежимыЗамещения = Истина;
        НаборЗаписей.Отбор.Сбросить();
        Для Индекс = КоличествоОбновляемыхЗаписей По КоличествоНедостающихЗаписей - 1 Цикл
            ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), НедостающиеЗаписи[Индекс]);
        КонецЦикла;                                      
        НаборЗаписей.Записать(РежимЗамещения.Добавление);
20 Garykom
 
гуру
27.02.26
16:06
(18) У вас там предпочитают красивый/быстрый но потенциально кривой код да?
Который без конкретных данных даже на ошибки не проверить
21 Garykom
 
гуру
27.02.26
16:10
(19) А нафига?
Зачем извращаться когда правильный метод работы с РС - многопоточность

Хотим быстрее - не надо разом кучу записей удалять/добавлять или обновлять
Можно и по одной но в кучу потоков
22 ass1c
 
27.02.26
16:29
(21) Я просто считаю что эта информация имеет место быть в данной ветке. А нафига и как её использовать уже каждый решит сам в меру своего опыта и интеллектуальных способностей
23 Timon1405
 
27.02.26
17:35
(19)(22) оно для регистров подчиненных регистратору, а у ТС независимый. RTFM!
24 Мультук
 
гуру
27.02.26
17:48
(23)

>> оно для регистров подчиненных регистратору, а у ТС независимый

Намекаете, что опять программисты 1С не читают свои же мануалы.
А потом, эвон -  пишут в РС без регистратора

Набор = РегистрыСведений.НекийРегистрБезРегистратора.СоздатьНаборЗаписей();
Набор.Загрузить(Этапы);
Набор.Записать(РежимЗамещения.Слияние);