Перем Л_Лев_Фиг_Скобка, Л_Прав_Фиг_Скобка, Л_Лев_Кв_Скобка, Л_Прав_Кв_Скобка, Л_Кавычка, Л_Экран, Л_Двоеточие, Л_Запятая, Л_Число, Л_Строка, Л_Константа, Л_Финиш; Перем Цифры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
]
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | РеализацияТоваровУслугТовары.Ссылка КАК Ссылка, | РеализацияТоваровУслугТовары.Ссылка.Номер, | РеализацияТоваровУслугТовары.Ссылка.Дата, | РеализацияТоваровУслугТовары.Ссылка.Контрагент, | РеализацияТоваровУслугТовары.Ссылка.ТоннажДокумента КАК Тоннаж, | РеализацияТоваровУслугТовары.Ссылка.СуммаДокумента КАК Сумма, | 0 КАК ЕстьДопУслуги |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары |ГДЕ | РеализацияТоваровУслугТовары.Ссылка.Доставка = &Ссылка | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ РАЗЛИЧНЫЕ | КомплектацияНоменклатурыКомплектующие.Ссылка.Ссылка, | КомплектацияНоменклатурыКомплектующие.Ссылка.Номер, | КомплектацияНоменклатурыКомплектующие.Ссылка.Дата, | NULL, | 0, | 0, | 0 |ИЗ | Документ.КомплектацияНоменклатуры.Комплектующие КАК КомплектацияНоменклатурыКомплектующие |ГДЕ | КомплектацияНоменклатурыКомплектующие.Доставка = &Ссылка | |УПОРЯДОЧИТЬ ПО | Ссылка |АВТОУПОРЯДОЧИВАНИЕ"); Запрос.УстановитьПараметр("Ссылка", Ссылка); ТабличноеПолеРеализаций = Запрос.Выполнить().Выгрузить(); ЭлементыФормы.ТабличноеПолеРеализаций.СоздатьКолонки(); ЭлементыФормы.ТабличноеПолеРеализаций.Колонки.ЕстьДопУслуги.Видимость = Ложь; ЭлементыФормы.ТабличноеПолеРеализаций.Колонки.Тоннаж.ОтображатьИтогиВПодвале = Истина; ЭлементыФормы.ТабличноеПолеРеализаций.Колонки.Сумма.ОтображатьИтогиВПодвале = Истина; ЭлементыФормы.ТабличноеПолеРеализаций.Колонки.Тоннаж.ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложение.Право; ЭлементыФормы.ТабличноеПолеРеализаций.Колонки.Сумма.ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложение.Право; ЭлементыФормы.ТабличноеПолеРеализаций.Колонки.Тоннаж.ТекстПодвала = "" + Формат(ТабличноеПолеРеализаций.Итог("Тоннаж"), "ЧЦ=15; ЧДЦ=3"); ЭлементыФормы.ТабличноеПолеРеализаций.Колонки.Тоннаж.Ширина = 15; ЭлементыФормы.ТабличноеПолеРеализаций.Колонки.Тоннаж.Формат = "ЧДЦ=3; ЧГ=3,0"; ЭлементыФормы.ТабличноеПолеРеализаций.Колонки.Сумма.Формат = "ЧДЦ=2; ЧГ=3,0";
Процедура УстановитьНачальныеНастройки(ДополнительныеПараметры = Неопределено) Экспорт // Настройка общих параметров универсального отчета //начальный вариант оформления цветовой схемы УниверсальныйОтчет.ВариантОформления = СтандартноеОформление.Песок; // Содержит название отчета, которое будет выводиться в шапке. // Тип: Строка. // Пример: // УниверсальныйОтчет.мНазваниеОтчета = "Название отчета"; УниверсальныйОтчет.мНазваниеОтчета = СокрЛП(ЭтотОбъект.Метаданные().Синоним); // Содержит признак необходимости отображения надписи и поля выбора раздела учета в форме настройки. // Тип: Булево. // Значение по умолчанию: Истина. // Пример: // УниверсальныйОтчет.мВыбиратьИмяРегистра = Ложь; УниверсальныйОтчет.мВыбиратьИмяРегистра = Ложь; // Содержит имя регистра, по метаданным которого будет выполняться заполнение настроек отчета. // Тип: Строка. // Пример: // УниверсальныйОтчет.ИмяРегистра = "ТоварыНаСкладах"; УниверсальныйОтчет.ИмяРегистра = "-"; // Содержит признак необходимости вывода отрицательных значений показателей красным цветом. // Тип: Булево. // Значение по умолчанию: Ложь. // Пример: // УниверсальныйОтчет.ОтрицательноеКрасным = Истина; УниверсальныйОтчет.ОтрицательноеКрасным = Истина; // Содержит признак необходимости вывода в отчет общих итогов. // Тип: Булево. // Значение по умолчанию: Истина. // Пример: // УниверсальныйОтчет.ВыводитьОбщиеИтоги = Ложь; УниверсальныйОтчет.ВыводитьОбщиеИтоги = Истина; // Содержит признак необходимости вывода детальных записей в отчет. // Тип: Булево. // Значение по умолчанию: Ложь. // Пример: // УниверсальныйОтчет.ВыводитьДетальныеЗаписи = Истина; УниверсальныйОтчет.ВыводитьДетальныеЗаписи = Ложь; // Содержит признак необходимости отображения флага использования свойств и категорий в форме настройки. // Тип: Булево. // Значение по умолчанию: Истина. // Пример: // УниверсальныйОтчет.мВыбиратьИспользованиеСвойств = Ложь; УниверсальныйОтчет.мВыбиратьИспользованиеСвойств = Истина; // Содержит признак использования свойств и категорий при заполнении настроек отчета. // Тип: Булево. // Значение по умолчанию: Ложь. // Пример: // УниверсальныйОтчет.ИспользоватьСвойстваИКатегории = Истина; //УниверсальныйОтчет.ИспользоватьСвойстваИКатегории = ЛОЖЬ; // Содержит признак использования простой формы настроек отчета без группировок колонок. // Тип: Булево. // Значение по умолчанию: Ложь. // Пример: // УниверсальныйОтчет.мРежимФормыНастройкиБезГруппировокКолонок = Истина; // Дополнительные параметры, переданные из отчета, вызвавшего расшифровку. // Информация, передаваемая в переменной ДополнительныеПараметры, может быть использована // для реализации специфичных для данного отчета параметрических настроек. // Описание исходного текста запроса. ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | CRM_ПредложенияОбороты.Номенклатура КАК Номенклатура, | ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.Номенклатура) КАК НоменклатураПредставление, | CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатурыПредставление, | CRM_ПредложенияОбороты.Контрагент КАК Контрагент, | ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.Контрагент) КАК КонтрагентПредставление, | CRM_ПредложенияОбороты.ДокументПредложения КАК Документ, | ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.ДокументПредложения) КАК ДокументПредставление, | CRM_ПредложенияОбороты.ДокументПредложения.Ответственный КАК Ответственный, | ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.ДокументПредложения.Ответственный) КАК ОтветственныйПредставление, | CRM_ПредложенияОбороты.КоличествоОборот КАК КоличествоОборот, | CRM_ПредложенияОбороты.СтоимостьОборот КАК СтоимостьОборот, | 0 КАК СкидкаОборот, | 1 КАК Количество, | CRM_ПредложенияОбороты.СтоимостьБезСкидокОборот КАК СтоимостьБезСкидокОборот | //ПОЛЯ_СВОЙСТВА | //ПОЛЯ_КАТЕГОРИИ |{ВЫБРАТЬ | Контрагент.*, | Номенклатура.*, | ХарактеристикаНоменклатуры.*, | Ответственный.*, | Документ.*, | КоличествоОборот, | СтоимостьОборот, | СкидкаОборот, | Количество, | (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации | //ПСЕВДОНИМЫ_СВОЙСТВА | //ПСЕВДОНИМЫ_КАТЕГОРИИ |} |ИЗ | РегистрНакопления.CRM_Предложения.Обороты(&ДатаНач, &ДатаКон, , ) КАК CRM_ПредложенияОбороты |{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсточникИнформацииПриОбращении.СрезПоследних(&ДатаКон) КАК ИсточникиИнформацииПриОбращении |ПО CRM_ПредложенияОбороты.Контрагент = ИсточникиИнформацииПриОбращении.Контрагент} |//СОЕДИНЕНИЯ |{ГДЕ | CRM_ПредложенияОбороты.Контрагент.* КАК Контрагент, | CRM_ПредложенияОбороты.Номенклатура.* КАК Номенклатура, | CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры, | CRM_ПредложенияОбороты.ДокументПредложения.Ответственный.* КАК Ответственный, | CRM_ПредложенияОбороты.ДокументПредложения.* КАК Документ, | (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации | //УСЛОВИЯ_СВОЙСТВА | //УСЛОВИЯ_КАТЕГОРИИ |} |{УПОРЯДОЧИТЬ ПО | Контрагент.*, | Номенклатура.*, | ХарактеристикаНоменклатуры.*, | Ответственный.*, | Документ.*, | (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации | //ПСЕВДОНИМЫ_СВОЙСТВА | //ПСЕВДОНИМЫ_КАТЕГОРИИ |} | |ИТОГИ | СУММА(КоличествоОборот), | СУММА(СтоимостьОборот), | СУММА(СтоимостьБезСкидокОборот - СтоимостьОборот) КАК СкидкаОборот, | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ(Документ)) КАК Количество |ПО | ОБЩИЕ |{ИТОГИ ПО | Контрагент.*, | Номенклатура.*, | ХарактеристикаНоменклатуры.*, | Ответственный.*, | Документ.*, | (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации, | НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, ДЕНЬ) КАК ПериодДень, | НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, НЕДЕЛЯ) КАК ПериодНеделя, | НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, МЕСЯЦ) КАК ПериодМесяц, | НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, КВАРТАЛ) КАК ПериодКвартал, | НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, ГОД) КАК ПериодГод | //ПСЕВДОНИМЫ_СВОЙСТВА | //ПСЕВДОНИМЫ_КАТЕГОРИИ |}"; // В универсальном отчете включен флаг использования свойств и категорий. Если УниверсальныйОтчет.ИспользоватьСвойстваИКатегории Тогда // Добавление свойств и категорий поля запроса в таблицу полей. // Необходимо вызывать для каждого поля запроса, предоставляющего возможность использования свойств и категорий. // УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля(<ПсевдонимТаблицы>.<Поле> , <ПсевдонимПоля>, <Представление>, <Назначение>); УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("CRM_ПредложенияОбороты.Номенклатура" , "Номенклатура", "Номенклатура", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура); УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры" , "ХарактеристикаНоменклатуры", "Характеристика номенклатуры", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура); УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("CRM_ПредложенияОбороты.Контрагент" , "Контрагент", "Контрагент", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура); УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("CRM_ПредложенияОбороты.ДокументПредложения" , "Документ", "Коммерческое предложение", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Документ_CRM_КоммерческоеПредложение); // Добавление свойств и категорий в исходный текст запроса. УниверсальныйОтчет.ДобавитьВТекстЗапросаСвойстваИКатегории(ТекстЗапроса); КонецЕсли; // Инициализация текста запроса построителя отчета УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса; // Представления полей отчета. // Необходимо вызывать для каждого поля запроса. // УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить(<ИмяПоля>, <ПредставлениеПоля>); УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("ХарактеристикаНоменклатуры", "Характеристика номенклатуры"); УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Документ", "Коммерческое предложение"); УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("ИсточникИнформации", "Источник информации при обращении покупателя"); // Добавление показателей // Необходимо вызывать для каждого добавляемого показателя. // УниверсальныйОтчет.ДобавитьПоказатель(<ИмяПоказателя>, <ПредставлениеПоказателя>, <ВключенПоУмолчанию>, <Формат>, <ИмяГруппы>, <ПредставлениеГруппы>); //УниверсальныйОтчет.ДобавитьПоказатель("Задача", "Задача", Истина,); УниверсальныйОтчет.ДобавитьПоказатель("Количество", "Количество документов", Истина, "ЧЦ = 15 ; ЧДЦ = 3"); УниверсальныйОтчет.ДобавитьПоказатель("КоличествоОборот", "Количество номенклатуры", Истина, "ЧЦ = 15 ; ЧДЦ = 3",,); УниверсальныйОтчет.ДобавитьПоказатель("СтоимостьОборот", "Сумма", Истина, "ЧЦ = 15 ; ЧДЦ = 2"); УниверсальныйОтчет.ДобавитьПоказатель("СкидкаОборот", "Скидка", Истина, "ЧЦ = 15 ; ЧДЦ = 2",,); // Добавление предопределенных группировок строк отчета. // Необходимо вызывать для каждой добавляемой группировки строки. // УниверсальныйОтчет.ДобавитьИзмерениеСтроки(<ПутьКДанным>); УниверсальныйОтчет.ДобавитьИзмерениеСтроки("Контрагент"); УниверсальныйОтчет.ДобавитьИзмерениеСтроки("Номенклатура"); // Добавление предопределенных группировок колонок отчета. // Необходимо вызывать для каждой добавляемой группировки колонки. // УниверсальныйОтчет.ДобавитьИзмерениеКолонки(<ПутьКДанным>); // Добавление предопределенных отборов отчета. // Необходимо вызывать для каждого добавляемого отбора. // УниверсальныйОтчет.ДобавитьОтбор(<ПутьКДанным>); УниверсальныйОтчет.ДобавитьОтбор("Контрагент"); УниверсальныйОтчет.ДобавитьОтбор("Номенклатура"); УниверсальныйОтчет.ДобавитьОтбор("Ответственный"); УниверсальныйОтчет.ДобавитьОтбор("Документ"); // Добавление предопределенных полей порядка отчета. // Необходимо вызывать для каждого добавляемого поля порядка. // УниверсальныйОтчет.ДобавитьПорядок(<ПутьКДанным>); // Установка связи подчиненных и родительских полей // УниверсальныйОтчет.УстановитьСвязьПолей(<ПутьКДанным>, <ПутьКДаннымРодитель>); //УниверсальныйОтчет.УстановитьСвязьПолей("ТочкаМаршрута","Задача"); // Установка связи полей и измерений // УниверсальныйОтчет.УстановитьСвязьПоляИИзмерения(<ИмяПоля>, <ИмяИзмерения>); // Установка представлений полей УниверсальныйОтчет.УстановитьПредставленияПолей(УниверсальныйОтчет.мСтруктураПредставлениеПолей, УниверсальныйОтчет.ПостроительОтчета); // Установка типов значений свойств в отборах отчета УниверсальныйОтчет.УстановитьТипыЗначенийСвойствДляОтбора(); // Заполнение начальных настроек универсального отчета УниверсальныйОтчет.УстановитьНачальныеНастройки(Ложь); // Добавление предопределенных отборов отчета. // Необходимо вызывать для каждого добавляемого отбора. // УниверсальныйОтчет.ДобавитьОтбор(<ПутьКДанным>); УниверсальныйОтчет.ДобавитьОтбор("Контрагент"); УниверсальныйОтчет.ДобавитьОтбор("Номенклатура"); УниверсальныйОтчет.ДобавитьОтбор("Ответственный"); УниверсальныйОтчет.ДобавитьОтбор("Документ"); // Добавление дополнительных полей // Необходимо вызывать для каждого добавляемого дополнительного поля. // УниверсальныйОтчет.ДобавитьДополнительноеПоле(<ПутьКДанным>, <Размещение>, <Положение>); УниверсальныйОтчет.мСтруктураФорматаПолей.Вставить("ДатаВыполнения", "ДЛФ=DDT"); УниверсальныйОтчет.мСтруктураФорматаПолей.Вставить("ДатаФактическогоВыполнения", "ДЛФ=DDT"); УниверсальныйОтчет.мМинимальнаяШиринаКолонкиПоказатель = 10; УниверсальныйОтчет.мМаксимальнаяШиринаКолонки = 80; КонецПроцедуры // УстановитьНачальныеНастройки()
ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("Номенклатура", "Номенклатура"); ЭлементОформления.Область.Добавить("Номенклатура", "Номенклатура", ТипОбластиОформления.Поле); ЭлементОформления.Оформление.ГоризонтальноеПоложение.Значение = ГоризонтальноеПоложение.Лево; ЭлементОформления.Оформление.ГоризонтальноеПоложение.Использование = Истина; ЭлементОформления.Использование = Истина; ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ХарактеристикаНоменклатуры", "ХарактеристикаНоменклатуры"); ЭлементОформления.Область.Добавить("ХарактеристикаНоменклатуры", "ХарактеристикаНоменклатуры", ТипОбластиОформления.Поле); ЭлементОформления.Оформление.ГоризонтальноеПоложение.Значение = ГоризонтальноеПоложение.Лево; ЭлементОформления.Оформление.ГоризонтальноеПоложение.Использование = Истина; ЭлементОформления.Использование = Истина; УниверсальныйОтчет.мМинимальнаяШиринаКолонкиПоказатель = 7; УниверсальныйОтчет.мМаксимальнаяШиринаКолонки = 50;
// Условное оформление поля "Состояние" ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ТребуетсяЗаказать", "Требуется заказать"); ЭлементОформления.Область.Добавить("Состояние", "Состояние", ТипОбластиОформления.Поле); ЭлементОтбора = ЭлементОформления.Отбор.Добавить("Состояние"); ЭлементОтбора.ВидСравнения = ВидСравнения.Равно; ЭлементОтбора.Значение = 0; ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.ЦветТекста.Значение = WebЦвета.Красный; ЭлементОформления.Оформление.ЦветТекста.Использование = Истина; ЭлементОформления.Оформление.Текст.Значение = "Требуется заказать"; ЭлементОформления.Оформление.Текст.Использование = Истина; ЭлементОформления.Использование = Истина; ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("РекомендуетсяЗаказать", "Рекомендуется заказать"); ЭлементОформления.Область.Добавить("Состояние", "Состояние", ТипОбластиОформления.Поле); ЭлементОтбора = ЭлементОформления.Отбор.Добавить("Состояние"); ЭлементОтбора.ВидСравнения = ВидСравнения.Равно; ЭлементОтбора.Значение = 1; ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.ЦветТекста.Значение = WebЦвета.Коричневый; ЭлементОформления.Оформление.ЦветТекста.Использование = Истина; ЭлементОформления.Оформление.Текст.Значение = "Рекомендуется заказать"; ЭлементОформления.Оформление.Текст.Использование = Истина; ЭлементОформления.Использование = Истина; ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("НеТребуетсяЗаказывать", "Не требуется заказывать"); ЭлементОформления.Область.Добавить("Состояние", "Состояние", ТипОбластиОформления.Поле); ЭлементОтбора = ЭлементОформления.Отбор.Добавить("Состояние"); ЭлементОтбора.ВидСравнения = ВидСравнения.Равно; ЭлементОтбора.Значение = 2; ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.ЦветТекста.Значение = WebЦвета.Зеленый; ЭлементОформления.Оформление.ЦветТекста.Использование = Истина; ЭлементОформления.Оформление.Текст.Значение = "Не требуется заказывать"; ЭлементОформления.Оформление.Текст.Использование = Истина; ЭлементОформления.Использование = Истина; ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ЗонаПоСумме", "Зона По Сумме"); ЭлементОформления.Область.Добавить("ЗонаПоСумме", "ЗонаПоСумме", ТипОбластиОформления.Поле); ЭлементОтбора = ЭлементОформления.Отбор.Добавить("ЗонаПоСумме"); ЭлементОтбора.ВидСравнения = ВидСравнения.Равно; ЭлементОтбора.Значение = "крас"; ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.ЦветФона.Значение = WebЦвета.Красный; ЭлементОформления.Оформление.ЦветФона.Использование = Истина; ЭлементОформления.Оформление.Текст.Значение = ""; ЭлементОформления.Оформление.Текст.Использование = Истина; ЭлементОформления.Использование = Истина; ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ЗонаПоСумме", "Зона По Сумме"); ЭлементОформления.Область.Добавить("ЗонаПоСумме", "ЗонаПоСумме", ТипОбластиОформления.Поле); ЭлементОтбора = ЭлементОформления.Отбор.Добавить("ЗонаПоСумме"); ЭлементОтбора.ВидСравнения = ВидСравнения.Равно; ЭлементОтбора.Значение = "зелн"; ЭлементОтбора.Использование = Истина; ЭлементОформления.Оформление.ЦветТекста.Значение = WebЦвета.Зеленый; ЭлементОформления.Оформление.ЦветТекста.Использование = Истина; ЭлементОформления.Оформление.Шрифт.Значение = Новый Шрифт(,,Истина); ЭлементОформления.Оформление.Шрифт.Использование = Истина; ЭлементОформления.Оформление.Текст.Значение = "|||||||||||||||||"; ЭлементОформления.Оформление.Текст.Использование = Истина; ЭлементОформления.Использование = Истина;
ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ДатаЗаписи", "Дата записи"); ЭлементОформления.Область.Добавить("ДатаЗаписи", "Дата записи", ТипОбластиОформления.Поле); ЭлементОформления.Оформление.Формат.Значение = "ДФ=dd.MM.yyyy"; ЭлементОформления.Оформление.Формат.Использование = Истина; ЭлементОформления.Использование = Истина;
ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("Печать", "Печать"); ЭлементОформления.Область.Добавить("Печать", "Печать", ТипОбластиОформления.Поле); ЭлементОформления.Оформление.ГоризонтальноеПоложение.Значение = ГоризонтальноеПоложение.Центр; ЭлементОформления.Оформление.Формат.Значение = «БЛ=Нет; БИ=Напечатан»; ЭлементОформления.Оформление.ГоризонтальноеПоложение.Использование = Истина; ЭлементОформления.Использование = Истина;
ТПТЧ = КакаяТоТЗсДанными; ЭлементыФормы.ТПТЧ.СоздатьКолонки(); //Пропишем отображение Итога, ПРЕДВАРИТЕЛЬНО - ПОСТАВИВ ГАЛОЧКУ ОТОБРАЖЕНИЯ ПОДВАЛА Для Каждого Кол из ЭлементыФормы.ТПТЧ.Колонки Цикл Попытка Кол.ОтображатьИтогиВПодвале = Истина; Кол.ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложение.Право; Исключение КонецПопытки; КонецЦикла;
//Пример изменения цвета текста при выводе данных в табличный документ Таб.ВывестиСекцию("Контрагент"); // Изменим Текст ячейки, имя которой заранее задали как "ТекстОСостоянии" Таб.Область("ТекстОСостоянии").Текст = "Хорошо "; // В зависимости от условия изменим Цвет Текста Если Раз<0 Тогда Таб.Область(Таб.ВысотаТаблицы(),9,Таб.ВысотаТаблицы(),9).ЦветТекста(255,0,0); ИначеЕсли Раз>0 Тогда Таб.Область(Таб.ВысотаТаблицы(),9,Таб.ВысотаТаблицы(),9).ЦветТекста(0,0,255); КонецЕсли;
Таб = СоздатьОбъект("Таблица"); Таб.Открыть("tabldoc.mxl"); ВыбОбласть = Таб.Область("R8C4"); ВыбОбласть.Шрифт("Arial"); ВыбОбласть.РазмерШрифта(10); ВыбОбласть.Подчеркнутый(1); ВыбОбласть.ГоризонтальноеПоложение(3); ВыбОбласть.Контроль(4); ВыбОбласть.ЦветФона(34, 126, 211); // Фон ВыбОбласть.ЦветРамки(34, 126, 211); // Рамка ВыбОбласть. ЦветТекста>(34, 126, 211); // Текст
//ТПОтчета - Табличное поле с формы (Таблица значений) с данными ПострПечать = Новый ПостроительОтчета; ПострПечать.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТПОтчета); ПострПечать.МакетОформления = ПолучитьМакетОформления(СтандартноеОформление.Интерфейс); ПострПечать.Выполнить(); Для каждого Колонка Из ПострПечать.ВыбранныеПоля Цикл Колонка.Представление = ТПОтчета.Колонки[Колонка.Имя].Заголовок; КонецЦикла; ПострПечать.Вывести();
//Процедура формирует и выводит отчет по переданной таблице значений // Параметры : // ТЗ - ТаблицаЗначений Процедура УниверсальныйОтчетПоТЗ(ТЗ) Табл=Новый ТабличныйДокумент; Макет = ЭтотОбъект.ПолучитьМакет("Макет"); ОбластьШапкаОсновной=Макет.ПолучитьОбласть("Шапка|Основной"); ОбластьСтрокаОсновной=Макет.ПолучитьОбласть("Строка|Основной"); ОбластьИтогОсновной=Макет.ПолучитьОбласть("Итог|Основной"); ОбластьШапкаДОП=Макет.ПолучитьОбласть("Шапка|Показатели"); ОбластьСтрокаДОП=Макет.ПолучитьОбласть("Строка|Показатели"); ОбластьИтогДОП=Макет.ПолучитьОбласть("Итог|Показатели"); Табл.Вывести(ОбластьШапкаОсновной); Для Каждого Колонка из Тз.Колонки ЦИКЛ ОбластьШапкаДОП.Параметры.ИмяПоказателя=Колонка.Имя; Табл.Присоединить(ОбластьШапкаДОП); КонецЦикла; счетчик=0; Для каждого стр из Тз Цикл счетчик=счетчик+1; ОбластьСтрокаОсновной.Параметры.счетчик=счетчик; Табл.Вывести(ОбластьСтрокаОсновной); Для Каждого Колонка из Тз.Колонки ЦИКЛ ОбластьСтрокаДОП.Параметры.ЗначениеКолонки=стр[Колонка.Имя]; Табл.Присоединить(ОбластьСтрокаДОП); КонецЦикла; КонецЦикла; Табл.Вывести(ОбластьИтогОсновной); Для Каждого Колонка из Тз.Колонки ЦИКЛ ОбластьИтогДОП.Параметры.Итог=Тз.Итог(Колонка.Имя); Табл.Присоединить(ОбластьИтогДОП); КонецЦикла; Табл.Показать(); КонецПроцедуры
//Вывести таблицу значений Процедура ПечатьТЗвТаб(ТЗ, Заголовок = "",КолонкиПоНазваниям = 0) Экспорт Перем ТТЗ; ТЗ.Выгрузить(ТТЗ); МаксШирина = 50; // максимальная ширина колонки СпШирина = СоздатьОбъект("СписокЗначений"); // список ширин колонок по таблице Для сч = 1 по ТТЗ.КоличествоКолонок() Цикл Если КолонкиПоНазваниям = 0 Тогда ИмяРек = ТТЗ.ПолучитьПараметрыКолонки(сч); Иначе ИмяРек = ""; ТТЗ.ПолучитьПараметрыКолонки(сч,,,,ИмяРек,); КонецЕсли; СпШирина.ДобавитьЗначение(СтрДлина(ИмяРек)*1.2); // с поправкой на размер шрифта КонецЦикла; // просто печать таблицы - вывод всех строк и колонок // числовые значения - по правому краю. Автоподбор ширины - в пределах МаксШирина Таб=СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("ПечатьТЗ"); Если СокрЛП(Заголовок) <> "" Тогда Таб.ВывестиСекцию("Шапка"); КонецЕсли; // заголовки таблицы Таб.ВывестиСекцию("Строка|Общая"); Для сч=1 по ТТЗ.КоличествоКолонок() Цикл Если КолонкиПоНазваниям = 0 Тогда ИмяРек = ТТЗ.ПолучитьПараметрыКолонки(сч); Иначе ИмяРек = ""; Ном = ""; ТТЗ.ПолучитьПараметрыКолонки(сч,,,,ИмяРек,); КонецЕсли; Таб.ПрисоединитьСекцию("Строка|Столбец"); КонецЦикла; ВысотаШапки = Таб.ВысотаТаблицы(); // данные таблицы по строкам ТТЗ.ВыбратьСтроки(); Пока ТТЗ.ПолучитьСтроку()=1 Цикл Ном = ТТЗ.НомерСтроки; Таб.ВывестиСекцию("Строка|Общая"); Выс = Таб.ВысотаТаблицы(); Для сч=1 по ТТЗ.КоличествоКолонок() Цикл ИмяРек=ТТЗ.ПолучитьЗначение(Ном,сч); Таб.ПрисоединитьСекцию("Строка|Столбец"); Если ТипЗначения(ИмяРек) = 1 Тогда Обл = Таб.Область("R"+Выс+"C"+(Сч+1)); // ячейка в которую поместили данные Обл.ГоризонтальноеПоложение(2); // числа - вправо КонецЕсли; НачШирина = СпШирина.ПолучитьЗначение(Сч); Ширина = СтрДлина(ИмяРек); СпШирина.УстановитьЗначение(Сч,Макс(НачШирина,Ширина)); КонецЦикла; КонецЦикла; Для сч = 1 по СпШирина.РазмерСписка() Цикл Обл = Таб.Область("R"+ВысотаШапки+"C"+(Сч+1)); // форматируем ширину таблицы Ширина = Мин(МаксШирина,2+СпШирина.ПолучитьЗначение(Сч)); Обл.ШиринаСтолбца(Ширина); // форматируем заголовок Обл.Полужирный(1); КонецЦикла; Таб.Показать(Заголовок); Таб.ТолькоПросмотр(1); КонецПроцедуры
Процедура глВывестиТаблицуЗначений(ТаблицаЗначений, Заголовок = "") Экспорт Перем Таб, ИИ, ЖЖ, НазваниеКолонки, ТипКолонки, Ширина, Значение, Сообщение; Таб = СоздатьОбъект("Таблица"); Если ТипЗначенияСтр(ТаблицаЗначений) <> "ТаблицаЗначений" Тогда Сообщение = "В процедуру ""глВывестиТаблицуЗначений()"" передана переменная не типа ""ТаблицаЗначений"", "+ "а типа """+СокрЛП(ТипЗначенияСтр(ТаблицаЗначений))+""""; Таб.Область(1, 1, 1, 1).Текст = Сообщение; Таб.Область(1, 1, 1, 1).ШиринаСтолбца(СтрДлина(Сообщение)); Таб.ТолькоПросмотр(1); Таб.Показать("Не таблица значений: "+Заголовок); Возврат; КонецЕсли; Для ЖЖ = 1 по ТаблицаЗначений.КоличествоКолонок() цикл ТаблицаЗначений.ПолучитьПараметрыКолонки(ЖЖ,,,, НазваниеКолонки); Таб.Область(1, ЖЖ, 1, ЖЖ).Текст = СокрЛП(НазваниеКолонки); Таб.Область(1, ЖЖ, 1, ЖЖ).РамкаОбвести(5, 5, 5, 5); Таб.Область(1, ЖЖ, 1, ЖЖ).ВертикальноеПоложение(3); Таб.Область(1, ЖЖ, 1, ЖЖ).ГоризонтальноеПоложение(3); Таб.Область(1, ЖЖ, 1, ЖЖ).РазмерШрифта(7); Таб.Область(1, ЖЖ, 1, ЖЖ).Полужирный(1); Ширина = Таб.Область(1, ЖЖ, 1, ЖЖ).ШиринаСтолбца(); Ширина = Макс(Ширина, СтрДлина(СокрЛП(НазваниеКолонки))); Таб.Область(1, ЖЖ, 1, ЖЖ).ШиринаСтолбца(Ширина); КонецЦикла; Для ИИ = 1 по ТаблицаЗначений.КоличествоСтрок() цикл Для ЖЖ = 1 по ТаблицаЗначений.КоличествоКолонок() цикл Значение = ТаблицаЗначений.ПолучитьЗначение(ИИ, ЖЖ); Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).Текст = Значение; Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).Расшифровка(Значение, 0); Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).РамкаОбвести(3, 0, 3, 0); Ширина = Таб.Область(1, ЖЖ, 1, ЖЖ).ШиринаСтолбца(); Ширина = Макс(Ширина, СтрДлина(СокрЛП(Строка(Значение)))); Таб.Область(1, ЖЖ, 1, ЖЖ).ШиринаСтолбца(Ширина); ТаблицаЗначений.ПолучитьПараметрыКолонки(ЖЖ, ТипКолонки); ; Если ТипКолонки = "Число" тогда Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).ГоризонтальноеПоложение(2); КонецЕсли; Если ИИ = ТаблицаЗначений.ТекущаяСтрока() тогда Таб.Область(ИИ+1, ЖЖ, ИИ+1, ЖЖ).ЦветФона(255, 0, 0); КонецЕсли; КонецЦикла; КонецЦикла; Таб.ТолькоПросмотр(1); Таб.Показать("Таблица значений: "+Заголовок); КонецПроцедуры