Имя: Пароль:
1C
1С v8
Как в УФ на форме в произвольном списке добавить колонку с нужным значением
0 oleg_prg
 
12.12.17
14:09
Добрый день уважаемые форумчане. Подскажите пожалуйста как в УФ на форме в произвольном списке добавить колонку с нужным значением.
Вот фотка чтобы было понятно. https://yadi.sk/i/AHUcuPSe3QYPgR
Заранее спасибо!
1 DmitrO
 
12.12.17
14:17
Нужно использовать событие ПриПолученииДанныхНаСервере. Все получится.
2 Сти
 
12.12.17
14:22
(1) для динамических списков только начиная с 8.3.8. Кроме того, поиск, отбор и прочее по получившейся колонке работать не будет.
3 drcrasher
 
12.12.17
14:28
(1) нафиг. у него там произвольный запрос, пусть туды и пихает. а потом колонку на форму
4 oleg_prg
 
12.12.17
14:43
(3) Даты запихнуть не получится т.к. мне надо дата прописью типа: 9 лет 5 месяев 3 дня  В запросе так не сделать
Я думал запрос отработает, выведу в таблицу а там похимичу с элементом строки. НО БЛИН! ПриПолученииДанныхНаСервере предопределенная работает только на сервереБЕЗконтекста - зараза. Вот и мучаюсь... не знаю как подступиться
5 oleg_prg
 
12.12.17
14:44
(4) а модифицировать набор полученных данных не получается т.к. выдается ошибка - нарушение ключа записи и что-то там еще
6 Cyberhawk
 
12.12.17
14:46
выбор когда год(дата) = 1 тогда "год" когда год(дата) > 1 и год(дата) < 5 тогда "года" когда год(дата) > 5 тогда "лет" конец
:)
7 oleg_prg
 
12.12.17
14:49
(6) =))))))))
8 Cyberhawk
 
12.12.17
14:51
(5) Это ты криво запрос модифицировал, у тебя появились дубли по ссылкам
9 Сти
 
12.12.17
14:54
(5) в запрос вставь "" как "СтажСтрокой" и потом модифицируй этот СтажСтрокой как хочешь
(6) 21?
10 Cyberhawk
 
12.12.17
15:02
(9) 21? Это ты уже придираешься :) Но думаю остатком от деления можно разрулить
11 Zamestas
 
12.12.17
15:03
(10) Да уж тогда/когда до сотни.
12 2dolist
 
12.12.17
15:05
не очень универсально, а вдруг люди будут жить по миллиону лет.
13 SSSSS_AAAAA
 
12.12.17
15:15
(4) "мне надо дата прописью типа: 9 лет 5 месяев 3 дня"
А уже определился с методикой расчета? Или еще не знаешь, что их несколько, все они дают разные результаты и каждая из них подходит только для какой-то конкретной области деятельности?
14 oleg_prg
 
12.12.17
16:10
Ребята - спасибо! Такс - все получилось. Вот реализация может кому пригодится.

Функция ДатаПрописьюГодМесяцДень(СрокПолезногоИспользования) Экспорт
    
    РасшифровкаСрокаПолезногоИспользования = "";
    Если ЗначениеЗаполнено(СрокПолезногоИспользования) Тогда
        ЧастьМесяца = СрокПолезногоИспользования - Цел(СрокПолезногоИспользования);
        ЧислоДней = Цел(30 * ЧастьМесяца);
        Суффикс = "";
        Если НЕ ЧислоДней = 0 Тогда
            Суффикс = ЧислоПрописью(ЧислоДней, "НД = Ложь", "#$ень, #$ня, #$ней, м,,,,,0");
            ПозицияПослеПрописи = Найти(Суффикс, "#$");
            Суффикс = Сред(Суффикс, ПозицияПослеПрописи);
            Суффикс = " " + СокрЛП(ЧислоДней) + " " + Суффикс;
        КонецЕсли;
        ЧислоЛет = Цел(СрокПолезногоИспользования / 12);
        ЧислоМесяцев = Цел((СрокПолезногоИспользования % 12));
        ЧислоЛетМесяцев = ЧислоЛет + ЧислоМесяцев/100;
        Если ЧислоЛет = 0 Тогда
            СтрокаЧислоЛетМесяцев = ЧислоПрописью(ЧислоМесяцев, "НД = Ложь", "месяц, месяца, месяцев, м,,,,,0");
            СтрокаПоиска = "месяц";
        Иначе
            СтрокаЧислоЛетМесяцев = ЧислоПрописью(ЧислоЛетМесяцев, ?(ЧислоМесяцев = 0, "НД = Ложь", "НД = Истина"), "год, года, лет, м" + ?(ЧислоМесяцев = 0, ",,,,,0" ,", месяц, месяца, месяцев, м, 2"));
            СтрокаПоиска = "год";
        КонецЕсли;
        ПозицияПослеЛет = Найти(СтрокаЧислоЛетМесяцев, СтрокаПоиска);
        Если ПозицияПослеЛет = 0 Тогда
            ПозицияПослеЛет = Найти(СтрокаЧислоЛетМесяцев, "лет");
            Если ПозицияПослеЛет = 0 Тогда
                //Фигня какая-то, оставим алгоритм МиСофт
                //От сих старый код типовой конфигурации
                //**************************************
                Если НЕ (ЧислоЛет = 0) Тогда
                    // Построим строку с числом лет
                    Если (СтрДлина(ЧислоЛет) > 1) И (Число(Сред(ЧислоЛет, СтрДлина(ЧислоЛет) - 1, 1)) = 1) Тогда
                        СтрокаГод = " лет";
                    ИначеЕсли Число(Прав(ЧислоЛет, 1)) = 1 Тогда
                        СтрокаГод = " год";
                    ИначеЕсли (Число(Прав(ЧислоЛет, 1)) > 1) И (Число(Прав(ЧислоЛет, 1)) < 5) Тогда
                        СтрокаГод = " года";
                    Иначе
                        СтрокаГод = " лет";
                    КонецЕсли;
                    РасшифровкаСрокаПолезногоИспользования = РасшифровкаСрокаПолезногоИспользования + Строка(ЧислоЛет) + СтрокаГод;
                КонецЕсли;
                Если НЕ (ЧислоМесяцев = 0) Тогда
                    // Построим строку с числом месяцев
                    Если (СтрДлина(Цел(ЧислоМесяцев)) > 1) И (Число(Сред(Цел(ЧислоМесяцев), СтрДлина(Цел(ЧислоМесяцев)) - 1, 1)) = 1) Тогда
                        СтрокаМесяц = " месяцев";
                    ИначеЕсли Число(Прав(Цел(ЧислоМесяцев), 1)) = 1 Тогда
                        СтрокаМесяц = " месяц";
                    ИначеЕсли (Число(Прав(Цел(ЧислоМесяцев), 1)) > 1) И (Число(Прав(Цел(ЧислоМесяцев), 1)) < 5) Тогда
                        СтрокаМесяц = " месяца";
                    Иначе
                        СтрокаМесяц = " месяцев";
                    КонецЕсли;
                    РасшифровкаСрокаПолезногоИспользования = РасшифровкаСрокаПолезногоИспользования + ?(НЕ ЗначениеЗаполнено(РасшифровкаСрокаПолезногоИспользования), "", " ") + Строка(ЧислоМесяцев) + СтрокаМесяц;
                КонецЕсли;
                РасшифровкаСрокаПолезногоИспользования = "(" + РасшифровкаСрокаПолезногоИспользования + ")";
                
                //**************************************
                //До сих старый код типовой конфигурации
                
                
            КонецЕсли;
        КонецЕсли;
        Если РасшифровкаСрокаПолезногоИспользования = "" Тогда
            РасшифровкаСрокаПолезногоИспользования = СокрЛП(?(ЧислоЛет = 0, ЧислоМесяцев, ЧислоЛет)) + " " + Сред(СтрокаЧислоЛетМесяцев, ПозицияПослеЛет);
            //Уберем обязательное двузначное число месяцев, если оно получилось:
            РасшифровкаСрокаПолезногоИспользования = СтрЗаменить(РасшифровкаСрокаПолезногоИспользования, " 0", " ") + СтрЗаменить(Суффикс, "#$", "д");
            
            
        КонецЕсли;
    КонецЕсли;
    Возврат РасшифровкаСрокаПолезногоИспользования;
КонецФункции// РасшифровкаСрокаПолезногоИспользования()

В запросе поставил " " КАК СтажСтрокой

В модуде
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    
    Для Каждого Эл из Строки Цикл
        Эл.Значение.Данные.СтажСтрокой = РаботаСоСтроками.ДатаПрописьюГодМесяцДень(Эл.Значение.Данные.Стаж);
    КонецЦикла
    
КонецПроцедуры
15 DmitrO
 
12.12.17
16:17
Поздравляю. Решена еще одна важная (но по сути бесполезная) для заказчика задача. )
16 Новиков
 
12.12.17
16:19
Красивая фукнция, надо забрать в коллекцию маразмов.
17 тарам пам пам
 
12.12.17
16:58
(14) тебе что, платят за число строк кода?
18 oleg_prg
 
12.12.17
17:36
(17) Хочешь поговорить об этом? ;)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан