Имя: Пароль:
1C
1С v8
Переменная переменная или вопрос на 1 миллион (не знаю как иначе назвать).
0 bplmeddy
 
14.09.18
16:59
Доброго времени суток.

Прошу совета по следующему вопросу:
Есть колонка "Себестоимость". Она создана через конфигуратор как реквизит ТЧ.
Есть несколько колонок которые были созданы программно.
И есть переменная (тип "Соответствие"(ключ - "ЦенаА", значение - 20(%)), в которой есть проценты наценок для каждой программно созданной колонки.

Например: ЦенаА, ЦенаБ - цены которые нужно высчитать.

Нужно заполнить значениями в ТЧ эти колонки по принципу:
ЦенаА = Себестоимость*ЗначениеПроцентаИзСоответсвия.
Но не могу придумать как их связать. Необходимо для каждой колонки использовать свой процент.

Посоветуйте пожалуйста как быть.
1 bplmeddy
 
14.09.18
17:00
Забыл сказать - управляемые формы.
2 bplmeddy
 
14.09.18
17:02
Думал сначала возможно есть способ сделать так:

Для Каждого СтрТаб Из Объект.КонтрольЦен Цикл
СтрТаб.{ВсунутьНазваниеКолонки} ....

Но думаю что так нельзя.
3 FIXXXL
 
14.09.18
17:05
(0) И есть переменная (тип "Соответствие"(ключ - "ЦенаА", значение - 20(%)), в которой есть проценты наценок для каждой программно созданной колонки.

Что мешает в Соответствие ИмяКолонки положить ключом?
4 bplmeddy
 
14.09.18
17:07
А весь алгоритм работы такой:

1) Пользователь открывает обработку и задает цены которые нужно устанавливать. На основании этих данных создаются колонки:

МассивНовыхКолонок = ЭтаФорма.ВидыУстанавливаемыхЦен.ВыгрузитьЗначения();
    Для Каждого Кол Из МассивНовыхКолонок Цикл
        нРеквизиты = Новый Массив;
        нРеквизиты.Добавить(Новый РеквизитФормы(СтрЗаменить(Кол," ",""), Новый ОписаниеТипов("Число"), "Объект.КонтрольЦен", СтрЗаменить(Кол," ",""), Истина));
        ИзменитьРеквизиты(нРеквизиты);

        нЭлемент = Элементы.Добавить(СтрЗаменить(Кол," ",""), Тип("ПолеФормы"), Элементы.КонтрольЦен);
        нЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        нЭлемент.ПутьКДанным = "Объект.КонтрольЦен."+СтрЗаменить(Кол," ","");    
    КонецЦикла;

2) Пользователь нажимает кнопку "УстановитьПроценты". Открывается форма для установки процентов наценки, на ней программно создаются поля ввода для каждой отобранной цены:

ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("Реквизиты", ЭтаФорма.ВидыУстанавливаемыхЦен.ВыгрузитьЗначения());
    ОткрытьФорму("Обработка.КонтрольЦен.Форма.ФормаПроцентыЦен", ПараметрыОткрытия, ЭтотОбъект);

МассивРеквизитов = Новый Массив;
    МассивРеквизитов = Параметры.Реквизиты;
    Если МассивРеквизитов <> Неопределено Тогда
        Для Каждого НовРек Из МассивРеквизитов Цикл
            СоздатьПолеНаСервере(НовРек);
        КонецЦикла;
    КонецЕсли;

///////ПОЛЯ ВВОДА ПРОЦЕНТОВ
    //Добавляем реквизит
    нРеквизиты = Новый Массив;
    Реквизит = Новый РеквизитФормы(СтрЗаменить(РеквизитПоля," ",""), Новый ОписаниеТипов("Число"), , "Процент для "+РеквизитПоля, Истина);
    нРеквизиты.Добавить(Реквизит);
    ИзменитьРеквизиты(нРеквизиты);

    //Добавляем поле ввода
    Элемент = ЭтаФорма.Элементы.Добавить(СтрЗаменить(РеквизитПоля," ",""), Тип("ПолеФормы"), ЭтаФорма.Элементы.ГруппаПроценты);
    Элемент.Вид = ВидПоляФормы.ПолеВвода;
    Элемент.ПутьКДанным = СтрЗаменить(РеквизитПоля," ","");

3) Когда значения процентов указаны, пользователь жмакает кнопку "Подтвердить", форма закрывается, данные передаются обратно в родительскую форму:

ПроцентыЦен = Новый Соответствие;
    Для Каждого Элемент Из ЭтаФорма.Элементы Цикл
        Если Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
            ПроцентыЦен.Вставить(Элемент.Имя,Число(Элемент.ТекстРедактирования));
        КонецЕсли;
    КонецЦикла;
    Оповестить("ФиксацияПроцентов", ПроцентыЦен);
    ЭтаФорма.Закрыть();

5) Дальше нужно как раз сделать то что я описал. Но додуматься к сожалению не могу :( Застрял на таком "чуде":

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ФиксацияПроцентов" Тогда
        ТаблицаПроцентов = Параметр;
        Если ТаблицаПроцентов <> Неопределено Тогда
            Для Каждого Элем Из ТаблицаПроцентов Цикл
                Для Каждого СтрТаб Из Объект.КонтрольЦен Цикл
                    
                    //Сообщить(Элем.Ключ+" "+Элем.Значение);
                КонецЦикла;
            КонецЦикла;    
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
5 bplmeddy
 
14.09.18
17:07
(3) Лежит. Что дальше с ним делать? Имя колонок, и ключи в соответствии совпадают.
6 bplmeddy
 
14.09.18
17:08
Мозги уже кипят. Прошу прощения если не вижу очевидного. Но без вас на справлюсь.
7 FIXXXL
 
14.09.18
17:12
Строка[КлючИмяКолонки] = Цена * Соответствие.Получить(ИмяКолонки)
8 FIXXXL
 
14.09.18
17:14
Для Каждого ТекСтрока из ТаблицаФормы Цикл

Для каждого КлючЗнач Из Соответствия Цикл

КлючИмяКолонки = КлючЗнач.Ключ

Строка[КлючИмяКолонки] = Цена * Соответствие.Получить(ИмяКолонки)

КонецЦикла

КонецЦикла
9 bplmeddy
 
14.09.18
17:19
(8) Сейчас попробую
10 bplmeddy
 
14.09.18
17:23
(8) А ИмяКолонки мы откуда получаем ?
Или это КлючИмяКолонки ?
11 bplmeddy
 
14.09.18
17:29
(10) Понял. Опять туплю
12 bplmeddy
 
14.09.18
17:35
(8) Заработало! Спасибо огромнейшее. Плюсов в карму, долгих лет, и богатства!
13 FIXXXL
 
14.09.18
18:01
(10) сорри, описАлся :)
14 bplmeddy
 
14.09.18
18:06
(13) Не страшно, главное что сработало. Если не сложно, и есть где-то под рукой, можете ткнуть носом в мануал по данному вопросу (индексы колонок(" [КлючИмяКолонки] ")).
15 bplmeddy
 
14.09.18
18:07
(14) А то я сегодня понял что у меня в данной плане проблем в знаниях )
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой