Имя: Пароль:
1C
1С v8
Не работает УФ ИзменитьРеквизиты при вызове из модуля
0 tciban
 
14.06.16
14:17
Уважаемые коллеги! подскажите в чем может быть дело! 1С 8.3.8.1747

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

Вызываю ее ПриСозданииНаСервере. Все хорошо. Перенес ее в серверный модуль (т.к. она понадобиться еще во многих формах). Отрабатывается без ошибки, но после колонок исхВалюта и исхКурс в таблице не оказывается! Что не так?!
1 Fedor-1971
 
14.06.16
14:27
(0)"Не так" - место вызова, скорее всего вызываешь прямо из процедуры/функции НаКлиенте (доступ к контексту формы недостаточен для его модификации). Пробуй сначала перейти в процедуру НаСервере (получишь серверный контекст формы), а потом вызывай свой модификатор.
2 tciban
 
14.06.16
14:41
Перепроверил. Вызываю так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОбработкаТабличныхЧастей.ДобавитьКолонкиВалютыКурсаВТаблицуНаСервере(ЭтаФорма, "Спецификация");
    ОбработкаТабличныхЧастей.ЗаполнитьРасчетныеКолонки(ЭтаФорма, "Спецификация");
КонецПроцедуры

Все работает. Но если вызываю процедуру ДобавитьКолонкиВалютыКурсаВТаблицуНаСервере в начале процедуры ЗаполнитьРасчетныеКолонки, то не работает.

Процедура ЗаполнитьРасчетныеКолонки(Форма, ИмяТаблицы, ЗначениеПустогоКоличества = 0) Экспорт
    
    Объект = Форма.Объект;
    
    ДобавитьКолонкиВалютыКурсаВТаблицуНаСервере(Форма, ИмяТаблицы);
    
    Для Каждого СтрокаТаблицы Из Объект[ИмяТаблицы] Цикл
        Если СтрокаТаблицы.Свойство("исхВалюта") Тогда
            СтрокаТаблицы.исхВалюта = СтрокаТаблицы.Валюта;
            СтрокаТаблицы.исхКурс   = СтрокаТаблицы.Курс;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
3 tciban
 
14.06.16
14:42
СтрокаТаблицы.Свойство("исхВалюта") = ложь почему то
4 tciban
 
14.06.16
14:47
И до кучи еще вопрос знатокам: как проверить что в ТЧ, которую я передаю в ЗаполнитьРасчетныеКолонки(Форма, ИмяТаблицы) есть колонка Валюта? Что бы не добавлять исхВалюта если Валюты нет.
5 tciban
 
14.06.16
14:48
Ответ на первый вопрос нашел - поменял местами первые 2 строки процедуры ЗаполнитьРасчетныеКолонки
6 Cyberhawk
 
14.06.16
14:49
Я что-то не вижу, чтобы ты какую-то колонку добавлял в ЭУ. Ты добавил только в реквизиты, а нужно еще и ЭУ нарисовать с путем к этому реквизиту
7 tciban
 
14.06.16
14:51
Мне не нужна видимость колонки, нужен только реквизит - колонка, для хранения исх. значений, которые я туда пишу при открытии формы документа :)
8 Cyberhawk
 
14.06.16
15:01
А, ясно.
Проверять существование реквизита / колонки реквизита где хочешь - на клиенте или на сервере?
9 tciban
 
14.06.16
15:02
На сервере
10 Cyberhawk
 
14.06.16
15:07
Ну тогда или метод в лоб (через попытку) тебе в помощь, или так:

    РеквизитФормыКоллекция.Очистить();
    ТЗ = РеквизитФормыКоллекция.Выгрузить();
    #Если _ Тогда
        ТЗ = Новый ТаблицаЗначений;
    #КонецЕсли
    
    КоллекцияКолонокТЗ = ТЗ.Колонки;
11 Cyberhawk
 
14.06.16
15:07
Само собой, коллекцию передавать по значению
12 Cyberhawk
 
14.06.16
15:09
+ еще у строки коллекции есть метод Свойство(), но это прокатит, если кол-во строк у тебя в коллекции есть...
13 tciban
 
14.06.16
15:12
Через свойство сразу не стал делать, т.к. строк может не быть. Сделал так:

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

Т.е. через попытку, классическим способом. Но это как то громоздко, может есть другой спсоб?
14 tciban
 
14.06.16
15:13
В принципе можно через свойство. Добавить строку, проверить, удалить строку...
15 Cyberhawk
 
14.06.16
16:18
"через попытку, классическим способом. Но это как то громоздко, может есть другой спсоб?"
Я вроде уже описал его выше
Основная теорема систематики: Новые системы плодят новые проблемы.