Имя: Пароль:
1C
1C 7.7
v7: Групповая обработка выводит сообщение Значение не представляет агрегатный объект
0 tolstikroot
 
14.10.12
22:55
Доброго времени суток!
Я только начинаю своё общение с 1с77. Раньше был небольшой опыт общения с 8.2.
Досталась мне в наследство одна база. Среди существующих конфигураций ничего подобного я не нашел. И по своему содержимому похожа она на самописную с элементами различных конфигураций. Поставлена была задача добавить одну единицу измерения ко всем товарам определенной группе номенклатуры. Нашел в базе групповую обработку, раскомментировал некоторые строки, так как обработка вообще ничего не делала из того что было мне необходимо. В итоге при попытке добавить определенную единицу измерения к отобранным товарам, получаю следующую ошибку

Единица.ИспользоватьВладельца(Товар.ТекущийЭлемент());
{Обработка.ГрупповаяОбработкаСправочникаНоменклатуры.Форма.Модуль(550)}: Значение не представляет агрегатный объект (ИспользоватьВладельца)

В групповой обработке этому сообщению предшествует следующий код

   ИначеЕсли Действие.ТекущаяСтрока()=10 Тогда // ("Добавить единицу измерения");
       ВыбЗначение2 = СоздатьОбъект("Справочник.Номенклатура");
       ВыбЗначение2.ВыборГруппы(0);
       Если ВыбЗначение2.Выбрать("Выбор товара",)=1 Тогда
           Если (ВыбЗначение2.Выбран()>0)И(ВыбЗначение2.ЭтоГруппа()=0) Тогда
               ВыбЗначение = СоздатьОбъект("Справочник.Единицы");  
               ВыбЗначение.ИспользоватьВладельца(ВыбЗначение2.ТекущийЭлемент());
               Если ВыбЗначение.Выбрать("Выбор единицы измерения",)=1 Тогда
                   ЗначениеВВидеСтроки = ВыбЗначение.Наименование;
                   Значение= ВыбЗначение.ТекущийЭлемент();
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;

Пока копался в конфигурации выяснил, что в справочнике Номенклатура, из реквизитов есть только БазоваяЕдиницаИзмерения. А в форме где в карточке указан список возможных единиц, он так и называется СписокЕдиниц. Но как связать его с групповой обработкой я пока не понимаю. Поэтому прошу помощи у гуру!
1 kimi_mm
 
14.10.12
23:04
Вышлите фрагмент кода, который вызывает ошибку, из указанного фрагмента непонятно что скрывается за переменной "Единица"
2 Remark
 
14.10.12
23:06
Является ли справочник "Единицы" подчиненным справочнику "Номенклатура"?
3 Злопчинский
 
14.10.12
23:16
(0) Дайте весь код, в диапазоне  плюс/минус 30 строк от 550 строки, а то у вас ошибка в строке
Единица.ИспользоватьВладельца(Товар.ТекущийЭлемент());
а в приведенном коде - такой нет
откуда мы занм что вы там за фуйню написали перед 550 строкой
4 Cthulhu
 
14.10.12
23:27
вернитесь обратно на 82
и вызовите специальста.
потому что фрагмент кода, который Вы продемонстрировали, не касается "групповой обработки" и не решает описанной
Вами проблемы НИКАК. в заданные Вами вопросы свидетельствуют о том, что вызвать специалиста будет в результате дешевле (в том числе и учитывая возможные последствия), нежели решать эту задачу Вашими, простите за выражение, силами.
5 Remark
 
14.10.12
23:31
(4) Как бы да... Я думаю, что ТС больше не появится.
6 tolstikroot
 
14.10.12
23:31
Процедура ВыборЗначения()
   Перем ВыбЗначение;
 ИначеЕсли Действие.ТекущаяСтрока()=10 Тогда // ("Добавить единицу измерения");
       ВыбЗначение2 = СоздатьОбъект("Справочник.Номенклатура");
       ВыбЗначение2.ВыборГруппы(0);
       Если ВыбЗначение2.Выбрать("Выбор товара",)=1 Тогда
           Если (ВыбЗначение2.Выбран()>0)И(ВыбЗначение2.ЭтоГруппа()=0) Тогда
               ВыбЗначение = СоздатьОбъект("Справочник.Единицы");  
               ВыбЗначение.ИспользоватьВладельца(ВыбЗначение2.ТекущийЭлемент());
               Если ВыбЗначение.Выбрать("Выбор единицы измерения",)=1 Тогда
                   ЗначениеВВидеСтроки = ВыбЗначение.Наименование;
                   Значение= ВыбЗначение.ТекущийЭлемент();
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
   
   (эта процедура отрабатывает нормально)
   
   Процедура Выполнить()
   Перем НомерСтроки;
   Перем Док;
   Перем ТипДок;
   Перем Товар,ТовДляПоиска;
   Перем Категория,Единица;

   Перем ЧислоОбработанныхПозиций;
 
   Если (ПустоеЗначение(Значение)=1) Тогда // пустое значение
       Если (Действие.ТекущаяСтрока()=4)ИЛИ
           (Действие.ТекущаяСтрока()=5)ИЛИ(Действие.ТекущаяСтрока()=6)ИЛИ
           (Действие.ТекущаяСтрока()=7)ИЛИ(Действие.ТекущаяСтрока()=8)ИЛИ
           (Действие.ТекущаяСтрока()=10)ИЛИ(Действие.ТекущаяСтрока()=11) Тогда
           Предупреждение("Не задано значение");
           Возврат;
       КонецЕсли;
   КонецЕсли;
 
 ИначеЕсли Действие.ТекущаяСтрока()=10 Тогда // ("Добавить единицу");
           Единица.ИспользоватьВладельца(Товар.ТекущийЭлемент());
           Если Единица.НайтиПоРеквизиту("ТипЕдиницы",Значение.ТипЕдиницы.ТекущийЭлемент(),0)<=0 Тогда
               Единица.Новый();
               Единица.ТипЕдиницы = Значение.ТипЕдиницы;
               Единица.Наименование = Значение.Наименование;
               Единица.Коэффициент = Значение.Коэффициент;
               Единица.Вес = Значение.Вес;
               Единица.Записать();
           Иначе
               Если Единица.ПометкаУдаления()=1 Тогда
                   Единица.СнятьПометкуУдаления();
               КонецЕсли;
           КонецЕсли;
     
     (вот здесь и выпадает ошибка)
     
     ЧислоОбработанныхПозиций = ЧислоОбработанныхПозиций + 1;

   КонецЦикла;

вся групповая обработка представлена по следующей ссылке https://dl.dropbox.com/u/6086754/групобр.rar
7 tolstikroot
 
14.10.12
23:32
Справочник "Единицы" подчинен справочнику "Номенклатура"
8 tolstikroot
 
14.10.12
23:33
ссылка на обработку https://dl.dropbox.com/u/6086754/grupob.rar
9 Remark
 
14.10.12
23:36
(6)Ошибся...
Так и что скрывается за переменной "Единица"?
10 tolstikroot
 
14.10.12
23:43
Насколько я понимаю Единица является одним из элементом справочника Единицы, владельцем которого является отдельный товар.
11 tolstikroot
 
14.10.12
23:52
В форме справочника Единицы, если я не ошибаюсь это описано так

Процедура ВводНового();
   Наименование=Строка(Владелец.БазоваяЕдиницаИзмерения);
   Единица=Владелец.БазоваяЕдиницаИзмерения;
   ШтрихКод=?(ПустоеЗначение(Владелец.ШтрихКод)=1,"",Владелец.ШтрихКод);
   Коэффициент=1;
   ВводНового = 1;
КонецПроцедуры
//-----------------------
Процедура ПриЗаписи()
   Записали = 1;
КонецПроцедуры
//-----------------------
Процедура ПриЗакрытии()
   Если ТипЗначенияСтр(ВнКонтекст)="ГрупповойКонтекст" Тогда
       Если Записали = 1 Тогда
           Если ВводНового=1 Тогда
               ВнКонтекст.СписокЕдиниц.ДобавитьЗначение(ТекущийЭлемент(),СокрЛП(Наименование)+";    "+Коэффициент+";    "+ШтрихКод);
               ВнКонтекст.СписокЕдиниц.ТекущаяСтрока(ВнКонтекст.СписокЕдиниц.РазмерСписка());
               ВнКонтекст.Форма.КнИзменить1.Доступность(1);
               ВнКонтекст.Форма.КнУдалить1.Доступность(1);
           Иначе
               Поз=ВнКонтекст.СписокЕдиниц.НайтиЗначение(ТекущийЭлемент());
               ВнКонтекст.СписокЕдиниц.УдалитьЗначение(Поз);
               ВнКонтекст.СписокЕдиниц.ВставитьЗначение(Поз,ТекущийЭлемент(),СокрЛП(Наименование)+";    "+Коэффициент+";    "+ШтрихКод);
               ВнКонтекст.СписокЕдиниц.ТекущаяСтрока(Поз);
           КонецЕсли;
           ВнКонтекст.Форма.Обновить();
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры
//-----------------------
Процедура ПриОткрытии()
   Если ТипЗначенияСтр(Форма.Параметр)="ГрупповойКонтекст" Тогда
       ВнКонтекст=Форма.Параметр;
   КонецЕсли;
КонецПроцедуры
12 Remark
 
14.10.12
23:59
А вот эту строчку куда дели:

//Единица = СоздатьОбъект("Справочники.Единицы");
13 tolstikroot
 
15.10.12
00:04
добавил строчку

ИначеЕсли Действие.ТекущаяСтрока()=10 Тогда // ("Добавить единицу");
           Единица = СоздатьОбъект("Справочники.Единицы");
           Единица.ИспользоватьВладельца(Товар.ТекущийЭлемент());

Но результат тот же

Единица = СоздатьОбъект("Справочники.Единицы");
{Обработка.ГрупповаяОбработкаСправочникаНоменклатуры.Форма.Модуль(550)}: Неудачная попытка создания объекта (Справочники.Единицы)
14 Злопчинский
 
15.10.12
00:05
(13) СПРАВОЧНИК - В ЕДИНСТВЕННОМ ЧИСЛЕ
15 Remark
 
15.10.12
00:07
(14) Сорри, это я попутался. 8ка что ли под руку влезла...
16 tolstikroot
 
15.10.12
00:11
Исправил Справочники на Справочник, но получил ошибку

Если Единица.НайтиПоРеквизиту("Единица",Значение.Единица.ТекущийЭлемент(),0)<=0 Тогда
{Обработка.ГрупповаяОбработкаСправочникаНоменклатуры.Форма.Модуль(552)}: Поле агрегатного объекта не обнаружено (ТекущийЭлемент)
17 tolstikroot
 
15.10.12
00:18
Насколько я понимаю данная ошибка говорит о том что происходит попытка найти реквизит единица у текущего элемента, кем является товар, но у номенклатуры нету реквизита единица. Сами единицы хранятся пока мне не известным образом(слишком мало опыта), но насколько я понимаю это описано здесь

Процедура ДобавитьЕдиницу()
   Перем ФормаЗаписи;
   ФормаЗаписи=ВзятьКонтекст(Контекст);
   ОткрытьФормуМодально("Элемент.Единицы",ФормаЗаписи,,,ТекущийЭлемент());
КонецПроцедуры
//-----------------------
Процедура ИзменитьЕдиницу()
   Перем ФормаЗаписи;
   Эл=СписокЕдиниц.ПолучитьЗначение(СписокЕдиниц.ТекущаяСтрока());
   ФормаЗаписи=ВзятьКонтекст(Контекст);
   ОткрытьФормуМодально(Эл,ФормаЗаписи);
КонецПроцедуры
//-----------------------
Процедура УдалитьЕдиницу()
   Если Вопрос("Вы действительно хотите удалить единицу измерения товара? (будет помечена на удаление)",1)=2 Тогда
       Возврат;
   КонецЕсли;
   Поз=СписокЕдиниц.ТекущаяСтрока();
   Эл=СписокЕдиниц.ПолучитьЗначение(Поз);
   Спр=СоздатьОбъект("Справочник.Единицы");
   Спр.ИспользоватьВладельца(ТекущийЭлемент());
   Если Спр.НайтиЭлемент(Эл)=1 Тогда
       Спр.Удалить(0);
       СписокЕдиниц.УдалитьЗначение(Поз);
       СписокЕдиниц.ТекущаяСтрока(?(Поз>1,Поз-1,1));
       Если СписокЕдиниц.РазмерСписка()=0 Тогда
           Форма.КнИзменить1.Доступность(0);
           Форма.КнУдалить1.Доступность(0);
       КонецЕсли;
       Форма.Обновить();
   КонецЕсли;
КонецПроцедуры
18 Remark
 
15.10.12
00:27
Единица.НайтиПоРеквизиту("Единица",Значение.Единица.ТекущийЭлемент(),0)

Вы ищете Единицу в реквизите "Единица" справочника "Единицы". Там ее точно нет.

Сами Единица хранятся в справочнике "Единицы", который подчинен справочнику "Номенклатура".
19 Remark
 
15.10.12
00:31

Номенклатура = СоздатьОбъект("Справочник.Номенклатура");
Если Номенклатура.НАйтиПоРеквизиту("БазоваяЕдиницаИзмерения", Единица,0) > 0 Тогда
...
КонецЕСли;
20 Cthulhu
 
15.10.12
00:45
а за использование ключевых слов встроенного языка в названиях переменных и объектов руки надо откусывать и семерочникам, и восьмерочникам...
21 Remark
 
15.10.12
00:48
(20) Сорри?
22 tolstikroot
 
15.10.12
00:52
Ошибка уже другая. Хотя проблема еще не решена, но её решение понемногу начинает проясняться.


Если Номенклатура.НАйтиПоРеквизиту("БазоваяЕдиницаИзмерения", Единица,0) > 0 Тогда
{Обработка.ГрупповаяОбработкаСправочникаНоменклатуры.Форма.Модуль(553)}: Неверное имя реквизита!

Всем спасибо за участие и терпение(все мы когда то только начинали). Завтра продолжу решать.
23 Злопчинский
 
15.10.12
03:12
мдя.. и эти люди что-то будут писать на снеговике...
я - точно без хлеба с икрйо не сотанусь!
24 Злопчинский
 
15.10.12
03:14
(22) реквизит БазоваяЕдиница в спр.номенклатура - не имеет признака "сортировка" - то бишь не индексируется и поиском не найдется!! привыкай уже не галочки расставлять по снеговиковски, а мозг включать