Версия для печати темы (https://pro1c.org.ua/index.php?s=62689d777ba59e79394286b74f6f4e97&showtopic=49783)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ По результатам запроса: Ошибка - Объект не может быть перепозиционирован!

Автор: leonid_gun 04.01.19, 16:41

Платформа 7.70.027, конфа допиленная ТиС 032.
Нужно некоторые элементы справочника имеющие признак Архив перенести из корня справочника в папку Архив, специально для этого заведенную. Выборка работает, но в момент замены Родителя возникает ошибка перепозиционирования. Помогите найти косяк.

Пробовал делать эту же операцию через ВыбратьЭлементы(), она работет, но только до момента когда перенесен первый найденный элемент справочника. Далее выборка сбивается и ее нужно инить заново. Так как-то криво. поэтому решил через запрос.

Процедура ВыполнитьАрхивациюЗапросом()
Перем Архив;
Архив = "";
Спр = СоздатьОбъект("Справочник.Пациенты");
Если Спр.НайтиПоНаименованию("Архив") = 1 Тогда // проверяем наличие папки Архив, куда будем переносить архивные карточки
    Если Спр.ЭтоГруппа() = 1 Тогда
        Архив = Спр.ТекущийЭлемент(); // получаем родителя (назначаем папку архивирования)
        Сообщить("Папка для архивирована выбрана - " + Архив);
    КонецЕсли;
Иначе
    Предупреждение("Папка Архив в текущем справочнике не найдена");
    Возврат;
КонецЕсли;  
Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    //|Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Пациенты = Справочник.Пациенты.ТекущийЭлемент;
    |Группировка Пациенты без групп;
    |Условие(Пациенты.ВАрхиве.Получить(РабочаяДата()) = Перечисление.ДаНет.Да);
    |Условие(Пациенты.ПометкаУдаления()=0);
    |"//}}ЗАПРОС
   ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
//Если Запрос.Пациенты.НайтиПоНаименованию("Архив") = 1 Тогда
//        Если Запрос.Пациенты.ЭтоГруппа() = 1 Тогда
//        Архив = Запрос.Пациенты.ТекущийЭлемент(); // получаем родителя (назначаем папку архивирования)
//        Сообщить("Папка для архивирована выбрана - " + Архив);
//    КонецЕсли;
//Иначе
//    Предупреждение("Папка Архив в текущем справочнике не найдена");
//    Возврат;
//КонецЕсли;  
    Пока Запрос.Группировка(1) = 1 Цикл
        Если Запрос.Пациенты.ЭтоГруппа()=1 Тогда
            Продолжить;
        КонецЕсли;
        Если (Запрос.Пациенты.ПринадлежитГруппе(Архив) = 0) И (Запрос.Пациенты.ВАрхиве.Получить(РабочаяДата()) = Перечисление.ДаНет.Да ) Тогда
        Запрос.Пациенты.Родитель = Архив; // ???? здесь ошибка  - Объект не может быть перепозиционирован!      
        Запрос.Пациенты.Записать();
        Сообщить(" Карточка клиента " + Запрос.Пациенты.Наименование + " имеет пометку для  Архив. Берем и переносим....");
        КонецЕсли;
    Состояние("Идет поиск карточек клиента для Архива...");
  
КонецЦикла;
КонецПроцедуры

Автор: Naghual 04.01.19, 16:49

Потому-что нельзя изменять объект, полученный запросом.
Вместо строк:

Запрос.Пациенты.Родитель = Архив; 
Запрос.Пациенты.Записать();

Напишите что-то типа:
Если СпрПацыки.НайтиЭлемент(Запрос.Пациенты) = 1 Тогда
  СпрПацыки.Родитель = Архив;
  СпрПацыки.Записать();
КонецЕсли;

Ну и в начале не забудьте:
СпрПацыки = СоздатьОбъект("Справочник.Пациенты");


П.С. Писал на скору руку, за синтаксис не отвечаю )

Автор: leonid_gun 04.01.19, 23:21

Цитата(Naghual @ 04.01.19, 16:49) *
Если СпрПацыки.НайтиЭлемент(Запрос.Пациенты) = 1 Тогда
  СпрПацыки.Родитель = Архив;
  СпрПацыки.Записать();
КонецЕсли;

icon_beer17.gif Внес исправления, все заработало с пол тычка. rulez.gif

Автор: mister-x 08.01.19, 12:31

Цитата(Naghual @ 04.01.19, 16:49) *
Потому-что нельзя изменять объект, полученный запросом.
розшифрую для автора теми. В документації 7.7 це не обговорюється, але у 8-ці це вже роз'ясено - маємо справу із посиланням на об'єкт, а НайтиЭлемент вертає об'єкт по заданному посиланню, який можна змінити.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua