Вход | Регистрация


1С:Предприятие ::

Метки: 

Подскажите правильный способ проверки и записи таблицы в РС.

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


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

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

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

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

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

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

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

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

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

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



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует