Страницы: 1
RSS
Как установить отбор на независимый регистр сведений по конкретному документу
 
Как установить отбор на независимый регистр сведений по конкретному документу
 

Приветствую.

Возникла такая проблема: имеется независимый регистр сведений. Но у него есть РегистраторЗаписи.
Необходимо программно получить записи по конкретному документу, как установить отбор по этому значению?

 
Добрый день.


Вы можете установить отбор в наборе записей:



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

 

Попробовал так сделать, получаю ошибку:

Поле объекта не обнаружено (РегистраторЗаписи)

 

У вас РегистраторЗаписи – это измерение? Если нет, то такой способ не сработает, отбор в независимом регистре сведений, согласно справке, можно устанавливать только на измерения.

Если нужно получить записи по реквизиту, можно использовать перебор или запрос.

У меня тестовый регистр сведений, с одним измерением и одним реквизитом. Если у вас измерений в регистре больше, тогда в запросе выбирайте все измерения.

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

 
Отобрать нужные записи получилось. Теперь другая проблема: пытаюсь менять, выходит ошибка:

Запись не верна! Значение поля не соответствует установленному отбору
 

Вы пытаетесь менять значение измерения?

Тогда немного сложнее. При чтении установлен отбор по старому значению измерения, поэтому запись с другим значением без изменения отбора не запишется.

Нужно удалить записи со старым значением измерений и добавить с новым. Например так:

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

Не забываем каждый раз устанавливать отбор на все измерения регистра.

В запросе нужно выбирать все Измерения, Реквизиты и Ресурсы, чтобы в новой записи не потерять значения.

И обязательно сначала пробуем на копии, чтобы не удалить лишнего!

Изменено: Екатерина - 26.04.2023 18:35:24
 
Екатерина, Большое спасибо, все получилось!
Страницы: 1