Имя: Пароль:
1C
1С v8
Программно изменить дополнительные реквизиты (сведения)
0 tabarigen
 
17.12.15
15:02
Здравствуйте друзья.
Для документа поступления добавил 2 доп реквизита: ВремяРазбора(Тип Дата) и Проверено (Тип Булево).

Как я могу получить доступ к этим реквизитам, через ссылку на документ? И возможно ли вообще через ссылку на документ изменить их?
Или же обязательно нужно ПВХ ковырять, или где там они хранятся?
1 Живой Ископаемый
 
17.12.15
15:16
через ссылку ты даже НЕдополнительные не сможешь изменить, придется объект получать...
2 tabarigen
 
17.12.15
15:17
(1) так я получил, на сервере

&НаСервере
Процедура ПеренестиВДокументНаСервере()
    // Вставить содержимое обработчика.
    ДокПоступления = ДокументПоступления.ПолучитьОбъект();
    ДокПоступления.Проверено = Истина;
КонецПроцедуры
3 tabarigen
 
17.12.15
15:18
{Форма.Форма.Форма(222)}: Поле объекта не обнаружено (Проверено)
    ДокПоступления.Проверено = Истина;
4 pessok
 
17.12.15
15:21
(3) а ДокументПоступления то заполнено?
5 IlyaSR
 
17.12.15
15:22
нет конечно, раз параметра нет

и записать после ДокПоступления не забудь
6 tabarigen
 
17.12.15
15:24
(4) Док Поступления заполнено на форме. В нем хранится ссылка на Документ.
7 pessok
 
17.12.15
15:28
(6) а что нам говорит отладчик на строке
ДокПоступления.Проверено = Истина; ?
8 tabarigen
 
17.12.15
15:28
Непонятно как добраться до Доп Реквизитов?
9 tabarigen
 
17.12.15
15:29
(7) я ж показал что он говорит
{Форма.Форма.Форма(222)}: Поле объекта не обнаружено (Проверено)
    ДокПоступления.Проверено = Истина;
10 pessok
 
17.12.15
15:30
*отладчик*
11 pessok
 
17.12.15
15:31
(8) конфа какая, для начала? в управлении борделем 3.1 это табчасть объекта, например
12 tabarigen
 
17.12.15
15:31
тоже самое говорит. Shift+F9  Выдает

поле объекта не обнаружено.
13 tabarigen
 
17.12.15
15:31
(11) конфа УТ 11
14 pessok
 
17.12.15
15:32
(12) так надо ж смотреть что у тебя в ДокументПоступления
(13) ну та в УТ 11 тоже в ТЧ объекта
15 tabarigen
 
17.12.15
15:35
Кстати для Ссылки на документ доступны свойства ДополнительныеРеквизиты и ДоаолнительныеСведения
16 tabarigen
 
17.12.15
15:36
(14) Вы наверное вопрос не поняли. Я создал в ПВХ дополнительные сведения для Документа поступления. Теперь я хочу их программно изменить.
17 pessok
 
17.12.15
15:36
(15) продолжайте наблюдения
18 pessok
 
17.12.15
15:36
(16) я то как раз все прекрасно понял.
но судя по ошибке в (9) что-то там не то
19 АдинС
 
17.12.15
15:40
к доп реквизитам через точку не добраться.... через точку только к нормальным реквизитам...
20 tabarigen
 
17.12.15
15:41
(18) Добраться не могу до Дополнительного Реквизита.
Неудивительно, напрямую это навероне и не должно делаться.

https://yadi.sk/i/2clt5shAmHyg5
21 tabarigen
 
17.12.15
15:41
(19) ну вот и я о том же. Как же к ним обращаться?
22 singlych
 
17.12.15
15:44
(21) они лежат в ТЧ ДополнительныеРеквизиты
23 АдинС
 
17.12.15
15:45
(21) Через ТЧ ДополнительныеРквизиты
24 DexterMorgan
 
17.12.15
15:46
//Объект = Объект-владелец доп реквизита
//НаименованиеДопРеквизита - Имя доп реквизита
//ЗначениеДопРеквизита - новое значение доп реквизита


ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(НаименованиеДопРеквизита, Истина);

СтрокаТЧ = Объект.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, "Свойство");

Если СтрокаТЧ = Неопределено Тогда
СтрокаТЧ = ОбъектОбъект.ДополнительныеРеквизиты.Добавить();
СтрокаТЧ.Свойство = ДопРеквизитСсылка;
КонецЕсли;

СтрокаТЧ.Значение = ЗначениеДопРеквизита;
25 DexterMorgan
 
17.12.15
15:52
(20) да, кстати, наименование доп реквизита нужно посмотреть в ПВХ, это не просто "Проверено", а что то вроде "Проверено (Поступление товаров и услуг)"
26 tabarigen
 
17.12.15
15:54
(25) {Форма.Форма.Форма(224)}: Ошибка при вызове метода контекста (Найти)
    СТрокаТЧ = ДокПоступления.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, "Проверено");
по причине:
Неверное имя колонки


эт точно. Сейчас посмотрю
27 DexterMorgan
 
17.12.15
15:56
(26) ну ты даешь.
СтрокаТЧ = Объект.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, "Свойство");

это менять не надо, искать доп реквизит надо тут

ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(НаименованиеДопРеквизита, Истина);
28 tabarigen
 
17.12.15
15:56
(25) ссылку на реквизит получаю, дальше ошибка

{Форма.Форма.Форма(224)}: Ошибка при вызове метода контекста (Найти)
    СТрокаТЧ = ДокПоступления.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, "Проверено");
по причине:
Неверное имя колонки



код такой
    // Получаем ссылку на документ
    ДокПоступления = ДокументПоступления.ПолучитьОбъект();
    //Получаем ссылку на доп реквизит
    ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Проверено (Поступление товаров и услуг)", Истина);
    СТрокаТЧ = ДокПоступления.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, "Проверено");
    СТрокаТЧ.Значение = Истина;
    
    ДокПоступления.Записать();
29 tabarigen
 
17.12.15
15:57
(27) расслабься я так и сделал)
30 DexterMorgan
 
17.12.15
15:57
(26) Проверено действительно колонки в тч нет, есть колонка "свойство"
31 DexterMorgan
 
17.12.15
15:58
(29) да я и не напрягался
32 DexterMorgan
 
17.12.15
15:59
(29) я вижу как ты сделал
33 tabarigen
 
17.12.15
16:03
(30) сделал свойство теперь такая ошибка
{Форма.Форма.Форма(225)}: Значение не является значением объектного типа (Значение)
    СТрокаТЧ.Значение = Истина;




&НаСервере
Процедура ПеренестиВДокументНаСервере()
    // Получаем ссылку на документ
    ДокПоступления = ДокументПоступления.ПолучитьОбъект();
    //Получаем ссылку на доп реквизит
    ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Проверено (Поступление товаров и услуг)", Истина);
    СТрокаТЧ = ДокПоступления.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, "Свойство");
    СТрокаТЧ.Значение = Истина;
    ДокПоступления.Записать();
КонецПроцедуры
34 DexterMorgan
 
17.12.15
16:05
(33) Слушай я тебе написал код, который проверяем на неопределено строку. Но ты его решил не писать, ты же лучше знаешь как надо. Прочитай лучше (24), ты думаешь "если" там зря написано?
35 tabarigen
 
17.12.15
16:08
(34) Зачем мне проверять есть ли реквизит "Проверено" если я знаю что он есть
36 DexterMorgan
 
17.12.15
16:10
(35) Ну видишь, ты лучше знаешь как устроен этот механизм
37 tabarigen
 
17.12.15
16:11
(36) ))
38 tabarigen
 
17.12.15
16:11
(36) Ну Морган ну не томи
39 DexterMorgan
 
17.12.15
16:11
(35) Зачем тогда на форуме спрашивать?
40 DexterMorgan
 
17.12.15
16:12
(38) его там нет. В табличную часть доп реквизиты добавляются при записи объекта
41 DexterMorgan
 
17.12.15
16:12
(38) При чем только если они заполнены
42 tabarigen
 
17.12.15
16:15
(40) упс.. нестыковочка. Так реквизиты я добавлял разве не к объекту? причем тут табличная часть? я ж не для каждой строки меняю, а для объекта Документ Поступления в целом.
43 DexterMorgan
 
17.12.15
16:16
(42) А ты не троль?)
44 tabarigen
 
17.12.15
16:18
(43) нет, честно
45 DexterMorgan
 
17.12.15
16:18
(44) Ты создавал элемент плана видов характеристик, к документу это не имеет отношения. Чтобы заполнить доп реквизит в документе, нужно добавить его в табличную часть "ДополнительныеРеквизиты" документа.
46 DexterMorgan
 
17.12.15
16:19
(44) Его там может не быть. А может быть. Поэтому нужно найти эту строку табличной части и проверить неопределено она или нет. И если ее нет, то добавить.
47 tabarigen
 
17.12.15
16:25
(46) Спасибо что объяснили на пальцах. я и не знал что допреквизиты в отдельной тч хранятся.

Переписал код как вы посоветовали, ошибок нет, но значение реквизита не меняется.

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



Может я значение неправильно присваиваю. Так как в СтрокаТЧ я получаю ссылку парвильно
48 DexterMorgan
 
17.12.15
16:28
В форме меняешь?
49 DexterMorgan
 
17.12.15
16:28
Или из обработки?
50 tabarigen
 
17.12.15
16:36
из обработки
51 DexterMorgan
 
17.12.15
16:37
Кароче, если это форма обработки - значит должно меняться, нужно перечитать данные формы или переоткрыть документ.
Если из формы документа, нужно по-другому делать:

Доп реквизиты на форме генерятся автоматически причем наименование складывается из гуида ПВХ ДополнительныеРеквизитыИСведения и гуида спр НаборыДополнительныхРеквизитовИСведений
надо найти на форме в отладке реквизит, он будет типа такого:
ДопРеквизит = "ДополнительныйРеквизитЗначение_F04809F9x137Dx11E4x93F1x002590F36D23_F26DC8FFx2E7Fx11E4x93FFx002590F36D25";

и просто присвоить ему значение
ЭтаФорма["ДополнительныйРеквизитЗначение_F04809F9x137Dx11E4x93F1x002590F36D23_F26DC8FFx2E7Fx11E4x93FFx002590F36D25"] = Истина;
52 DexterMorgan
 
17.12.15
16:38
(50) Тогда не может не меняться =)
53 DexterMorgan
 
17.12.15
16:47
(50) А ты точно доп реквизит создал или доп сведение?
54 tabarigen
 
17.12.15
16:47
(52) буду провобовать. Вам спасибо. по результатам отпишусь
55 tabarigen
 
18.12.15
11:05
в общем ситуация такая, у меня были добавлены допсведения и не доп реквизиты, потому они и не менялись.

Теперь бы еще осмыслить как быть если хочу изменить больше одного Доп реквизита.


&НаСервере
Процедура ПеренестиВДокументНаСервере()
    // Получаем ссылку на документ
    ДокПоступления = ДокументПоступления.ПолучитьОбъект();
    //Получаем ссылку на доп реквизит  
    ДопРеквизитПроверено = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Проверено (Поступление товаров и услуг)", Истина);
    ДопРеквизитВремяРазбора = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Время Разбора (Поступление товаров и услуг)", Истина);
    
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Свойство", ДопРеквизитПроверено);
    ПараметрыОтбора.Вставить("Свойство", ДопРеквизитВремяРазбора);
    ЕстьСтроки = ДокПоступления.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);
    Если ЕстьСтроки.Количество() = 0 Тогда
     СтрокаТЧ = ДокПоступления.ДополнительныеРеквизиты.Добавить();
     СтрокаТЧ.Свойство = ДопРеквизитПроверено;
    Иначе
     СтрокаТЧ = ЕстьСтроки[0];
    КонецЕсли;
    СтрокаТЧ.Значение = Истина;
    СтрокаТЧ.ТекстоваяСтрока = "Да";
    ДокПоступления.Записать();
КонецПроцедуры



Если сделаю так то думаю будет ошибка.

Если ЕстьСтроки.Количество() = 0 Тогда
     СтрокаТЧ = ДокПоступления.ДополнительныеРеквизиты.Добавить();
     СтрокаТЧ.Свойство = ДопРеквизитПроверено;
    СтрокаТЧ.Свойство = ДопРеквизитВремяРазбора;
    Иначе
56 tabarigen
 
18.12.15
14:48
Сделал так если кому интересно, не знаю насколько правильно с точки зрения производительности

&НаСервере
Процедура ПеренестиВДокументНаСервере()
    // Получаем ссылку на документ
    ДокПоступления = ДокументПоступления.ПолучитьОбъект();
    //Получаем ссылку на доп реквизит
    ДопРеквизитПроверено = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Проверено (Поступление товаров и услуг)", Истина);
    ЕстьСтроки = ДокПоступления.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизитПроверено));//Пусть результатом поиска будут "ЕстьСтроки"
    Если ЕстьСтроки.Количество() = 0 Тогда
     СтрокаТЧ = ДокПоступления.ДополнительныеРеквизиты.Добавить();
     СтрокаТЧ.Свойство = ДопРеквизитПроверено;
    Иначе
     СтрокаТЧ = ЕстьСтроки[0];
    КонецЕсли;
    СТрокаТЧ.Значение = Истина;
    ДокПоступления.Записать();
    
    ДопРеквизитВремяРазбора = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Время Разбора (Поступление товаров и услуг)", Истина);
    ЕстьСтроки = ДокПоступления.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизитВремяРазбора));//Пусть результатом поиска будут "ЕстьСтроки"
    Если ЕстьСтроки.Количество() = 0 Тогда
     СтрокаТЧ = ДокПоступления.ДополнительныеРеквизиты.Добавить();
     СтрокаТЧ.Свойство = ДопРеквизитВремяРазбора;
    Иначе
     СтрокаТЧ = ЕстьСтроки[0];
    КонецЕсли;
    СТрокаТЧ.Значение = ТекущаяДата();
    ДокПоступления.Записать();
    
    
    
КонецПроцедуры