Перем Л_Лев_Фиг_Скобка, Л_Прав_Фиг_Скобка, Л_Лев_Кв_Скобка, Л_Прав_Кв_Скобка, Л_Кавычка, Л_Экран, Л_Двоеточие, Л_Запятая, Л_Число, Л_Строка, Л_Константа, Л_Финиш; Перем Цифры1_9, Цифры0_9, ПервыеСимволыКонстант, ОдносимвольныеЛексемы; Перем НомЛексемы, ТекЛексема; Перем JSON_Error; Перем В_Массив, В_Объект, В_Значение; //***** Перем НомерСимвола; Перем ФлагОшибки; Перем СписокСтроковыхКонстант; Перем СтекЛексем; Перем АнализируемаяСтрока; //***** Перем ТекКаталог, ТекФайл; //***** Функция ПолучитьОбъект_ТЗ() Далее Функция ПолучитьМассив_ТЗ() Далее //***** Функция ТекущиеСимволы(Сколько) Возврат Сред(АнализируемаяСтрока, НомерСимвола, Сколько); КонецФункции //***** Функция ПрошлыйСимвол(Сдвиг) Возврат Сред(АнализируемаяСтрока, НомерСимвола - Сдвиг, 1); КонецФункции //***** Процедура ДобавитьЛексему(Лексема, Значение, Сдвиг) СтекЛексем.НоваяСтрока(); СтекЛексем.Лексема = Лексема; СтекЛексем.Значение = Значение; НомерСимвола = НомерСимвола + Сдвиг; КонецПроцедуры //***** Процедура ОбвестиОбласть(Обл) Обл.РамкаСнизу(1); Обл.РамкаСверху(1); Обл.РамкаСлева(1); Обл.РамкаСправа(1); КонецПроцедуры //***** Процедура НапечататьТЗ(Таб, ТЗ, НомС, НомК) Перем Тип, Обл1, НС, КС, Ключ, Зн, Обл2; Тип = ТЗ.ПолучитьЗначение(1, 1); НомС = НомС + 1; Обл1 = Таб.Область(НомС, НомК); ОбвестиОбласть(Обл1); Если Тип = В_Значение Тогда ТипЗн = ТЗ.ПолучитьЗначение(2, 1); Обл1.Текст = ТЗ.ПолучитьЗначение(2, 2); Обл1.ГоризонтальноеПоложение(1); Если ТипЗн = Л_Число Тогда Обл1.ГоризонтальноеПоложение(2); ИначеЕсли ТипЗн = Л_Константа Тогда Обл1.Полужирный(1); ИначеЕсли ТипЗн = Л_Строка Тогда Обл1.Контроль(4); КонецЕсли; Возврат; ИначеЕсли (Тип = В_Объект) Или (Тип = В_Массив) Тогда Обл1.Текст = Тип; Обл1.Полужирный(1); Обл1.ЦветФона(12648447); Обл1.РамкаСнизу(5); КС = ТЗ.КоличествоСтрок(); Для НС = 2 По КС Цикл НомС = НомС + 1; Обл2 = Таб.Область(НомС, НомК); Обл2.Текст = ТЗ.ПолучитьЗначение(НС, 1); Если Тип = В_Массив Тогда Обл2.ГоризонтальноеПоложение(2); КонецЕсли; ОбвестиОбласть(Обл2); НомС = НомС - 1; НапечататьТЗ(Таб, ТЗ.ПолучитьЗначение(НС, 2), НомС, НомК + 1); КонецЦикла; Иначе Сообщить("Фигня " + Тип, "!"); КонецЕсли; КонецПроцедуры //***** Процедура ВыравнятьТЗ(Таб, ОграничениеШирины) Перем НомерКол, НомерСтр, МаксШирина, Обл, ТекШирина, ТекДлина; Для НомерКол = 1 По Таб.ШиринаТаблицы() Цикл МаксШирина = 0; Для НомерСтр = 1 По Таб.ВысотаТаблицы() Цикл Обл = Таб.Область(НомерСтр, НомерКол); ТекШирина = Обл.ШиринаСтолбца(); ТекДлина = СтрДлина(СокрЛП(Обл.Текст)); МаксШирина = Макс(МаксШирина, ТекШирина, ТекДлина); КонецЦикла; Таб.Область(, НомерКол).ШиринаСтолбца(Мин(МаксШирина, ОграничениеШирины)); КонецЦикла; КонецПроцедуры //***** Процедура Напечатать_ТЗ(ТЗ) Перем Таб, НС, НК, МаксШирина, ТекДлина, Обл; Таб = СоздатьОбъект("Таблица"); МаксНК = 1; НС = 0; НК = 1; НапечататьТЗ(Таб, ТЗ, НС, НК); ВыравнятьТЗ(Таб, 30); Таб.Область(1, 1, Таб.ВысотаТаблицы(), Таб.ШиринаТаблицы()).ВертикальноеПоложение(2); Таб.Опции(0, 0); Таб.Показать("JSON"); КонецПроцедуры //***** Функция Ошибка() ФлагОшибки = 1; Возврат 0; КонецФункции //***** Функция ЧитатьКонстанту(ПервСимвол) Перем КонстантаСтр, ДлинаКонстанты; КонстантаСтр = СписокСтроковыхКонстант.Получить(ПервСимвол); ДлинаКонстанты = СтрДлина(КонстантаСтр); Если ТекущиеСимволы(ДлинаКонстанты) = КонстантаСтр Тогда ДобавитьЛексему(Л_Константа, КонстантаСтр, ДлинаКонстанты); Возврат 1; Иначе Возврат Ошибка(); КонецЕсли; КонецФункции //***** Процедура ДописатьСимвол(Стр) Стр = Стр + ТекущиеСимволы(1); НомерСимвола = НомерСимвола + 1; КонецПроцедуры //***** Функция ЧитатьЧисло() Перем ЧислоСтр; ЧислоСтр = ""; Если ТекущиеСимволы(1) = "-" Тогда ДописатьСимвол(ЧислоСтр); КонецЕсли; Если Найти(Цифры1_9, ТекущиеСимволы(1)) > 0 Тогда // не с нуля ДописатьСимвол(ЧислоСтр); Пока Найти(Цифры0_9, ТекущиеСимволы(1)) > 0 Цикл // любые цыфры ДописатьСимвол(ЧислоСтр); КонецЦикла; ИначеЕсли ТекущиеСимволы(1) = "0" Тогда //с нуля - ничего дальше ДописатьСимвол(ЧислоСтр); Иначе Возврат Ошибка(); КонецЕсли; Если ТекущиеСимволы(1) = "." Тогда // десятичная точка ДописатьСимвол(ЧислоСтр); Пока Найти(Цифры0_9, ТекущиеСимволы(1)) > 0 Цикл // любые цыфры ДописатьСимвол(ЧислоСтр); КонецЦикла; КонецЕсли; Если ВРег(ТекущиеСимволы(1)) = "E" Тогда // значок e больное или маленькое ДописатьСимвол(ЧислоСтр); Если Найти("+-", ТекущиеСимволы(1)) > 0 Тогда // унарный знак для порядка ДописатьСимвол(ЧислоСтр); КонецЕсли; Пока Найти(Цифры0_9, ТекущиеСимволы(1)) > 0 Цикл // любые цыфры ДописатьСимвол(ЧислоСтр); КонецЦикла; КонецЕсли; ДобавитьЛексему(Л_Число, ЧислоСтр, 0); Возврат 1; КонецФункции //***** Функция ЧитатьСтроку() Перем СтрокаСтр; СтрокаСтр = ""; НомерСимвола = НомерСимвола + 1; Пока (ТекущиеСимволы(1) <> Л_Кавычка) Или ((ТекущиеСимволы(1) = Л_Кавычка) И (ПрошлыйСимвол(1) = Л_Экран) И (ПрошлыйСимвол(2) <> Л_Экран)) Цикл ДописатьСимвол(СтрокаСтр); КонецЦикла; ДобавитьЛексему(Л_Строка, СтрокаСтр, 1); Возврат 1; КонецФункции //***** Функция ПрочитатьФайл(ИмяФайла) Перем Т, НомерСтрокиФайла, СтрокаРез; Т = СоздатьОбъект("Текст"); Т.Открыть(ИмяФайла); СтрокаРез = ""; Для НомерСтрокиФайла = 1 По Т.КоличествоСтрок() Цикл СтрокаРез = СтрокаРез + Т.ПолучитьСтроку(НомерСтрокиФайла); КонецЦикла; Возврат СтрокаРез; КонецФункции //***** Функция СледующаяЛексема() НомЛексемы = НомЛексемы + 1; СтекЛексем.ПолучитьСтрокуПоНомеру(НомЛексемы); ТекЛексема = СтекЛексем.Лексема; Возврат 1; КонецФункции //***** Функция ОшибкаЛексемы() Перем РезСтр, НомСтр, ТЛ, ТС; Сообщить("Ошибочная лексема № " + НомЛексемы + " : <" + ТекЛексема + ">", "!"); РезСтр = ""; Для НомСтр = НомЛексемы + 1 По СтекЛексем.КоличествоСтрок() Цикл СтекЛексем.ПолучитьСтрокуПоНомеру(НомСтр); ТЛ = СтекЛексем.Лексема; Если ТЛ = Л_Строка Тогда ТС = "<" + ТЛ + "(" + СтекЛексем.Значение + ")>"; ИначеЕсли ТЛ = Л_Константа Тогда ТС = "<" + ТЛ + "(" + СтекЛексем.Значение + ")>"; Иначе ТС = "<" + ТЛ + ">"; КонецЕсли; РезСтр = РезСтр + ТС + ","; КонецЦикла; Сообщить(Лев(РезСтр, 400), "!"); Возврат 0; КонецФункции //***** Процедура ДобавитьПару(ТЗ, Ключ, Значение) ТЗ.НоваяСтрока(); ТЗ.Ключ = Ключ; ТЗ.Значение = Значение; КонецПроцедуры //***** Функция НоваяТЗ(Тип) Перем _ТЗ; _ТЗ = СоздатьОбъект("ТаблицаЗначений"); _ТЗ.НоваяКолонка("Ключ"); _ТЗ.НоваяКолонка("Значение"); ДобавитьПару(_ТЗ, Тип, ""); Возврат _ТЗ; КонецФункции //***** Функция ПолучитьПроизвольноеЗначение_ТЗ() Перем ТЗ; Если (ТекЛексема = Л_Строка) Или (ТекЛексема = Л_Число) Или (ТекЛексема = Л_Константа) Тогда ТЗ = НоваяТЗ(В_Значение); ДобавитьПару(ТЗ, ТекЛексема, СтекЛексем.Значение); СледующаяЛексема(); Возврат ТЗ; ИначеЕсли ТекЛексема = Л_Лев_Фиг_Скобка Тогда Возврат ПолучитьОбъект_ТЗ(); ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда Возврат ПолучитьМассив_ТЗ(); КонецЕсли; Возврат ОшибкаЛексемы(); КонецФункции //***** Функция ДобавитьКлючЗначение(ТЗ) Перем НовКлюч, НовЗначение; Если ТекЛексема <> Л_Строка Тогда Возврат 0; КонецЕсли; НовКлюч = СтекЛексем.Значение; СледующаяЛексема(); Если ТекЛексема <> Л_Двоеточие Тогда Возврат ОшибкаЛексемы(); КонецЕсли; СледующаяЛексема(); НовЗначение = ПолучитьПроизвольноеЗначение_ТЗ(); Если НовЗначение = 0 Тогда Возврат 0; КонецЕсли; ДобавитьПару(ТЗ, НовКлюч, НовЗначение); Возврат 1; КонецФункции //***** Функция ПолучитьОбъект_ТЗ() Перем ТЗ; ТЗ = НоваяТЗ(В_Объект); СледующаяЛексема(); Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда // пустой объект СледующаяЛексема(); Возврат ТЗ; КонецЕсли; Если ДобавитьКлючЗначение(ТЗ) = 0 Тогда // первая пара ключ-значение Возврат 0; КонецЕсли; Пока ТекЛексема = Л_Запятая Цикл // пока запятые СледующаяЛексема(); Если ДобавитьКлючЗначение(ТЗ) = 0 Тогда // пара ключ-значение Возврат 0; КонецЕсли; КонецЦикла; Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда СледующаяЛексема(); Возврат ТЗ; КонецЕсли; Возврат 0; КонецФункции //***** Функция ПолучитьМассив_ТЗ() Перем ТЗ, _Ключ, _Значение; ТЗ = НоваяТЗ(В_Массив); СледующаяЛексема(); Если ТекЛексема = Л_Прав_Кв_Скобка Тогда СледующаяЛексема(); Возврат ТЗ; КонецЕсли; _Значение = ПолучитьПроизвольноеЗначение_ТЗ(); Если _Значение = 0 Тогда Возврат 0; КонецЕсли; _Ключ = 0; // JS - индексы массиворв с нуля ДобавитьПару(ТЗ, _Ключ, _Значение); Пока ТекЛексема = Л_Запятая Цикл СледующаяЛексема(); _Значение = ПолучитьПроизвольноеЗначение_ТЗ(); Если _Значение = 0 Тогда Возврат 0; КонецЕсли; _Ключ = _Ключ + 1; ДобавитьПару(ТЗ, _Ключ, _Значение); КонецЦикла; Если ТекЛексема = Л_Прав_Кв_Скобка Тогда СледующаяЛексема(); Возврат ТЗ; КонецЕсли; Возврат 0; КонецФункции //***** Функция ПрочитатьОбъект_ТЗ() Перем Рез; НомЛексемы = 0; СледующаяЛексема(); Если ТекЛексема = Л_Лев_Фиг_Скобка Тогда Рез = ПолучитьОбъект_ТЗ(); ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда Рез = ПолучитьМассив_ТЗ(); Иначе Рез = ПолучитьПроизвольноеЗначение_ТЗ(); КонецЕсли; Если (Рез = 0) Или (ТекЛексема <> Л_Финиш) Тогда ОшибкаЛексемы(); Возврат 0; КонецЕсли; Возврат Рез; КонецФункции //***** Функция СгенерироватьТЗ(НачАнализируемаяСтрока) Перем НачальныйСимвол, Рез; АнализируемаяСтрока = НачАнализируемаяСтрока; СтекЛексем = СоздатьОбъект("ТаблицаЗначений"); СтекЛексем.НоваяКолонка("Лексема" , "Строка"); СтекЛексем.НоваяКолонка("Значение", "Строка"); ФлагОшибки = 0; НомерСимвола = 1; Пока НомерСимвола <= СтрДлина(АнализируемаяСтрока) Цикл НачальныйСимвол = ТекущиеСимволы(1); Если Найти(" " + Симв(9), НачальныйСимвол) > 0 Тогда // пробелы и разделители строк пропускаем НомерСимвола = НомерСимвола + 1; ИначеЕсли НачальныйСимвол = Л_Кавычка Тогда // кавычка - читаем строку ЧитатьСтроку(); ИначеЕсли Найти(ОдносимвольныеЛексемы, НачальныйСимвол) > 0 Тогда ДобавитьЛексему(НачальныйСимвол, "", 1); ИначеЕсли Найти(ПервыеСимволыКонстант, НачальныйСимвол) > 0 Тогда // первая буква из начала константы - константа null, true, false Если ЧитатьКонстанту(НачальныйСимвол) = 0 Тогда Прервать; КонецЕсли; ИначеЕсли Найти("-" + Цифры0_9, НачальныйСимвол) > 0 Тогда // число Если ЧитатьЧисло() = 0 Тогда Прервать; КонецЕсли; Иначе // иных вариантов нет Сообщить("========= " + НомерСимвола, "!"); Сообщить(НачальныйСимвол, "!"); Сообщить("<" + НачальныйСимвол + "> " + КодСимв(НачальныйСимвол), "!"); Сообщить(ТекущиеСимволы(100), "!"); Возврат 0; КонецЕсли; КонецЦикла; Если ФлагОшибки <> 0 Тогда Сообщить("Ошибка парсинга JSON - выражения", "!"); Возврат 0; ИначеЕсли СтекЛексем.КоличествоСтрок() = 0 Тогда Сообщить("Пустой стек", "!"); Возврат 0; КонецЕсли; ДобавитьЛексему(Л_Финиш, "", 0); Возврат ПрочитатьОбъект_ТЗ(); КонецФункции //***** Функция JSON_Error(Стр = "") Если Стр <> "" Тогда Сообщить("JSON-ОШИБКА: " + Стр, "!"); КонецЕсли; Возврат JSON_Error; КонецФункции //***** Функция JSON_Type(Парам) Если ТипЗначенияСтр(Парам) <> "ТаблицаЗначений" Тогда Возврат JSON_Error(); ИначеЕсли Парам.КоличествоКолонок() <> 2 Тогда Возврат JSON_Error(); ИначеЕсли Парам.КоличествоСтрок() < 2 Тогда Возврат JSON_Error(); КонецЕсли; Возврат Парам.ПолучитьЗначение(1, 1); КонецФункции //***** Функция JSON_GetValue(Парам, Keys) Перем Тип, До, После, ПозЗакр, Л1, П2, Инд, ИндСтр, НС, КвоСтрок; Тип = JSON_Type(Парам); ПозЗакр = Найти(Keys, "]"); Если ПозЗакр = 0 Тогда ПозЗакр = СтрДлина(Keys) + 1; КонецЕсли; До = Лев(Keys, ПозЗакр); После = Сред(Keys, ПозЗакр + 1); Л1 = Лев(До, 1); П2 = Найти(До, "]"); Если Тип = JSON_Error Тогда Возврат JSON_Error("Параметра"); КонецЕсли; КвоСтрок = Парам.КоличествоСтрок(); Если До = "" Тогда // сам объект Если (Тип = В_Массив) Или (Тип = В_Объект) Тогда Возврат JSON_Error(); ИначеЕсли Тип = В_Значение Тогда Возврат Парам.ПолучитьЗначение(2, 2); Иначе Возврат JSON_Error("№ 1"); КонецЕсли; ИначеЕсли До = ".length" Тогда // размер массива или объекта. Для значения - ошибка Если (Тип = В_Массив) Или (Тип = В_Объект) Тогда Возврат Парам.КоличествоСтрок() - 1; Иначе Возврат JSON_Error("Длина скаляра"); КонецЕсли; ИначеЕсли Л1 = "[" Тогда // размер массива или объекта. Для значения - ошибка Если П2 = 0 Тогда Возврат JSON_Error("Индексация: <" + До + ">"); КонецЕсли; Инд = Сред(До, 2, П2 - 2); Если (Найти("'""", Лев(Инд, 1)) > 0) И (Найти("'""", Прав(Инд, 1)) > 0) Тогда // строковый только объект ИндСтр = Сред(Инд, 2, СтрДлина(Инд) - 2); Если Тип <> В_Объект Тогда Возврат JSON_Error("Строковый индекс <" + ИндСтр + "> только для Объекта"); КонецЕсли; НС = 0; Если Парам.НайтиЗначение(ИндСтр, НС, 1) = 1 Тогда Возврат JSON_GetValue(Парам.ПолучитьЗначение(НС, 2), После); КонецЕсли; Возврат JSON_Error("Нет индекса <" + ИндСтр + ">"); КонецЕсли; ИндЧис = 0 + Инд; Если "" + ИндЧис <> Инд Тогда // защита от <5D> Возврат JSON_Error("Ошибка 1 числового индекса <" + Инд + ">"); ИначеЕсли Цел(ИндЧис) <> ИндЧис Тогда // защита от неЦелого индекса Возврат JSON_Error("Ошибка 2 числового индекса <" + Инд + "> (нецелый)"); ИначеЕсли ИндЧис < 0 Тогда Возврат JSON_Error("Ошибка 3 числового индекса <" + Инд + "> (отрицательный)"); ИначеЕсли ИндЧис > (КвоСтрок - 2) Тогда Возврат JSON_Error("Ошибка 4 числового индекса <" + Инд + "> (" + ИндЧис + ">" + (КвоСтрок - 2) + ")"); КонецЕсли; Возврат JSON_GetValue(Парам.ПолучитьЗначение(ИндЧис + 1, 2), После); Иначе Возврат JSON_Error("Ошибка 5 <" + До + ">"); КонецЕсли; КонецФункции //***** Процедура ПриОткрытии() Перем Рез1, ТипУзла1, Зн1, Значение; ОчиститьОкноСообщений(); СтатусВозврата(0); Рез1 = СгенерироватьТЗ(ПрочитатьФайл(ТекКаталог + "j1.json")); Напечатать_ТЗ(Рез1); ТипУзла1 = JSON_Type(Рез1); Сообщить("Тип узла: " + ТипУзла1); Зн1 = JSON_GetValue(Рез1, ".length"); Сообщить("1) Размер: " + Зн1); Зн3 = JSON_GetValue(Рез1, "['1']"); Сообщить("3) ['1']: <" + Зн3 + ">"); Зн4 = JSON_GetValue(Рез1, "[1]"); Сообщить("4) [1]: <" + Зн4 + ">"); Зн5 = JSON_GetValue(Рез1, "['Массив'][6]"); Сообщить("5) [*]: <" + Зн5 + ">"); Зн6 = JSON_GetValue(Рез1, "['Соответствие']['ДопустимоеИмяСвойства']"); Сообщить("6) [*]: <" + Зн6 + ">"); КонецПроцедуры //***** Процедура ДобавитьСтроковуюКонстанту(КонстантаСтр) Перем ПервыйСимвол; ПервыйСимвол = Лев(КонстантаСтр, 1); ПервыеСимволыКонстант = ПервыеСимволыКонстант + ПервыйСимвол; СписокСтроковыхКонстант.Установить(ПервыйСимвол, КонстантаСтр); КонецПроцедуры //***** РасположениеФайла(ТекКаталог, ТекФайл); //***** Л_Лев_Фиг_Скобка = "{"; Л_Прав_Фиг_Скобка = "}"; Л_Лев_Кв_Скобка = "["; Л_Прав_Кв_Скобка = "]"; Л_Двоеточие = ":"; Л_Запятая = ","; Л_Экран = "\"; Л_Кавычка = """"; Л_Финиш = ""; Л_Число = "number"; Л_Строка = "string"; Л_Константа = "const"; ОдносимвольныеЛексемы = Л_Лев_Фиг_Скобка + Л_Прав_Фиг_Скобка + Л_Лев_Кв_Скобка + Л_Прав_Кв_Скобка + Л_Двоеточие + Л_Запятая; //***** Цифры1_9 = "123456789"; Цифры0_9 = "0" + Цифры1_9; //***** В_Массив = "###array"; В_Объект = "###object"; В_Значение = "###value"; //***** СписокСтроковыхКонстант = СоздатьОбъект("СписокЗначений"); ПервыеСимволыКонстант = ""; ДобавитьСтроковуюКонстанту("null"); ДобавитьСтроковуюКонстанту("false"); ДобавитьСтроковуюКонстанту("true"); JSON_Error = "ERROR";
В качестве примера взят файл j1.json :
{
"999": 88,
"Null": null,
"Сэкраном": "\"",
"Ложь": false,
"ОдинСимв": "1",
"1": "11111",
"Пустышка": "",
"Истина": true,
"Число (плавающая точка)": 1.001e-2,
"Число (плавающая)": -1.001e-2,
"Число (фиксированная точка)": -1000.001,
"Дата": "2011-01-01T12:00:00Z",
"Строка (двойная кавычка)": "Двойная кавычка",
"Строка (одинарная кавычка)": "Одинарная кавычка",
"Маскируемые символы": " \\ \/ \b \t \n \f \r \" ",
"Заковыристая строка": "\\n\\",
"Проблемные символы": "Спец. символы: \u0000, \u0001, \u0002, ... , \u001e, \u001f; Юникод символы: \u0421\u0430\u0448\u0430\u0020\u003a\u0029",
"Кириллические символы": "’АБВГҐДЂЃЕ?ЁЄЖЗЅИ?ІЇЙЈКЛЉМНЊОПРСТЋЌУЎФХЦЧЏШЩЪЫЬЭЮЯ",
"Идентификатор": "a763cfbb-f94f-4c67-8e13-0e96a3a7f353",
"Пустой массив": [],
"Пустой объект": {},
"Массив": [
null,
false,
true,
1.001e-2,
-1000.001,
"2011-01-01T12:00:00Z",
"Двойная кавычка",
"Одинарная кавычка",
"a763cfbb-f94f-4c67-8e13-0e96a3a7f353",
[
"Первый элемент",
"Второй элемент"
],
"Имя": "Александр",
"Отчество": "Владимирович",
"Фамилия": "Переверзев"
},
"ДопустимоеИмяСвойства": true,
"Недопустимое Имя Свойства": false
}
"Структура":
"Соответствие":
"Ссылка":
"Ссылка": "00000000-0000-0000-0000-000000000000",
"Представление": "Неизвестная ссылка"
"COMSafeArray": [
0,
1,
2,
3,
4,
5
]
// В приведенном примере производится подключение к агенту сервера, выбирается первый кластер. // Для этого кластера получается список информационных баз, который затем обходится в цикле. Соединитель = Новый COMObject("V81.COMConnector"); ИмяМашины = "SERVANT"; Порт = "1540"; СтрокаСоединения = "TCP://" + ИмяМашины + ":" + Порт; СоединениеСАгентом = Соединитель.ConnectAgent(СтрокаСоединения); МассивКластеров = СоединениеСАгентом.GetClusters(); // получается первый массив кластера. ОписаниеКластера = МассивКластеров.GetValue(МассивКластеров.GetLowerBound()); // в случае если определены администраторы кластера, должны быть указаны данные о логине. СоединениеСАгентом.authenticate(ОписаниеКластера, " ", " "); МассивБаз = СоединениеСАгентом.GetInfoBases(ОписаниеКластера); МаксимальныйИндекс = МассивБаз.GetUpperBound(); Для ТекущийИндекс = МассивБаз.GetLowerBound() По МаксимальныйИндекс Цикл ОписаниеБазы = МассивБаз.GetValue(ТекущийИндекс); Сообщить(ОписаниеБазы.Descr); Сообщить(ОписаниеБазы.Name); КонецЦикла;
Ex = Новый COMObject("Excel.Application"); Ex.Workbooks.Open(Путь); Ex.Visible = 1; ТекЛист=Ex.WorkSheets(1); Для Ячейка = 1 по 400 цикл Если НЕ ТекЛист.Cells(Ячейка,1).Value = Неопределено тогда Сообщить(Строка(ТекЛист.Cells(Ячейка,1).Value)); Карта = Справочники.Номенклатура.НайтиПоКоду(ИзЧислаВСтроку(ТекЛист.Cells(Ячейка,1).Value)); Если Карта.Пустая() тогда Сообщить(" Пустой элемент " + ТекЛист.Cells(Ячейка,1)); иначе Объект = Карта.ПолучитьОбъект(); Объект.ОсновнойПоставщик = ОсновнойКлиент; Объект.Записать(); конецесли; конецесли; конеццикла;
// Функция получает данные из файла Excel // // Параметры: // пФайл - Имя файла // пЛист - Имя листа с данными // СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки" // если не задано, созадуться колонки вида "К1", "К2" // // Возвращаемое значение: // ТаблицаЗначений // Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт #Если Клиент Тогда Состояние("Установка соединения с Excel"); #КонецЕсли //ЗаголовкиВСтроке1 = "HDR=YES;" ЗаголовкиВСтроке1 = "HDR=NO;"; СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(пФайл) +" ;Extended Properties=""Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;"""; Connection = Новый COMОбъект("ADODB.Connection"); Connection.ConnectionString = СтрокаСоединения; Попытка Connection.Open(); Исключение Сообщить ("Проблемы с подключением к Excel" ); Возврат Неопределено; КонецПопытки; RS = Новый COMОбъект("ADODB.Recordset"); ТекстЗапроса = "S_elect | Лист.* |FROM | [" + пЛист + "$] as Лист"; Попытка RS.Open(ТекстЗапроса, Connection); Исключение Сообщить ("Проблемы с выполнением запроса"); Возврат Неопределено; КонецПопытки; Таблица = Новый ТаблицаЗначений; Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По RS.Fields.Count Цикл Поле = RS.Fields.Item(Счетчик - 1); Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name); КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); КонецЦикла; КонецЕсли; НомерСтроки = 0; КолвоСтрок = RS.RecordCount; Пока RS.EOF() = 0 Цикл НомерСтроки = НомерСтроки + 1; #Если Клиент Тогда Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок)); ОбработкаПрерыванияПользователя(); #КонецЕсли Если НомерСтроки < НачСтрока Тогда RS.MoveNext(); Продолжить; КонецЕсли; Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда Прервать; КонецЕсли; НоваяСтрока = Таблица.Добавить(); Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По RS.Fields.Count Цикл Поле = RS.Fields.Item(Счетчик - 1); НоваяСтрока["К" + Счетчик] = Поле.Value; КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Поле = RS.Fields.Item(КлючИЗначение.Значение - 1); НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value; КонецЦикла; КонецЕсли; // Обработка других полей RS.MoveNext(); КонецЦикла; // Завершение работы RS.Close(); Connection.Close(); Возврат Таблица; КонецФункции // Функция получает данные из файла Excel // // Параметры: // пФайл - Имя файла // пЛист - Имя листа с данными // СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки" // если не задано, созадуться колонки вида "К1", "К2" // XLSОбъект - COM объект типа "Excel.Application" // // Возвращаемое значение: // ТаблицаЗначений // Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт #Если Клиент Тогда Состояние("Открытие Excel"); #КонецЕсли Если XLSОбъект = Неопределено Тогда XLSОбъект = Новый COMОбъект("Excel.Application"); XLSОбъект.Visible = Ложь; XLSОбъект.DisplayAlerts = Ложь; КонецЕсли; Попытка Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); Исключение Сообщить ("Проблемы с подключением к Excel" ); Возврат Неопределено; КонецПопытки; Лист = Book.Sheets(1); КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; Таблица = Новый ТаблицаЗначений; Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По КолвоКолонок Цикл Колонка = Таблица.Колонки.Добавить("К" + Счетчик); КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); КонецЦикла; КонецЕсли; НачСтрока = ?(НачСтрока = 0, 1, НачСтрока); КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока); КонСтрока = Мин(КонСтрока, КолвоСтрок); Для НомерСтроки = НачСтрока По КонСтрока Цикл #Если Клиент Тогда Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КонСтрока)); ОбработкаПрерыванияПользователя(); #КонецЕсли НоваяСтрока = Таблица.Добавить(); Если СтруктураКолонок = Неопределено Тогда Для НомерКолонки = 1 По КолвоКолонок Цикл Поле = Лист.Cells(НомерСтроки, НомерКолонки); НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Поле.Value; КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл Поле = Лист.Cells(НомерСтроки, КлючИЗначение.Значение); НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value; КонецЦикла; КонецЕсли; КонецЦикла; XLSОбъект.Application.Quit(); Возврат Таблица; КонецФункции // Функция получает данные из файла Excel // // Параметры: // пФайл - Имя файла // пЛист - Имя листа с данными // СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки" // если не задано, созадуться колонки вида "К1", "К2" // XLSОбъект - COM объект типа "Excel.Application" // // Возвращаемое значение: // ТаблицаЗначений // Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт #Если Клиент Тогда Состояние("Открытие Excel"); #КонецЕсли Если XLSОбъект = Неопределено Тогда XLSОбъект = Новый COMОбъект("Excel.Application"); XLSОбъект.Visible = Ложь; XLSОбъект.DisplayAlerts = Ложь; КонецЕсли; Попытка Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); Исключение Сообщить ("Проблемы с подключением к Excel" ); Возврат Неопределено; КонецПопытки; Лист = Book.Sheets(1); КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; Таблица = Новый ТаблицаЗначений; Если СтруктураКолонок = Неопределено Тогда Для Счетчик = 1 По КолвоКолонок Цикл Колонка = Таблица.Колонки.Добавить("К" + Счетчик); КонецЦикла; Иначе МаксимальныйНомерКолонки = 0; Для каждого КлючИЗначение Из СтруктураКолонок Цикл Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ); МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение); КонецЦикла; КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки); КонецЕсли; НачСтрока = ?(НачСтрока = 0, 1, НачСтрока); КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока); КонСтрока = Мин(КонСтрока, КолвоСтрок); // Массив типа COMSafeArray Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value; КолвоСтрок = Массив.GetUpperBound(1); Для НомерСтроки = 1 По КолвоСтрок Цикл #Если Клиент Тогда Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок)); ОбработкаПрерыванияПользователя(); #КонецЕсли НоваяСтрока = Таблица.Добавить(); Если СтруктураКолонок = Неопределено Тогда Для НомерКолонки = 1 По КолвоКолонок Цикл НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки); КонецЦикла; Иначе Для каждого КлючИЗначение Из СтруктураКолонок Цикл НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки); КонецЦикла; КонецЕсли; КонецЦикла; XLSОбъект.Application.Quit(); Возврат Таблица; КонецФункции // Функция получает список листов Excel // // Параметры: // пФайл - Имя файла // XLSОбъект - COM объект типа "Excel.Application" // // Возвращаемое значение: // СписокЗначений // Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт Если XLSОбъект = Неопределено Тогда XLSОбъект = Новый COMОбъект("Excel.Application"); XLSОбъект.Visible = Ложь; XLSОбъект.DisplayAlerts = Ложь; КонецЕсли; Попытка Book = XLSОбъект.Workbooks.Open(пФайл, , Истина); Исключение Возврат Новый СписокЗначений; КонецПопытки; СписокЛистов = Новый СписокЗначений; Для каждого Лист Из XLSОбъект.Sheets Цикл СписокЛистов.Добавить(Лист.Name); КонецЦикла; XLSОбъект.Application.Quit(); Возврат СписокЛистов; КонецФункции
Попытка Excel = СоздатьОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()+"; программа Excel не установлена на данном компьютере!"); Возврат; КонецПопытки; РабочиеКниги=Excel.WorkBooks; // создаем рабочую книгу Попытка // открываем файл Отчет=РабочиеКниги.Open(Каталог+ИмяФайла); Исключение Сообщить(ОписаниеОшибки()+"; фаил с макросом не найден!"); Возврат; КонецПопытки; // заносим в таблицу какие-либо данные Лист = Отчет.Worksheets(1); Для Ном=1 По 20 Цикл Ячейка = Лист .Cells(ном,1); Ячейка.Value; Сообщить(Ячейка ); КонецЦикла; Excel.Visible=1; Попытка Отчет.Save(); Исключение Сообщить(ОписаниеОшибки()+"; не могу сохранить отчет!"); Возврат; КонецПопытки;