├── .gitignore ├── Jenkinsfile ├── README.md ├── bin └── cTool_1CD.exe ├── config-storage.os ├── lib.config ├── packagedef └── table-reader.os /.gitignore: -------------------------------------------------------------------------------- 1 | *.ospx 2 | -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | 2 | pipeline { 3 | agent none 4 | options { 5 | buildDiscarder(logRotator(numToKeepStr: '7')) 6 | skipDefaultCheckout() 7 | } 8 | 9 | stages { 10 | stage('Тестирование кода пакета WIN') { 11 | 12 | agent { label 'windows' } 13 | 14 | steps { 15 | checkout scm 16 | 17 | script { 18 | if( fileExists ('tasks/test.os') ){ 19 | bat 'chcp 65001 > nul && oscript tasks/test.os' 20 | junit 'junit-*.xml' 21 | } 22 | else 23 | echo 'no testing task' 24 | } 25 | 26 | } 27 | 28 | } 29 | 30 | stage('Тестирование кода пакета LINUX') { 31 | 32 | agent { label 'master' } 33 | 34 | steps { 35 | echo 'under development' 36 | } 37 | 38 | } 39 | 40 | stage('Сборка пакета') { 41 | 42 | agent { label 'windows' } 43 | 44 | steps { 45 | checkout scm 46 | 47 | bat 'erase /Q *.ospx' 48 | bat 'chcp 65001 > nul && call opm build .' 49 | 50 | stash includes: '*.ospx', name: 'package' 51 | archiveArtifacts '*.ospx' 52 | } 53 | 54 | } 55 | 56 | stage('Публикация в хабе') { 57 | when { 58 | branch 'master' 59 | } 60 | agent { label 'master' } 61 | steps { 62 | sh 'rm -f *.ospx' 63 | unstash 'package' 64 | 65 | sh ''' 66 | artifact=`ls -1 *.ospx` 67 | basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'` 68 | cp $artifact $basename.ospx 69 | sudo rsync -rv *.ospx /var/www/hub.oscript.io/download/$basename/ 70 | '''.stripIndent() 71 | } 72 | } 73 | 74 | stage('Публикация в нестабильном хабе') { 75 | when { 76 | branch 'develop' 77 | } 78 | agent { label 'master' } 79 | steps { 80 | sh 'rm -f *.ospx' 81 | unstash 'package' 82 | 83 | sh ''' 84 | artifact=`ls -1 *.ospx` 85 | basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'` 86 | cp $artifact $basename.ospx 87 | sudo rsync -rv *.ospx /var/www/hub.oscript.io/dev-channel/$basename/ 88 | '''.stripIndent() 89 | } 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Чтение файловых баз данных 1С с помощью tool1cd 2 | 3 | Программная скриптовая обертка для популярной утилиты чтения файловых баз данных tool1cd от [awa](http://infostart.ru/profile/13819/) Удобно использовать, например, для работы с хранилищем 1С. 4 | 5 | Предоставляет 2 класса: 6 | 7 | ## ЧтениеТаблицФайловойБазыДанных 8 | 9 | Позволяет считать любую таблицу базы данных в виде ТаблицыЗначений 10 | 11 | ## ЧтениеХранилищаКонфигурации 12 | 13 | Использует класс *ЧтениеТаблицФайловойБазыДанных* для доступа к базе Хранилища конфигураций 1С. 14 | -------------------------------------------------------------------------------- /bin/cTool_1CD.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/tool1cd/38606b55bc266680f5c1cc2c26456dbb11371acf/bin/cTool_1CD.exe -------------------------------------------------------------------------------- /config-storage.os: -------------------------------------------------------------------------------- 1 | #Использовать 1commands 2 | #Использовать tempfiles 3 | #Использовать logos 4 | 5 | Перем мКаталогВнешнихПрограмм; 6 | Перем Лог; 7 | Перем ЭтоWindows; 8 | 9 | ////////////////////////////////////////////////////////////////////////////////////////////////// 10 | // ПРОГРАММНЫЙ ИНТЕРФЕЙС 11 | 12 | Процедура ВыгрузитьВерсиюКонфигурации(Знач ФайлХранилища, Знач ВыходнойФайл, Знач НомерВерсии = 0) Экспорт 13 | 14 | ЛогTool1CD = ВременныеФайлы.НовоеИмяФайла("txt"); 15 | ПрефиксПути = ?(ЭтоWindows = Ложь, "Z:", ""); 16 | СтрокаЗапуска = """" + ПутьTool1CD() + """ """ + ПрефиксПути + ФайлХранилища 17 | + """ -l """ + ПрефиксПути + ЛогTool1CD 18 | + """ -q -ne -drc " 19 | + Строка(НомерВерсии) 20 | +" """ + ПрефиксПути + ВыходнойФайл +""""; 21 | 22 | ФайлИсходника = Новый Файл(ВыходнойФайл); 23 | ФайлЛога = Новый Файл(ЛогTool1CD); 24 | 25 | КодВозврата = ""; 26 | Если НЕ ЭтоWindows Тогда 27 | СтрокаЗапуска = "wine "+СтрокаЗапуска; 28 | КонецЕсли; 29 | Лог.Отладка(СтрокаЗапуска); 30 | 31 | Команда = Новый Команда; 32 | 33 | Команда.УстановитьСтрокуЗапуска(СтрокаЗапуска); 34 | Команда.УстановитьКодировкуВывода(КодировкаТекста.UTF8); 35 | Команда.ПоказыватьВыводНемедленно(Истина); 36 | КодВозврата = Команда.Исполнить(); 37 | ВыводКоманды = Команда.ПолучитьВывод(); 38 | 39 | Если ФайлЛога.Существует() Тогда 40 | ТекстЛогаTool1CD = (ПрочитатьФайл(ЛогTool1CD)); 41 | УдалитьФайлы(ФайлЛога.ПолноеИмя); 42 | Иначе 43 | ВызватьИсключение "Tool_1CD не выгрузил файл конфигурации." + ВыводКоманды; 44 | КонецЕсли; 45 | 46 | Если КодВозврата <> 0 Тогда 47 | Лог.Ошибка(ТекстЛогаTool1CD); 48 | ВызватьИсключение "Tool_1CD вернул код возврата " + КодВозврата; 49 | КонецЕсли; 50 | 51 | КонецПроцедуры 52 | 53 | ////////////////////////////////////////////////////////////////////////////////////////////////// 54 | // 55 | 56 | Функция ПутьTool1CD() 57 | Если мКаталогВнешнихПрограмм = Неопределено Тогда 58 | мКаталогВнешнихПрограмм = ОбъединитьПути(ТекущийСценарий().Каталог, "bin", "cTool_1CD.exe"); 59 | КонецЕсли; 60 | 61 | Возврат мКаталогВнешнихПрограмм; 62 | 63 | КонецФункции 64 | 65 | Функция ПрочитатьФайл(Знач ИмяФайла) 66 | ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла); 67 | Текст = ЧтениеТекста.Прочитать(); 68 | ЧтениеТекста.Закрыть(); 69 | 70 | Возврат Текст; 71 | КонецФункции 72 | 73 | СистемнаяИнформация = Новый СистемнаяИнформация; 74 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 75 | 76 | Лог = Логирование.ПолучитьЛог("oscript.lib.tool1cd"); 77 | -------------------------------------------------------------------------------- /lib.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /packagedef: -------------------------------------------------------------------------------- 1 |  2 | Описание.Имя("tool1cd") 3 | .Версия("0.6") 4 | .ЗависитОт("tempfiles") 5 | .ЗависитОт("logos") 6 | .ЗависитОт("1commands", "1.3.5") 7 | .ВключитьФайл("bin") 8 | .ВключитьФайл("table-reader.os") 9 | .ВключитьФайл("config-storage.os") 10 | .ВключитьФайл("lib.config") -------------------------------------------------------------------------------- /table-reader.os: -------------------------------------------------------------------------------- 1 | #Использовать 1commands 2 | #Использовать tempfiles 3 | 4 | Перем мИмяФайлаБазы; 5 | Перем мКаталогВнешнихПрограмм; 6 | Перем мРабочийКаталог; 7 | Перем Лог; 8 | Перем ЭтоWindows; 9 | 10 | Процедура ОткрытьФайл(Знач ИмяФайла) Экспорт 11 | мИмяФайлаБазы = ИмяФайла; 12 | КонецПроцедуры 13 | 14 | Процедура ЗакрытьФайл() Экспорт 15 | мИмяФайлаБазы = Неопределено; 16 | ВременныеФайлы.УдалитьФайл(мРабочийКаталог); 17 | КонецПроцедуры 18 | 19 | Функция ПрочитатьТаблицу(Знач ИмяТаблицы) Экспорт 20 | 21 | ВыгрузитьТаблицыВXML(ИмяТаблицы); 22 | 23 | Возврат ПрочитатьТаблицуИзXml(ФайлВыгрузкиТаблицы(ИмяТаблицы)); 24 | 25 | КонецФункции 26 | 27 | Функция ВыгрузитьТаблицыВXML(Знач ИменаТаблиц) Экспорт 28 | 29 | ЛогTool1CD = ВременныеФайлы.НовоеИмяФайла("txt"); 30 | ПрефиксПути = ?(ЭтоWindows = Ложь, "Z:", ""); 31 | // СтрокаЗапуска = """" + ПутьTool1CD() + """ " 32 | СтрокаЗапуска = """"+ ПрефиксПути + мИмяФайлаБазы + """" 33 | + " -l """ +ПрефиксПути+ ЛогTool1CD + """" 34 | + " -q -ne -ex " 35 | + """" + ПрефиксПути + РабочийКаталог() + """ """ + ИменаТаблиц + """"; 36 | 37 | ПутьПриложения = ПутьTool1CD(); 38 | Если Не ЭтоWindows Тогда 39 | СтрокаЗапуска = СтрШаблон("""%1"" %2", ПутьПриложения, СтрокаЗапуска); 40 | ПутьПриложения = "wine"; 41 | КонецЕсли; 42 | 43 | Лог.Отладка(ПутьПриложения); 44 | Лог.Отладка(СтрокаЗапуска); 45 | 46 | Команда = Новый Команда; 47 | Команда.УстановитьКоманду(ПутьПриложения); 48 | Команда.УстановитьПараметры(СтрокаЗапуска); 49 | // Команда.УстановитьСтрокуЗапуска(СтрокаЗапуска); 50 | Команда.УстановитьКодировкуВывода(КодировкаТекста.UTF8); 51 | Команда.ПоказыватьВыводНемедленно(Истина); 52 | КодВозврата = Команда.Исполнить(); 53 | 54 | Если КодВозврата <> 0 Тогда 55 | Лог.Ошибка(Команда.ПолучитьВывод()); 56 | ПоказатьЛог(ЛогTool1CD); 57 | ВызватьИсключение "Tool_1CD вернул код: " + КодВозврата; 58 | 59 | КонецЕсли; 60 | 61 | МассивИменТаблиц = РазложитьИменаТаблицВМассив(ИменаТаблиц); 62 | ФайлыВыгрузки = Новый Соответствие; 63 | Для Каждого ИмяТаблицы Из МассивИменТаблиц Цикл 64 | 65 | ФайлТаблицы = Новый Файл(ФайлВыгрузкиТаблицы(ИмяТаблицы)); 66 | Если Не ФайлТаблицы.Существует() Тогда 67 | ВызватьИсключение "Таблица " + ИмяТаблицы + " не была выгружена Tool_1CD"; 68 | КонецЕсли; 69 | 70 | ФайлыВыгрузки[ИмяТаблицы] = ФайлТаблицы.ПолноеИмя; 71 | 72 | КонецЦикла; 73 | 74 | Возврат ФайлыВыгрузки; 75 | 76 | КонецФункции 77 | 78 | Функция ПрочитатьТаблицуИзXml(Знач ФайлТаблицы) Экспорт 79 | 80 | ЧтениеXML = Новый ЧтениеXML; 81 | ЧтениеXML.ОткрытьФайл(ФайлТаблицы); 82 | 83 | Попытка 84 | 85 | ЧтениеXML.ПерейтиКСодержимому(); 86 | ЧтениеXML.Прочитать(); 87 | 88 | ПоляТаблицы = ПрочитатьПоляТаблицыИзXML(ЧтениеXML); 89 | ДанныеТаблицы = Новый ТаблицаЗначений; 90 | Для Каждого Поле Из ПоляТаблицы Цикл 91 | ДанныеТаблицы.Колонки.Добавить(Поле); 92 | КонецЦикла; 93 | 94 | Пока ЧтениеXML.Прочитать() Цикл 95 | 96 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента 97 | И ЧтениеXML.Имя = "Record" Тогда 98 | 99 | НоваяСтрока = ДанныеТаблицы.Добавить(); 100 | Пока ЧтениеXML.Прочитать() Цикл 101 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда 102 | НоваяСтрока[ЧтениеXML.Имя] = ПолучитьТекст(ЧтениеXML); 103 | КонецЕсли; 104 | 105 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Record" Тогда 106 | Прервать; 107 | КонецЕсли; 108 | 109 | КонецЦикла; 110 | 111 | КонецЕсли; 112 | КонецЦикла; 113 | 114 | ЧтениеXML.Закрыть(); 115 | 116 | Исключение 117 | ЧтениеXML.Закрыть(); 118 | ВызватьИсключение; 119 | КонецПопытки; 120 | 121 | Возврат ДанныеТаблицы; 122 | 123 | КонецФункции 124 | 125 | Функция ПрочитатьПоляТаблицыИзXML(Знач ЧтениеXML) 126 | ИменаПолей = Новый Массив; 127 | Пока ЧтениеXML.Прочитать() Цикл 128 | 129 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента 130 | И ЧтениеXML.Имя = "Field" Тогда 131 | 132 | ИменаПолей.Добавить(ЧтениеXML.ЗначениеАтрибута("Name")); 133 | 134 | КонецЕсли; 135 | 136 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Fields" Тогда 137 | Прервать; 138 | КонецЕсли; 139 | 140 | КонецЦикла; 141 | 142 | Возврат ИменаПолей; 143 | 144 | КонецФункции 145 | 146 | Функция ПолучитьТекст(ЧтениеXML) 147 | Результат = ""; 148 | Пока ЧтениеXML.Прочитать() Цикл 149 | 150 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда 151 | Результат = ЧтениеXML.Значение; 152 | КонецЕсли; 153 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда 154 | Прервать; 155 | КонецЕсли; 156 | КонецЦикла; 157 | 158 | Возврат Результат; 159 | 160 | КонецФункции 161 | 162 | Функция РабочийКаталог() 163 | Если мРабочийКаталог = Неопределено Тогда 164 | мРабочийКаталог = ВременныеФайлы.СоздатьКаталог(); 165 | КонецЕсли; 166 | 167 | Возврат мРабочийКаталог; 168 | 169 | КонецФункции 170 | 171 | Функция ПутьTool1CD() 172 | Если мКаталогВнешнихПрограмм = Неопределено Тогда 173 | мКаталогВнешнихПрограмм = ОбъединитьПути(ТекущийСценарий().Каталог, "bin", "cTool_1CD.exe"); 174 | КонецЕсли; 175 | 176 | Возврат мКаталогВнешнихПрограмм; 177 | 178 | КонецФункции 179 | 180 | Функция ФайлВыгрузкиТаблицы(Знач Таблица) 181 | Возврат ОбъединитьПути(РабочийКаталог(), Таблица+".xml"); 182 | КонецФункции 183 | 184 | Процедура ПоказатьЛог(Знач ЛогTool1CD) 185 | ТекстЛога = ПрочитатьФайл(ЛогTool1CD); 186 | Сообщить(ТекстЛога); 187 | 188 | Попытка 189 | УдалитьФайлы(ЛогTool1CD); 190 | Исключение 191 | КонецПопытки; 192 | КонецПроцедуры 193 | 194 | Функция ПрочитатьФайл(Знач ИмяФайла) 195 | Чтение = Новый ЧтениеТекста(ИмяФайла); 196 | Текст = Чтение.Прочитать(); 197 | Чтение.Закрыть(); 198 | 199 | Возврат Текст; 200 | КонецФункции 201 | 202 | Функция РазложитьИменаТаблицВМассив(Знач ИменаТаблиц) 203 | 204 | МассивИмен = Новый Массив; 205 | Хвост = ИменаТаблиц; 206 | Пока Истина Цикл 207 | Поз = Найти(Хвост, ";"); 208 | Если Поз > 0 Тогда 209 | Голова = СокрЛП(Лев(Хвост, Поз-1)); 210 | Хвост = Сред(Хвост, Поз+1); 211 | МассивИмен.Добавить(Голова); 212 | Иначе 213 | Голова = СокрЛП(Хвост); 214 | Если Не ПустаяСтрока(Голова) Тогда 215 | МассивИмен.Добавить(Голова); 216 | КонецЕсли; 217 | Прервать; 218 | КонецЕсли; 219 | КонецЦикла; 220 | 221 | Возврат МассивИмен; 222 | 223 | КонецФункции 224 | 225 | СистемнаяИнформация = Новый СистемнаяИнформация; 226 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 227 | 228 | Лог = Логирование.ПолучитьЛог("oscript.lib.tool1cd"); --------------------------------------------------------------------------------