Имя: Пароль:
1C
1С v8
Удаление записи из регистра сведений
0 travelekb
 
06.04.13
22:42
Доброго вечера.
Как я уже писал пару раз - я начинающий, потихоньку практикуюсь в 1С 8.2 по вечерам и ночам.
Прошу помощи в решении следующего вопроса:

У меня есть Регистр сведений, в который записываются статусы (выгружен/не выгружен) выгружена или нет информация по товару в локальную папку на диске.
1. Товар добавляется в систему (приходуется на склад), при проведении документа, ему присваивается статус в этом регистре "не выгружен".
2. После того, как информация о всех товарах на складе выгружается в папку в текстовый файл, статус у товара в этом регистре должен поменяться соответственно на "выгружен", и что самое главное - предыдущий статус "не выгружен" - должен из регистра быть удален.

Подскажите как можно это сделать? Последовательность действий я вижу такую:
1. Нужно найти строку в регистре сведений с этим товаром и статусом "не выгружен".
2. Удалить этот статус "не выгружен" у этого товара
3. Добавить новый статус "выгружен".

никак не могу понять как подойти к решению. Простите за возможно глупый вопрос.
1 Staffa
 
06.04.13
22:45
Если все примитивно и просто, то вот так:
1. Создаешь набор записей регистра, накладываешь условие по товару.
2. Удалять записи не нужно
3. У найденных записей по п.1 меняешь ресурс на "Выгружен" и записываешь набор.
2 travelekb
 
06.04.13
23:02
(1), правильно ли я делаю?
1. Создаешь набор записей регистра, накладываешь условие по товару.
Нм = Товар.НоменклатураПокупателя;
НаборЗаписей = РегистрыСведений.СтатусыТоваров.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Нм);
как на данном шаге в отладчике можно проверить нашлось ли что-то? У меня подозрение, что тут не находит данные из регистра сведений.

2. Хорошо

3. У найденных записей по п.1 меняешь ресурс на "Выгружен" и записываешь набор.
тут нужно как то заменить на "выгружен"
далее НаборЗаписей.Записать();

верно?
3 Ksandr
 
06.04.13
23:06
Стр = НаборЗаписей.Добавить();
Стр.........
НаборЗаписей.Записать()

Если не Прочитать() то новый набор заместит старый
4 travelekb
 
06.04.13
23:21
никак не пойму, как изменить статус?
набор записей создал, условие по номенклатуре наложил и вроде даже нашлось то, что нужно.
А вот как статус сменить не пойму, просто перезаписывает и все тут...
5 hhhh
 
06.04.13
23:29
ЗаписьНабора.Статус = Перечисления.СтатусыВыгружеНеВыгружен.Выгружен;
6 Necessitudo
 
06.04.13
23:54
Нм = Товар.НоменклатураПокупателя;
НаборЗаписей = РегистрыСведений.СтатусыТоваров.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Нм);
НаборЗаписей.Прочитать();

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

Для Каждого Запись Из НаборЗаписей Цикл
  Запись.Статус = Перечисления.СтатусыВыгружеНеВыгружен.Выгружен;
КонецЦикла;

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

КонецЕсли;
7 Necessitudo
 
06.04.13
23:59
А еще наверное лучше отбор наложить на те записи, которые уже имеют статус Выгружен.
8 travelekb
 
07.04.13
00:08
(6), огромное спасибо! Я написал сам почти тоже самое, только, к сожалению, с 2 ошибками.

Вы писали: "А еще наверное лучше отбор наложить на те записи, которые уже имеют статус Выгружен."
А подскажите, пожалуйста, как наложить отбор И по номенклатуре, И по статусу "Выгружен" одновременно?

Можно ли использовать дважды конструкцию?
НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура);
НаборЗаписей.Отбор.Статус.Установить(Статус);
9 fimanich
 
07.04.13
00:14
(8) можно
10 hhhh
 
07.04.13
00:17
отбор только на измерения регистра накладывается
11 Necessitudo
 
07.04.13
00:24
(8) Надеюсь, что статус это всё же ресурс:)
12 travelekb
 
07.04.13
00:25
(10) да, спасибо. Так и есть. Там как раз два измерения:
"Номенклатура" и "Статус"

При попытке записи
НаборЗаписей.Записать();
вываливается с ошибкой почему-то, пока не могу понять из-за чего
13 travelekb
 
07.04.13
00:26
(11) "Статус" - это измерение регистра
14 Necessitudo
 
07.04.13
00:26
(12) Ну еще бы. Он ругается на то, что отбор установлен по одним полям, а запись идет по другим:)
15 Necessitudo
 
07.04.13
00:27
Нм = Товар.НоменклатураПокупателя;
НаборЗаписей = РегистрыСведений.СтатусыТоваров.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Нм);
НаборЗаписей.Отбор.Статус.Установить(Статус);

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

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

Для Каждого Запись Из НаборЗаписей Цикл
  Запись.Статус = Перечисления.СтатусыВыгружеНеВыгружен.Выгружен;
КонецЦикла;

НаборЗаписнй.Отбор.Статус.Установить(Перечисления.СтатусыВыгружеНеВыгружен.Выгружен);
НаборЗаписей.Записать();

КонецЕсли;
16 Necessitudo
 
07.04.13
00:29
А вообще на мой взгляд нужно оторвать руки тому, кто сделал статус измерением:) Если будет две одинаковые номенклатуры с разными статусами, счастья будет мало. Особенно если регистр независимый.
17 travelekb
 
07.04.13
00:34
Нм = Товар.НоменклатураПокупателя;
НаборЗаписей = РегистрыСведений.СтатусыТоваров.СоздатьНаборЗаписей(); //создали набор записей
НаборЗаписей.Отбор.Номенклатура.Установить(Нм);  //наложили отбор по номенклатуре
НаборЗаписей.Отбор.Статус.Установить(Статус);    // дополнительно наложили отбор по статусу

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

Если Не НаборЗаписей.Количество() = 0 Тогда  //если записей не ноль, то идем в цикл

Для Каждого Запись Из НаборЗаписей Цикл
  Запись.Статус = Перечисления.СтатусыВыгружеНеВыгружен.Выгружен;  //устанавливаем статус "выгружен"
КонецЦикла;

НаборЗаписнй.Отбор.Статус.Установить(Перечисления.СтатусыВыгружеНеВыгружен.Выгружен); //зачем эта строка? мы же уже изменили статус. Зачем еще раз отбор делать?

НаборЗаписей.Записать(); //записываем

КонецЕсли;
18 Necessitudo
 
07.04.13
00:36
Потому что сначала ты поставил отбор на то, что статус имеет значение Перечисления.СтатусыВыгружеНеВыгружен.НеВыгружен. Потом ты обошел записи и поменял измерение статус на Перечисления.СтатусыВыгружеНеВыгружен.Выгружен. Вот у набора записей и шок:)
19 Necessitudo
 
07.04.13
00:37
Да, и еще - ты не учел ситуации, когда измерение статус в регистре вообще не заполнено:) Или там стоит запрет незаполненных значений?
20 travelekb
 
07.04.13
00:43
(18), спасибо огромное! Я сейчас возьму тайм-аут переварить все это, у меня не так быстро все укладывается :) И еще раз главу по регистрам сведений перечитаю с учетом полученной только что информации. Еще раз спасибо и простите за столь глупые вопросы.
21 travelekb
 
07.04.13
00:53
Все запустилось вроде бы, но предыдущий статус "Не выгружен" тоже остался! А я хочу сделать так, чтобы из статусов "Выгружен" и "Не выгружен" всегда был только один, тот который актуальный.
Сейчас получается, мы добавили в регистр сведений еще один (дополнительный) статус товара, а вот как убрать предыдущий (или в общем случае предыдущие, если их несколько)?
22 Necessitudo
 
07.04.13
01:11
Естественно. Не зря же я бурчал про то, что статус должен быть ресурсом. Конечно, и так можно сейчас вывернуться - но для новичка сложновато будет:-) Посему убери отбор по статусу:-) :-) :-)
23 travelekb
 
07.04.13
01:15
Убрал отбор по статусу, выдает ошибку
Error calling context method (Записать)    НаборЗаписей.Записать();
because: Record with these key fields exists!
я так понимаю причина в том, что два одинаковых статуса быть не может у одного товара
24 travelekb
 
07.04.13
11:53
Сколько ни пробовал - никак не выходит, получается нужно переводить "Статус" с измерения в ресурс регистра, иначе никак ):
25 Necessitudo
 
07.04.13
12:15
Нм = Товар.НоменклатураПокупателя;
СтатусыВыгружеНеВыгружен =  Перечисления.СтатусыВыгружеНеВыгружен;

НаборЗаписей = РегистрыСведений.СтатусыТоваров.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Нм);
НаборЗаписей.Отбор.Статус.Установить(СтатусыВыгружеНеВыгружен.НеВыгружен);

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

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

Для Каждого Запись Из НаборЗаписей Цикл
  Запись.Статус = СтатусыВыгружеНеВыгружен.Выгружен;
КонецЦикла;

НаборЗаписей.Отбор.Статус.Установить(СтатусыВыгружеНеВыгружен.Выгружен);
НаборЗаписей.Записать();

НаборЗаписей.Отбор.Статус.Установить(СтатусыВыгружеНеВыгружен.НеВыгружен);
НаборЗаписей.Очистить();
НаборЗаписей.Записать();

КонецЕсли;
26 Necessitudo
 
07.04.13
12:17
За что мы так любим регистры сведений - так это за то, что там изкаропки уже будет контроль уникальности по всем измерениям. Я про независимый регистр конечно:)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn