Имя: Пароль:
1C
1С v8
Обход записей регистра сведений с учетом отбора
0 СэдКС
 
12.11.13
10:39
Добрый день! Задача: на форме размещен список регистра сведений, над формой поле флажка, выставлен некоторый отбор по полям регистра. Отображаются записи соответственно отбору.
При включении флажка поле Выполнено включается у всех записей, а не только у отобранных записей.

Подскажите пожалуйста, какое условие выставить перед условием обхода полей регистра, чтобы флажок ставился только у отобранных полей (те поля, которые на данный момент выставил пользователь)?

условие на обход регистра:
Рег = РегистрыСведений.ПланированиеПоЗакупу;
    Выборка = Рег.Выбрать();
    Пока Выборка.Следующий() Цикл
        Запись = Выборка.ПолучитьМенеджерЗаписи();
        Запись.Прочитать();
        Если Выполнено = Истина тогда
             Запись.Выполнено = Истина;
            Иначе Запись.Выполнено = Ложь;
        КонецЕсли;
        Запись.Записать();
    КонецЦикла;
1 Господин ПЖ
 
12.11.13
10:41
за такой код принято бить по пальцам
2 Господин ПЖ
 
12.11.13
10:41
молотком как минимум
3 СэдКС
 
12.11.13
10:42
(1) я его нашла на сайте http://www.1c-h.ru/?p=235. Побейте их)

Вы мне подскажите как правильно, я исправлюсь
4 Ork
 
12.11.13
10:43
(0) Читайте в СП за метод Выбрать(). Там одним из параметров идет "Отбор". Это то, что вам нужно. Установите так же как отбор в форме и получите такую же выборку.
(1) Хай тренируется. Вам жалко?
5 Maxus43
 
12.11.13
10:44
(3) лучше запросом получай данные, так лучше во всех смыслах
6 Defender aka LINN
 
12.11.13
10:45
(4) Сегодня он тренируется, а завтра ты это найдешь в рабочем коде
7 Maxus43
 
12.11.13
10:47
(6) она.
понять и простить, научить, воспитать, взять замуж. Нормально
8 Ork
 
12.11.13
10:47
(6) Я сам тренировки с этого начинал... пАтамучта после семерки. И "это" до сих пор продолжаю находить в своем жеШ коде. Такие дела...
9 СэдКС
 
12.11.13
10:52
(4) Хорошо, я попробую. Спасибо!
(7) :)))
10 Ork
 
12.11.13
10:55
(9) Вам же сказали - не нужно так делать. Методически правильно - запросом. Если только потренироваться...
11 СэдКС
 
12.11.13
11:56
(10) Да нет же, я не буду так делать, я всё сразу поняла :) Над "попробую" я имела ввиду метод выбрать
12 1dvd
 
12.11.13
11:59
Кривой программист за год создает два рабочих места
13 Михаил Козлов
 
12.11.13
12:30
(0) Обход записей, соответствующих отборам попробуйте через построитель отчета:
построитель = Новый ПостроительОтчета;
построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(<имя реквизита набора записей>);
выборка = построитель.Результат.Выбрать();
14 СэдКС
 
12.11.13
12:37
Подождите, я еще не разобралась с записью полей. У меня не ставится флажок на поля регистра.
Я не поняла, как это написать. После запроса вывела:
Пока Выборка.Следующий() Цикл
        Если Выполнено = Истина Тогда
            Выборка.Выполнено = Истина;
            Иначе Выборка.Выполнено = Ложь;
        КонецЕсли;    
    КонецЦикла;  

Скорей всего неверно. Нужно через команду "СоздатьНаборЗаписей"?
15 Ofizer
 
12.11.13
12:44
(14) Выборке из результата запроса нельзя что-то присвоить.
да, можно СоздатьНаборЗаписей, там установить необходимые значения, и потом записать этот набор
16 СэдКС
 
12.11.13
12:55
С набором получилось, сохраняет значения. Теперь остался отбор
17 Ofizer
 
12.11.13
12:58
(16) отбор сразу в запросе установить можно
18 СэдКС
 
12.11.13
13:01
НаборЗаписей = РегистрыСведений.ПланированиеПоЗакупу.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();        
Для Каждого Запись Из НаборЗаписей Цикл
Если Выполнено = Истина Тогда
Запись.Выполнено = Истина;  
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();

Но я ведь снова сделала неправильно. Не через запрос. Кто мне может сказать, как это "через запрос" ?
19 Ofizer
 
12.11.13
13:03
(18) посмтри в СП Запрос.Выполнить
20 СэдКС
 
12.11.13
13:06
(19) я знаю, как строить запрос, но я не могу понять, как сделать привязку. Вы же говорили, что
> Выборке из результата запроса нельзя что-то присвоить.

А как тогда присвоить?
21 Ofizer
 
12.11.13
13:08
(20) РезультатЗапроса = Запрос.Выполнить().Выгрузить();
получить ТаблицуЗначений, в ней делай все необходимое, потом
НаборЗаписей.Загрузить(ТаблицаЗначений.Выгрузить())
22 Ofizer
 
12.11.13
13:14
(21) малость ошибся :) НаборЗаписей.Загрузить(ТаблицаЗначений)
вот так надо
23 СэдКС
 
12.11.13
13:47
(21) сначала создаю таблицу значений, потом делаю выборку из запроса в эту таблицу, потом создаю набор записей, присваиваю значение флажка полю из регистра и затем выгражаю все значения из таблицы в набор. Схема такая? Запутано как-то
24 Ofizer
 
13.11.13
05:13
(23) ничего не запустано, метод Выгрузить() сразу возвращает ТаблицуЗначений: ТЗ = Запрос.Выполнить().Выгрузить();
дальше в ТЗ делаешь необходимые действия:
для каждого СтрокаТЗ из ТЗ цикл
....
конецЦикла

создаешь набор записей НЗ = рег.СоздатьНаборЗаписей;
загружаешь в него ТЗ
НЗ.Загрузить(ТЗ);
записываешь набор в БД - НЗ.Записать();
25 СэдКС
 
13.11.13
14:05
У меня получилось только очистить записи, которые соответствуют отбору списка регистра, но присвоить значение Булево определенному полю так и не удалось.

Если ставить такое условие, то не проходит, потому что выборке из результата запроса нельзя что-то присвоить, как показал опыт.

Для каждого СтрокаТЗ из ТЗ цикл
Если Выполнено = Истина Тогда
СтрокаТЗ.Выполнено = Истина;
Иначе СтрокаТЗ.Выполнено = Ложь;
КонецЕсли;
КонецЦикла;

Если ставить такое условие, то не проходит, потому что ругается на то, что "Запись не верна! Значение поля не соответствует установленному отбору:..."

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

Может еще где можно дописать это условие?
Конечный вариант:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ПланированиеПоЗакупу.Автор,
|    ПланированиеПоЗакупу.Номенклатура,
|    ПланированиеПоЗакупу.ХарактеристикаНоменклатуры,
|    ПланированиеПоЗакупу.Контрагент,
|    ПланированиеПоЗакупу.ЗаказПоставщику,
|    ПланированиеПоЗакупу.Выполнено,
|    ПланированиеПоЗакупу.ВыполненоЧастично,
|    ПланированиеПоЗакупу.Отменено,
|    ПланированиеПоЗакупу.ДатаЗаявки,
|    ПланированиеПоЗакупу.ДатаЗаказа,
|    ПланированиеПоЗакупу.ПроверкаОТКФакт
|ИЗ
|    РегистрСведений.ПланированиеПоЗакупу КАК ПланированиеПоЗакупу";
        
ТЗ = Запрос.Выполнить().Выгрузить();
//неработающий кусочек
Для каждого СтрокаТЗ из ТЗ цикл
Если Выполнено = Истина Тогда
СтрокаТЗ.Выполнено = Истина;
Иначе СтрокаТЗ.Выполнено = Ложь;
КонецЕсли;
КонецЦикла;
//
                
ОтборТЧ = ЭтаФорма.ПланированиеПоЗакупу.Отбор;
НЗ = РегистрыСведений.ПланированиеПоЗакупу.СоздатьНаборЗаписей();
        
Для Каждого ЭлементОтбора Из ОтборТЧ Цикл
Если ЭлементОтбора.Использование Тогда
ЭлементОтбораРС = НЗ.Отбор.Найти(ЭлементОтбора.Имя);
Если ЭлементОтбораРС=Неопределено Тогда
Продолжить;
КонецЕсли;
ЭлементОтбораРС.Использование = Истина;
ЭлементОтбораРС.ВидСравнения = ЭлементОтбора.ВидСравнения;
ЭлементОтбораРС.Значение = ЭлементОтбора.Значение;
КонецЕсли;
КонецЦикла;

НЗ.Прочитать();

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

ТЗ = НЗ.Выгрузить();
НЗ.Записать();
НЗ.Отбор.Выполнено.Установить();
НЗ.Загрузить(ТЗ);
26 СэдКС
 
13.11.13
14:10
+(25)Предпоследняя строка неправильная
НЗ.Отбор.Выполнено.Установить();
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой