1+ #Использовать 1commands
2+ #Использовать tempfiles
3+ #Использовать "../../bindata"
4+
5+ Перем мИмяФайлаБазы ;
6+ Перем мКаталогВнешнихПрограмм ;
7+ Перем мРабочийКаталог ;
8+ Перем Лог ;
9+ Перем ЭтоWindows ;
10+
11+ Процедура ОткрытьФайл (Знач ИмяФайла ) Экспорт
12+ мИмяФайлаБазы = ИмяФайла;
13+ КонецПроцедуры
14+
15+ Процедура ЗакрытьФайл () Экспорт
16+ мИмяФайлаБазы = Неопределено ;
17+ ВременныеФайлы.УдалитьФайл(мРабочийКаталог);
18+ КонецПроцедуры
19+
20+ Функция ПрочитатьТаблицу (Знач ИмяТаблицы ) Экспорт
21+
22+ ВыгрузитьТаблицыВXML(ИмяТаблицы);
23+
24+ Возврат ПрочитатьТаблицуИзXml(ФайлВыгрузкиТаблицы(ИмяТаблицы));
25+
26+ КонецФункции
27+
28+ Функция ВыгрузитьТаблицыВXML (Знач ИменаТаблиц ) Экспорт
29+
30+ ЛогTool1CD = ВременныеФайлы.НовоеИмяФайла("txt" );
31+ ПрефиксПути = ? (ЭтоWindows = Ложь , "Z:" , "" );
32+ // СтрокаЗапуска = """" + ПутьTool1CD() + """ "
33+ СтрокаЗапуска = """ " + ПрефиксПути + мИмяФайлаБазы + """ "
34+ + " -l "" " + ПрефиксПути+ ЛогTool1CD + """ "
35+ + " -q -ne -ex "
36+ + """ " + ПрефиксПути + РабочийКаталог() + """ "" " + ИменаТаблиц + """ " ;
37+
38+ ПутьПриложения = ПутьTool1CD();
39+ Если Не ЭтоWindows Тогда
40+ СтрокаЗапуска = СтрШаблон (""" %1"" %2" , ПутьПриложения, СтрокаЗапуска);
41+ ПутьПриложения = "wine" ;
42+ КонецЕсли ;
43+
44+ Лог.Отладка(ПутьПриложения);
45+ Лог.Отладка(СтрокаЗапуска);
46+
47+ Команда = Новый Команда;
48+ Команда.УстановитьКоманду(ПутьПриложения);
49+ Команда.УстановитьПараметры(СтрокаЗапуска);
50+ // Команда.УстановитьСтрокуЗапуска(СтрокаЗапуска);
51+ Команда.УстановитьКодировкуВывода(КодировкаТекста.UTF8);
52+ Команда.ПоказыватьВыводНемедленно(Истина );
53+ КодВозврата = Команда.Исполнить();
54+
55+ Если КодВозврата <> 0 Тогда
56+ Лог.Ошибка(Команда.ПолучитьВывод());
57+ ПоказатьЛог(ЛогTool1CD);
58+ ВызватьИсключение "Tool_1CD вернул код: " + КодВозврата;
59+
60+ КонецЕсли ;
61+
62+ МассивИменТаблиц = РазложитьИменаТаблицВМассив(ИменаТаблиц);
63+ ФайлыВыгрузки = Новый Соответствие;
64+ Для Каждого ИмяТаблицы Из МассивИменТаблиц Цикл
65+
66+ ФайлТаблицы = Новый Файл(ФайлВыгрузкиТаблицы(ИмяТаблицы));
67+ Если Не ФайлТаблицы.Существует() Тогда
68+ ВызватьИсключение "Таблица " + ИмяТаблицы + " не была выгружена Tool_1CD" ;
69+ КонецЕсли ;
70+
71+ ФайлыВыгрузки[ИмяТаблицы] = ФайлТаблицы.ПолноеИмя;
72+
73+ КонецЦикла ;
74+
75+ Возврат ФайлыВыгрузки;
76+
77+ КонецФункции
78+
79+ Функция ПрочитатьТаблицуИзXml (Знач ФайлТаблицы ) Экспорт
80+
81+ ЧтениеXML = Новый ЧтениеXML;
82+ ЧтениеXML.ОткрытьФайл(ФайлТаблицы);
83+
84+ Попытка
85+
86+ ЧтениеXML.ПерейтиКСодержимому();
87+ ЧтениеXML.Прочитать();
88+
89+ ПоляТаблицы = ПрочитатьПоляТаблицыИзXML(ЧтениеXML);
90+ ДанныеТаблицы = Новый ТаблицаЗначений;
91+ Для Каждого Поле Из ПоляТаблицы Цикл
92+ ДанныеТаблицы.Колонки.Добавить(Поле);
93+ КонецЦикла ;
94+
95+ Пока ЧтениеXML.Прочитать() Цикл
96+
97+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента
98+ И ЧтениеXML.Имя = "Record" Тогда
99+
100+ НоваяСтрока = ДанныеТаблицы.Добавить();
101+ Пока ЧтениеXML.Прочитать() Цикл
102+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
103+ НоваяСтрока[ЧтениеXML.Имя] = ПолучитьТекст(ЧтениеXML);
104+ КонецЕсли ;
105+
106+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Record" Тогда
107+ Прервать ;
108+ КонецЕсли ;
109+
110+ КонецЦикла ;
111+
112+ КонецЕсли ;
113+ КонецЦикла ;
114+
115+ ЧтениеXML.Закрыть();
116+
117+ Исключение
118+ ЧтениеXML.Закрыть();
119+ ВызватьИсключение ;
120+ КонецПопытки ;
121+
122+ Возврат ДанныеТаблицы;
123+
124+ КонецФункции
125+
126+ Функция ПрочитатьПоляТаблицыИзXML (Знач ЧтениеXML )
127+ ИменаПолей = Новый Массив;
128+ Пока ЧтениеXML.Прочитать() Цикл
129+
130+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента
131+ И ЧтениеXML.Имя = "Field" Тогда
132+
133+ ИменаПолей.Добавить(ЧтениеXML.ЗначениеАтрибута("Name" ));
134+
135+ КонецЕсли ;
136+
137+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Fields" Тогда
138+ Прервать ;
139+ КонецЕсли ;
140+
141+ КонецЦикла ;
142+
143+ Возврат ИменаПолей;
144+
145+ КонецФункции
146+
147+ Функция ПолучитьТекст (ЧтениеXML )
148+ Результат = "" ;
149+ Пока ЧтениеXML.Прочитать() Цикл
150+
151+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
152+ Результат = ЧтениеXML.Значение;
153+ КонецЕсли ;
154+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
155+ Прервать ;
156+ КонецЕсли ;
157+ КонецЦикла ;
158+
159+ Возврат Результат;
160+
161+ КонецФункции
162+
163+ Функция РабочийКаталог ()
164+ Если мРабочийКаталог = Неопределено Тогда
165+ мРабочийКаталог = ВременныеФайлы.СоздатьКаталог();
166+ КонецЕсли ;
167+
168+ Возврат мРабочийКаталог;
169+
170+ КонецФункции
171+
172+ Функция ПутьTool1CD ()
173+ Если мКаталогВнешнихПрограмм = Неопределено Тогда
174+ мКаталогВнешнихПрограмм = Загрузчик_tool1CD.ПутьКФайлу();
175+ КонецЕсли ;
176+
177+ Возврат мКаталогВнешнихПрограмм;
178+
179+ КонецФункции
180+
181+ Функция ФайлВыгрузкиТаблицы (Знач Таблица )
182+ Возврат ОбъединитьПути(РабочийКаталог(), Таблица+ ".xml" );
183+ КонецФункции
184+
185+ Процедура ПоказатьЛог (Знач ЛогTool1CD )
186+ ТекстЛога = ПрочитатьФайл(ЛогTool1CD);
187+ Сообщить (ТекстЛога);
188+
189+ Попытка
190+ УдалитьФайлы (ЛогTool1CD);
191+ Исключение
192+ КонецПопытки ;
193+ КонецПроцедуры
194+
195+ Функция ПрочитатьФайл (Знач ИмяФайла )
196+ Чтение = Новый ЧтениеТекста(ИмяФайла);
197+ Текст = Чтение.Прочитать();
198+ Чтение.Закрыть();
199+
200+ Возврат Текст;
201+ КонецФункции
202+
203+ Функция РазложитьИменаТаблицВМассив (Знач ИменаТаблиц )
204+
205+ МассивИмен = Новый Массив;
206+ Хвост = ИменаТаблиц;
207+ Пока Истина Цикл
208+ Поз = Найти (Хвост, ";" );
209+ Если Поз > 0 Тогда
210+ Голова = СокрЛП (Лев (Хвост, Поз- 1 ));
211+ Хвост = Сред (Хвост, Поз+ 1 );
212+ МассивИмен.Добавить(Голова);
213+ Иначе
214+ Голова = СокрЛП (Хвост);
215+ Если Не ПустаяСтрока (Голова) Тогда
216+ МассивИмен.Добавить(Голова);
217+ КонецЕсли ;
218+ Прервать ;
219+ КонецЕсли ;
220+ КонецЦикла ;
221+
222+ Возврат МассивИмен;
223+
224+ КонецФункции
225+
226+ СистемнаяИнформация = Новый СистемнаяИнформация;
227+ ЭтоWindows = Найти (НРег (СистемнаяИнформация.ВерсияОС), "windows" ) > 0 ;
228+
229+ Лог = Логирование.ПолучитьЛог("oscript.lib.tool1cd" );
0 commit comments