Имя: Пароль:
1C
1С v8
Подскажите, пожалуйста, новичку.
0 petyabal
 
20.05.17
20:30
Прохожу учебный курс по практическому пособию "1с предприятие" 8.3, Радченко. В 12м задании создаются оборотные регистры накопления.
Программа пишет, что в модуле содержатся ошибки.
В режиме отладчика выдается ошибка:

{Документ.ОказаниеУслуги.МодульОбъекта(29,25)}:Переменная не определена (Мастер)

У регистра накопления продажи имеются измерения, в т.ч. и Мастер. У Измерения Мастер тип СправочникСсылка.Сотрудники.

Я делал все как по книге. Вот текст процедуры:

Процедура  ОбработкаПроведения(Отказ, Режим)

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

         // Регистр  СтоимостьМатериалов Расход
         Движение = Движения.СтоимостьМатериалов.Добавить();
         Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
         Движение.Период = Дата;
         Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
         Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Количество * ТекСтрокаПереченьНоменклатуры.Стоимость;
      КонецЕсли;

      // Регистр Продажи
      Движение = Движения.Продажи.Добавить();
      Движение.Период = Дата;
      Движение.Номенклатура = ТекСтрокаПереченьНоменклатуры.Номенклатура;
      Движение.Клиент = Клиент;
      Движение.Мастер = Мастер;
      Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
      Движение.Выручка = ТекСтрокаПереченьНоменклатуры.Сумма;
      Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость * ТекСтрокаПереченьНоменклатуры.Количество;
   КонецЦикла;

КонецПроцедуры

Подскажите пожалуйста в чем ошибка.
1 PuhUfa
 
20.05.17
20:32
>> Движение.Мастер = Мастер;

Мастер после = это что?
2 zenik
 
20.05.17
20:33
>Переменная не определена (Мастер)
У документа реквизита такого нет по ходу.
3 petyabal
 
20.05.17
20:43
Еще раз прошу прощения если буду тупить.
Предыдущая строчка очень на нее похожа и у программы нет никаких к ней претензий. Мастер  - это измерение регистра. Реквизиты у регистра Продажи не создавались (по книге):"На закладке Данные создадим измерения регистра:
?? Номенклатура, тип СправочникСсылка.Номенклатура;
?? Клиент, тип СправочникСсылка.Клиенты;
?? Мастер, тип СправочникСсылка.Сотрудники." и "У регистра будет три ресурса:
?? Количество, тип Число, длина 15, точность 3;
?? Выручка, тип Число, длина 15, точность 2;
?? Стоимость, тип Число, длина 15, точность 2.". если удалить строчку с мастером никаких ошибок не выдается.
4 Wern
 
20.05.17
22:03
"Движение.Мастер" - тут это измерение регистра.
" = Мастер" - а вот на это программа ругается, потому что не знает что такое "Мастер".
5 petyabal
 
20.05.17
22:07
Спасибо за ответ. но я не понял:
Почему тогда программа знает что такое клиент строчкой ранее? и что сделать чтоб не было ошибки?
6 PiotrLoginov
 
20.05.17
22:10
(5) Так. Надо привыкать, что в программировании все должно подчиняться какой-то логике. Вы не только выполняйте указания из книги, а еще и размышляйте. Иначе из такого следования от одной главы к другой толку будет мало. Опираясь на собственный опыт это Вам говорю.
7 PR
 
20.05.17
22:11
(5) У документа реквизит такой есть по ходу.
Нужно изменить конфигурацию.
8 PiotrLoginov
 
20.05.17
22:38
+ (6) И на этом форуме не ждите, что Вам все разжуют и в рот положат. Могут проигнорировать. Могут и раздразиться на тормоза.

По сабжу:
Надо понимать, что движения документа - это запись некоторой информации в регистр, то есть в то место, где информация будет храниться. От других мест хранения информации регистр отличается тем, что всячески подготовлен к быстрому и удобному извлечению из него хранящейся информации.

Какую информацию записать в регистр - решает разработчик. В данном случае Радченко предлагает присвоить свойствам новой записи регистра следующие значения:

   свойству (измерению) Номенклатура - значение свойства ("колонки") текущей строки (ТекСтрокаПереченьНоменклатуры) табличной части документа, называющейся "ПереченьНоменклатуры" под именем "Номенклатура";
   свойству (измерению) Клиент - значение свойства (реквизита) документа под именем "Клиент"

и т.д. ...


Т.е. для "помещения" некоторых данных в новую запись регистра мы берем эти данные из разных "мест" - из каждой строки табличной части документа, собственно из самого документа... Чтобы обратиться (т.е. получить значения свойств) к самому документу в его модуле мы можем использовать переменную Объект, в которую документ уже заботливо "помещен" платформой перед наступлением события "ОбработкаПроведения". К реквизитам документа можно обратиться, написав имя реквизита через точку поле переменной, в которую документ "помещен". Например, к табличной части ПереченьНоменклатуры, мы должны написать: Объект.ПереченьНоменклатуры, а чтобы получить значение реквизита документа "Клиент", мы должны написать: Объект.Клиент

Или можно (но только в модуле объекта!) обратиться к реквизитам документа напрямую: ПереченьНоменклатуры , Клиент


т.е. переменные Объект.ПереченьНоменклатуры и ПереченьНоменклатуры - это здесь одно и то же!

переменные Объект.Клиент и Клиент - это одно и то же!

Объект.Мастер и Мастер - это одно и то же!


Вопросы?
9 МихаилМ
 
20.05.17
22:44
10 PiotrLoginov
 
20.05.17
22:45
+ (8)   * Объект = ЭтотОбъект

осталось добавить, что конечно, если мы обращаемся к какому-то реквизиту объекта, он должен быть у этого объекта. В данном случае, поскольку платформа "ругается", что переменная Мастер не определена, явно у документа нет реквизита Мастер. Его нужно было добавить.
11 petyabal
 
20.05.17
23:08
Спасибо большое.Очень подробно объяснили. Все получилось. Вместо Мастер подставил имя реквизита документа.
Т.е. поменял
"Движение.Мастер = Мастер;" на "Движение.Мастер = Сотрудники;"
12 Franchiser
 
гуру
21.05.17
01:22
Создай реквизит Мастер в документе Оказание Услуги