Книга знаний

1С:Предприятие / v8 / Приемы программирования / Коллекции значений

v8: Функция для считывания таблицы значений из макета

Считывает таблицу значений из макетаАвтор статьи: Гений 1С
Последняя редакция №1 от 12.07.06
URL: http://kb.mista.ru/article.php?id=286

Дешево и сердито, часто нужно считывать данные из макета в таблицу значений (константа типа таблица значений). :) Уж лучше так, чем как это делают 1С-ники в своих регламентированных отчетах.
Макет - макет из которого читаем.
_ТЗ - если грузим в существующую таблицу (добавляет в конец).
флДобавлятьКолонки - если ложь, то новые колонки не добавляются.

Функция МакетВТаблицуЗначений(Макет, _ТЗ=Неопределено, флДобавлятьКолонки=истина) Экспорт
    Перем ТЗ;
    
    Если _ТЗ=Неопределено Тогда
        ТЗ=Новый ТаблицаЗначений();
        флЗаполняем=ложь;
    Иначе
        ТЗ=_ТЗ;
        флЗаполняем=истина;
    КонецЕсли;
    
    //Считываем колонки
    КоличествоКолонок=0;
    ИменаКолонок=Новый Массив();
    Кол=1;
    Пока истина Цикл
        Адрес="R1C"+Формат(Кол,"ЧГ=");
        ИмяКол=Макет.Область(Адрес).Текст;
        Если ПустаяСтрока(ИмяКол) Тогда
            Прервать;
        КонецЕсли;
        КоличествоКолонок=КоличествоКолонок+1;
        Если НЕ флЗаполняем или (флЗаполняем И флДобавлятьКолонки) И ТЗ.Колонки.Найти(ИмяКол)=Неопределено Тогда
            ТЗ.Колонки.Добавить(ИмяКол);
        КонецЕсли;
        ИменаКолонок.Добавить(ИмяКол);
        Кол=Кол+1;
    КонецЦикла;
    
    //Считываем строки
    Стр=2; Кол=1;
    Пока истина Цикл
        Вставлено=ложь; Первая=истина;
        Для Инд=1 По КоличествоКолонок Цикл
            Адрес="R"+Формат(Стр,"ЧГ=")+"C"+Формат(Инд,"ЧГ=");
            Зн=СокрЛП(Макет.Область(Адрес).Текст);
            Если ПустаяСтрока(Зн) Тогда
                Продолжить;
            КонецЕсли;
            Если Первая Тогда
                ТСтр=ТЗ.Добавить();
                Первая=ложь;
                Вставлено=истина;
            КонецЕсли;
            ИмяКолонки=ИменаКолонок[Инд-1];
            Если ТЗ.Колонки.Найти(ИмяКолонки)<>Неопределено Тогда
                Если флЗаполняем Тогда
                    //Проверяем тип - число, строка, булево
                    ОписаниеТипаКолонки=ТЗ.Колонки[ИмяКолонки].ТипЗначения;
                    Если ОписаниеТипаКолонки.СодержитТип(Тип("Число")) Тогда
                        РезЗн=Число(Зн);
                    ИначеЕсли ОписаниеТипаКолонки.СодержитТип(Тип("Строка")) Тогда
                        РезЗн=Строка(Зн);
                    ИначеЕсли ОписаниеТипаКолонки.СодержитТип(Тип("Булево")) Тогда
                        РезЗн=Булево(Зн);
                    ИначеЕсли ОписаниеТипаКолонки.СодержитТип(Тип("Дата")) Тогда
                        РезЗн=Дата(Зн);
                    Иначе
                        РезЗн=Зн;
                    КонецЕсли;
                Иначе
                    РезЗн=Зн;
                КонецЕсли;
                ТСтр[ИмяКолонки]=РезЗн;
            КонецЕсли;
        КонецЦикла;
        Если Не вставлено Тогда
            Прервать;
        КонецЕсли;
        Стр=Стр+1;
        Кол=1;
    КонецЦикла;
    
    Возврат ТЗ;
    
КонецФункции

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2024 | Mista.ru

Яндекс.Метрика