Имя: Пароль:
1C
1С v8
Вопросы по курсу Чистова 8.3
0 Штурман
 
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
2 mehfk
 
14.10.16
07:06
ТабДок должен быть реквизитом формы, а не реквизитом объекта.
3 Mankubus
 
14.10.16
07:07
>>где ставить точку останова, чтобы потом Вычислить выражение?
на строке со словом КонецПроцедуры
4 Mankubus
 
14.10.16
07:08
>>Но если в группе Услуг у справочника поставить галку, вылазит ошибка:
Нажми на кнопку Подробно чтобы был полный текст ошибки
5 Штурман
 
14.10.16
07:12
(4)
Ошибка при выполнении обработчика - 'ОбработкаПроверкиЗаполнения'
по причине:
{Справочник.Номенклатура.МодульОбъекта(16)}: Ошибка при вызове метода контекста (Удалить)
        ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("ЕдИзм"));
по причине:
Несоответствие типов (параметр номер '1')
6 Штурман
 
14.10.16
07:13
(4) ок, первый вопрос понятен :)
7 Mankubus
 
14.10.16
07:17
(5) в массиве ПроверяемыеРеквизиты нету значения "ЕдИзм"
В реквизите установлено значение Выдавать ошибку на проверке заполнения?
8 Штурман
 
14.10.16
07:25
(7) сам весь код формы справчоника такой:


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

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

Но такая запись не очень хороша, т.к. признак «Услуга» - это реквизит справочника, а так как
в нем свойство «Заполнять из данных заполнения = Истина», то если в «ДанныеЗаполнения»
при отрабатывании процедуры будет найден ключ «Услуга», то система заполнит его автома-
том, т.е. принудительно его устанавливать не надо.

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

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

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

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

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

Итого:

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

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

Данные заполнения можно как прочитать:

А = ДанныеЗаполнения.Услуга

так и записать в них значение:

ДанныеЗаполнения.Услуга = Ложь

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

Модуль объекта – процедура «ОбработкаПроверкиЗаполнения»

ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Отказ – признак успешности транзакции записи объекта в БД.

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

Но данная процедура будет работать не только для элементов, но и для групп, что неправиль-
но. Добавим код:

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

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

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

но не думаю, что ошибки из-за этого, это ж самые основы
15 Mankubus
 
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

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    Если ДанныеЗаполнения = Неопределено тогда
        Возврат
    конецесли;
    
    если ДанныеЗаполнения.Свойство("Родитель") тогда
        //Услуга = ДанныеЗаполнения.Родитель.Услуга;
        ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга);
    конецесли;
    
КонецПроцедуры
23 Dyspho
 
14.10.16
08:23
24 Штурман
 
14.10.16
08:27
(23) по книжке быстрее, к тому же нет траффика, чтобы видео с ютуба смотреть )
25 Dyspho
 
14.10.16
08:28
(24) Я просто думал книжка новая
26 Lexey_
 
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
реквизит есть
29 FIXXXL
 
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) а как добавить реквизит формы ТабДок? куда?
33 cons74
 
14.10.16
09:35
(0) не поверишь, но можно задать вопросы на форуме Чистова: http://forum.chistov.pro
34 GROOVY
 
14.10.16
09:58
Как много нового я о себе узнаю...
35 FIXXXL
 
14.10.16
09:59
(31) дык про то и речь
я написал, падаван галку снял, пользователи ловят глюк
36 Лефмихалыч
 
14.10.16
09:59
(32) на форму добавить в редакторе формы
37 Elysee
 
14.10.16
10:38
(34) Павел, как пишутся 750 страниц? Нужна команда машинисток или доверяя только себе, закрываешься на кухне на 2 месяца?
38 GROOVY
 
14.10.16
10:40
(37)  Это скрибинг видеокурса. Делал слушатель. http://expert.chistov.pro/public/249785/
Основная теорема систематики: Новые системы плодят новые проблемы.