Информация

Использование любой информации, размещённой на настоящем сайте, в том числе любых изображений и/или их частей возможно только по письменному согласованию с правообладателем такой информации (Луньков В.Н.).
Использование любой информации, размещённой на настоящем сайте, в том числе ссылок на ресурсе infostart.ru не допускается .

1С:Предприятие 7.7. Рекурсивное получение файлов в каталоге

При решении задачи по интеграции 1С: Управление холдингом с базой на 1С:Предприятие 7.7 возникла необходимость рекурсивного чтения каталога с фалами обмена. Поиск в интернете не увенчался успехом, на множестве форумов в ответ на запрос функции рекурсивного получения файлов из каталога "диванные эксперты" цитируют справочную информацию. На сайте infostart.ru нашлась обработка, оцененная в валюте данного сайта (кто не в курсе, то эти обработки публиковались бесплатно и ценники "навесили" владельцы сайта самостоятельно). Более того, сайт infostart.ru потребовал выбрать тариф через звонок оператора. В ходе звонка с оператором выяснилось, что минимальная стоимость тарифа для физического лица составляет 2 тыс. руб. Мнение о сайте, высказанное в частном порядке, администрации не понравилось и мой аккаунт был заблокирован.
В общем пришлось писать самому.
Функция ПолучитьСодержимоеКаталога с параметрами:
<ВхИмяКаталога> - строка с именем каталога, содержимое которого необходимо получить;
<ВхРекурсия > - (необязательный) число. По умолчанию 1. Если 1 производится рекурсивный поиск объектов ФС;
<ВхТолькоКаталоги > - (необязательный) число. По умолчанию 0. Если 1 производится поиск только каталогов;
<ВхСписок> - (необязательный) служебный параметр со списком значений;

Возвращает структуру, значения которой содержат структуры с параметрами:
<Каталог> - строка с именем каталога;
<ИмяФайла> - строка с именем файла;
<РазмерФайла> - размер файла в байтах;
<АтрибутыФайла> - строка с атрибутами файла;
Строковое значение длиной 9 символов, в котором закодированы атрибуты файла. Символы могут принимать значения ''0'' или ''1'':
первый символ: если ''1'' - файл только для чтения;
второй символ: если ''1'' - скрытый файл;
третий символ: если ''1'' - системный файл;
четвертый символ: если ''1'' - каталог;
пятый символ: если ''1'' - архивный файл;
шестой символ: если ''1'' - обычный файл (все другие атрибуты не установлены);
седьмой символ: если ''1'' - временный файл;
восьмой символ: если ''1'' - файл, сжатый каким-либо архиватором;
девятый символ: если ''1'' - нет доступа к файлу.
<ВремяСоздания> -  строка с датой и временем создания файла;
<ВремяПоследнегоДоступа> - строка с датой и временем последнего доступа к файлу;
<ВремяПоследнейЗаписи> - строка с датой и временем последней записи файла;
<РасширенноеИмяФайла> - строка с полным именем файла;
<ЭтоКаталог> - число, значение 1 указывает, что объект ФС является каталогом.

Функция ПолучитьАттрибутыФайла(ВхИмяФайла)
   
    ВрмВозврат = СоздатьОбъект("СписокЗначений");
    ВрмФС = СоздатьОбъект("ФС");
   
    ВрмРазмерФайла = ПолучитьПустоеЗначение();
    ВрмАтрибутыФайла = ПолучитьПустоеЗначение();
    ВрмВремяСоздания = ПолучитьПустоеЗначение();
    ВрмВремяПоследнегоДоступа = ПолучитьПустоеЗначение();
    ВрмВремяПоследнейЗаписи = ПолучитьПустоеЗначение();
    ВрмРасширенноеИмяФайла = ПолучитьПустоеЗначение();
   
    ВрмТекКаталог = ВрмФС.ТекКаталог();
    ВрмФС.АтрибутыФайла(ВхИмяФайла, ВрмРазмерФайла, ВрмАтрибутыФайла, ВрмВремяСоздания,
                        ВрмВремяПоследнегоДоступа, ВрмВремяПоследнейЗаписи, ВрмРасширенноеИмяФайла);
   
    ВрмВозврат.ДобавитьЗначение(ВрмТекКаталог, "Каталог");
    ВрмВозврат.ДобавитьЗначение(ВхИмяФайла, "ИмяФайла");
    ВрмВозврат.ДобавитьЗначение(ВрмРазмерФайла, "РазмерФайла");
    ВрмВозврат.ДобавитьЗначение(ВрмАтрибутыФайла, "АтрибутыФайла");
    ВрмВозврат.ДобавитьЗначение(ВрмВремяСоздания, "ВремяСоздания");
    ВрмВозврат.ДобавитьЗначение(ВрмВремяПоследнегоДоступа, "ВремяПоследнегоДоступа");
    ВрмВозврат.ДобавитьЗначение(ВрмВремяПоследнейЗаписи, "ВремяПоследнейЗаписи");
    ВрмВозврат.ДобавитьЗначение(ВрмРасширенноеИмяФайла, "РасширенноеИмяФайла");
    ВрмВозврат.ДобавитьЗначение(Сред(ВрмАтрибутыФайла,4,1), "ЭтоКаталог");
   
    Возврат ВрмВозврат;
   
КонецФункции

Функция ПолучитьСодержимоеКаталога(ВхИмяКаталога, ВхРекурсия = 1, ВхТолькоКаталоги = 0, ВхСписок = "")
   
    Если Прав(ВхИмяКаталога, 1) <>"\" Тогда
        ВхИмяКаталога = ВхИмяКаталога + "\";
    КонецЕсли;
   
    ВрмВозврат = ВхСписок;
    Если ВрмВозврат = "" Тогда
        ВрмВозврат = СоздатьОбъект("СписокЗначений");
    КонецЕсли;
   
    ВрмФС = СоздатьОбъект("ФС");
    ВрмТекКаталог = ВрмФС.ТекКаталог();
    ВрмФС.УстТекКаталог(ВхИмяКаталога);
   
    ВрмИмяФайла = ВрмФС.НайтиПервыйФайл("*.*");    
    Пока ПустоеЗначение(ВрмИмяФайла) = 0 Цикл
       
        Если Лев(ВрмИмяФайла,1) <> "." Тогда
           
            ВрмАтрибутыФайла = ПолучитьАттрибутыФайла(ВрмИмяФайла);
           
            Если ВрмАтрибутыФайла.Получить("ЭтоКаталог") = "1" Тогда
                ВрмВозврат.ДобавитьЗначение(ВрмАтрибутыФайла, ВхИмяКаталога + ВрмИмяФайла);
            ИначеЕсли ВхТолькоКаталоги = 0 Тогда
                ВрмВозврат.ДобавитьЗначение(ВрмАтрибутыФайла, ВхИмяКаталога + ВрмИмяФайла);
            КонецЕсли;
           
            Если ВрмАтрибутыФайла.Получить("ЭтоКаталог") = "0" Тогда
               
            ИначеЕсли ВхРекурсия = 1 Тогда
                ПолучитьСодержимоеКаталога(ВхИмяКаталога + ВрмИмяФайла, ВхРекурсия, ВхТолькоКаталоги, ВрмВозврат);
            КонецЕсли;
           
        КонецЕсли;
       
        ВрмИмяФайла = ВрмФС.НайтиСледующийФайл();
       
    КонецЦикла;
   
    ВрмФС.УстТекКаталог(ВрмТекКаталог);
   
    Возврат ВрмВозврат;
   
КонецФункции

Комментариев нет: