Имя: Пароль:
1C
1С v8
Необходимо заполнить таблицу значений программно с программно добавленными колонками
🠗 (Волшебник 12.03.2025 16:20)
0 dkalin
 
12.03.25
15:54
Добрый день!Необходимо заполнить таблицу значений программно с программно добавленными колонками.Я добавила рекизит формы Таблицазначений.Программно добавила колонки и описала их тип в процедуре
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если  Не Объект.пн.Пустая() Тогда
    МассивТипа = Новый Массив;
    МассивТипа.Добавить(Тип("ТаблицаЗначений"));

    ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
    МассивРеквизитовФормы = Новый Массив;
    МассивРеквизитовФормы.Добавить(Новый РеквизитФормы("ТЗ", ОписаниеТипа, "", "Т"));
    
    ТЗ = Новый ТаблицаЗначений;
      ТЗ.Колонки.Добавить("Номер",Новый ОписаниеТипов("Число"),"№",3);
    ТЗ.Колонки.Добавить("Код",Новый ОписаниеТипов("Строка"),"Код",9);
    ТЗ.Колонки.Добавить("Номенклатура",Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"Номенклатура",28);
    ТЗ.Колонки.Добавить("Цена",Новый ОписаниеТипов("Число"),"Цена",7);

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

    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Строка = ТДп.Добавить();
        Строка.Код = ВыборкаДетальныеЗаписи.НоменклатураКод;
        Строка.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
    КонецЦикла;
     ЗначениеВРеквизитФормы(ТДп, "Тп");  
   КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура пнПриИзменении(Элемент)
     пнПриИзмененииНаСервере();
КонецПроцедуры
1 dkalin
 
12.03.25
15:55
Пишет Поле объекта не обнаружено (Код)
{ВнешняяОбработка.СозданиеПеремещенийУНФ.Форма.Форма.Форма(141)}:Строка.Код = ВыборкаДетальныеЗаписи.НоменклатураКод;
{ВнешняяОбработка.СозданиеПеремещенийУНФ.Форма.Форма.Форма(152)}:пнПриИзмененииНаСервере();

[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]
2 dkalin
 
12.03.25
15:55
Что я не так делаю?
3 arsik
 
гуру
12.03.25
15:57
ТДп = Новый ТаблицаЗначений;
Не смущает?
4 maxab72
 
12.03.25
15:59
(2) Вижу ТДп = Новый ТаблицаЗначений;, а где описание полей?
5 dkalin
 
12.03.25
16:00
(3) Что не так?
6 dkalin
 
12.03.25
16:01
(3) Я поняла,это в полях дело или нетолько?
7 Fedor-1971
 
12.03.25
16:06
(2) так попутала, почти берега
реквизит формы: ТЗ (вот это "   ТЗ = Новый ТаблицаЗначений;" лишнее, т.к. он уже создан с нужным типом)
А исправляешь:
  ТДп = Новый ТаблицаЗначений;

а где колонки оной?
8 dkalin
 
12.03.25
16:13
(7) Я добавила колонки,теперь вторая ошибка
Тут
&НаСервере
Процедура пнПриИзмененииНаСервере()
    Если  Не Объект.пн.Пустая() Тогда
    ТДп = Новый ТаблицаЗначений;
    ТДп.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    ТДп.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПриходнаяНакладнаяЗапасы.Номенклатура КАК Номенклатура,
        |    ПриходнаяНакладнаяЗапасы.Номенклатура.Код КАК НоменклатураКод
        |ИЗ
        |    Документ.ПриходнаяНакладная.Запасы КАК ПриходнаяНакладнаяЗапасы";

    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Строка = ТДп.Добавить();
        Строка.Код = ВыборкаДетальныеЗаписи.НоменклатураКод;
        Строка.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
    КонецЦикла;
     ЗначениеВРеквизитФормы(ТДп, "Тп");  
   КонецЕсли;
КонецПроцедуры
Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
{ВнешняяОбработка.СозданиеПеремещенийУНФ.Форма.Форма.Форма(138)}:ЗначениеВРеквизитФормы(ТДп, "Тп");
{ВнешняяОбработка.СозданиеПеремещенийУНФ.Форма.Форма.Форма(144)}:пнПриИзмененииНаСервере();

[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Недопустимое значение параметра (параметр номер '2')
[ОшибкаИспользованияВстроенногоЯзыка]
9 Волшебник
 
12.03.25
16:18
Какой позор!
10 Волшебник
 
12.03.25
16:19
Поле объекта не обнаружено...
Недопустимое значение параметра...
11 Волшебник
 
12.03.25
16:20
При чём тут форум?! Иди, работай в отладчике! Копай синтакс-помощник! При чём тут форум?!
12 Мультук
 
гуру
12.03.25
16:20
(8)

Нужно менять, пока ошибки не исчезнут
Очень действенный способ "времен до ChatGPT".

Кстати,
"пн" это вероятно реквизит "выбранная ПриходнаяНакладная"

А запрос, телепатически должен догадаться, что нужен отбор только по этой накладной или нет?

P.S.
Скучно и печально.
13 Fedor-1971
 
12.03.25
16:25
(8) Заполняй сразу ТЗ, а не всякие левые таблицы
Ну и посмотри, надо её чистить или нет перед заполнением
14 maxab72
 
12.03.25
16:26
(12) не, "пн" - это понедельник, потом добавятся процедуры с префиксами "вт", "ср", "чт", "пт" и "вс".
(8) видимо это реквизиты разных типов или с разным составом полей.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.