Функции сохранения таблицы значений в файл и чтения из файла В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:
П орядок программных действий при выгрузке в файл выглядит так:
Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки); Конвертируем таблицу значений в табличный документ; Сохраняем табличный документ в MXL.
При загрузке таблицы порядок действий такой:
Читаем из файла табличный документ; Конвертируем табличный документ в таблицу значений; Используем эту таблицу значений в своих целях (загружаем в табличную часть).
Соответственно файл для хранения данных таблицы имеет расширение *.mxl.
Основные функции для реализации поставленной задачи следующие:
ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.
Код 1C v 8.3
Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт
Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда
НачалоСтрока = 1 ;
НачалоСтолбец = 1 ;
КонецЕсли ;
Если НачалоСтрока = Неопределено Тогда
НачалоСтрока = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтрока < ТабДок. ВысотаТаблицы
Цикл
НачалоСтрока = НачалоСтрока + 1 ;
КонецЦикла ;
ИначеЕсли НачалоСтолбец = Неопределено Тогда
НачалоСтолбец = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтолбец < ТабДок. ШиринаТаблицы
Цикл
НачалоСтолбец = НачалоСтолбец + 1 ;
КонецЦикла ;
КонецЕсли ;
КонецСтрока = ? ( КонецСтрока = Неопределено , ТабДок. ВысотаТаблицы, КонецСтрока) ;
КонецСтолбец = ? ( КонецСтолбец = Неопределено , ТабДок. ШиринаТаблицы, КонецСтолбец) ;
ЭтоТаблица = ( ТипЗнч( СтруктураКолонок) = Тип( "ТаблицаЗначений" ) ) ;
ТабЗначений = ПолучитьТаблицуВывода( СтруктураКолонок) ;
Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл
СтрокаТЗ = ТабЗначений. Добавить( ) ;
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из СтруктураКолонок Цикл
НаименованиеКолонки = ? ( ЭтоТаблица, Колонка. Наименование, Колонка. Ключ) ;
пИндексКолонки = ? ( ЭтоТаблица, Колонка. СтолбецОтчёт, ИндексКолонки) ;
Если ТабДок. Область( ИндексСтроки, пИндексКолонки) . СодержитЗначение Тогда
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Значение;
Иначе
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Текст;
КонецЕсли ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
КонецЦикла ;
Возврат ТабЗначений;
КонецФункции ;
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли ;
НачалоСтрока = ? ( НачалоСтрока = Неопределено , 1 , НачалоСтрока) ;
НачалоСтолбец = ? ( НачалоСтолбец = Неопределено , 1 , НачалоСтолбец) ;
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Текст = ? ( ПустаяСтрока( Колонка. Заголовок) , Колонка. Имя, Колонка. Заголовок) ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЕсли ;
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . СодержитЗначение = Истина ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . ТипЗначения = Новый ОписаниеТипов( Колонка. ТипЗначения) ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Значение = Элемент[Колонка. Имя];
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЦикла ;
Возврат ТабДок;
КонецФункции ;
Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок. Прочитать( ИмяФайла) ;
Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл1 = ТабДок. Область( 1 , ИндексКолонки) ;
Обл2 = ТабДок. Область( 2 , ИндексКолонки) ;
ИмяКолонки = СокрЛП( Обл1 . Текст) ;
ИмяКолонки = ? ( Найти( ИмяКолонки, " " ) > 0 , СтрЗаменить( ТРег( ИмяКолонки) , " " , "" ) , ИмяКолонки) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл2 = ТабДок. Область( 1 , ИндексКолонки) ;
ИмяКолонки = "К" + Формат( ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0" ) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
КонецЕсли ;
Таблица = ПреобразоватьТДвТЗ( ТабДок, СтруктураКолонок, ? ( ЕстьЗаголовок, 2 , 1 ) , 1 ) ;
Возврат Таблица;
КонецФункции ;
Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт
ТабДок = ПреобразоватьТЗвТД( ТабЗначений, Неопределено , 1 , 1 , ЕстьЗаголовок) ;
ТабДок. Записать( ИмяФайла, ТипФайлаТабличногоДокумента. MXL) ;
КонецПроцедуры ;
Еще небольшой набор функций для вывода таблицы значений в табличный документ. После формирования табличного документа, - сохраняем его в файл mxl.
Табличный документ можно сохранить a файлы следующих типов:
ANSITXT - Текстовый документ DOCX - документ MS Word HTML HTML3 HTML4 HTML5 MXL MXL7 ODS - Файл Open Office PDF - файл Acrobat Readr TXT - Текстовый документ XLS - файл Excel XLS95 - файл Excel95 XLS97 - файл Excel97 XLSX - файл Excel2010
Код 1C v 8.3
Функция ЗагрузитьТЗизФайла(ИмяФайла)
Путь = КаталогВременныхФайлов( ) + ИмяФайла;
Текст = Новый ЧтениеТекста( Путь, КодировкаТекста. UTF8) ;
стрТЗ = Текст. Прочитать( ) ;
Текст. Закрыть( ) ;
ТЗ = ЗначениеИзСтрокиВнутр( стрТЗ) ;
Возврат ТЗ;
КонецФункции
Функция ЗаписьТЗ2ТабДок(записьТЗ,НомерСтроки,ТабличныйДокумент)
НомерКолонки = 1 ;
Символ160 = Символ( 160 ) ;
Для каждого полеТЗ из ЗаписьТЗ цикл
типПоляТЗ = ТипЗнч( полеТЗ) ;
если типПоляТЗ = Тип( "Число" ) тогда
полеТЗ= Строка( полеТЗ) ;
полеТЗ= СтрЗаменить( полеТЗ, Символ160 , "" ) ;
полеТЗ= СтрЗаменить( полеТЗ, "," , "." ) ;
иначеесли типПоляТЗ = Тип( "Строка" ) тогда
иначе
полеТЗ = строка( полеТЗ) ;
КонецЕсли ;
имяОбласти = "R" + номерСтроки + "C" + НомерКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = полеТЗ;
НомерКолонки = НомерКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент)
номерСтроки= 1 ;
номКолонки= 1 ;
ТабличныйДокумент = новый ТабличныйДокумент;
Для НомКол= 0 по ТаблицаЗначений. Колонки. Количество( ) - 1 Цикл
имяКолонки= ТаблицаЗначений. Колонки[НомКол]. Имя;
имяОбласти = "R" + номерСтроки + "C" + номКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = имяКолонки;
ЖирныйШрифт = ? ( ЖирныйШрифт = Неопределено , Новый Шрифт( Ячейка. Шрифт, , , Истина ) , ЖирныйШрифт) ;
Ячейка. Шрифт = ЖирныйШрифт;
номКолонки = номКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент)
НомСтр= 1 ;
Для каждого записьТЗ из ТаблицаЗначений Цикл
НомСтр = НомСтр + 1 ;
ЗаписьТЗ2 ТабДок( записьТЗ, НомСтр, ТабличныйДокумент) ;
КонецЦикла ;
КонецФункции
Функция ТаблицаЗначений2Mxl(ТаблицаЗначений,ФайлMxl)
ТабличныйДокумент = новый ТабличныйДокумент;
НаимКолонок2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
Таблица2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
ТабличныйДокумент. Записать( ФайлMxl, ТипФайлаТабличногоДокумента. MXL) ;
ТабличныйДокумент. Показать( ФайлMxl, ФайлMxl) ;
Возврат 0 ;
КонецФункции
Функция Тест_ВыгрузитьТЗвMxl() ;
файл_мТЗИсходныеДанные = "мТЗИсходныеДанные.dat" ;
ТЗ = ЗагрузитьТЗизФайла( файл_мТЗИсходныеДанные) ;
ФайлMxl = КаталогВременныхФайлов( ) + СтрЗаменить( файл_мТЗИсходныеДанные, ".dat" , ".mxl" ) ;
ТаблицаЗначений2 Mxl( ТЗ, ФайлMxl) ;
КонецФункции
Тест_ВыгрузитьТЗвMxl( ) ;
Пример выгруженной таблицы значений в файл:
Категория:
Работа с Таблицей Значений Синтаксический анализ JSON - выражения средствами 1С 7.7 Код 1C v 7.x
Перем Л_Лев_Фиг_Скобка, Л_Прав_Фиг_Скобка, Л_Лев_Кв_Скобка, Л_Прав_Кв_Скобка, Л_Кавычка, Л_Экран, Л_Двоеточие, Л_Запятая, Л_Число, Л_Строка, Л_Константа, Л_Финиш;
Перем Цифры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" Тогда
ДописатьСимвол( ЧислоСтр) ;
Если Найти( "+-" , ТекущиеСимволы( 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 ;
ДобавитьПару( ТЗ, _Ключ, _Значение) ;
Пока ТекЛексема = Л_Запятая Цикл
СледующаяЛексема( ) ;
_Значение = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
Если _Значение = 0 Тогда
Возврат 0 ;
КонецЕсли ;
_Ключ = _Ключ + 1 ;
ДобавитьПару( ТЗ, _Ключ, _Значение) ;
КонецЦикла ;
Если ТекЛексема = Л_Прав_Кв_Скобка Тогда
СледующаяЛексема( ) ;
Возврат ТЗ;
КонецЕсли ;
Возврат 0 ;
КонецФункции
Функция ПрочитатьОбъект_ТЗ()
Перем Рез;
НомЛексемы = 0 ;
СледующаяЛексема( ) ;
Если ТекЛексема = Л_Лев_Фиг_Скобка Тогда
Рез = ПолучитьОбъект_ТЗ( ) ;
ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда
Рез = ПолучитьМассив_ТЗ( ) ;
Иначе
Рез = ПолучитьПроизвольноеЗначение_ТЗ( ) ;
КонецЕсли ;
Если ( Рез = 0 ) Или ( ТекЛексема < > Л_Финиш) Тогда
ОшибкаЛексемы( ) ;
Возврат 0 ;
КонецЕсли ;
Возврат Рез;
КонецФункции
Функция СгенерироватьТЗ(НачАнализируемаяСтрока)
Перем НачальныйСимвол, Рез;
АнализируемаяСтрока = НачАнализируемаяСтрока;
СтекЛексем = СоздатьОбъект( "ТаблицаЗначений" ) ;
СтекЛексем. НоваяКолонка( "Лексема" , "Строка" ) ;
СтекЛексем. НоваяКолонка( "Значение" , "Строка" ) ;
ФлагОшибки = 0 ;
НомерСимвола = 1 ;
Пока НомерСимвола < = СтрДлина( АнализируемаяСтрока) Цикл
НачальныйСимвол = ТекущиеСимволы( 1 ) ;
Если Найти( " " + Симв( 9 ) , НачальныйСимвол) > 0 Тогда
НомерСимвола = НомерСимвола + 1 ;
ИначеЕсли НачальныйСимвол = Л_Кавычка Тогда
ЧитатьСтроку( ) ;
ИначеЕсли Найти( ОдносимвольныеЛексемы, НачальныйСимвол) > 0 Тогда
ДобавитьЛексему( НачальныйСимвол, "" , 1 ) ;
ИначеЕсли Найти( ПервыеСимволыКонстант, НачальныйСимвол) > 0 Тогда
Если ЧитатьКонстанту( НачальныйСимвол) = 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 + Инд;
Если "" + ИндЧис < > Инд Тогда
Возврат 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
}
],
"Структура":
{
"Имя": "Александр",
"Отчество": "Владимирович",
"Фамилия": "Переверзев"
},
"Соответствие":
{
"ДопустимоеИмяСвойства": true,
"Недопустимое Имя Свойства": false
},
"Ссылка":
{
"Ссылка": "00000000-0000-0000-0000-000000000000",
"Представление": "Неизвестная ссылка"
},
"COMSafeArray": [
0,
1,
2,
3,
4,
5
]
}
Категория:
HTML, JS, VML Как при печати выводить шапку на каждой странице (ПовторятьПриПечатиСтроки)? Необходимо при печати, если происходит переход на следующую страницу таблицы, выводить шапку таблицы вверху на новой странице.
для печати шапки на каждой странице в языке программирования есть специальный метод - ПовторятьПриПечатиСтроки
Примеры его использования:
Код 1C v 8.х ТабДок. ПовторятьПриПечатиСтроки = ТабДок. Область( 1 , , 2 , ) ;
ЭлементыФормы. Поле_ТД. ПовторятьПриПечатиСтроки = Макет. Область( "Шапка_Спецификации" ) ;
ЭлементыФормы. Поле_ТД. ПовторятьПриПечатиСтроки = Макет. Область( "R777:R778" ) ;
Полный код вывода табличного документа с повторением шапки на каждой странице:
Код 1C v 8.х Функция ПечатьПриказаТ11а()
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент. ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПечатнаяФорма_МатериальнаяПомощь_Т11а" ;
ТабДокумент. ПовторятьПриПечатиСтроки = ТабДокумент. Область( "R21:R22" ) ;
Макет = ПолучитьМакет( "Т11а" ) ;
ОбластьМакетаШапкаДокумента = Макет. ПолучитьОбласть( "Шапка" ) ;
ОбластьПовторятьПриПечати = Макет. ПолучитьОбласть( "ПовторятьПриПечати" ) ;
ОбластьМакетаСтрока = Макет. ПолучитьОбласть( "Строка" ) ;
ОбластьМакетаПодвал = Макет. ПолучитьОбласть( "Подвал" ) ;
ВыборкаДляШапкиДокумента = СформироватьЗапросДляШапкиДокумента( ) . Выбрать( ) ;
ВыборкаРаботники = СформироватьЗапросДляТабличнойЧасти( 1 ) . Выбрать( ) ;
Если ВыборкаРаботники. Количество( ) = 0 Тогда
ВыборкаРаботники = СформироватьЗапросДляТабличнойЧасти( 2 ) . Выбрать( ) ;
КонецЕсли ;
ВыводимыеОбласти = Новый Массив( ) ;
ВыводимыеОбласти. Добавить( ОбластьМакетаСтрока) ;
Пока ВыборкаДляШапкиДокумента. Следующий( ) Цикл
ОбластьМакетаШапкаДокумента. Параметры. Заполнить( ВыборкаДляШапкиДокумента) ;
ОбластьМакетаШапкаДокумента. Параметры. НазваниеОрганизации = СокрЛП( ОбластьМакетаШапкаДокумента. Параметры. НазваниеОрганизации) ;
КонецЦикла ;
ТабДокумент. Вывести( ОбластьМакетаШапкаДокумента) ;
ном= 0 ;
Пока ВыборкаРаботники. Следующий( ) Цикл
ОбластьМакетаСтрока. Параметры. Заполнить( ВыборкаРаботники) ;
ном= ном+ 1 ;
ОбластьМакетаСтрока. Параметры. ПодразделениеОрганизации = ВыборкаРаботники. ПодразделениеОрганизации. ПолноеНаименование( ) ;
ОбластьМакетаСтрока. Параметры. ном= ном;
ТабДокумент. Вывести( ОбластьМакетаСтрока) ;
КонецЦикла ;
ОбластьМакетаПодвал. Параметры. Заполнить( ВыборкаДляШапкиДокумента) ;
ТабДокумент. Вывести( ОбластьМакетаПодвал) ;
Если ТабДокумент. ВысотаТаблицы > 0 Тогда
Возврат УниверсальныеМеханизмы. НапечататьДокумент( ТабДокумент, 1 , Ложь , ОбщегоНазначения. СформироватьЗаголовокДокумента( СсылкаНаОбъект, "Приказ о поощрении работника " ) ) ;
КонецЕсли ;
КонецФункции
Категория:
Табличный документ Как программно изменить текст, цвет, фон ячейки или области табличного документа? Ниже приведено несколько полезных шаблонов кода по работе с табличным документом:
Код 1C v 8.х
ПолеТабДок = ЭлементыФормы. тдПолеТабличногоДокумента;
ПолеТабДок. Область( "R1C2" ) . Текст = спрНоменклатура. Наименование;
ПолеТабДок. Область( "R2C2" ) . Текст = "Это Строка" ;
Код 1C v 8.х
Для а = 11 по ТабличныйДокумент. ВысотаТаблицы Цикл
текстЯчейка = ТабличныйДокумент. Область( "R" + а+ "C2" ) . Текст;
Если Строка( ТабличныйДокумент. Область( "R" + а+ "C2" ) . ЦветФона) = "стиль: Фон кнопки" Тогда
ТабличныйДокумент. Область( "R" + а+ "C7" ) . Текст= "" ;
ТабличныйДокумент. Область( "R" + а+ "C11" ) . Текст= "" ;
ТабличныйДокумент. Область( "R" + а+ "C8" ) . Текст= "" ;
ТабличныйДокумент. Область( "R" + а+ "C9" ) . Текст= "" ;
ТабличныйДокумент. Область( "R" + а+ "C10" ) . Текст= "" ;
КонецЕсли ;
КонецЦикла ;
Код 1C v 8.х
ТабДок = ЭлементыФормы. ПолеТабличногоДокумента;
ТабДок. Очистить( ) ;
Макет = ПолучитьМакет( "Макет" ) ;
ОбластьСтрокаТаб = Макет. ПолучитьОбласть( "СтрокаТаб" ) ;
ОбластьСтрокаТаб. Параметры. НашПараметр = 1 ;
ОбластьОформления = ТабДок. Вывести( ОбластьСтрокаТаб) ;
ТабДок. Область( ОбластьОформления. Верх, ОбластьОформления. Лево, ОбластьОформления. Низ, ОбластьОформления. Лево) . ЦветФона = WebЦвета. Красный;
Код 1C v 8.х //Пример изменения цвета текста при выводе данных в табличный документ
Таб.ВывестиСекцию("Контрагент");
// Изменим Текст ячейки, имя которой заранее задали как "ТекстОСостоянии"
Таб.Область("ТекстОСостоянии").Текст = "Хорошо ";
// В зависимости от условия изменим Цвет Текста
Если Раз<0 Тогда
Таб.Область(Таб.ВысотаТаблицы(),9,Таб.ВысотаТаблицы(),9).ЦветТекста(255,0,0);
ИначеЕсли Раз>0 Тогда
Таб.Область(Таб.ВысотаТаблицы(),9,Таб.ВысотаТаблицы(),9).ЦветТекста(0,0,255);
КонецЕсли;
Для того, чтобы появилась возможность использовать свойство "Значение", необходимо явно присвоить свойству ячейки "СодержитЗначение" значение Истина или установить флажок "Содержит значение" в палитре свойств.
Для ячейки, у которой установлен признак "СодержитЗначение", можно задать тип значения, размещаемого в ячейке.
Следующий фрагмент демонстрирует, как можно управлять этими свойствами из встроенного языка://задаем нужный тип с помощью объекта "ОписаниеТипов"
Код 1C v 8.х МассивБулево = Новый Массив;
МассивБулево. Добавить( Тип( "Булево" ) ) ;
ОписаниеТиповБулево = Новый ОписаниеТипов( МассивБулево) ;
ПолеТабДок = ЭлементыФормы. тдПолеТабличногоДокумента;
ПолеТабДок. Область( "R3C3" ) . СодержитЗначение = Истина ;
ПолеТабДок. Область( "R3C3" ) . ТипЗначения = ОписаниеТиповБулево;
ПолеТабДок. Область( "R3C3" ) . Значение = СпрНоменклатура. Услуга;
Для ячейки табличного документа можно задавать формат вывода данных. Для этого используется свойство "Формат", которое содержит форматную строку. Приемы работы с форматной строкой полностью совпадают с функцией Формат()
Код 1C v 8.х ПолеТабДок = ЭлементыФормы. тдПолеТабличногоДокумента;
ПолеТабДок. Область( "R4C3" ) . ТипЗначения = ОписаниеТиповДата;
ПолеТабДок. Область( "R4C3" ) . Значение = ТекущаяДата( ) ;
ПолеТабДок. Область( "R4C3" ) . Формат = "ДФ=[ггММдд-ЧЧмм]-" ;
Элемент управления в табличном документе
Для ячейки, у которой установлен признак "СодержитЗначение", можно также задать элемент управления, который будет использоваться для редактирования этого значения.
Элемент управления можно назначить через палитру свойств или из встроенного языка с помощью метода "УстановитьЭлементУправления()". Чтобы проверить в программе, установлен ли элемент управления для конкретной ячейки, можно использовать свойство "ЭлементУправления", которое возвращает элемент управления, назначенный для ячейки.
Элементы управления, встроенные в ячейку, отображаются только при входе в режим редактирования значения. На приведенном ниже рисунке редактируемая ячейка обведена овалом и в ней отображается флажок:
Ниже показан пример установки элемента управления типа "Флажок" из встроенного языка://задаем нужный тип с помощью объекта "ОписаниеТипов"
Код 1C v 8.х МассивБулево = Новый Массив;
МассивБулево. Добавить( Тип( "Булево" ) ) ;
ОписаниеТиповБулево = Новый ОписаниеТипов( МассивБулево) ;
. . .
ПолеТабДок = ЭлементыФормы. тдПолеТабличногоДокумента;
ПолеТабДок. Область( "R5C3" ) . СодержитЗначение = Истина ;
ПолеТабДок. Область( "R5C3" ) . ТипЗначения = ОписаниеТиповБулево;
ПолеТабДок. Область( "R5C3" ) . Значение = СпрНоменклатура. Услуга;
ПолеТабДок. Область( "R5C3" ) . УстановитьЭлементУправления( Тип( "Флажок" ) ) ;
Для элементов управления, расположенных в табличном документе, расширяется набор свойств, методов и событий:
Разберем самые важные свойства и методы:
Свойство "ВстроенВЯчейку" имеет тип "булево" и говорит о том, что элемент управления встраивается в ячейку или просто привязывается к ней, о чем было рассказано выше.
Свойство "Видимость" позволяет показать или скрыть элемент управления.
Свойство "Значение" предоставляет доступ к значению, которое редактируется в элементе управления. Оно используется только для элементов управления, поддерживающих связь с данными.
Метод "Расположить" позволяет разместить элемент управления в конкретной области ячеек табличного документа. Именно этот метод был использован в вышеприведенном примере.
Код 1C v 8.х ПолеТабДок = ЭлементыФормы. тдПолеТабличногоДокумента;
ПолеТабДок. Область( "R4C3" ) . Защита = Истина ;
Категория:
Табличный документ Как в универсальном отчете отключить вывод итогов по некоторым полям? В универсальном отчете понадобилось отключить вывод итого по некоторым полям, но в универсальном отчете, созданном через построитель, к сожалению это невозможно
Многие скажут - что давно пора использовать СКД и там все есть! - согласен на все 100% но есть клиенты у которых стоит программа УТ с 2012 года, их все устраивает и ничего не хотят менять, кроме отчетов. Вот один мой знакомы попросил отключить итоги в универсальном отчете - сделал это добавив следующий код в процедуру формирования отчета:
Код 1C v 8.х
Процедура СформироватьОтчет(ТабличныйДокумент) Экспорт
Если НЕ ЗначениеЗаполнено( УниверсальныйОтчет. ДатаКон) Тогда
УниверсальныйОтчет. ДатаКон = ТекущаяДата( ) ;
КонецЕсли ;
УниверсальныйОтчет. ПостроительОтчета. Параметры. Вставить( "ДатаОтчета" , КонецДня( УниверсальныйОтчет. ДатаКон) ) ;
УниверсальныйОтчет. ПостроительОтчета. Параметры. Вставить( "ДатаНеделяНазад" , УниверсальныйОтчет. ДатаКон- ( 86400 * 7 ) ) ;
УниверсальныйОтчет. СформироватьОтчет( ТабличныйДокумент) ;
Для а = 11 по ТабличныйДокумент. ВысотаТаблицы Цикл
текстЯчейка = ТабличныйДокумент. Область( "R" + а+ "C2" ) . Текст;
Если Строка( ТабличныйДокумент. Область( "R" + а+ "C2" ) . ЦветФона) = "стиль: Фон кнопки" Тогда
ТабличныйДокумент. Область( "R" + а+ "C7" ) . Текст= "" ;
ТабличныйДокумент. Область( "R" + а+ "C11" ) . Текст= "" ;
ТабличныйДокумент. Область( "R" + а+ "C8" ) . Текст= "" ;
ТабличныйДокумент. Область( "R" + а+ "C9" ) . Текст= "" ;
ТабличныйДокумент. Область( "R" + а+ "C10" ) . Текст= "" ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Для наглядности покажу на примере:
в выделенных полях добавленным кодом были стерты итоги
Категория:
Прочие вопросы Вертикальная автофиксация для СКД В СКД очень не хватает возможности автофиксации строк. Обусловлено это невозможностью однозначно определить их количество в общем случае. Однако в большинстве случаев это можно сделать
Обращаю ваше внимание, что приведенная процедура работает не всегда корректно. Но в большинстве случаев она сделает свое дело.
Код 1C v 8.х
Процедура ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок(Таб, ПроцессорКомпоновкиДанных, ЭлементыРасшировки,
Знач МассивИгнорируемыхПолей = Неопределено, РазрешитьПрерывание = Истина) Экспорт
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( Таб) ;
ПроцессорВывода. НачатьВывод( ) ;
ФиксацияВыполнена = Ложь ;
Если МассивИгнорируемыхПолей = Неопределено Тогда
МассивИгнорируемыхПолей = Новый Массив;
КонецЕсли ;
Пока Истина Цикл
ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных. Следующий( ) ;
Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
Прервать ;
КонецЕсли ;
Если Не ФиксацияВыполнена Тогда
Для Каждого ЗначениеПараметра Из ЭлементРезультатаКомпоновкиДанных. ЗначенияПараметров Цикл
Если ТипЗнч( ЗначениеПараметра. Значение) = Тип( "ИдентификаторРасшифровкиКомпоновкиДанных" ) Тогда
ЗначенияПолейРасшифровки = ЭлементыРасшировки[ЗначениеПараметра. Значение]. ПолучитьПоля( ) ;
Для Каждого ЗначениеПоляРасшифровки Из ЗначенияПолейРасшифровки Цикл
Если МассивИгнорируемыхПолей. Найти( ЗначениеПоляРасшифровки. Поле) = Неопределено Тогда
Таб. ФиксацияСверху = Таб. ВысотаТаблицы;
ФиксацияВыполнена = Истина ;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Если ФиксацияВыполнена Тогда
Прервать ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
ПроцессорВывода. ВывестиЭлемент( ЭлементРезультатаКомпоновкиДанных) ;
Если РазрешитьПрерывание Тогда
ОбработкаПрерыванияПользователя( ) ;
КонецЕсли ;
КонецЦикла ;
ПроцессорВывода. ЗакончитьВывод( ) ;
КонецПроцедуры
tormozit Категория:
Схема Компоновки Данных Как результат СКД в виде Табличного Документа разобрать и вывести в Дерево Значений Процедура получает из СКД результат в виде Табличного документа, парсит его, создает в Дереве на форме колонки и заполняет дерево данными результата СКД
Смысл в том, что СКД не может вывести результат в объект на форму, если он Таблица - выдает ошибку "Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений".
Поэтому я выгружаю СКД в ТабличныйДокумент и вытаскиваю данные уже из него, далее строю и заполняю Дерево на форме
Код 1C v 8.х Процедура ЗаполнитьДерево()
ДеревоЗначений. Строки. Очистить( ) ;
КолРазмеров = 0 ;
СхемаКомпоновкиДанных = ПолучитьМакет( "Схема" ) ;
Настройки = СхемаКомпоновкиДанных. НастройкиПоУмолчанию;
Для Каждого ЭлементОтбора Из ПостроительОтчета. Отбор Цикл
Если Не ЭлементОтбора. Использование Тогда
Продолжить;
КонецЕсли ;
ВидСравненияВОтборе = мСоответствиеВидовСравнения. Получить( ЭлементОтбора. ВидСравнения) ;
Если ВидСравненияВОтборе = Неопределено Тогда
Продолжить;
КонецЕсли ;
Если Лев( ЭлементОтбора. ПутьКДанным, 8 ) = "Свойство" Тогда
ИмяПоля = "Номенклатура.[" + мСоответствиеНазначений[ЭлементОтбора. Представление]+ " (свойство)]" ;
ИначеЕсли Лев( ЭлементОтбора. ПутьКДанным, 9 ) = "Категория" Тогда
ИмяПоля = "Номенклатура.[" + мСоответствиеНазначений[ЭлементОтбора. Представление]+ " (категория)]" ;
Иначе
ИмяПоля = ЭлементОтбора. ПутьКДанным;
КонецЕсли ;
ПолеОтбора = Новый ПолеКомпоновкиДанных( ИмяПоля) ;
Отбор = Настройки. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
Отбор. ЛевоеЗначение = ПолеОтбора;
Отбор. Использование = Истина ;
Отбор. ВидСравнения = ВидСравненияВОтборе;
Отбор. ПравоеЗначение = ЭлементОтбора. Значение;
КонецЦикла ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета. Выполнить( СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки, , Тип( "ГенераторМакетаКомпоновкиДанных" ) ) ;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных. Инициализировать( МакетКомпоновки, , ДанныеРасшифровки) ;
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( ТабличныйДокумент) ;
ПроцессорВывода. Вывести( ПроцессорКомпоновкиДанных, Истина ) ;
КолДанных = 5 ;
СоздатьДерево( ТабличныйДокумент, КолДанных) ;
СтКол = Новый Структура;
СтКол. Вставить( "Ном" , 1 ) ;
СтКол. Вставить( "Дат1" , 2 ) ;
СтКол. Вставить( "Дат2" , 3 ) ;
СтКол. Вставить( "Прих" , 4 ) ;
СтКол. Вставить( "Реал" , 5 ) ;
СтКол. Вставить( "Возв" , 6 ) ;
СтКол. Вставить( "Остат" , 7 ) ;
СтКол. Вставить( "ВПути" , 8 ) ;
СтрНом = Неопределено ;
СтрДерева = Неопределено ;
Для i= 3 По ТабличныйДокумент. ВысотаТаблицы Цикл
ПерваяКолонка = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Ном) ;
Если ТипЗнч( ПерваяКолонка) = Тип( "СправочникСсылка.Номенклатура" ) Тогда
Если СтрНом Неопределено Тогда
СтрНом. Строки. Сортировать( "Продажи УБЫВ" ) ;
СтрНом. ОстатокМагазин = СтрНом. Строки. Итог( "ОстатокМагазин" ) ;
СтрНом. ОстатокСклад = СтрНом. Строки. Итог( "ОстатокСклад" ) ;
КонецЕсли ;
СтрНом = ДеревоЗначений. Строки. Добавить( ) ;
СтрДерева = СтрНом;
ИначеЕсли ТипЗнч( ПерваяКолонка) = Тип( "СправочникСсылка.Склады" ) Тогда
СтрДерева = СтрНом. Строки. Добавить( ) ;
Дат1 = Формат( ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Дат1 ) , "ДФ=dd.MM.yy" ) ;
Дат2 = Формат( ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Дат2 ) , "ДФ=dd.MM.yy" ) ;
СтрДерева. Период = "" + Дат1 + " - " + Дат2 ;
Иначе
Продолжить;
КонецЕсли ;
СтрДерева. Номенклатура = ПерваяКолонка;
СтрДерева. Остаток = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Остат, Истина ) ;
СтрДерева. Приход = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Прих, Истина ) ;
СтрДерева. Продажи = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Реал, Истина ) ;
СтрДерева. Возврат = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Возв, Истина ) ;
Если ЗначениеЗаполнено( СтрДерева. Родитель) Тогда
Если ПерваяКолонка. ТипСклада = Перечисления. ТипыСкладов. ТорговыйЗал Тогда СтрДерева. ОстатокМагазин = СтрДерева. Остаток;
Иначе СтрДерева. ОстатокСклад = СтрДерева. Остаток;
КонецЕсли ;
Попытка СтрДерева. ПроцентПродаж = СтрДерева. Продажи * 100 / СтрДерева. Родитель. Продажи;
Исключение СтрДерева. ПроцентПродаж = "-" ;
КонецПопытки ;
Иначе
СтрДерева. ПроцентПродаж = "100%" ;
КонецЕсли ;
Для j= 1 По КолРазмеров Цикл
СтрДерева["Ост" + j] = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, 3 + КолДанных * j + 4 , Истина ) ;
СтрДерева["Пут" + j] = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, 3 + КолДанных * j + 5 , Истина ) ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура СоздатьДерево(ТабличныйДокумент, КолДанных)
КЧ = Новый КвалификаторыЧисла( 10 , 0 ) ;
Массив = Новый Массив;
Массив. Добавить( Тип( "Число" ) ) ;
ОписаниеТиповЧ = Новый ОписаниеТипов( Массив, , , КЧ) ;
Ном = 3 + КолДанных + 1 ;
КолРазмеров = ( ТабличныйДокумент. ШиринаТаблицы - Ном- 1 ) / КолДанных + 1 ;
Для i= 1 По КолРазмеров Цикл
Размер = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, 1 , Ном, Истина , Ложь ) ;
Ном = Ном + КолДанных;
Попытка
ДеревоЗначений. Колонки. Добавить( "Ост" + i, ОписаниеТиповЧ, Размер, 5 ) ;
ДеревоЗначений. Колонки. Добавить( "Пут" + i, ОписаниеТиповЧ, "Путь" , 5 ) ;
ДеревоЗначений. Колонки. Добавить( "Пер" + i, ОписаниеТиповЧ, "Пер" , 5 ) ;
Исключение
КонецПопытки ;
КонецЦикла ;
ЭтаФорма. ЭлементыФормы. ДеревоЗначений. Значение = ДеревоЗначений;
ЭтаФорма. ЭлементыФормы. ДеревоЗначений. СоздатьКолонки( ) ;
i= 1 ; НомерРазмера= 1 ;
Для Каждого Кол Из ЭтаФорма. ЭлементыФормы. ДеревоЗначений. Колонки Цикл
Кол. ТолькоПросмотр = Истина ;
Если i = ( НомерРазмера + 8 + 1 ) Тогда
Кол. Положение = ПоложениеКолонки. НоваяКолонка;
ИначеЕсли i = ( НомерРазмера + 8 + 2 ) Тогда
Кол. Положение = ПоложениеКолонки. НаСледующейСтроке;
ИначеЕсли i = ( НомерРазмера + 8 + 3 ) Тогда
Кол. Положение = ПоложениеКолонки. ВТойЖеКолонке;
Кол. ТолькоПросмотр = Ложь ;
НомерРазмера = НомерРазмера + 3 ;
КонецЕсли ;
Если i= 1 Тогда
Кол. Ширина = 20 ;
Иначе
Если i= 2 Тогда Кол. Ширина = 11 ;
ИначеЕсли i9 Тогда Кол. Ширина = 7 ;
Иначе Кол. Ширина = 5 ;
КонецЕсли ;
Кол. ИзменениеРазмера = ИзменениеРазмераКолонки. НеИзменять;
КонецЕсли ;
i= i+ 1 ;
КонецЦикла ;
КонецПроцедуры
Автор:
Абазин Антон Категория:
Схема Компоновки Данных Вывод картинки в строках отчета на СКД В этом примере показан метод вывода в строку отчета картинки, вид которой завист от значения другого поля.
Ради примера, в отчет выведем справоник «Банки» - реквизит «Ссылка» и картинку возле этого реквизита. Вид картинки зависит от значения реквизита «ЭтоГруппа»
Создаем новый
отчет - Основная схема компоновки данных:
В
Вычисляемые поля добавлено поле «ПолеКартинка». В выражение добавлено значение «%Картинка%», поэтому выражению будем искать область ячеек куда необходимо вставить нашу картинку:
В это поле будет выводится картинка.
В настройках указываем:
В модуле объекта пишем код:
Код 1C v 8.х Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
ДокументРезультат. Очистить( ) ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета. Выполнить( СхемаКомпоновкиДанных, КомпоновщикНастроек. Настройки, ДанныеРасшифровки) ;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки. Инициализировать( Макет, , ДанныеРасшифровки) ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( ДокументРезультат) ;
ПолеПоКоторомуНеобходимоПолучитьЗначение = "Ссылка" ;
ПроцессорВывода. НачатьВывод( ) ;
Пока истина Цикл
ЭлементРезультата = ПроцессорКомпоновки. Следующий( ) ;
Если ЭлементРезультата = Неопределено Тогда
прервать ;
КонецЕсли ;
ПроцессорВывода. ВывестиЭлемент( ЭлементРезультата) ;
Если ЭлементРезультата. ЗначенияПараметров. Количество( ) > 0 Тогда
ЗначениеВыводимыхДанных = Неопределено ;
Для каждого ЗначениеПараметра из ЭлементРезультата. ЗначенияПараметров Цикл
Если ТипЗнч( ЗначениеПараметра. Значение) = Тип( "ИдентификаторРасшифровкиКомпоновкиДанных" ) Тогда
ПоляРасшифровки = ДанныеРасшифровки. Элементы[ЗначениеПараметра. Значение]. ПолучитьПоля( ) ;
Для Каждого ПолеРасшифровки из ПоляРасшифровки Цикл
Если ПолеРасшифровки. Поле = ПолеПоКоторомуНеобходимоПолучитьЗначение Тогда
ЗначениеВыводимыхДанных = ПолеРасшифровки. Значение;
Прервать ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Если ЗначениеЗаполнено( ЗначениеВыводимыхДанных) Тогда
Рис = ДокументРезультат. Рисунки. Добавить( ТипРисункаТабличногоДокумента. Картинка) ;
Рис. РазмерКартинки = РазмерКартинки. РеальныйРазмер;
Индекс = ДокументРезультат. Рисунки. Индекс( Рис) ;
Если ЗначениеВыводимыхДанных. ЭтоГруппа Тогда
ДокументРезультат. Рисунки[Индекс]. Картинка = БиблиотекаКартинок. ГруппаИЭлемент;
Иначе
ДокументРезультат. Рисунки[Индекс]. Картинка = БиблиотекаКартинок. Сформировать;
КонецЕсли ;
ВысотаТабДок = ДокументРезультат. ВысотаТаблицы;
ОбластьДляКартинки = ДокументРезультат. НайтиТекст( "%Картинка%" ) ;
Если ОбластьДляКартинки < > Неопределено Тогда
ДокументРезультат. Рисунки[Индекс]. Расположить( ОбластьДляКартинки) ;
ОбластьДляКартинки. Текст = "%КартинкаДобавлена%"
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
ПроцессорВывода. ЗакончитьВывод( ) ;
КонецПроцедуры
В результате:
Скачать пример этого отчета(Работает в любой конфишурации где есть справочник Банки):
Скачивать файлы может только зарегистрированный пользователь! Категория:
Схема Компоновки Данных Быстрая выгрузка отчетов в Excel, наложение Фильта и отображение ярлыка Вместо Таб.Показать() используем глобальную функцию - и отчет показывается сразу в Excel в удобоваримом виде - с форматированием колонок по ширине, автофильтром и ярлычками листов
Код 1C v 7.x Процедура глОткрытьВЭкселе(Таб,ИмяФайла="" ,НеИзменятьВысотуСтроки=0) Экспорт
Попытка
Excel = СоздатьОбъект( "Excel.Application" ) ;
Исключение
Excel = 0 ;
Предупреждение( "MS Excel не загружен!" ) ;
Возврат ;
КонецПопытки ;
Если ТипЗначенияСтр( Таб) = "Строка" Тогда
Excel. WorkBooks. Open( Таб) ;
Иначе
Если НеИзменятьВысотуСтроки= 0 Тогда
ШиринаТаблицы= Таб. ШиринаТаблицы( ) ;
Область= Таб. Область( 1 , 1 , Таб. ВысотаТаблицы( ) , ШиринаТаблицы) ;
Область. ВысотаСтроки( 12 ) ;
КонецЕсли ;
Если Найти( ИмяФайла, ":" ) = 0 Тогда
ИмяФайла= КаталогПользователя( ) + ИмяФайла;
КонецЕсли ;
Если Найти( Врег( ИмяФайла) , "XLS" ) = 0 Тогда
ИмяФайла= ИмяФайла+ ".xls" ;
КонецЕсли ;
Таб. Записать( ? ( ПустоеЗначение( ИмяФайла) = 0 , ИмяФайла, КаталогПользователя( ) + "Таблица.xls" ) , "XLS" ) ;
Excel. WorkBooks. Open( ИмяФайла) ;
Excel. Visible = 0 ;
Excel. Columns. AutoFit( ) ;
Range = Excel. Range( Excel. Cells( 1 , 1 ) , Excel. Cells( 1 , ШиринаТаблицы) ) ;
Range. S_elect( ) ;
Range. AutoFilter( ) ;
Excel. ActiveWindow. DisplayWorkbookTabs = - 1 ;
Excel. ActiveWindow. TabRatio = 0.25 ;
КонецЕсли ;
Excel. Visible= 1 ;
Excel= 0 ;
КонецПроцедуры
mikukrnet Категория:
Работа с Microsoft Office и OpenOffice Как закрепить шапку таблицы отчета? Код 1C v 8.х
Процедура скдФиксироватьШапкуОтчета(ТабДок, Фиксировать, Строка = "Номенклатура" , Поправка = 0) Экспорт
Если Фиксировать Тогда
Область = ТабДок. НайтиТекст( Строка, , , , Истина ) ;
ТабДок. ФиксацияСверху = ? ( ЗначениеЗаполнено( Область) , Область. Верх + Поправка, 0 ) ;
Иначе
ТабДок. ФиксацияСверху = 0 ;
КонецЕсли ;
КонецПроцедуры
Код 1C v 8.х
ПроцессорВывода. НачатьВывод( ) ;
ТаблицаЗафиксирована = Ложь ;
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновкиДанных. Следующий( ) ;
Если ЭлементРезультата= Неопределено Тогда
Прервать ;
Иначе
ПроцессорВывода. ВывестиЭлемент( ЭлементРезультата) ;
Если Не ТаблицаЗафиксирована И ЭлементРезультата. ЗначенияПараметров. Количество( ) > 0 Тогда
ТаблицаЗафиксирована = Истина ;
Таб. ФиксацияСверху = Таб. ВысотаТаблицы;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
ПроцессорВывода. ЗакончитьВывод( ) ;
Код 1C v 8.х
Процедура глВывестиРезультатКомпоновкиСАвтофиксациейСтрок( Таб,
ПроцессорКомпоновкиДанных,
ЭлементыРасшировки,
Знач МассивИгнорируемыхПолей = Неопределено,
РазрешитьПрерывание = Истина) Экспорт
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( Таб) ;
ПроцессорВывода. НачатьВывод( ) ;
ФиксацияВыполнена = Ложь ;
Если МассивИгнорируемыхПолей = Неопределено Тогда
МассивИгнорируемыхПолей = Новый Массив;
КонецЕсли ;
Пока Истина Цикл
ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных. Следующий( ) ;
Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
Прервать ;
КонецЕсли ;
Если Не ФиксацияВыполнена Тогда
Для Каждого ЗначениеПараметра Из ЭлементРезультатаКомпоновкиДанных. ЗначенияПараметров Цикл
Если ТипЗнч( ЗначениеПараметра. Значение) = Тип( "ИдентификаторРасшифровкиКомпоновкиДанных" ) Тогда
ЗначенияПолейРасшифровки = ЭлементыРасшировки[ЗначениеПараметра. Значение]. ПолучитьПоля( ) ;
Для Каждого ЗначениеПоляРасшифровки Из ЗначенияПолейРасшифровки Цикл
Если МассивИгнорируемыхПолей. Найти( ЗначениеПоляРасшифровки. Поле) = Неопределено Тогда
Таб. ФиксацияСверху = Таб. ВысотаТаблицы;
ФиксацияВыполнена = Истина ;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Если ФиксацияВыполнена Тогда
Прервать ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
ПроцессорВывода. ВывестиЭлемент( ЭлементРезультатаКомпоновкиДанных) ;
Если РазрешитьПрерывание Тогда
#Если Клиент тогда
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
КонецЕсли ;
КонецЦикла ;
ПроцессорВывода. ЗакончитьВывод( ) ;
КонецПроцедуры
Категория:
Схема Компоновки Данных Как при выводе данных в Табличный Документ изменить Текст и Цвет Текста конкретной ячейки? Код 1C v 8.х //Пример изменения цвета текста при выводе данных в табличный документ
Таб.ВывестиСекцию("Контрагент");
// Изменим Текст ячейки, имя которой заранее задали как "ТекстОСостоянии"
Таб.Область("ТекстОСостоянии").Текст = "Хорошо ";
// В зависимости от условия изменим Цвет Текста
Если Раз<0 Тогда
Таб.Область(Таб.ВысотаТаблицы(),9,Таб.ВысотаТаблицы(),9).ЦветТекста(255,0,0);
ИначеЕсли Раз>0 Тогда
Таб.Область(Таб.ВысотаТаблицы(),9,Таб.ВысотаТаблицы(),9).ЦветТекста(0,0,255);
КонецЕсли;
Код 1C v 7.x Таб = СоздатьОбъект( "Таблица" ) ;
Таб. Открыть( "tabldoc.mxl" ) ;
ВыбОбласть = Таб. Область( "R8C4" ) ;
ВыбОбласть. Шрифт( "Arial" ) ;
ВыбОбласть. РазмерШрифта( 10 ) ;
ВыбОбласть. Подчеркнутый( 1 ) ;
ВыбОбласть. ГоризонтальноеПоложение( 3 ) ;
ВыбОбласть. Контроль( 4 ) ;
ВыбОбласть. ЦветФона( 34 , 126 , 211 ) ;
ВыбОбласть. ЦветРамки( 34 , 126 , 211 ) ;
ВыбОбласть. ЦветТекста> ( 34 , 126 , 211 ) ;
Категория:
Табличный документ Функция загружает весь табличный документ в таблицу значений Код 1C v 8.х
Функция ПолучитьТЗИзМакета(ТабДок, КолонкаИндекса = 1) Экспорт
ТаблицаДанных = Новый ТаблицаЗначений;
НомерКолонки = 0 ;
Пока Истина Цикл
НомерКолонки = НомерКолонки + 1 ;
ИмяКолонки = ТабДок. Область( 1 , НомерКолонки) . Текст;
Если ПустаяСтрока( ИмяКолонки) Тогда
Прервать ;
КонецЕсли ;
ТаблицаДанных. Колонки. Добавить( ИмяКолонки) ;
КонецЦикла ;
СчетчикКолонок = НомерКолонки - 1 ;
НомерСтроки = 1 ; ФлагПрерывания = Ложь ;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1 ;
Стр = ТаблицаДанных. Добавить( ) ;
Для А = 1 ПО СчетчикКолонок Цикл
ТекстКолонки = ТабДок. Область( НомерСтроки, А) . Текст;
Если ПустаяСтрока( ТекстКолонки) Тогда
Если А = КолонкаИндекса Тогда
Флагпрерывания = Истина ;
ТаблицаДанных. Удалить( Стр) ;
КонецЕсли ;
Иначе
Стр[А - 1 ] = ТекстКолонки
КонецЕсли ;
Если Флагпрерывания Тогда
Прервать
КонецЕсли ;
КонецЦикла ;
Если Флагпрерывания Тогда
Прервать
КонецЕсли ;
КонецЦикла ;
Возврат ТаблицаДанных
КонецФункции
Функция обМакетВТаблицуЗначений(Макет) Экспорт
Перем ТЗ;
ТЗ= Новый ТаблицаЗначений( ) ;
#Если Клиент Тогда
Для Стр= 1 По Макет. ВысотаТаблицы Цикл
Если Стр> 1 Тогда
ТекСтр= ТЗ. Добавить( ) ;
КонецЕсли ;
ПустаяСтрока= истина ;
Для Кол= 1 По Макет. ШиринаТаблицы Цикл
Яч= Макет. Область( Стр, Кол) ;
Если Яч. СодержитЗначение Тогда
Зн= Яч. Значение;
Иначе
Зн= Яч. Текст;
КонецЕсли ;
Если ТипЗнч( Зн) = Тип( "Строка" ) И ПустаяСтрока( Зн) Тогда
Зн= Неопределено ;
КонецЕсли ;
Если Стр= 1 Тогда
ТЗ. Колонки. Добавить( Зн) ;
Иначе
ТекСтр[Кол- 1 ]= Зн;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
#КонецЕсли
Возврат ТЗ;
КонецФункции
Категория:
Табличный документ Автоматическая установка ширины колонки табличного документа. Процедура, которая "примерно" делает автоширину колонок (навроде, как если бы выделить все колонки и дважды щелкнуть мышкой по границе заголовка колонки). Привожу текст, работает неахти, но лучше чем ничего:
Код 1C v 8.х Процедура РасчетШириныКолонок(ТабличныйДокумент)
Перем МаксимальноеКоличествоСтрок, МаксимальнаяШиринаКолонки;
Перем КонечнаяСтрока, НачальнаяСтрока, ТекущаяКолонка, ТекущаяСтрока, НачалоДанных;
Перем ОбластьШапки, ОбластьПодвала;
Перем ШиринаКолонки, ТекстЯчейки, НомерСтрокиТекста;
Перем КоличествоУровнейГруппировокСтрок, Отступ;
Перем ШириныКолонок;
МаксимальноеКоличествоСтрок = 50 ;
МаксимальнаяШиринаКолонки = 50 ;
ШириныКолонок = Новый Массив;
КоличествоУровнейГруппировокСтрок = ТабличныйДокумент. КоличествоУровнейГруппировокСтрок( ) ;
НачальнаяСтрока = 0 ;
НачалоДанных = 0 ;
ОбластьШапки = ТабличныйДокумент. Области. Найти( "ШапкаТаблицы" ) ;
Если ТипЗнч( ОбластьШапки) = Тип( "ОбластьЯчеекТабличногоДокумента" ) Тогда
НачальнаяСтрока = ОбластьШапки. Верх;
НачалоДанных = ОбластьШапки. Низ + 1 ;
Иначе
ОбластьШапки = ТабличныйДокумент. Области. Найти( "ШапкаСтрок" ) ;
Если ТипЗнч( ОбластьШапки) = Тип( "ОбластьЯчеекТабличногоДокумента" ) Тогда
НачальнаяСтрока = ОбластьШапки. Верх;
НачалоДанных = ОбластьШапки. Низ + 1 ;
КонецЕсли ;
КонецЕсли ;
ОбластьПодвала = ТабличныйДокумент. Области. Найти( "Подвал" ) ;
Если ТипЗнч( ОбластьПодвала) = Тип( "ОбластьЯчеекТабличногоДокумента" ) Тогда
КонечнаяСтрока = ОбластьПодвала. Верх - 1 ;
Если КонечнаяСтрока - НачальнаяСтрока > МаксимальноеКоличествоСтрок Тогда
КонечнаяСтрока = НачальнаяСтрока + МаксимальноеКоличествоСтрок;
КонецЕсли ;
Иначе
КонечнаяСтрока = НачальнаяСтрока + МаксимальноеКоличествоСтрок;
КонецЕсли ;
КонечнаяСтрока = Мин( КонечнаяСтрока, ТабличныйДокумент. ВысотаТаблицы) ;
Для ТекущаяКолонка = 1 По ТабличныйДокумент. ШиринаТаблицы Цикл
АвтоОтступ = 0 ;
Для ТекущаяСтрока = НачальнаяСтрока По КонечнаяСтрока Цикл
ШиринаКолонки = 0 ;
ОбластьЯчейки = ТабличныйДокумент. Область( ТекущаяСтрока, ТекущаяКолонка) ;
Если ОбластьЯчейки. Лево < > ТекущаяКолонка Или ОбластьЯчейки. Верх < > ТекущаяСтрока Тогда
Продолжить;
КонецЕсли ;
Если КоличествоУровнейГруппировокСтрок > 0 И ТекущаяСтрока = НачалоДанных Тогда
АвтоОтступ = ОбластьЯчейки. АвтоОтступ;
КонецЕсли ;
ТекстЯчейки = ОбластьЯчейки. Текст;
Для НомерСтрокиТекста = 1 По СтрЧислоСтрок( ТекстЯчейки) Цикл
ШиринаТекстаЯчейки = СтрДлина( СтрПолучитьСтроку( ТекстЯчейки, НомерСтрокиТекста) ) ;
Если АвтоОтступ < > Неопределено И АвтоОтступ > 0 Тогда
ШиринаТекстаЯчейки = ШиринаТекстаЯчейки + КоличествоУровнейГруппировокСтрок * АвтоОтступ;
КонецЕсли ;
ШиринаКолонки = Макс( ШиринаКолонки, ШиринаТекстаЯчейки) ;
КонецЦикла ;
Если ШиринаКолонки > МаксимальнаяШиринаКолонки Тогда
ШиринаКолонки = МаксимальнаяШиринаКолонки;
КонецЕсли ;
Если ШиринаКолонки < > 0 Тогда
КоличествоКолонок = ОбластьЯчейки. Право - ОбластьЯчейки. Лево;
Для НомерКолонки = 0 По КоличествоКолонок Цикл
Если ШириныКолонок. ВГраница( ) > ТекущаяКолонка - 1 + НомерКолонки Тогда
Если ШириныКолонок[ТекущаяКолонка - 1 + НомерКолонки] = Неопределено Тогда
ШириныКолонок[ТекущаяКолонка - 1 + НомерКолонки] = ШиринаКолонки / ( КоличествоКолонок + 1 ) ;
Иначе
ШириныКолонок[ТекущаяКолонка - 1 + НомерКолонки] =
Макс( ШириныКолонок[ТекущаяКолонка - 1 + НомерКолонки], ШиринаКолонки / ( КоличествоКолонок + 1 ) ) ;
КонецЕсли ;
Иначе
ШириныКолонок. Вставить( ТекущаяКолонка - 1 + НомерКолонки, ШиринаКолонки / ( КоличествоКолонок + 1 ) ) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
Для ТекущаяКолонка = 0 По ШириныКолонок. ВГраница( ) Цикл
Если ШириныКолонок[ТекущаяКолонка] < > Неопределено Тогда
ТабличныйДокумент. Область( , ТекущаяКолонка + 1 , НачалоДанных, ТекущаяКолонка + 1 ) . ШиринаКолонки = ШириныКолонок[ТекущаяКолонка] + 1 ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Очень полезная штука при условии, что у Вас заранее невозможно определить размер итоговых колонок в печатной форме. А так, надо просто "натравить" процедуру с соответствующими параметрами на нужные ячейки таблицы, и они сами "выровняются" и приобретут необходимый размер (ширину).
Код 1C v 7.x
Процедура глУстШиринуЯчейки(Таб, Строка1, Столбец1, Строка2, Столбец2, ДлТекста = 0) Экспорт
Если ДлТекста = 0 Тогда
врДлина = СтрДлина( СокрЛП( Таб. Область( Строка1 , Столбец1 , Строка2 , Столбец2 ) . Текст) ) ;
Иначе
врДлина = ДлТекста;
КонецЕсли ;
Таб. Область( Строка1 , Столбец1 , Строка2 , Столбец2 ) . ШиринаСтолбца( Макс( Таб. Область( Строка1 , Столбец1 , Строка2 , Столбец2 ) . ШиринаСтолбца( ) , врДлина) ) ;
КонецПроцедуры
Категория:
Табличный документ Вывод (печать) таблицы значений в табличный документ Пример кода быстрая Печать таблицы значений
Код 1C v 8.х
ПострПечать = Новый ПостроительОтчета;
ПострПечать. ИсточникДанных = Новый ОписаниеИсточникаДанных( ТПОтчета) ;
ПострПечать. МакетОформления = ПолучитьМакетОформления( СтандартноеОформление. Интерфейс) ;
ПострПечать. Выполнить( ) ;
Для каждого Колонка Из ПострПечать. ВыбранныеПоля Цикл
Колонка. Представление = ТПОтчета. Колонки[Колонка. Имя]. Заголовок;
КонецЦикла ;
ПострПечать. Вывести( ) ;
Пример функций Печать таблицы значений с использованием Макета
Код 1C v 8.х
Процедура УниверсальныйОтчетПоТЗ(ТЗ)
Табл= Новый ТабличныйДокумент;
Макет = ЭтотОбъект. ПолучитьМакет( "Макет" ) ;
ОбластьШапкаОсновной= Макет. ПолучитьОбласть( "Шапка|Основной" ) ;
ОбластьСтрокаОсновной= Макет. ПолучитьОбласть( "Строка|Основной" ) ;
ОбластьИтогОсновной= Макет. ПолучитьОбласть( "Итог|Основной" ) ;
ОбластьШапкаДОП= Макет. ПолучитьОбласть( "Шапка|Показатели" ) ;
ОбластьСтрокаДОП= Макет. ПолучитьОбласть( "Строка|Показатели" ) ;
ОбластьИтогДОП= Макет. ПолучитьОбласть( "Итог|Показатели" ) ;
Табл. Вывести( ОбластьШапкаОсновной) ;
Для Каждого Колонка из Тз. Колонки ЦИКЛ
ОбластьШапкаДОП. Параметры. ИмяПоказателя= Колонка. Имя;
Табл. Присоединить( ОбластьШапкаДОП) ;
КонецЦикла ;
счетчик= 0 ;
Для каждого стр из Тз Цикл
счетчик= счетчик+ 1 ;
ОбластьСтрокаОсновной. Параметры. счетчик= счетчик;
Табл. Вывести( ОбластьСтрокаОсновной) ;
Для Каждого Колонка из Тз. Колонки ЦИКЛ
ОбластьСтрокаДОП. Параметры. ЗначениеКолонки= стр[Колонка. Имя];
Табл. Присоединить( ОбластьСтрокаДОП) ;
КонецЦикла ;
КонецЦикла ;
Табл. Вывести( ОбластьИтогОсновной) ;
Для Каждого Колонка из Тз. Колонки ЦИКЛ
ОбластьИтогДОП. Параметры. Итог= Тз. Итог( Колонка. Имя) ;
Табл. Присоединить( ОбластьИтогДОП) ;
КонецЦикла ;
Табл. Показать( ) ;
КонецПроцедуры
Код 1C v 7.x
Процедура ПечатьТЗвТаб(ТЗ, Заголовок = "" ,КолонкиПоНазваниям = 0) Экспорт
Перем ТТЗ;
ТЗ. Выгрузить( ТТЗ) ;
МаксШирина = 50 ;
СпШирина = СоздатьОбъект( "СписокЗначений" ) ;
Для сч = 1 по ТТЗ. КоличествоКолонок( ) Цикл
Если КолонкиПоНазваниям = 0 Тогда
ИмяРек = ТТЗ. ПолучитьПараметрыКолонки( сч) ;
Иначе
ИмяРек = "" ;
ТТЗ. ПолучитьПараметрыКолонки( сч, , , , ИмяРек, ) ;
КонецЕсли ;
СпШирина. ДобавитьЗначение( СтрДлина( ИмяРек) * 1.2 ) ;
КонецЦикла ;
Таб= СоздатьОбъект( "Таблица" ) ;
Таб. ИсходнаяТаблица( "ПечатьТЗ" ) ;
Если СокрЛП( Заголовок) < > "" Тогда
Таб. ВывестиСекцию( "Шапка" ) ;
КонецЕсли ;
Таб. ВывестиСекцию( "Строка|Общая" ) ;
Для сч= 1 по ТТЗ. КоличествоКолонок( ) Цикл
Если КолонкиПоНазваниям = 0 Тогда
ИмяРек = ТТЗ. ПолучитьПараметрыКолонки( сч) ;
Иначе
ИмяРек = "" ;
Ном = "" ;
ТТЗ. ПолучитьПараметрыКолонки( сч, , , , ИмяРек, ) ;
КонецЕсли ;
Таб. ПрисоединитьСекцию( "Строка|Столбец" ) ;
КонецЦикла ;
ВысотаШапки = Таб. ВысотаТаблицы( ) ;
ТТЗ. ВыбратьСтроки( ) ;
Пока ТТЗ. ПолучитьСтроку( ) = 1 Цикл
Ном = ТТЗ. НомерСтроки;
Таб. ВывестиСекцию( "Строка|Общая" ) ;
Выс = Таб. ВысотаТаблицы( ) ;
Для сч= 1 по ТТЗ. КоличествоКолонок( ) Цикл
ИмяРек= ТТЗ. ПолучитьЗначение( Ном, сч) ;
Таб. ПрисоединитьСекцию( "Строка|Столбец" ) ;
Если ТипЗначения( ИмяРек) = 1 Тогда
Обл = Таб. Область( "R" + Выс+ "C" + ( Сч+ 1 ) ) ;
Обл. ГоризонтальноеПоложение( 2 ) ;
КонецЕсли ;
НачШирина = СпШирина. ПолучитьЗначение( Сч) ;
Ширина = СтрДлина( ИмяРек) ;
СпШирина. УстановитьЗначение( Сч, Макс( НачШирина, Ширина) ) ;
КонецЦикла ;
КонецЦикла ;
Для сч = 1 по СпШирина. РазмерСписка( ) Цикл
Обл = Таб. Область( "R" + ВысотаШапки+ "C" + ( Сч+ 1 ) ) ;
Ширина = Мин( МаксШирина, 2 + СпШирина. ПолучитьЗначение( Сч) ) ;
Обл. ШиринаСтолбца( Ширина) ;
Обл. Полужирный( 1 ) ;
КонецЦикла ;
Таб. Показать( Заголовок) ;
Таб. ТолькоПросмотр( 1 ) ;
КонецПроцедуры
ИЛИ
Код 1C v 7.x Процедура глВывестиТаблицуЗначений(ТаблицаЗначений, Заголовок = "" ) Экспорт
Перем Таб, ИИ, ЖЖ, НазваниеКолонки, ТипКолонки, Ширина, Значение, Сообщение;
Таб = СоздатьОбъект( "Таблица" ) ;
Если ТипЗначенияСтр( ТаблицаЗначений) < > "ТаблицаЗначений" Тогда
Сообщение = "В процедуру "" глВывестиТаблицуЗначений()"" передана переменная не типа "" ТаблицаЗначений"" , " +
"а типа "" " + СокрЛП( ТипЗначенияСтр( ТаблицаЗначений) ) + """ " ;
Таб. Область( 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 ) ;
Таб. Показать( "Таблица значений: " + Заголовок) ;
КонецПроцедуры
Категория:
Работа с Таблицей Значений