Имя: Пароль:
1C
1С v8
Автоматическое подставление даты в табличную часть документа
0 Korzh
 
29.05.23
22:57
Добрый день.Подскажите как сделать правильно, только учусь.
Есть документ ПродажаАбонемента с реквизитом ДатаОкончанияАбонемента и документ ЗаписиНаТренировки с реквизитом одноименным в табличной части Клиенты.Нужно осуществить автоматическую подстановку даты окончания абонемента из ПродажаАбонемента в ЗаписиНаТренировки при выборе ФИО клиента в табличной части ЗаписиНаТренировки, а также вывод информации в поле надписи если дата окончания меньше текущей даты.Сделал через Регистр сведений, чтобы подцеплялись актуальные даты абонементов.

В отладке выводит ошибку

Метод объекта не обнаружен (ДатаОкончанияАбонемента)
{Документ.ЗаписиНаТренировки.Форма.ФормаДокумента.Форма(26)}:ДатаОкончанияАбонемента = Объект.ДатаОкончанияАбонемента();
{Документ.ЗаписиНаТренировки.Форма.ФормаДокумента.Форма(4)}:ЗаполнитьТабличнуюЧасть();

И заполняет даты автоматически(а не при выборе клиента) только проведенных документов  после создания Регистра Сведений(что собственно логично ), клиента выбрать не могу.


[code]

&НаКлиенте
Процедура КлиентыПриИзменении(Отказ)
    
    ЗаполнитьТабличнуюЧасть();
    
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТабличнуюЧасть()  
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ДанныеОбОкончанииАбонимента.ФИОклиента КАК ФИОклиента,
    |    ДанныеОбОкончанииАбонимента.ДатаОкончанияАбонемента КАК ДатаОкончанияАбонемента
    |ИЗ
    |    РегистрСведений.ДанныеОбОкончанииАбонимента КАК ДанныеОбОкончанииАбонимента";

    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    Для каждого Стр из РезультатЗапроса Цикл
        НоваяСтрока = Объект.ТабличнаяЧасть.Добавить();
        
        НоваяСтрока.ДатаОкончанияАбонемента = Стр.ДатаОкончанияАбонемента;
    КонецЦикла ;
        ТекДата = ТекущаяДата();
    ДатаОкончанияАбонемента = Объект.ДатаОкончанияАбонемента();
          
    Если ДатаОкончанияАбонемента < ТекДата
        тогда
        Инфо = "Нужно приобрести новый абонемент!";

     иначе
         Инфо = "Дата окончания абонемента = " + ДатаОкончанияАбонемента;  
                
    КонецЕсли;

КонецПроцедуры[/code]
1 Волшебник
 
29.05.23
22:56
Объект.ДатаОкончанияАбонемента()

уберите скобки
2 Korzh
 
29.05.23
23:06
Ничего не изменилось.Ошибка такая же, заполнение просто дат в табличной части, клиента добавить не могу.
3 Волшебник
 
29.05.23
23:23
(2) Не врите
4 Korzh
 
29.05.23
23:50
Поле объекта не обнаружено (ДатаОкончанияАбонемента)
{Документ.ЗаписиНаТренировки.Форма.ФормаДокумента.Форма(26)}:ДатаОкончанияАбонемента = Объект.ДатаОкончанияАбонемента;
{Документ.ЗаписиНаТренировки.Форма.ФормаДокумента.Форма(4)}:ЗаполнитьТабличнуюЧасть();

Ну вот как-то так.К сожалению, не вру.Где-то косячу с кодом, пока понять не могу где.
5 Мимохожий Однако
 
29.05.23
23:52
Научись включать отладку. Потом сделай точку останова на строке с ошибкой и долго думай
6 Волшебник
 
30.05.23
08:22
(4) Ошибка изменилась. Раньше был "Метод не обнаружен". Значит врёте, к сожалению.
7 Korzh
 
30.05.23
08:47
Действие не поменялось само - заполняет только даты, не дает выбрать клиента :)
Подскажите, пожалуйста, как исправить.
Написал ДатаОкончанияАбонемента = Объект.Клиенты.ДатаОкончанияАбонемента;
Ну ошибка, собственно, такая же - Поле объекта не обнаружено (ДатаОкончанияАбонемента)
8 banco
 
30.05.23
08:54
(0) Потому что у документа нет ни метода, ни реквизита ДатаОкончанияАбонемента.
Наверное в цикле проверить для каждой строки таб части.
9 Волшебник
 
30.05.23
08:56
(7) Если это реквизит табличной части, то доставать значение надо из конкретной строки
10 Волшебник
 
30.05.23
08:59
Кстати, исправьте опечатку
ДанныеОбОкончанииАбонимента
11 Korzh
 
30.05.23
09:16
Исправил так, но теперь при попытке добавить клиента начинается бесконечная загрузка и только с перезапуском прекращает.

&НаКлиенте
Процедура КлиентыПриИзменении(Элемент)
    
    ЗаполнитьТабличнуюЧасть();  
    
    
    СтрокаТЧ = Элементы.Клиенты.ТекущиеДанные;
    Для каждого СтрокаТЧ из Объект.Клиенты Цикл
     НоваяСтрока = Объект.Клиенты.Добавить();
        
     НоваяСтрока.ДатаОкончанияАбонемента = СтрокаТЧ.ДатаОкончанияАбонемента;
    КонецЦикла ;
        
     ТекДата = ТекущаяДата();
            
    ДатаОкончанияАбонемента = Объект.Клиенты.ДатаОкончанияАбонемента;
          
    Если Объект.ДатаОкончанияАбонемента < ТекДата
        тогда
        Инфо = "Нужно приобрести новый абонемент!";

     иначе
         Инфо = "Дата окончания абонемента = " + ДатаОкончанияАбонемента;  
                
    КонецЕсли;
    
    КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТабличнуюЧасть()  
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ДанныеОбОкончанииАбонемента.ФИОклиента КАК ФИОклиента,
    |    ДанныеОбОкончанииАбонемента.ДатаОкончанияАбонемента КАК ДатаОкончанияАбонемента
    |ИЗ
    |    РегистрСведений.ДанныеОбОкончанииАбонемента КАК ДанныеОбОкончанииАбонемента";

    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    

КонецПроцедуры
12 Волшебник
 
30.05.23
09:18
(11) А регистр сведений Вы тоже переименовали?

Кстати, в запросе нет условия на клиента. Он выбирает все данные, это может быть долго
13 Волшебник
 
30.05.23
09:20
(11) Кстати, поздравляю, Вы сделали бесконечную рекурсию

У Вас же внутри процедуры КлиентыПриИзменении(Элемент)
меняется табличная часть Клиенты и опять вызывается эта процедура
14 KJlag
 
30.05.23
09:20
Для каждого СтрокаТЧ из Объект.Клиенты Цикл
     НоваяСтрока = Объект.Клиенты.Добавить();
        
     НоваяСтрока.ДатаОкончанияАбонемента = СтрокаТЧ.ДатаОкончанияАбонемента;
КонецЦикла ;


красиво. а зачем?
15 Мультук
 
30.05.23
09:22
(11)

Вот здесь запрос сам должен догадаться какой абонемент вы имеете в виду ?
Или это учебная база, абонемент всегда один, а дальше "и так сойдет" ?


   Запрос.Текст =
    "ВЫБРАТЬ
    |    ДанныеОбОкончанииАбонемента.ФИОклиента КАК ФИОклиента,
    |    ДанныеОбОкончанииАбонемента.ДатаОкончанияАбонемента КАК ДатаОкончанияАбонемента
    |ИЗ
    |    РегистрСведений.ДанныеОбОкончанииАбонемента КАК ДанныеОбОкончанииАбонемента";
16 Волшебник
 
30.05.23
09:22
(14) Это генератор программного кода или магическое программирование. Вдруг сработает
17 Korzh
 
30.05.23
09:33
Регистр переименовал правильно, спасибо
Как исправить код, подскажите, пожалуйста, не могу додуматься
18 Волшебник
 
30.05.23
09:35
(17) Сотрите всю процедуру и напишите новую.

Задействуйте событие ПриИзменении для ячейки Клиент в табличной части.
В ней напишите одну строку.
19 Волшебник
 
30.05.23
09:50
(17) Дополнительно измените структуру регистра. Измерение ФИОклиента переименуйте в Клиент и измените тип на Справочник.Клиенты
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший