Имя: Пароль:
1C
 
Подскажите правильный способ проверки и записи таблицы в РС.
,
0 Doomer
 
02.01.13
19:08
Есть у меня РС периодический. Есть Таблица значений. Задача проверить есть ли записи из этой таблицы в РС и записать в РС только те которых в РС нет. Пытаюсь придумать "правильный", "восьмерочный" способ выполнения этой задачи.
1 Ахмадинежад
 
02.01.13
19:11
Создать набор записей, проставить в качестве отборов значения из столбцов (списки значений) и прочитать - если набор будет пустой - значит нет таких записей... Плюс результирующий набор пробежаться перебором
2 Doomer
 
02.01.13
19:13
Пока придумал такой способ
1. Делаю запрос к РС, там тоже добавляю колонку типа будево "Есть в РС". Все записи устанавливаю в "Истину"
2. Левым соединением пристегиваю к ТЗ данные из РС.
3. Выполняю запрос.
4. Выгружают из Таблицы запроса записи у которых "Есть в РС" равно "Ложь".
5. Полученную таблицу пихаю в РС.
3 Doomer
 
02.01.13
19:14
(1) Может быть такая ситуация в ТЗ 10 строк из них 2 есть в РС, остальные нужно туда записать.
4 Doomer
 
02.01.13
19:19
РС периодический. Данные могут быть записаны в разное время. Например 2 записи попали в РС 01.12.12, а потом 06.12.12 нужно туда записать 6 из них 2 были записаны 01.12.12. Нельзя трогать старые 2 записи.
5 fisher
 
02.01.13
19:20
(2) Нифига не понял.
По идее, достаточно одного запроса с полным соединением ТЗ и РС, чтобы вернуть записи, которых нет в РС и нет в ТЗ. Или речь только о небольших "догрузках" в громадный РС?
6 Doomer
 
02.01.13
19:25
(5) Попробую подробнее
1. Через менеджер временных таблиц передаю в запрос ТЗ.
2. Делаю вложный запрос к РС, там тоже добавляю колонку типа будево "Есть в РС". Все записи устанавливаю в "Истину"
2. Левым соединением пристегиваю обединяю ТЗ с РС.
3. Выполняю запрос.
4. Выгружают из Таблицы запроса записи у которых "Есть в РС" равно "Ложь".
5. Полученную таблицу пихаю в РС.
7 Doomer
 
02.01.13
19:25
(5) Я и сделал один запрос.
8 Miss1C
 
02.01.13
19:27
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл  
НЗ = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
НЗ.Отбор.Контрагент.Установить(СтрокаТЗ.Контрагент");
НЗ.Отбор.Организация.Установить(СтрокаТЗ.Организация);
НЗ.Прочитать;
Если НЗ.Количество() = 0 Тогда
 Записываю данные
КонецЕсли;
КонецЦикла;
9 Doomer
 
02.01.13
19:28
(5) Да есть громадный РС в него нужно дозаписывать данные.
10 Miss1C
 
02.01.13
19:29
(9) Отбор делай, будит тебе счастье
11 zippygrill
 
02.01.13
19:31
Записываю данные(), ошибка при выпонении. Процедура или функция с таким именем не найдена :):)
12 Miss1C
 
02.01.13
19:32
(11) ))
14 Doomer
 
02.01.13
19:33
(10) По моему не самое правильное решение накладывать отборы в РС и читать данные в цикле.
15 Miss1C
 
02.01.13
19:34
(14)Почему?
16 Miss1C
 
02.01.13
19:35
(14) По скорости лучше не сделаешь
17 Doomer
 
02.01.13
19:40
Я слабо представляю как 1С взаимодействует на уровне таблиц с СУБД, но по моему на каждой итерации вашего цикла будет производится выборка данных из БД и формироваться результирующая таблица, которая будет передаваться на клиенту. Если у меня в ТЗ 10000 строк, то мы получим 10000 обращений к БД которые она должна будет отработать. Не уверен, что это оптимально.
18 Miss1C
 
02.01.13
19:42
(17) Ну тогда выберите запросом эти 10000 строк получите ТЗ и сравнивайте со своей методом НайтиСтроки
19 zippygrill
 
02.01.13
19:47
Можно немножко уменьшить размер тз путем откидывании уже сушествуюших записей в РС, и потом просто в цикле по тз добавить записи.
20 zippygrill
 
02.01.13
19:49
Ну или как там мисс говорит
21 Doomer
 
02.01.13
20:10
Вот такой запрос накидал:
ВЫБРАТЬ
                |    ЗапросКТЗ.Работы
                |ПОМЕСТИТЬ ТаблицаРабот
                |ИЗ
                |    ТаблицаРабот КАК ЗапросКТЗ
                |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УРВ_СостояниеРабот.СрезПервых КАК УРВ_СостояниеРаботСрезПервых
                |        ПО ЗапросКТЗ.Работы = УРВ_СостояниеРаботСрезПервых.Работа
                |ГДЕ
                |    (НЕ УРВ_СостояниеРаботСрезПервых.Работа = NULL)
22 XLife
 
02.01.13
20:12
все не читал... про запрос уже было?
23 Лефмихалыч
 
02.01.13
21:27
(21) любое сравнение с NULL в запросе всегда возвращает ложь. Именно по этой причине были изобретены ЕСТЬNULL() и есть NULL.
Учи матчасть
24 ДенисЧ
 
02.01.13
21:29
(21) "УРВ_СостояниеРаботСрезПервых.Работа = NULL"


мдя.... расстрелять. На 15 лет. Без права переписки.
25 Doomer
 
02.01.13
21:29
(24) Да накосячил. Ну я без проверки писал. Только в конфигураторе накидал.
26 Doomer
 
02.01.13
21:32
+25 Поторопился что сказать.
27 milan
 
02.01.13
22:20
Зачем тебе срез? Временную таблицу левым соединением с таблицеей регистра по периоду и всем измерениям выбирай где таблица регистра есть null - вот готовая таблица для записи в регистр
28 ILM
 
гуру
02.01.13
22:35
(0) - (27) Не кошерно это...
Нужно по книжному:
РегистрСведенийНаборЗаписей.<Имя регистра сведений> (InformationRegisterRecordSet.<Имя регистра сведений>)
Записать (Write)
Синтаксис:

Записать(<Замещать>)
Параметры:

<Замещать> (необязательный)

Тип: Булево.
Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям
Значение по умолчанию: Истина
Описание:

Записывает набор записей в базу данных. В зависимости от переданного параметра, может быть выполнено добавление записей или их замещение.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

Для регистров сведений, подчиненных регистратору, при вызове с параметром <Замещать> равным Ложь после записи в информационную базу набор записей очищается (удаляются записи из набора).
Пример:

НаборКурсов.Записать();
29 ILM
 
гуру
02.01.13
22:35
Если СП пропили, могу подарить...
30 Doomer
 
03.01.13
12:21
(28) Я может туплю, но в вашем случае будет производиться повторная запись всей таблицы.
31 milan
 
03.01.13
12:26
(28) клюшкистайл?
32 ILM
 
гуру
03.01.13
13:28
(30) (31) С какого бодуна?

В  (0) вопрос: "как дописать?", в (28) ответ.
Про отборы и т.д. вопросов не было...
33 sapphire
 
03.01.13
13:32
(32) Если не указывать отбор по измерениям.
34 ILM
 
гуру
03.01.13
13:40
Если не указывать отбор и поставить строку
НЗ_РС.Записать(Ложь);  
то набор записей допишется в таблицу. Причем скорость записи будет зависеть от кол-ва измерений и кол-ва строк в наборе записей.
35 rozer76
 
03.01.13
20:11
34)сэр, вы практикуете или просто знаток СП? При параметре="ложь" необходимо позаботиться о том, чтобы значения измерений добавляемых записей были уникальны для существующих записей в РС, иначе запись выполнена не будет и не важно есть отбор или нет. Т.е. сначала полюбому читать. В Вашем случае "прокатит" только разве что если обернуть в "Попытка..."
36 ILM
 
гуру
03.01.13
22:52
А я и читаю, это ТС не читает ))
37 hhhh
 
03.01.13
23:15
(35) регистр периодический. Поэтому значения измерений не должны быть так уж и уникальны.
38 rozer76
 
03.01.13
23:39
(37)дада, еще одно измерение РС но сути не меняет. Наверно оптимальнее делать запросом и в отсортированной выборке писать в пустой РС частичными наборами записей. В таком случае и уникальность будет  при "Записать(ложь)" и не так тормознуто как в (8).