Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 12:40

Отбор записей из РС запросом

Автор trialex3, 08 авг 2018, 10:11

0 Пользователей и 1 гость просматривают эту тему.

trialex3

Добрый день. Может кто дать подробный пример, как отобрать нужные записи РС через запрос и потом изменить их? РС без регистратора и непериодический. Отбор хочу сделать по измерению СправочникСсылка.

ДмитрийФ

Делаешь запрос, потом работаешь с РС

НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.СправочникСсылка.Установить(Выборка.Ссылка);
НаборЗаписей.Прочитать();
... // здесь меняешь записи
НаборЗаписей.Записать();

trialex3

Цитата: ДмитрийФ от 08 авг 2018, 10:25
Делаешь запрос, потом работаешь с РС

НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.СправочникСсылка.Установить(Выборка.Ссылка);
НаборЗаписей.Прочитать();
... // здесь меняешь записи
НаборЗаписей.Записать();


Ну сделал вот так. Но не записывает(
Если ОТКИзменение Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АР_ИсторияИзделий.КодИзделия,
| АР_ИсторияИзделий.Участок,
| АР_ИсторияИзделий.Дата,
| АР_ИсторияИзделий.НомерИсполнителя
|ИЗ
| РегистрСведений.АР_ИсторияИзделий КАК АР_ИсторияИзделий
|ГДЕ
| АР_ИсторияИзделий.КодИзделия.Код = &КодИзделия";

Запрос.УстановитьПараметр("КодИзделия", КодИзделия);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

НаборЗаписей = РегистрыСведений.АР_ИсторияИзделий.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.КодИзделия.Установить(ВыборкаДетальныеЗаписи.КодИзделия);
НаборЗаписей.Прочитать();
Для каждого ЗаписьНабора из НаборЗаписей Цикл
Если ЗаписьНабора.Участок = Справочники.РабочиеЦентры.НайтиПоКоду("000037") Тогда
ЗаписьНабора.НомерИсполнителя = ОТК;
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();
КонецЕсли;


ПС.Результат не пустой.Проверял

ДмитрийФ

Что-то не догоняю, а где:      
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

trialex3

Цитата: ДмитрийФ от 08 авг 2018, 11:14
Что-то не догоняю, а где:      
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Вот как то так сделал.Сойдет?

Если ОТКИзменение Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АР_ИсторияИзделий.КодИзделия,
| АР_ИсторияИзделий.Участок,
| АР_ИсторияИзделий.Дата,
| АР_ИсторияИзделий.НомерИсполнителя
|ИЗ
| РегистрСведений.АР_ИсторияИзделий КАК АР_ИсторияИзделий
|ГДЕ
| АР_ИсторияИзделий.КодИзделия.Код = &КодИзделия";

Запрос.УстановитьПараметр("КодИзделия", КодИзделия);

Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Участок = Справочники.РабочиеЦентры.НайтиПоКоду("000037") Тогда
НаборЗаписей = РегистрыСведений.АР_ИсторияИзделий.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.КодИзделия.Установить(ВыборкаДетальныеЗаписи.КодИзделия);
НаборЗаписей.Прочитать();
Для каждого ЗаписьНабора из НаборЗаписей Цикл
Если ЗаписьНабора.Участок = Справочники.РабочиеЦентры.НайтиПоКоду("000037") Тогда
    ЗаписьНабора.НомерИсполнителя = ОТК;   
    КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;

ДмитрийФ

Почему условие сразу в запросе не сделать?
Если ВыборкаДетальныеЗаписи.Участок = Справочники.РабочиеЦентры.НайтиПоКоду("000037") Тогда
И зачем условие повторно далее идет, оно точно нужно?
Если ЗаписьНабора.Участок = Справочники.РабочиеЦентры.НайтиПоКоду("000037") Тогда
Если в цикле сравнивают с подобным "Справочники.РабочиеЦентры.НайтиПоКоду("000037")", лучше перед циклом вычислить и присвоить переменной, и далее использовать переменную.

trialex3

Цитата: ДмитрийФ от 08 авг 2018, 13:14
Почему условие сразу в запросе не сделать?
Если ВыборкаДетальныеЗаписи.Участок = Справочники.РабочиеЦентры.НайтиПоКоду("000037") Тогда
И зачем условие повторно далее идет, оно точно нужно?
Если ЗаписьНабора.Участок = Справочники.РабочиеЦентры.НайтиПоКоду("000037") Тогда
Если в цикле сравнивают с подобным "Справочники.РабочиеЦентры.НайтиПоКоду("000037")", лучше перед циклом вычислить и присвоить переменной, и далее использовать переменную.

Спасибо за подсказку. сделал так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АР_ИсторияИзделий.КодИзделия,
| АР_ИсторияИзделий.Участок,
| АР_ИсторияИзделий.Дата,
| АР_ИсторияИзделий.НомерИсполнителя
|ИЗ
| РегистрСведений.АР_ИсторияИзделий КАК АР_ИсторияИзделий
|ГДЕ
| АР_ИсторияИзделий.КодИзделия.Код = &КодИзделия

|   АР_ИсторияИзделий.Участок = &ОТКСсылка";

Запрос.УстановитьПараметр("КодИзделия", КодИзделия);
Запрос.УстановитьПараметр("ОТКСсылка", ОТКСсылка);

Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НаборЗаписей = РегистрыСведений.АР_ИсторияИзделий.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.КодИзделия.Установить(ВыборкаДетальныеЗаписи.КодИзделия);
НаборЗаписей.Прочитать();
Для каждого ЗаписьНабора из НаборЗаписей Цикл
    ЗаписьНабора.НомерИсполнителя = ОТК;   
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;


Вопрос надо ли использовать цикл Для каждого если я знаю что результатом запроса всегда будет макс 1 строка?

Упд ваш вариант не подходит. теперь меняется не 1а запись в регистре а несколько, потому что отбор нужно делать уже по 2м реквизитам. Как это сделать? просто добавить еще 1 строку с Установить?

alex0402

Цитата: trialex3 от 08 авг 2018, 15:07Упд ваш вариант не подходит. теперь меняется не 1а запись в регистре а несколько, потому что отбор нужно делать уже по 2м реквизитам. Как это сделать? просто добавить еще 1 строку с Установить?

еще одну строку
НаборЗаписей.Отбор.ИмяРеквизита.Установить(значение);
Спасибо за Сказать спасибо

ДмитрийФ

Цитата: trialex3 от 08 авг 2018, 15:07
просто добавить еще 1 строку с Установить?
Да

Цитата: trialex3 от 08 авг 2018, 15:07
надо ли использовать цикл Для каждого если я знаю что результатом запроса всегда будет макс 1 строка?

цикл не обязательно, достаточно:
ВыборкаДетальныеЗаписи.Следующий();

Теги:  

Похожие темы (5)

Рейтинг@Mail.ru

Поиск