Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Вопросы по курсу Чистова 8.3

Вопросы по курсу Чистова 8.3
Я
   Штурман
 
14.10.16 - 06:55
У Чистова есть книжка по 8.3 на 750 страниц.
Возникли некоторые вопросы относительно кода и предложений в книге.
1. В книге часто пишется про поставить точку останова, но конкретно где ставить непонятно. Допустим, создали процедуру, в которой нету кода, где ставить точку останова, чтобы потом Вычислить выражение?

2. Есть справочник Номенклатура, в ней две подгруппы – Товары и Услуги, по книге сделали проверку, чтобы была проверка услуги в зависимости от установленной галки следующим кодом:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)    
    Если НЕ ЭтоГруппа и Услуга тогда
        ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("ЕдИзм"));
    конецесли;
КонецПроцедуры

Но если в группе Услуг у справочника поставить галку, вылазит ошибка:
s017.radikal.ru/i435/1610/0c/512a64b92d68.jpg

3. При создании отчета почему-то невозможно вывести данные из-за неопределенной переменной:

{Отчет.ПрайсЛист.Форма.ФормаОтчета.Форма(4,18)}: Переменная не определена (ТабДок)
    ЗаполнитьТабДок(<<?>>ТабДок); (Проверка: Тонкий клиент)

Сам код -

&НаКлиенте
Процедура СформироватьПрайс(Команда)
    ЗаполнитьТабДок(ТабДок);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗаполнитьТабДок(ТабДок)
    Макет = Отчеты.ПрайсЛист.ПолучитьМакет("Макет");
    ОблШапка = Макет.ПолучитьОбласть("Шапка");
    ОблЭлемент = Макет.ПолучитьОбласть("Элемент");
    
    ОблШапка.Параметры.ДатаОтчета = ТекущаяДата();
    ТабДок.Вывести(ОблШапка);
    
    Выборка = Справочники.Номенклатура.Выбрать();    
    Пока Выборка.Следующий() цикл
        ОблЭлемент.Параметры.Заполнить(Выборка);
        ТабДок.Вывести(ОблЭлемент);
    конеццикла;
    
конецпроцедуры

http://radikal.ru/lfp/s019.radikal.ru/i630/1610/b8/bfe8b6895a08t.jpg/htm
 
 
   Штурман
 
1 - 14.10.16 - 06:58
   mehfk
 
2 - 14.10.16 - 07:06
ТабДок должен быть реквизитом формы, а не реквизитом объекта.
   Mankubus
 
3 - 14.10.16 - 07:07
>>где ставить точку останова, чтобы потом Вычислить выражение?
на строке со словом КонецПроцедуры
   Mankubus
 
4 - 14.10.16 - 07:08
>>Но если в группе Услуг у справочника поставить галку, вылазит ошибка:
Нажми на кнопку Подробно чтобы был полный текст ошибки
   Штурман
 
5 - 14.10.16 - 07:12
(4)
Ошибка при выполнении обработчика - 'ОбработкаПроверкиЗаполнения'
по причине:
{Справочник.Номенклатура.МодульОбъекта(16)}: Ошибка при вызове метода контекста (Удалить)
        ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("ЕдИзм"));
по причине:
Несоответствие типов (параметр номер '1')
   Штурман
 
6 - 14.10.16 - 07:13
(4) ок, первый вопрос понятен :)
   Mankubus
 
7 - 14.10.16 - 07:17
(5) в массиве ПроверяемыеРеквизиты нету значения "ЕдИзм"
В реквизите установлено значение Выдавать ошибку на проверке заполнения?
   Штурман
 
8 - 14.10.16 - 07:25
(7) сам весь код формы справчоника такой:


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

        ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга);
    конецесли;
    
КонецПроцедуры

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)    
    Если НЕ ЭтоГруппа и Услуга тогда
        ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("ЕдИзм"));
    конецесли;
КонецПроцедуры
   Штурман
 
9 - 14.10.16 - 07:27
Метод  «Свойство»  -  получает  значение  элемента  по  указанному  имени,  а  также  проверяет
наличие свойства.
     
Если ДанныеЗаполнения.Свойство("Родитель") 
  Услуга = ДанныеЗаполнения.Родитель.Услуга; 
КонецЕсли; 
 
Но такая запись не очень хороша, т.к. признак «Услуга» - это реквизит справочника, а так как 
в нем свойство «Заполнять из данных заполнения = Истина», то если в «ДанныеЗаполнения» 
при отрабатывании процедуры будет найден ключ «Услуга», то система заполнит его автома-
том, т.е. принудительно его устанавливать не надо.

Если ДанныеЗаполнения.Свойство("Родитель") 
  //Услуга = ДанныеЗаполнения.Родитель.Услуга; 

  ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга) 
КонецЕсли; 
 
«Услуга» - название реквизита, который будет заполнен. 
«ДанныеЗаполнения.Родитель.Услуга» - значение, которым будет заполнен этот реквизит.

Т.е. значение реквизита не устанавливается напрямую, а стандартному механизму передается
инструкция  заполнить  значение  реквизита  «Услуга»  при  отрабатывании  процедуры  «Обра-
боткаЗаполнения».

Параметр «СтандартнаяОбратотка» - отвечает за работу стандартного механизма заполнения
реквизитов. Если  «СтандартнаяОбратотка = Ложь», то ничего автоматом не заполнится, но
принудительное заполнение сработает:

Услуга = ДанныеЗаполнения.Родитель.Услуга; 
 
Итого:

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

    ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель. 
Услуга) 
  КонецЕсли; 
   
  //СтандартнаяОбработка = Ложь; 

КонецПроцедуры 
 
К элементу структуры можно обратиться по его ключу:
ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель. Услуга); 
 
Данные заполнения можно как прочитать:

А = ДанныеЗаполнения.Услуга 
 
так и записать в них значение:

ДанныеЗаполнения.Услуга = Ложь 
 
В примере у реквизита «Единица измерения» если элемент – товар, то надо проверять на за-
полнение, а если элемент – услуга, то заполнение не обязательно. Проверку надо проводить 
независимо от формы (на стороне сервера), т.е. вообще форму надо загружать по минимуму, а 
все проверки выполнять на стороне сервера.

Модуль объекта – процедура «ОбработкаПроверкиЗаполнения» 
 
ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) 
 
Отказ – признак успешности транзакции записи объекта в БД.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) 
  Если НЕ Услуга Тогда  
    Если ЕдИзм.Пустая() Тогда  
      Отказ = Истина; 
    КонецЕсли; 
  КонецЕсли; 
КонецПроцедуры 
 
Но данная процедура будет работать не только для элементов, но и для групп, что неправиль-
но. Добавим код:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) 
  Если ЭтоГруппа Тогда 
    Возврат; 
  КонецЕсли; 
     
  Если НЕ Услуга Тогда  
    Если ЕдИзм.Пустая() Тогда 
      Отказ = Истина; 
    КонецЕсли; 
  КонецЕсли; 
КонецПроцедуры 
 
Но при этом пользователь не будет проинформирован, почему ему не удалось записать эле-
мент. Поэтому такой способ применяется для описания каких-либо сложных алгоритмов.

Реализуем проверку при помощи стандартной обработки. Обратимся к коллекции
«ПроверяемыеРеквизиты»  -  попытаемся  записать  услугу  «Доставка»  с  незаполненной
единицей измерения. При этом у реквизита «ЕдИзм» свойство:
«Проверка заполнения – Выдавать ошибку».
   Dyspho
 
10 - 14.10.16 - 07:32
(0) чо за книга
 
 Рекламное место пустует
   Dyspho
 
11 - 14.10.16 - 07:38
дайте ссылку на книгу
   Штурман
 
12 - 14.10.16 - 07:38
Чистов П. Полная методичка к курсу 1С: Предприятие 8.2. Программирование
   Dyspho
 
13 - 14.10.16 - 07:40
(12) а говоришь 83
   Штурман
 
14 - 14.10.16 - 07:44
(13) косяк да, короче книга по 8.2, но все делаю на платформе 8.3

но не думаю, что ошибки из-за этого, это ж самые основы
   Mankubus
 
15 - 14.10.16 - 07:47
(9) При этом у реквизита «ЕдИзм» свойство:
«Проверка заполнения – Выдавать ошибку».

это сделал?
   Штурман
 
16 - 14.10.16 - 07:50
(15) конечно, это и есть:

Здесь содержится список реквизитов, значение которых проверяется на заполнение.
В процедуре если элемент справочника не группа и услуга, то найдем нужный элемент мас-
сива и удалим его из проверяемых реквизитов.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) 
   
  Если НЕ ЭтоГруппа И Услуга Тогда 
    ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("ЕдИзм")); 
  КонецЕсли; 
   
КонецПроцедуры
   Штурман
 
17 - 14.10.16 - 07:52
(15) в общем из-за этой процедуры нельзя поставить галочку Услуга в справочнике Номенклатра, если элемент справочника принадлежит группе Услуга
   Штурман
 
18 - 14.10.16 - 07:54
(15) вот сам справочник:

http://savepic.ru/11797780.jpg

в группе Товары галка Услуга ставится, а в группе Услуги галка услуга не ставится
   Mankubus
 
19 - 14.10.16 - 07:54
(16) не верю. покажи скриншот со свойствами реквизита ЕдИзм
   Штурман
 
20 - 14.10.16 - 08:00
   Mankubus
 
21 - 14.10.16 - 08:01
(20) а теперь перечитываем (15)
у реквизита «ЕдИзм» свойство:
«Проверка заполнения – Выдавать ошибку».
   Штурман
 
22 - 14.10.16 - 08:10
(21) о, заработало, теперь спокойно можно галку ставить.
Вот только трабла в том, что при создании нового элемента в группе Услуги эта галка автоматически не проставляется, вот код:

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

        ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга);
    конецесли;
    
КонецПроцедуры
   Dyspho
 
23 - 14.10.16 - 08:23
   Штурман
 
24 - 14.10.16 - 08:27
(23) по книжке быстрее, к тому же нет траффика, чтобы видео с ютуба смотреть )
   Dyspho
 
25 - 14.10.16 - 08:28
(24) Я просто думал книжка новая
   Lexey_
 
26 - 14.10.16 - 08:38
(22) "Заполнять из данных заполнения"
   Лефмихалыч
 
27 - 14.10.16 - 08:59
(0) 1. на слове КонецПроцедуры
2. ты не включил "выдавать ошибку" в свойствах реквизита ЕдИзм
3. реквизита формы ТабДок не существует, вот оно и не работает
   Штурман
 
28 - 14.10.16 - 09:03
(27) 3. почему не существует?
вот же картинка: http://radikal.ru/lfp/s019.radikal.ru/i630/1610/b8/bfe8b6895a08t.jpg/htm
реквизит есть
   FIXXXL
 
29 - 14.10.16 - 09:06
ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("ЕдИзм")); 

не надо так писать в общем случае

сначала Найти, потом проверка поиска, если найдено - удалить
   Лефмихалыч
 
30 - 14.10.16 - 09:07
(28) на картинке нет реквизита формы ТабДок. Там есть реквизит объекта, а это не одно и то же.
   Лефмихалыч
 
31 - 14.10.16 - 09:08
(29) если бы проверка заполнения была "выдавать ошибку", то реквизит в массиве бы гарантированно был и код бы выполнился успешно. Но проверка заполнения у ЕдИзм просто не включена.
   Штурман
 
32 - 14.10.16 - 09:18
(30) а как добавить реквизит формы ТабДок? куда?
   cons74
 
33 - 14.10.16 - 09:35
(0) не поверишь, но можно задать вопросы на форуме Чистова: http://forum.chistov.pro
 
 
   GROOVY
 
34 - 14.10.16 - 09:58
Как много нового я о себе узнаю...
   FIXXXL
 
35 - 14.10.16 - 09:59
(31) дык про то и речь
я написал, падаван галку снял, пользователи ловят глюк
   Лефмихалыч
 
36 - 14.10.16 - 09:59
(32) на форму добавить в редакторе формы
   Elysee
 
37 - 14.10.16 - 10:38
(34) Павел, как пишутся 750 страниц? Нужна команда машинисток или доверяя только себе, закрываешься на кухне на 2 месяца?
   GROOVY
 
38 - 14.10.16 - 10:40
(37)  Это скрибинг видеокурса. Делал слушатель. http://expert.chistov.pro/public/249785/


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует