Имя: Пароль:
1C
1C 7.7
v7: Сохранить значение всех реквизитов формы в файл.
,
0 planod
 
09.12.14
04:52
Доброго времени суток. Подскажите как реализовать сохранение значений всех реквизитов формы отчета в отдельный файл? Заранее спасибо.
1 Cube
 
09.12.14
05:04
(0) Создаешь список значений, заполняешь чем хочешь и ЗначениеВФайл()
2 France
 
09.12.14
05:12
Интересно, что в итоге нужно: толи отчет в файл сохранить, толи сохранить значения фильтров (реквизитов формы).
3 planod
 
09.12.14
05:13
(2) второй вариант: сохранить значения фильтров.
4 DrZombi
 
гуру
09.12.14
06:49
(3) А зачем в файл?
5 Рэйв
 
09.12.14
07:45
6 dk
 
09.12.14
08:12

Функция глПолучитьВсеАтрибутыФормы(Форма, Таблицы = 0) Экспорт
    
    Перем Результат,спНужныеВидыАтрибутов,Сч,Атрибут,ФормаРасш, ТекСтрока;
    
    Результат = СоздатьОбъект("СписокЗначений");
    
    спНужныеВидыАтрибутов = СоздатьОбъект("СписокЗначений");
    спНужныеВидыАтрибутов.ДобавитьЗначение(2);        //2  - 1CEDIT (Поле ввода)
    спНужныеВидыАтрибутов.ДобавитьЗначение(11);        //11 - LISTBOX (Список)
    спНужныеВидыАтрибутов.ДобавитьЗначение(12);        //12 - CHECKBOX (Флажок)
    спНужныеВидыАтрибутов.ДобавитьЗначение(13);        //13 - RADIO (Переключатель)
    спНужныеВидыАтрибутов.ДобавитьЗначение(14);        //14 - COMBOBOX (Поле со списком)
    
    Если Таблицы = 1 Тогда
        спНужныеВидыАтрибутов.ДобавитьЗначение(15);    //15 - TABLE (Таблица)
    КонецЕсли;

    ФормаРасш = СоздатьОбъект("РасширениеФормы");
    ФормаРасш.УстановитьФорму(Форма);
    
    Для Сч = 0 По ФормаРасш.КоличествоАтрибутов() - 1 Цикл
        
        Атрибут = ФормаРасш.ПолучитьАтрибут(Сч);
        
        Если ПустоеЗначение(Атрибут.Идентификатор) = 1 Тогда
            Продолжить;
        КонецЕсли;
        
        Если спНужныеВидыАтрибутов.Принадлежит(Атрибут.Тип) = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        Результат.ДобавитьЗначение(ЗначениеВСтрокуВнутр(Атрибут.Значение), Атрибут.Идентификатор);
        Попытка
            Если (Атрибут.Тип = 11) ИЛИ (Атрибут.Тип = 14) Тогда
                ТекСтрока = Атрибут.Значение.ТекущаяСтрока();
                Результат.ДобавитьЗначение(ТекСтрока, Атрибут.Идентификатор + "_dk_ТекущаяСтрока");
            КонецЕсли;
        Исключение
        КонецПопытки;
        
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции    //глПолучитьВсеАтрибутыФормы

откуда-то (с)тырено
7 dk
 
09.12.14
08:18

//************************************************************************************************************
Процедура глВосстановитьВсеАтрибутыФормы(Форма, СЗ, Таблицы = 0) Экспорт
    
    Перем спНужныеВидыАтрибутов, ФормаРасш, Сч, Атрибут, Зн, флОшибкаЧтенияНастроек;
    
    Если ПустоеЗначение(Форма) = 1 Тогда
        Сообщить("Не передали форму");
        Возврат;
    КонецЕсли;
    
    Если ПустоеЗначение(СЗ) = 1 Тогда
        Сообщить("Не передали параметры");
        Возврат;
    КонецЕсли;
    
    спНужныеВидыАтрибутов = СоздатьОбъект("СписокЗначений");
    спНужныеВидыАтрибутов.ДобавитьЗначение(2);        //2  - 1CEDIT (Поле ввода)
    спНужныеВидыАтрибутов.ДобавитьЗначение(11);        //11 - LISTBOX (Список)
    спНужныеВидыАтрибутов.ДобавитьЗначение(12);        //12 - CHECKBOX (Флажок)
    спНужныеВидыАтрибутов.ДобавитьЗначение(13);        //13 - RADIO (Переключатель)
    спНужныеВидыАтрибутов.ДобавитьЗначение(14);        //14 - COMBOBOX (Поле со списком)
    
    Если Таблицы = 1 Тогда
        спНужныеВидыАтрибутов.ДобавитьЗначение(15);    //15 - TABLE (Таблица)
    КонецЕсли;
    
    ФормаРасш = СоздатьОбъект("РасширениеФормы");
    ФормаРасш.УстановитьФорму(Форма);
    
    флОшибкаЧтенияНастроек = 0;
    
    Для Сч = 0 По ФормаРасш.КоличествоАтрибутов() - 1 Цикл
        
        Атрибут = ФормаРасш.ПолучитьАтрибут(Сч);
        
        Если ПустоеЗначение(Атрибут.Идентификатор) = 1 Тогда
            Продолжить;
        КонецЕсли;
        
        Если спНужныеВидыАтрибутов.Принадлежит(Атрибут.Тип) = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        Зн = ЗначениеИзСтрокиВнутр(СЗ.Получить(Атрибут.Идентификатор));
        
        Если ТипЗначения(Зн) <> ТипЗначения(Атрибут.Значение) Тогда
            
            флОшибкаЧтенияНастроек = 1;
            Сообщить("Ошибка чтения настроек: " + Атрибут.Идентификатор);
            Продолжить;
            
        ИначеЕсли (ТипЗначения(Зн) = 11) ИЛИ (ТипЗначения(Зн) = 12) Тогда
            
            Если Зн.Вид() <> Атрибут.Значение.Вид() Тогда
                флОшибкаЧтенияНастроек = 1;
                Сообщить("Ошибка чтения настроек: " + Атрибут.Идентификатор);
                Продолжить;
            КонецЕсли;
            
        КонецЕсли;            
        
        Попытка
            Если (ТипЗначенияСтр(Зн) = "СписокЗначений") или ((ТипЗначенияСтр(Зн) = "ТаблицаЗначений") и (Таблицы = 1)) Тогда
                Зн.Выгрузить(Атрибут.Значение);
            Иначе
                Атрибут.Значение = Зн;
            КонецЕсли;
        Исключение
            флОшибкаЧтенияНастроек = 1;
            Сообщить("Ошибка чтения настроек: " + Атрибут.Идентификатор);
            Продолжить;
        КонецПопытки;
        
        Попытка
            Если (Атрибут.Тип = 11) ИЛИ (Атрибут.Тип = 14) Тогда
                Зн = СЗ.Получить(Атрибут.Идентификатор+"_dk_ТекущаяСтрока");
                Атрибут.Значение.ТекущаяСтрока(Зн);
            КонецЕсли;
        Исключение
            флОшибкаЧтенияНастроек = 1;
            Сообщить("Ошибка чтения настроек: " + Атрибут.Идентификатор);
            Продолжить;
        КонецПопытки;
        
    КонецЦикла;
    
    Если флОшибкаЧтенияНастроек <> 0 Тогда
        глОшибкаВосстановленияНастроекФормы(Форма);
    КонецЕсли;
    
КонецПроцедуры    //ВосстановитьВсеАтрибутыФормы(Форма, СЗ)
8 Cube
 
09.12.14
08:32
(6) (7) Быдлокод какой-то...
9 dk
 
09.12.14
09:00
универсальное сохранение всех реквизитов формы
у нас используется для сохранения настроек автопилотов
2 кнопки на форме "сохранить настройки", "восстановить настройки"
при количестве автопилотов больше нескольких сотен - дюже удобно
10 Поpyчик-4
 
09.12.14
09:04
(8) Клюшки же. На ней только быдлокодить.
11 Herby
 
09.12.14
09:18
(10) Быдло может везде накодить... не стоит обижать 77
12 Ёпрст
 
09.12.14
09:31
(0)
infostart.ru/public/20038/
13 ildary
 
09.12.14
09:37
Господа в сияющих доспехах, объясните нам, холопам, что в коде (6)+(7) попадает в рамки быдлокода? Не дайте сгинуть в незнании.
14 Herby
 
09.12.14
09:51
(13) мода такая - любой код называть быдлокодом, не знал что ле?
15 Cube
 
09.12.14
09:52
(13) Ну, я в 7.7 уже давно не работал и не помню, как там что...
Но вот в снеговике я сохраняю так:

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

а восстанавливаю так:

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

Неужели, в 7.7 нельзя написать что-то вроде этого?
16 Cube
 
09.12.14
09:54
+(15) СохраненнаяНастройка имеет тип "Структура", но можно и с списком значений ведь сделать...
17 dk
 
09.12.14
09:55
(15) ты не поверишь, но именно это и делается в (6) и (7)
т.ч. поздравляю с присоединением к команде быдлокодеров
18 Cube
 
09.12.14
10:01
(17) В том-то и дело, что

Результат = 2 + 2;

И

Результат = 2 - 0 + 100 / 100 - 1 + 2;

Тоже дают одинаковый результат, только второй случай - быдлокод...

Я не говорю, что код неверный, я говорю, что он нечитабельный и на первый взгляд непонятный...
19 dk
 
09.12.14
10:03
ладно зачислим в новую категорию - быдлочитатель
20 Herby
 
09.12.14
10:06
(18) кстати, ни хрена не одинаковый результат :)
21 Herby
 
09.12.14
10:07
(20) а не, одинаковый)
22 ildary
 
09.12.14
10:07
(19) ну если поставить цель "докопаться до столба" - я бы покритиковал лишние переносы строк в инициализации списка, но с другой стороны когда я вижу вместо кучи вложенных Если - несколько отдельных Если+Продолжить - я понимаю, что код писал явно не быдлокодер.
Закон Брукера: Даже маленькая практика стоит большой теории.