Как при получении данных из запроса обойти только иерархические итоговые записи?
I ПродажиКомпанинОбороты.СуммаПродажиОборот КАК СуммаПродажиОборот |ИЗ
I РегистрНакопления.ПродажиКомнании.Обороты(&НачПериода,&КонПсриода) КАК ПродажиКомпанииОбороты
|ИТОГИ СУММА(КоличсствоОборот), СУММА(СуммаПродажиОборот) ПО I ОБЩИЕ,
I Номенклатура Иерархия”:
Запрос.УстановнтьПараметрС'&НачПериода", НачПериода); Запрос.УстановитьПараметрС&КонПернода”, КонецДня(КонПериода)):
Результат = Запрос. Выпол ни гь();
ОбластьЗаголовок = Макет.ПолучнтьОбластьС'Заголовок");
ОбластьПодвал = Макет.ПолучитьОбластьС'Подвал”);
ОбластьШапкаТаблицы = Макет.ПолучитьОбластьС'ШапкаТаблицы”); ОбластьПодвалТаблицы = Макет.ПолучитьОбластьС'ПодвалТаблицы"); ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги"); ОбластьНоменклатура = Макет.ПолучитьОбластьС'Номенклатура"); ОбластьДетальныхЗаписей = Макет.ПолучитьОбластьС'Детали");
Т абДок. В ы вести(ОбластьЗагол овок):
ТабДок.Вывести(ОбластьШапкаТаблнцы):
// Обход по определенным в запросе итоговым группировкам.
ВыборкаОбщийИтог = Результат
.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам):
// Запись общих итогов одна, поэтому нет необходимости в цикле. ВыборкаОбщийИтог.СледующинО;
ОбластьОбщнйИтог.Параметры.Заполнить(ВыборкаОбщийИтог):
ТабДок.Вывести(ОбластьОбщийИтог);
// Получить подчиненную выборку по итоговой группировке «номенклатура». ВыборкаНомснклатура = ВыборкаОбщийИтог
.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам):
Пока ВыборкаНоменклатура.СлсдующийО Цикл_
ОбластьНоменклатура. Параметры.Заполнит ь(ВыборкаНоменклатура): ТабДок.Вывести(ОбластьНоменклатура);
// Несмотря на то, что можем получить еще одну подчиненную // выборку (по детальным записям) мы это нс делаем, т.е. фактически // при обходе пропускаем детальные записи.
КонецЦнкла;
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал):
Как при получении данных из запроса обойти только иерархические итоговые записи?
В примере «Как при получении данных из запроса обойти только итоговые записи» на странице 276 в методе Выбрать() вместо варианта обхода ПоГруппировкам необходимо использовать
ПоГруппировкамСИерархией.
В результате часть кода изменится:
ВыборкаОбщийИтог = Результат
. Выбрать(ОбходРезул ы атаЗапроса
.ПоГруппировкамСИерархией);
ВыборкаОбщийИтог.СледующийО;
Облает ьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийІітог);
Т абДок. В ы вести(ОбластьОбщи й Итог);
ВыборкаНоменклатура = ВыборкаОбщийИтог
,Выбрать(ОбходРезультатаЗапроса
.ПоГруппировкамСИерархией);
Пока ВыборкаНоменклатура.СледующийО Цикл ОбластьНоменклатура. Параметры.Заполнить(ВыборкаНоченклатура): ТабДок.Вывести(ОбластьНоменклатура);
КонецЦнкла;
В результате в табличный документ будут выведены только:
• запись общих итогов (она относится к иерархическим)
• итоговые записи по группам справочника «Номенклатура» (иерархические итоговые записи)
Остальные данные (содержащиеся в результате запроса) обходиться не будут, таким образом, будут выданы только иерархические записи, расположенные на первом уровне.
ф Как вывести картинку в табличный документ?
В макете определим именованную область «ОбластьСКартинкой». В ней разместим элемент управления Картинка (имя «Логотип»), как показано на рисунке:

В процедуре, которая будет выполняться при формировании печатной формы, разместим следующий текст:
ТабДок = Новый ТабличныйДокумент:
Макет = ОбработкаОбъект.ПолучитьМакст("Макет");
ОбластьКартинки = Макет.ПолучитьОбласть( "ОблаегьСКартинкой"); Картинка = Новый Картинка(ПутьККартннке);
И Элемент управления "Логотип" входит в коллекцию картинок области. ОбластьКартинки. Рнсунки.Логотип. Картинка = Картинка:
ТабДок.Вывести!ОбластьКартинки);
ТабДок. ПоказатЦ);
Как вывести картинку в табличный документ без изменения макета?
Необходимо в шапке отчета (выводимого в поле табличного документа) отобразить логотип компании. При этом не нужно менять макет данного отчета.
Полный путь к картинке находится в одноименной переменной. Для решения задачи необходимо внести в процедуру, формирующую табличный документ следующие строки кода:
Область = Макет.ПолучнтьОбластьС’Шапка");
Рисунок = Область. Рисунки. ДобавіітМТнпРисункаТабличногоДокумснта. Картинка): Рисунок.Всрх = 5;
Рисунок.Высота = 10;
Рисунок.Ширина = 10;
РисунокЛево = 5;
Рисунок.Картинка = Новый Картинка! ПутьККартинке);
Рисунок.РазмерКартннкн = Размер Картинки. РеальныйРатмер;
ТабДок.Вывести(Область);
Первоначально создается новый элемент коллекции рисунков табличного документа. Далее устанавливается положение нового рисунка и, используя свойство Картинка, в новый рисунок загружается изображение из файла.
Как работать со сводной таблицей?
Для иллюстрации одного из способов работы со сводной таблицей создадим обработку. В диалоге основной формы разместим элемент управления ПолеТабличноГОДокумента (имя «ПолеДокумента»). В данном элементе управления необходимо выделить любую прямоугольную область и воспользоваться пунктом главного меню программы «Форма | Встроенные таблицы | Вставить сводную таблицу»:

При этом будет создана сводная таблица с именем « СводнаяТабл ица 1».
В процедуре обработчике нажатия на кнопку «Выполнить» разместим следующие строки:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
I ПродажиКомпанииОбороты.ДоговорВзаиморасчетовПокупателя.Владелец КА К ДоговорВзаи морас четов П окупателя Владелец,
I ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура,
I ПродажиКомпанииОбороты.ПодразделениеКомпанни I КАК ПодразделениеКомпанин.
I СУММА(ГІродажиКомпанииОбороты.КоличествоОборот)
I КАК КоличествоОборот,
I СУММА(ПродажиКомпанииОбороты.СуммаПродажиОборот)
I КАК СуммаПродажиОборот
|ИЗ
I РегнстрНакопления. Продажи Компании.Обороты(&НачПериода,&КонПериода) КАК ПродажиКомпанииОбороты
ІСГРУППИРОВАТЬ ПО
I ПродажиКомпанииОбороты.ДоговорВзаиморасчетовПокупателя.Владелец.
I ПродажиКомпанииОбороты.Номенклатура,
I ПродажиКомпанииОбороты.ПодразделениеКомпанин
|ИТОГИ СУММА(КолнчествоОборот). СУММА(СуммаПродажиОборот) ПО I ДоговорВзаиморасчетовПокупателяВладелец,
I Номенклатура.
I ПодразделениеКомпанин";
// На состав полей, которые могут быть размешены в измерениях.
//данных сводной таблицы влияет раздел «Итоги».
Запрос.УстановитьПарамегрС'НачПериода". НачПернода): Запрос.УстановитьПараметрС'КонПериода". КонІ Іериода);
Результат — Запрос. Выполнитъ/);
Сводная = ЭлемснтыФормы Пол еДоку мента .ВстроенныеТаблицы .СводнаяТаблицаІ:
Сводная.ИсточникДанных = Результат;
В сводную таблицу передается результат запроса. Состав отображаемых полей определяется в диалоге, который вызывается путем выбора пункта «Отображать поля» контекстного меню сводной таблицы.
Как программно разместить данные в сводной таблице и оформить ее?
Для того чтобы облегчить чтение сводных таблиц, содержащих большое количество данных, можно использовать свойства сводной
таблицы МакетОформения и ОтображатьЛинии, позволяющее задать режим отображения линий, а для размещения данных использовать свойства сводной таблицы Строки, Колонки и Данные. Например:
Построитель = Новый ПостроительОтчета():
Построитель.Текст =
"ВЫБРАТЬ
I ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад.
I ТоварыНаСкладахОстаткиИОбороты.Склад.Представление,
I ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, I ТоварыНаСкладахОстагкиИОбороты.Номенклатура. Представление.
I СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличесгвоПриход)
I КАК КоличествоПриход,
I СУММАПоварыНаСкладахОсіаікнПОбороты.КоличесгвоОбороі)
I КАК КоличествоОборог.
I СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличесгвоРасход)
КАК КолнчествоРасход
1113
I РегистрНаколлення.ТоварыНаСкладах.ОстаткиИОборогы КАК ТоварыНаСкладахОстаткиИОбороты
I
ІСГРУППИРОВАТЬ ПО 1 ТоварыНаСкладахОстаткиИОбороты.Склад,
I ТоварыНаСкладахОстаткиИОбороты.Номенклатура.
I ТоварыНаСкладахОстаткиИОбороты.Склад.Представлснис,
I ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Представление
|ИТОГИ СУММА(КолнчествоПриход).
СУММА(КолнчествоОборот).
I СУММА(КоличествоРасход) ПО
I ОБЩИЕ,
1 Номенклатура ИЕРАРХИЯ,
1 Склад ИЕРАРХИЯ
Построй тсль.ЗаполнитьНастройкиС);
Таблица = ЭлементыФормы
.ПолеТабличногоДокумептаІ .ВстроенныеТаблицы .СводнаяТаблина I;
Таблица.МакетОформления =
ПолучитьМакетОформления(СтандарлноеОформление.Лед);
Таблица.ИсточникДанных = Построитель:
Таблица.Строки.ДобавитьС'Номснклатура"):
Таблица.Колонки .Добавить) "Склад”); Таблица.Данные.ДобавитьГКоличествоГІриход");
Гиб. іи па.О тиража і иІинни = ТнпОтображеніімЛіінийСво.іііоііТаб.іиііы
•Всегда;
Как создать печатную форму посредством текстового шаблона?
Требуется создать печатную форму для формирования заявок на пропуска сторонних лиц на встречи в офисе компании. Заявки впоследствии должны печататься на матричном принтере, поэтому для формирования выходной формы удобнее использовать текстовый документ:
Заявка на пропуска на 09.08.2004 Планируемое время посещения с 10:00:00
по 15:00:00
+
I
+
I
+
I
+
1
I
+
+------------------------------------------
I ФИО
+------------------------------------------
I Шлаков Семен Кузьмич
+------------------------------------------
I Кротов Иван Ильич
+------------------------------------------
I Колесниковская - Абдурахманова Александра I Константиновна
+------------------------------------------
Ответственный: _/Федоров
Для решения данной задачи создаем сначала макет текстового документа « ЗаявкаНаПропуск».

Макет сделаем следующего вида:
#Область Заголовок #Поле Дата
UФормат "ДФ= dd.ИИ.уууу"
UПоле ВремяНач
#Формат "ДЛФ=Т"
#Поле ВремяОконч
#Формат "ДЛФ-Т"
Заявка на пропуска на [Дата
Планируемое время посещения с [ВремяНач ]
по [ВремяОконч ]
I ФИО I
#КонецОбласти
^Область Состав
]I #Поля ФИО >I #Поля ФИО
I [
|<
+---------------
#Ко нецОб ласти
^Область Подвал
Ответственный: _/[Ответственный ]
#КонецОбласти
Каждая область заключается внутри маркеров ее начала и конца.
Форматирование выводимых в области данных можно производить посредством обращения к выводимому полю, далее «# Формат» и форматная строка. Аналогично там же можно производить выравнивание, например: «#Выравнивание Лево».
Вывод значений параметров определяется указанием имен параметров области между квадратными скобками. Количество разрядов между квадратными скобками определяет - во сколько разрядов будет помещено отображаемое текстом значение параметра.
Поэтому отдельный интерес представляет ситуация с выводом длинного, не вмещающегося в одной строке, текста. Она отработана при выводе строк области «Состав». Заметьте, в первой строке вывод поля указан в квадратных скобках, строкой ниже - в угловых. То есть вторая строка появится только тогда, когда выводимое не поместится в предыдущую строку.
Сам же текстовый документ будет формироваться так:
// Создать текстовый документ, в который будет выполняться вывод. ТекстДок = Новый ТекстовыйДокумент:
// Получить макет.
Макет - ПолучитьМакет("ЗаявкаНаПропуск"):
// Заголовок.
Область = Макет.ПолучитьОбластьГЗаіоловок"); Область.Параметры.Дата = Дата:
Область.ГІараметры.ВремяНач = НачалоСобытия: Область.Параметры.ВремяОконч = ОкончаннеСобытия;
Текст Док. Вывеет и(Область):
// Состав.
Область = Макет.ПолучитьОбластьС'Состав");
Для Каждого ТекСтрокаСторонннеЛица Из СторонниеЛнца Цикл Область.Парамстры.ФИО = Строка(ТекСтрокаСторотшеЛица.Лнцо): ТскстДок.Вывести(Облаегь);
КонецЦикла:
// Подвал.
Область = Макет.ПолучнтьОбластьГПодвал");
Область.Парамсгры. Ответственный = Ответственный. Наименование;
ТекстДок.Вывести(Область);
// Открыть сформированный документ.
ТекстДок.ПоказатьС'Заявка на пропуска для События №" + Номер);
Создаем в оперативной памяти текстовый документ. Для его заполнения используем текстовый макет, который мы создавали подчиненным документу «Событие».
Получаем область «Заголовок», производим заполнение ее параметров, выводим полученную область в текстовый документ.
В цикле перебора строк табличной части документа
«СторонниеЛица» производим заполнение и вывод области «Состав».
В подвале текстового документа выводим ответственного и показываем текстовый документ на экране.
Диаграммы
ф Как заполнить диаграмму данными?
Рассмотрим пример, позволяющий показать данные в круговой диаграмме. Данная диаграмма имеет одну точку и произвольное количество серий.
Первоначально в диалоге необходимо разместить элемент управления Диаграмма (имя элемента «Диаграмма»). В свойствах элемента управления укажем, что будем работать с круговой диаграммой.
Далее в модуле формы определить текст обработчика нажатия на кнопку «Выполнить»:
Диаграмма = Э.темснтыФормы.Диаірамма;
// Очистить диаграмму, возможно ранее в нее уже выводились данные. Диаграмма.КоличествоСернй = 0;
Диаграмма.КоличеетвоТочек = 0;
// Количество серий будет оіраннчивлться (не все значения будут показываться). Диаграмма. МаксимумСерий = МакснмумСерий.Ограничсно; Днаграмма.МаксимумСерийКолнчество = 7;
Диаграмма. ВидПодписей = ВидПодписейКДиаграмме.Процент: Диаграмма.ОблаетьЗаголовка.Текст = "Обороты номенклатуры";
Запрос = Новый Запрос:
Занрос.Текст = "ВЫБРАТЬ I ПродажиКомпанииОбороты. Номенклатура.
I СУММА»ПродажиКомпанииОбороты.КоличесгвоОборот)
КАК КоличествоОборот |ПЗ
I РегистрНакопления.Продажи.Обороты(,.,) КАК ПродажиКомпанииОбороты ІСГРУППМРОВАТЬ ПО
I ПродажиКомпанииОбороты.Номенклатура”;
Результат = Запрос. Выполнить!):
// Запретить обновление диаграммы на время вывода данных. Диаграмма.Обновление = Ложь;
// Установить единственную точку.
Диаграмма.КоличеетвоТочек = I;
Диаірамма.Точки[0]. Текст = "Количество";
Выборка = Результат.ВыбратьО;
Пока Выборка.Следующий!) Цикл
// Количество серий, если бы не ограничивали зависело бы от результата запроса КолнчествоСерий = Диаграмма.Серии.КоличествоО;
Диаі~рамма.КолнчествоСерий = КолнчествоСерий + 1; Диаграмма.Серни|КоличествоСернн].Текст= Выборка. Номенклатура:
// Установить значение «на пересечении» точки и серии.
// Первый параметр - 0 , так как в диаграмме только одна точка. Диаірамма.УстановитьЗначенне(0,
КолнчествоСерий,
Выборка. КоличсствоОборот);
КонецЦикла;
// Обновить диаграмму.
Диаграмма.Обновление = Истина;
В результате выполнения этого кода будет сформирована следующая диаграмма:
Следует заметить, что специфика круговой диаграммы заключается в том, что она содержит одну точку и некоторое количество серий. В других видах диаграмм для вывода аналогичных данных номенклатуру лучше назначать точкам диаграммы. Кроме этого, заполнение диаграммы данными может быть выполнено также через свойство ИСТОЧИ И кДанных аналогично тому, как заполняется сводная диаграмма в примере «Как заполнить данными измерительную диаграмму?» на странице 289.
Как заполнить данными измерительную диаграмму?
Чаще всего при выводе в измерительную диаграмму, необходимо настроить полосы диаграммы, и, возможно, максимальное и минимальное значения шкалы диаграммы. Следующий пример демонстрирует настройку и вывод данных в измерительную диаграмму при помощи кода, однако надо заметить, что аналогичную на стройку измерительной диаграммы можно выполнить интерактивно в палитре свойств:
// Настроить свойства диаграммы.
Диаграмма = ЭлементыФормы.ДиаграммаПродажи; Диаграмма.ТипДиаграммы = ТипДиаграммы. Измерительная: Диаграмма.АвтоМаксимальносЗначение = Ложь;
Диаграмма.МаксимальноеЗначение = 20000;
Диаграмма. АвгоМинимальноеЗначение = Ложь;
Диаграмма.МинимальноеЗначение = 0;
// Создать три полосы.
Полосы = Диаграмма.ПолосыИзмерительнойДиаграммы;
НоваяПолоса = Полосы ДобавитьО;
Новая Полоса. Начало = 0;
НоваяПолоса.Конец = 1000;
НоваяПолоса.ЦветФона =\?сЬЦвеіа. Красный;
НоваяПолоса = Полосы.Добавить();
НоваяПолоса.Начало = 1000;
НоваяПолоса.Конец = 5000:
НоваяПолоса.ЦветФона =\?еЬЦвета.Желтый:
НоваяПолоса = Полосы.Добавить();
НоваяПолоса.Начало = 5000;
НоваяПолоса.Конец = 20000:
НоваяПолоса.ЦветФона = Web Цвета. Зел е н ы й;
Запрос = Новый Запросе
ІВЫБРАТЬ |
|
1 ПродажиОбороты.Период.
1 ПродажмОбороты.СтоимостьОборот |
|
|ИЗ |
|
1 РегнстрНакоішения.Г1родажи.Обороты(&ДатаНача;іа. &ДатаОкончания, День,) |
КАК ПродажиОбороты
1"); |
|
Запрос.УстановитьПараметрС'ДатаНачала". '2004.08.10 00 |
00:00’); |
Запрос.Установить! ІараметрС'ДатаОкончания". '2004.08.30 23:59:59'); |
ЭлсмснтыФормы.ДнаграммаПродажи.ИсточникДанных = |
Запрос
.ВыполнитьО
ВыірутитЫ); |
В результате работы данного кода будут получены данные о продажах за четыре дня августа 2004 года (в другие дни продаж не было), которые отобразятся в измерительной диаграмме четырьмя стрелками, указывающими на объем продаж:
* Отчет Отчет!
Действия » і ?J
20000
і ром I и
15 08 20IJ4
О 00 Гіи 18.08 2004 0 00 00 20 08 2004
о ии но
2208.2004
0:00:00
Просмотреть Сформировать Закрыть
<D Как вывести результат запроса в сводную диаграмму?
Для того чтобы отобразить результат запроса в сводной диаграмме, следует использовать свойство сводной диаграммы ИСТОЧНИКДЗННЫХ, а затем установить нужные значения серий, точек и ресурсов диаграммы:
Запрос = Новый Запрос)
"ВЫБРАТЬ
I ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад.
I ТоварыНаСкладахОстаткнИОбороты.Склад. Представление.
I ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура. I ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Представление.
I СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход)
КАК КоличествоПрнход,
I СУММА(ТоварыНаСкладахОстаткиИОборогы.КоличсствоОборот)
КАК КоличествоОборот,
I СУММАіТоварыНаСкладахОстагкиНОбороты. КоличествоРасход)
КАК КоличествоРасход |ИЗ
I РсгнстрНакопления.ТоварыНаСкладах.ОстаткнИОбороты КАК ТоварыНаСкладахОстаткиИОбороты
ІСГРУППИРОВАТЬ ПО I Товары Н аС кладах Остатки И Обороты .Склад.
I ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
I ТоварыНаСкладахОстаткиИОбороты.Склад.Прсдставление,
I ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Представлсние
|ИТОГИ СУММА) КоличествоПрнход),
СУ М М А) Кол н чествоОборот),
СУММА)КоличествоРасход) ПО I ОБЩИЕ,
I Номенклатура ИЕРАРХИЯ.
) Склад ИЕРАРХИЯ');
Диаграмма = ЭлементыФормы.СводнаяДиафаммаІ;
Диаграмма.ОбластьЗаголовка.Текст = "Приход товаров";
Диаірам.ча.ИсточникДанных = Запрос.Выполнить)); Диаірамча.Серии.ДобавнтьС'Номенклатура");
Диаграмма.Точки. Добавить) "Склад");
Диаграмма. Ресурсы .Добавить)" КоличествоПриход”):
В данном примере сводная диаграмма «СводнаяДиаграммаІ», расположенная в форме отчета, заполняется данными, полученными в результате выполнения запроса:

Программное добавление серий, точек и ресурсов диаграммы выполнять не обязательно - можно предоставить пользователю возможность самостоятельно разместить в сводной диаграмме данные, используя системный интерактивный диалог:

Данный диалог можно вызвать, используя пункт контекстного меню элемента управления сводная диаграмма.
Как заполнить диаграмму Ганта данными?
Создадим обработку. В диалоге основной формы разместим элемент управления Диаграмма Га ШЭ (имя элемента управления «ДГ»). В обработчик события нажатия на кнопку «Выполнить» поместим следующие строки:
ДГ = ЭлсментыФормы.ДГ;
// Установить заголовок диаграммы.
ДІ .ОбластьЗаголовка.Текст = "График дежурств”;
// Интервал будем определять самостоятельно. ДГ.АвтоОпределсниеПолногоИнтервала = Ложь;
// Установить интервал.
ДГ.УстановнтьПолныйИнтервал(НачалоМесяиа(ТекущаяДата()),
КонецМесяца(ТекущаяДатаО));
// В диаграмме будет две точки - сотрудники Петров и Сидоров...
ТочкаП = ДГ.УстановитьТочкуСТІстров");
ТочкаС = ДГ'.УстановитьТочкуС'Сидоров");
// и две серии - дежурство на вахте и дежурство в центральном офисе. СерияНаВахте = ДГ.УстановнтьСернюС'На вахте
1');
СерияВЦентре = ДГ.УстановитьСериюСВ центральном офисе");
// Задать цвета серий, отличные от цвета по умолчанию.
СерияНаВахте.Цвет = ??сЬЦвета.Синий;
СерияВЦентре.Цвет = \?еЬЦвета.СветлоЖелтый;
ПервыйДень = НачалоМесяца(ТекущаяДатаО);
// Получить значение диаграммы - дежурство Петрова на вахте.
Значение = ДГ.Г1олучитьЗначение(ТочкаІІ. СерияНаВахте);
// В значении определить новый интервал.
Интервал = Значение.ДобавитьО;
Интервал.Текст = "Работает на вахте”;
//Определить границы интервала.
Интервал.Начало = ПервыйДень;
Интервал.Конец = ПервыйДень + 10*24*60*60;
// Получить значение диаграммы - дежурство Петрова в центральном офисе. Значение = ДГ.ПолучитьЗначение(ТочкаП. СерияВЦентре);
Интерват = Значение.ДобавитьО;
Интервал.Текст = "Работает в центральном офисе";
Интервал.Начало = ПервыйДснь + 14*24*60*60;
Интервал. Конец = ГІервыйДень + 24*24*60*60;
// Получить значение диаграммы - дежурство Сидорова на вахте.
Значение = ДГ.ПолучитьЗначение* ГочкаС, Серия НаВахте);
Интервал = Значение.ДобавитьО;
Интервал.Текст = "Работает на вахте";
Интервал.Начало = ПервыйДснь + 5*24*60*60;
Интервал.Конец = ПервыйДснь + 15*24*60*60;
// Получить значение диаграммы - дежурство Сидорова в центральном офисе. Значение = ДГ.ПолучитьЗначеннеіТочкаС. Серия ВЦентре);
Интерват = Значение.ДобавитьО;
Интерваі.Текст = "Работает в центральном офисе";
Интервал. Начато = ПервыйДень + 21*24*60*60;
Интервал. Конец = ПервыйДснь + 25*24*60*60;
Для того чтобы заполнить диаграмму Ганта, необходимо создать нужные серии (в нашем случае это виды дежурств), точки (в нашем случае это сотрудники) и заполнить свойства значений диаграммы для каждой пары точка - серия. Значение диаграммы представляет собой в общем случае совокупность нескольких интервалов. В данном примере каждое значение диаграммы содержит лишь один интервал, для которого задается начало, конец и текст, выводимый в качестве подсказки при наведении курсора мыши на этот интервал.
В результате работы этого кода будет сформирована следующая диаграмма:

В реальных механизмах данные для построения, скорее всего, будут получаться из базы данных, в соответствии с этим будет меняться и алгоритм работы с диаграммой.
Как связать интервалы диаграммы Г анта?
Диаграмма Ганта позволяет устанавливать связи между различными интервалами диаграммы. Для иллюстрации этой возможности доработаем пример «Как заполнить диаграмму Ганта данными?» на странице 293.
Чтобы связать между собой интервалы дежурств каждого из сотрудников, добавим в этот пример следующий код:
// Получить значение диаграммы - дежурство Петрова на вахте.
Значение = ДГ.ПолучитьЗначеннеРГочкаП. СерняНаВахте);
// В значении определить новый интервал.
Интервал = Значение.Добавить)):
//Запомнить интервал начала связи.
СвязьИнтервалНачало = Интервал;
И Получить значение диаграммы - дежурство Петрова в центральном офисе. Значение = ДГ.ПолучитьЗначсниеСГочкаП. СерияВЦентре):
Интервал = Значение.ДобавитьО;
// Запомнить интервал окончания связи.
СвязьИнтервалКонец = Интервал;
// Связать два интервала.
Связь = СвязьИнтервалНачало.Добивить(СвязьИнтсрва.ік'онец); Связь.Цвет = \?еЬЦвета.Синин;
// Получить значение диаграммы - дежурство Сидорова на вахте.
Значение = ДГ.ПолучитьЗначение(ТочкаС, Серия НаВахте);
Интервал = Значение.ДобавитьО;
СвязьИнтервалНачало = Интервал;
// Получить значение диаграммы - дежурство Сидорова в центральном офисе Значение = ДГ.ПолучзпьЗначение(ТочкаС, СерияВЦентре);
Интервал = Значение.ДобавитьО;
СвязьИнтервалКонец = Интервал;
// Связать два интервала.
Связь = СвнзьИнгервалНачало.Добавить(СвязьИнтервал Конец); Связь.Цвет = З?еЬЦвета.Синий;
Для добавления связи необходимо выполнить метод Добавить() того интервала диаграммы, который является началом связи. В качестве параметра этого метода необходимо передать интервал диаграммы,
который будет являться окончанием этой связи. Кроме этого можно задать другие свойства связи, например цвет.
В результате будет получена следующая диаграмма:

Как обработать интерактивное изменение интервалов диаграммы Ганта?
Для того чтобы пользователь имел возможность интерактивного изменения интервалов диаграммы Ганта, необходимо свойству Редактирование нужных интервалов присвоить значение Истина:
// Получить значение диаграммы - дежурство Петрова на вахте. |
Значение = ДГ.ПолучитьЗначениеіТочкаГІ. СсрияМаВахте): |
|
// Разрешить интерактивное редактирование иіпервалоі Значеиие.Редактированне = Истина; |
. |
// Получить значение диаграммы - дежурство Петрова в цен Значение = ДГ.ПолучитьЗначеннс(ТочкаП. СерняВЦентре);
Значснис.Редактнрование = Истина; |
¦ральном офисе. |
// Получить значение диаграммы - дежурство Сидорова на вахте. |
Значение = ДГ.ПолучитьЗначение(ТочкаС. СерияНаВахте);
Значение.Редактирование = Истина; |
|
// Получить значение диаграммы - дежурство Сидорова в центральном офисе. |
Значение = ДГ.ПолучитьЗначенисіТочкаС. СерняВЦентре); Значение.Редактирование = Истина; |
|
Интерактивное изменение интервалов диаграммы Ганта приводит к
генерации события При окончании редактирования интервала.
Используя обработчик этого события, можно выполнять различные
действия, связанные с изменением интервалов. Например, можно «дискретизировать» перемещение границ интервалов, «округлив» их до нужного значения или изменить цвет связи между интервалами, если интервалы «перекрывают» друг друга:
Процедура ДГПриОкончанииРедактированияИнтервала(Элемент,
Интервал.
Отмена)
//Сгладить погрешности интерактивного перетаскивания -// округлить интервал по границе дня.
Интервал.Начало = Интервал.Начало + 3600 * 12;
Интервал.Начало = НачалоДня(Интервал.Начало);
Интервал.Конец = Интервал.Конец + 3600 * 12;
Интервал.Конец = НачатоДня(Интервал.Конец);
// Скорректировать цвета связей.
Дтя Каждого Связь Из Интервал Цикл
Если Связь.Начало.Конец <= Связь.Конец.Начало Тогда Связь.Цвет = ??еЬЦвета.Синий;
Иначе // есть пересечение интервалов - выделить красным Связь.Цвет = ??еЬЦвета. Красный.
КонецЕсли;
КонецЦикла:
КонецПроцедуры_
Если добавить этот код к примеру «Как связать интервалы диаграммы Ганта?» на странице 295, то изменение границ интервалов диаграммы станет возможным с «точностью до дня», а при частичном перекрытии связанных интервалов связь между ними будет отображаться кэасным цветом.

Как разместить непериодические метки в диаграмме Ганта?
Диаграмма Ганта позволяет размещать на шкале времени непериодические метки, которые могут использоваться для обозначения контрольных точек или произвольных событий, связанных с отображаемыми в диаграмме данными. В качестве развития примера «Как обработать интерактивное изменение интервалов диаграммы Ганта?» на странице 296, можно добавить в диаграмму две непериодические метки, которые будут обозначать события проверки дежурств, выполняемых сотрудниками:
// Установить непериодические метки - контроль дежурства.
// Создать отдельный элемент шкалы времени (для более наі лядного отображения) ЭлементМеток = ДГ.ОбластьПостроення.ШкалаВречени.Элементы. Добавит ь(); ЭлементМеток.Единица = ТипЕдиницыШкалыВремсни.День;
// Скрыть периодические метки добавленного элемента. ЭлементМсток.ОтображатьПериодичсскиеМетки = Ложь:
// Установить метку - первая проверка - 10 часов утра 9 числа.
ПерваяПроверка = ПервмйДснь + 8 * 24 * 60 * 60 + 10 * 60 * 60;
Метка = ЭлементМеток.Метки.Добавить(ПерваяІІроверка);
Метка.Текст = "Проверка";
Метка. ЦветТекста = З?еЬЦвета. Красный:
Метка.ЦветЛинии = Метка.ЦветТекста;
И Установить метку - вторая проверка - 8 часов вечера 23 числа.
Вторая Проверка = ПервыйДень + 22 * 24 * 60 * 60 + 20 * 60 * 60;
Метка = ЭлементМеток Метки.Добавить(ВтораяПроверка);
Метка.Текст = "Проверка";
Метка.ЦветТекста = З?еЬЦвета. Красный:
Метка.ЦветЛинии = Метка.ЦветТекста;
Для добавления непериодических меток мы используем дополнительный элемент шкалы времени лишь для более наглядного отображения меток. Те же самые метки можно было бы добавить и в существующий элемент шкалы времени. Также для каждой метки мы задаем текст, цвет надписи и цвет линии, которая будет отображать эту метку в диаграмме.
В результате будет получена следующая диаграмма:

Как выделить некоторые интервалы фона диаграммы Ганта?
Диаграмма Ганта позволяет выделять цветом фона произвольные интервалы. Эта возможность может использоваться, например, для «подсветки» выходных дней.
Для иллюстрации этой возможности к примеру «Как разместить непериодические метки в диаграмме Ганта?» на странице 298, можно добавить код, который выделит выходные дни другим цветом фона диаграммы:
// Выделить выходные дни другим цветом фона. Неделя = 3600 * 24 * 7:
Выходные = 3600 * 48;
МаксимальнаяДата = ПсрвыйДень + Неделя * 4; ТекущаяДата = Первый День;
Пока ТекущаиДага <- МаксимальнаяДата Цикл; Конец = НачалоНелели(ТекущаяДата):
Начало = Конец - Выходные; ДГ.ИнтервалыФона.Добавить(Начало, Конец);
ТекущаяДата = ТекущаяДата + Неделя; КонецЦикла;
Чтобы выходные дни выделить другим цветом, мы добавляем нужные интервалы к коллекции интервалов фона диаграммы. Цвет создаваемых интервалов мы не меняем - используем назначаемый по умолчанию.
В результате будет получена следующая диаграмма:

Географическая схема
Ф Как отобразить в форме файл географической схемы?
Для этого следует разместить в форме поле географической схемы (например, «ГеоСхема») и выполнить метод Пр0ЧИТЗТЬ():
Схема = ЭлементыФормы ГеоСхема;
Схема. npo4HTaTb("D:/MyGeo.geo”);
® Как отобразить в форме макет географической схемы?
Для этого следует расположить в форме поле географической схемы (например, «ГеоСхема»), а затем получить макет географической схемы (в следующем примере это один из общих макетов), и вывести его в поле в форме:
Схема = ЭлементыФормы.Г еоСхема;
Схема. Вывссти(ПолучитьОбщийМакет("ГеографичсскаяСхемаРоссин"));
(D Как изменить масштаб географической схемы?
Для этого следует установить соответствующий режим отображения географической схемы (ЗадаетсяМасштабом) и задать требуемый масштаб:
Масштаб = 100000;
Если ВвестиЗначение(Масштаб) Тогда ЭлементыФормы.ГеоСхема.ПолдержкаМасштаба =
РежимОтображенияГеографическойСхемы. ЗадаетсяМасштабом ЭлементыФормы.ГеоСхема.Масштаб = Масштаб;
КонецЕсли:
Как отобразить на географической схеме выбранный город?
Предположим, что в форме расположено поле географической схемы («ГеоСхема»), в которую выведен макет регионов России, содержащий слои «Регионы» и «Города» (такой макет, например, содержится в демонстрационной конфигурации «Географическая схема» ИТС). Требуется предоставить пользователю возможность выбрать из списка некоторый город и затем отобразить этот город на карте России. Эта задача может быть выполнена при помощи следующего кода:
Схема = ЭлементыФормы. ГеоСхема;
СпнсокГородов = Новый СписокЗначений; |
|
// Запретить перерисовку схемы на время обновления. Схема.Обновленне = Ложь; |
|
// Отобразить слой Регионы.
Схема.Слои.Регионы.Видимость = Истина; |
|
// Задать тип отображения названий городов.
СлойГорода = Схема.Слои.Города; СлойГорода.Ссрии.Название.ТипОтображения = |
|
ТипОтображенияСерииСлояГ'еоі |
рафическойСхемы.Текст; |
// Сформировать список городов и скрыть все города.
Для Счетчик = 0 По СлойГорода.Объекты.Количество() - 1 |
Цикл |
Г ород = СлойГ орода.Объекты.Получить(Счетчик); Город.Видимость = Ложь;
НазваниеГорода = Слой Города. ПолучитьЗначение( Город |
|
СлойГорода.Серии. Название); |
НазваниеРегиона = СлойГорода |
|
,ПолучитьЗначение(Город, СлойГорода.Серии.Регион); |
С иисокГо родов. Добавить! С четчнк. |
|
НазваниеГорода.Значение + " |
|
+ НазваниеРегиона.Значение 4 |
|
КонецЦикла; |
|
СлойГорода.Видимость = Истина; // Отобразить слой Города. |
СписокГородов.СортироватьІІоПредставлсннюО; ВыбранныйГород = СписокГородов.ВыбратьЭлементО; Если ВыбранныйГород о Неопределеио Тогда |
|
ГородСхемы = СлойГорода.Обьекты.Получить(Выбранн |
ыйГород.Значение); |
ГородСхемы.Видимость = Истина; // отобразить выбранный город |
КонецЕсли;
Схема.Обновление = Истина; // Обновить схему. |
|
Географическая схема
В этом примере осуществляется обход всех объектов слоя «Города», и формируется список городов, который затем открывается для выбора пользователю. После того, как пользователь выбрал город, видимость выбранного объекта устанавливается в значение Истина. Поскольку для серии «Название» задан тип отображения Текст, рядом с городом будет отображено и его название.
Как использовать таблицу значений в качестве источника данных географической схемы?
Для иллюстрации работы географической схемы с произвольным источником данных расположим в форме поле географической схемы (например «ГеоСхема») и под ним табличное поле («ИсточникДанныхГеоСхемы»), связанное с таблицей значений.
В поле географической схемы выведем макет регионов России, содержащий слои «Регионы» и «Города» (такой макет, например, содержится в демонстрационной конфигурации «Географическая схема» ИТС). Затем выполним следующий код, который создаст источник данных типа На Пересечен И И и назначит его географической схеме:
Схема = ЭлементыФормы.ГеоСхема;
Схема.Обновление = Ложь: // Запретить обновление схемы.
// Отобразить слои Регионы и Города.
Схема.Слои.Регионы.Виднмость = Истина;
СлойГорода = Схсма.Слои.Города:
СлойГорода.Вндимость = Истина;
// Добавить новую серию для отображения данных источника.
СсрияИнформацня = Схема.Слои.Города.Серии.ДобавитьС'Информапия"); СерияИнформация.Значение = "Информация";
// Сформировать таблицу значений источника данных.
ИсточникДанныхГеоСхемы.Колонки .ДобавитьС'ЗначениеГоро да"); ИсточникДанныхГеоСхемы. Колонки.ДобавнтьС'СерияИнформацня",
Новый ОписаниеТиповС’Строка"));
//Добавить "справочную" колонку в истоник данных // (нужна только для "наглядности" работы с источником). ИсточникДанныхГеоСхемы.Колонки.Добавить("НазваниеГоро да”);
// Заполнить в первой строке источника данных значение серии.
// для которой будут выводиться данные.
ИсточникДанныхГеоСхемы.ДобавитьО.СерияИнформация = "Информация":
// Задать тип источника данных
Схема.Слои.Города.ТнпОрганизацииИсточникаДанных =
ТипОрганизацииИсточникаДанныхГеографическойСхемы.НаІІересечении;
// Задать тип отображения значений серии источника данных. СлойГорода.Серии.Информация.ТинОтображения =
ТипОтображенияСерииСлояГеоі рафическойСхемы.Текст;
// Заполнить источник данных значениями всех объектов.
Для Каждого Город Из СлойГорода.Объекты Цикл Город.Видимость = Истина;
СтрокаИсточникаДанных = ИсточникДанныхГеоСхемы.Добавить(); СтрокаИсточникаДанных.ЗначениеГорода = Город.Значение: СтрокаИсточникаДанных.НазванисГорода = СлойГорода
ПолучитьЗначенис(Город, СлойГорода.Серии.Название) .Значение;
КонецЦикла;
Элемен гыФормы.МсточникДанныхГеоСхемы.Создать Колонки));
Схема.Обновленне = Истина; // Обновить поле географической схемы.
// Назначить источник данных.
СлойГорода.ИсточннкДанных = ИсточникДанныхГеоСхемы;_
Табличное поле «ИсточникДанныхГеоСхемы» иллюстрирует устройство источника данных типа На Пересечен И и. В первой колонке расположены значения объектов, а во второй - должны находиться те значения, которые должны быть отображены для этих объектов в серии «Информация». Серия, в которой должны отображаться значения, идентифицируется своим значением, которое указывается в первой строке источника данных в соответствующем столбце (в нашем случае это строка «Информация»). Последняя колонка в источник данных добавлена исключительно в «демонстрационных» целях. Этой колонке не соответствует никакая серия в слое Города, поэтому она просто игнорируется географической схемой.
Введя произвольные значения в колонку таблицы «СерияИнформация», можно увидеть, что они будут отображены для соответствующих объектов слоя «Города».
Следует учитывать, что данный пример лишь иллюстрирует работу с источником данных, поэтому он содержит для наглядности все объекты слоя Города (около 2 500 городов), что замедляет его работу. Кроме того, в реальных задачах обычно в качестве источника данных используется не таблица значений, а результат запроса, имеющий аналогичную структуру.
Администрирование
Запуск 1С:Предприятия из командной строки
ф Как запустить 1 С:Предприятие из командной строки?
Для запуска 1С:Предприятия в пользовательском режиме, в случае если база данных функционирует в файловом варианте.
“C:\Program Files\lcv8\bin\lcv8.exe" ENTERPRISE /F ОЛКонфи і'урации?Г шювые\У прТорг /N ИмяПользователя /Р Пароль
Для запуска 1С:Предприятие в режиме «Конфигуратор», в случае если база данных функционирует в файловом варианте.
"C:\Program Files\lcv8\bin\lcv8.exe" CONFIG IF 0:\Конфигурации\Типовые\УпрТорг /N ИмяПользователя /Р Пароль_
Для запуска 1 С: Предприятие в пользовательском режиме, в случае если система функционирует в клиент-серверном варианте.
"C:\Program Files\lcv8\bin\lcv8.exe" ENTERPRISE /S Сервер?База
IN ИмяПользователя /Р Пароль
Для запуска 1С:Предприятие в режиме «Конфигуратор», в случае если система функционирует в клиент-серверном варианте.
"C:\Program Files\lcv8\bin\lcv8.exe" CONFIG IF 0:\Конфигурации\Тнповые\УпрТорг /N ИмяПользователя /Р Пароль
ENTERPRISE - режим «Предприятие»
CONFIG - режим «Конфигуратор»
/F Путь к базе, функционирующей в файловом режиме /S ИмяСервера\ИмяБазы, функционирующей в клиент-серверном режиме
/N Имя пользователя /Р Пароль пользователя
Замечание: в этих и последующих примерах командная строка отформатирована (добавлен перенос на следующую строку) для повышения наглядности. В реальных примерах весь текст должен записываться в одну строку.
Как из командной строки заставить 1С:Предприятие сделать выгрузку базы данных?
В командной строке необходимо прописать следующее:
"C:\Prograin Files\lcv8\bin\lcv8.exe" CONFIG /F 0:\Конфигурации\Типовые\УпрТорг /N ИмяПользователя /Р Пароль /DumpIB сЛммя.сІІ
Как из командной строки обновить изменения текущей конфигурации в конфигурации базы данных?
В командной строке необходимо прописать следующее: |
|
|
"C:\Prograin Files\lcv8\bin\lcv8.exe" CONFIG /F [):\Конфш урации\Типовые\УпрТорг /N ИмяПользователя /Р Пароль /UpdateDBCfg |
|
|
Запуск 1С:Предприятия из командной строки
Как выполнить тестирование и исправление информационной базы без проверки ссылочной целостности в автоматическом режиме?
Для этого следует использовать режим пакетного запуска конфигуратора из командной строки:
"C:\Program Files\lcv8\bin\lcv8.exe" CONFIG /F"C:\Documents and Settings\user\My Documents\lC\DemoTrd2” Л?'Федоров (администратор)” /Р”"
/IBcheckAndRepair -Loglnlegrity
Параметр /IBcheckAndRepair позволяет выполнить тестирование и исправление информационной базы, а ключ -Loglntegrity указывает, что при проверке логической целостности не будет выполняться проверка ссылочной целостности.
Каквыполнить проверку конфигурации в автоматическом режиме с выводом результатов проверки в файл?
Для этого следует использовать режим пакетного запуска конфигуратора из командной строки:
"C:\Program Files\lcv8\bin\lcv8.exe" CONFIG /F'C:\Documents and Settings\user\My Documems\IC\DemoTrd2”
/№Федоров (администратор)" /Р""
/OutD.\my\Jog.txt
/CheckConfig -ClientServer -Client -ExtemalConnectionServer -ExtemalConnection
-Server -DistributiveModules -IncorrectReferences -ConfigLogicallntegrity -UnreferenceProcedures -HandlcrsExistence -EmptyHandlers
Параметр /Out позволяет задать имя файла, в который будут выводиться результаты проверки. Параметр /CheckConfig позволяет выполнить проверку конфигурации, при этом используются следующие ключи:
-ClientServer - Работа клиентского приложения в режиме клиент -сервер. Проверка компиляции модулей в режиме эмуляции среды клиентского приложения, выполняемого в режиме клиент - сервер.
-Client - Работа клиентского приложения. Проверка компиляции модулей в режиме эмуляции среды клиентского приложения, выполняемого в файловом режиме.
-ExternalConnectionServer - Работа внешнего соединения. Проверка компиляции модулей в режиме эмуляции среды внешнего соединения, выполняемого в режиме клиент - сервер..
-Server - Работа сервера 1 С:Предприятия. Проверка компиляции модулей в режиме эмуляции среды сервера 1 С: Предприятия.
-DistributiveModules - Поставка модулей без исходных текстов. В случае если в настройках поставки конфигурации для некоторых модулей указана поставка без исходных текстов, проверяется возможность генерации образов этих модулей.
-IncorrectReferences - Поиск некорректных ссылок. Поиск ссылок на удаленные объекты. Выполняется по всей конфигурации, включая права, формы, макеты, интерфейсы и т.д. Также осуществляется поиск логически неправильных ссылок.
-Config Logical Integrity - Проверка логической целостности конфигурации. Стандартная проверка, обычно выполняемая перед обновлением базы данных.
-UnreferenceProcedures - Поиск неиспользуемых процедур и функций. Поиск локальных (не экспортных) процедур и функций, на которые отсутствуют ссылки. В том числе осуществляется поиск неиспользуемых обработчиков событий.
-HandlersExistence - Проверка существования назначенных обработчиков. Проверка существования обработчиков событий интерфейсов, форм и элементов управления.
-EmptyHandlers - Поиск пустых обработчиков. Поиск назначенных обработчиков событий, в которых не выполняется никаких действий. Существование таких обработчиков может привести к падению производительности системы.
Запуск 1С предприятия из командной строки
Как сократить журнал регистрации программно?
Для этого следует использовать режим пакетного запуска конфигуратора из командной строки с параметром
/ReduceEventLogSize:
"C:\Program Files\lcv8\bin\lcv8.exe" CONFIG /F"C:\Documents and Settings\user\My Documents\lC\DemoTrd2" /Ы"Фелоров (администратор)" IP""
/OutD:\my\log.txt
/ReduceEventLogSize 2004-12-26 -saveAsC:\OldLog.elf_
После параметра /ReduceEventLogSize обязательно должна быть указана новая граница журнала регистрации, а ключ -saveAs позволяет указать файл, в который будут сохранены копии выгружаемых записей.
Как выгрузить модули прикладного решения в виде текстовых файлов из командной строки?
Для этого можно использовать режим пакетного запуска конфигуратора из командной строки с параметром /DumpConfigFileS:
"C:\Program Files\lcv8\bin\Icv8.exe" CONFIG /F"C:\Documents and Settings\user\My Documenls\lC\DemoTrd2' ^"Федоров (администратор)" IP""
/DumpConfigFiles "D:\1\I 1” -Module
После параметра /DumpConfigFiles указывается каталог, в котором будут находиться выгруженные файлы, а ключ -Module указывает, что необходимо выгружать только модули, содержащиеся в конфигурации.
Как загрузить в прикладное решение файлы справки, сохраненные в формате htm?
Для этого можно использовать режим пакетного запуска конфигуратора из командной строки с параметром /LoadConfigFiles:
"C:\Program Files\lcv8\bin\lcv8.exe" CONFIG /F"C:\Documents and Settings\user\My Documents\lC\DcmoTrd2' /N''Федоров (администратор)" /Р"“
/LoadConfigFiles "D:\l\ll" -Help_
После параметра /LoadConfigFiles указывается каталог, в котором находятся загружаемые файлы, а ключ -Help указывает, что загружать нужно только файлы справки.
Разное
ф Как поменять значение рабочей даты?
Прежде чем устанавливать значение рабочей даты на «УстанавливаемаяДата», необходимо убедится, что рабочая дата не определяется системной датой компьютера:
Если ИспользованнеРабочейДаты = РежимРабочейДагы.Назначать Тогда РабочаяДата = УстанавливаемаяДата;
Иначе
СообщитьС'Рабочая дата не будет сменена.
[Необходимо сначала в меню Сервис-Парамстры-Обшая |снять флажок - Использовать текущую дату компьютера ")
КонецЕсли;
Проверка осуществляется для свойства глобального контекста ИспользованиеРабочейДаты на равенство значению Назначать системного перечисления Режим РабочейДаты. В случае выполнения условия назначаем значение свойству глобального контекста РабочаяДата.
Какустановить/снять монопольный режим?
Установленный монопольный режим позволит пользователю быть единственным пользователем базы, пока он установлен. Однако сам монопольный режим возможно установить только в том случае, если на момент установки пользователь был единственным:
Попытка
УстановитьМонопольныйРежнм(Истина);
Исключение
ПредупрсждениеС'К базе подключены пользователи.
[Монопольный режим установить невозможно!", 7).
КонецПопыткн:
Как видите, если применение процедуры работы с информационной базой УстановитьМонопольныйРежим() приводит к ошибке приходится с этим смириться. Хотя если захотите обеспечить выход других пользователей из системы - в настоящем издании есть пример
того, этого добиться: «Как принудительно завершить работу всех пользователей информационной базы в клиент-серверном варианте работы?» на странице 320.
Кроме самой установки монопольного режима можно еще, например, убедиться, что в текущий момент работа идет в монопольном режиме:
Если МонопольныііРежимО Тогда СообщитьС’Монополыіын режим установлен"); КонецЕсли;
Или же снять монопольный режим:
УсгановнтьМонопольныйРсжнм(Ложь);
(D Как внести запись в журнал регистрации?
Основные события системы (запись, удаление объектов и т.п.) при установках соответствующей политики ведения журнала регистрации заносятся туда автоматически. Однако есть еще возможность регистрации дополнительных действий.
Например, приведенный ниже код позволит регистрировать факты обращения пользователя к отчету «Рапорт руководителя». Его надо лишь разместить в соответствующем обработчике события.
ЗаписьЖурналаРегисграцин("ОтчетныеДанные. Просмотр",
УровеньЖурналаРеі истрацин. Информация Метаданные)),
ДатаКон,);
В качестве параметров можно указывать:
• событие (строковое описание, допустимо использование «.»);
• уровень важности события (будет отображено соответствующей пиктограммой). Тип значения - элемент системного перечисления УровеньЖурналаРегистрации;
• объект метаданных. В нашем случае определили его посредством соответствующего метода;
• данные. Для указания ссылок на объекты, с которыми связано данное событие. Например, на конкретный документ или элемент справочника. В нашем случае - указали переменную содержащую дату формирования отчета;
• комментарий.
ф Как получить данные о зарегистрированных пользователях информационной базы?
Данная задача может возникать при выгрузке подобных данных в другую информационную базу, или при первичном заполнении справочника «Пользователи».
Выборка = ПользователиИнформационнойБазы.ПолучитьПользователеШ):
Для Кажлого Элемен (Массива Из Выборка Цикл ИмяПользователя = ЭлементМассива.Имя;
ПолноеИмяПользователя = ЭлементМасснва.ПолноеИмя;
ЕстьПароль = ЭлсмснтМассива.ПарольУстановлеи:
Роли = ЭлсментМассива.Роли:
Для Кажлого Роль Из Роли Цикл ИмяРоли = Роль.Имя;
КонецЦикла;
КонецЦикла;
В указанной процедуре работа по получению списка пользователей начинается с обращения к свойству глобального контекста
ПользователиИнформационнойБазы. Метод
ПолучитьПользователейО возвращает массив объектов
ПользовательИнформационнойБазы, который обходится потом в цикле.
(D Как определить общую системную информацию?
Получить подобное предупреждение:

можно посредством такого кода:
Инфо = Новый Системная! Інформация;
Текст = "Версия ІС:Предприятия 8.0: " + Инфо.ВерсияПриложения;
Текст = Текст + Символы.11C + "Конфигурация: ” + Метаданные.Синоним;
Текст = Текст + Символы.ПС + "Поставщик: " + Метаданные.Поставщик;
Текст = Текст + Символы.ПС + "Операционная система: " + Инфо.ВерсияОС:
Текст = Текст + Символы.ПС +
"Оперативная память (МБ): " + Инфо.ОиеративнаяПамять;
Текст = Текст + Символы.ПС + "Процессор:" + Инфо.Процессор;
Предунреждение(Текст,,
"ДАННЫЕ ТЕКУЩЕГО КОМПЬЮТЕРА И КОНФИГУРАЦИИ"):
Создаем конструктором новый объект СистемнаяИнформация. Считываем из него версию приложения, версию операционной системы, данные об оперативной памяти и процессоре. Данные о конфигурации считываем из глобального контекста, объект Метаданные.
Как программно добавить пользователя в информационную базу?
При переносе данных из одной информационной базы в другую может возникнуть необходимость перенести и пользователей информационной базы. Для этого можно воспользоваться свойством глобального контекста ПользователиИнформационнойБазы:
Новый Пользователь = ПользователпИнформационнойБазы.СоздагьПользователяО НовыйПользователь.Имя = "Имя”; .
НовыйПользователь.ПолноеИмя = "Фамилия Имя Отчество"; НовыйПользователь.АутентифнкацияСтандартная = Истина; НовыйГІользователь.ОсновнойИнтерфейс = Метаданные
.Интерфейсы
.Администратор;
НовыйПользователь.Пароль = "пароль";
НовыйПользоватсль.Роли.Добавить(Метаданные.Роли. Администратор); НовыйПользователь.ПоказыватьВСпискеВыбора = Ложь; НовыйПользовагель.Язык = Метаданные.Языки.Русский; НовыйПользователь.Записа і ь();
Следует отметить, что в свойство Пароль можно только записать новый пароль, прочитать записанный (определенный) ранее нет возможности.
Замечание: добавление новых пользователей в информационную базу может осуществлять пользователь, обладающий административными правами. Если административные права у пользователя отсутствуют - он может изменить только ограниченный набор сведений о себе.
Для того чтобы предоставить, например, менеджеру, не имеющему административных прав, возможность добавления новых пользователей с правами менеджера, можно поступить следующим образом.
Создать обработку, с помощью которой менеджер будет задавать имя, пароль, набор ролей и другие свойства нового пользователя. Однако запись нового пользователя выполнять не на клиенте, а на сервере, передав нового пользователя в качестве параметра в процедуру привилегированного модуля:

В этом случае система не будет выполнять проверку прав пользователя, поэтому о проверке необходимых прав нужно позаботиться самостоятельно. Например, процедура привилегированного модуля может выглядеть следующим образом:
Процедура ЗалисатьНовогоПольэователя(НовыйПользова |
ель) Экспорт |
// Проверить наличие роли Администратор у нового пол |
•зоватсля. |
РольАдминистратор = Метаданные.Роли.Администрато| Если НовыйІ1ользователь.Роли.Содержит(РольАдмннис |
к
гратор) Тогда |
СообщитьС'Добавление пользователя с адмииистратив |
іыми правами |
Ізапрешено."); |
|
Иначе // у нового пользователя нет роли Администратор |
|
// Проверить, что текущий пользователь обладает прав И или Администратора
Если РольДоступнаІ РольАдминистратор) ИЛИ |
імн Менеджера |
РольДоступна(Мегаданныс.Ролн.Менсджер) Тоі |
іа |
// Выполнить запись новою пользователя.
Новый П ол ьзовател ь.Зан исать(); |
|
Иначе
СообщитьС'Недостаточно прав доступа для добавлеі КонсцЕсли; |
ия пользователя."); |
КонецЕсли: |
|
КонецПроцсдуры |
|
Если выполняется попытка добавить нового пользователя с административными правами - выдается запрет. Если набор ролей нового пользователя не содержит роль «Администратор» проверяется, является ли текущий пользователь менеджером или администратором -и если это так, то выполняется запись нового пользователя. В противном случае выдается сообщение об отсутствии прав доступа.
Как создать собственный лог-файл для записи результатов работы внешней обработки?
Для этого можно использовать объект ЗаписьФаЙЛЗ, который позволяет выводить текстовые строки в указанный файл:
ФайлРепістрации = Новый 3aiiHCbTeKCTa("C:\LogFile.txt".
КоднровкаТексіа.АЫ.ЧІ,
Истина);
ФайлРепістрации.Запнсать( "Первое сообщение" + Символы.IІФ); ФайлРегистрации.ЗаписатьС'Второе сообіцение”+ Символы.ПФ);
Файл Регистрации .ЗакрытьО:
При создании нового объекта ЗаписьТекста в качестве четвертого параметра конструктора указывается значение Истина, что говорит о том, что содержимое файла будет сохранено, если файл уже существует.
Как в форме отобразить список пользователей, которые работают с данной информационной базой?
Для этого можно расположить в форме табличное поле (например, с именем «Пользователи»), и воспользоваться методом глобального контекста ПолучитъСоединенияИнформационнойБазы(), который возвращает массив, состоящий из описаний соединений с текущей информационной базой:
МассивСоединений = ПолучнтьСоединенняИнформационнойБазы!);
Колонки = Пользователи.Колонки;
Колонки.ДобавитьСПользователь".,, 10);
Колонки.Добавить!"Приложение",,, 10);
Колонки.ДобавитьС'НачалоРаботы",,, 10);
Колонки.Добавить! "Компьютер",,. 10);
Колонкн.ДобавитьС'Сосдиненнс",., 10);
Для Каждого Соединение из МассивСоединений цикл НоваяСтрока = Полыователи.Добави іь();
НоваяСтрока.Комньютер = Соединение.ИмяКомпыогера; НоваяСтрока.Прнложение = Предс і авленнеі I риложенп я! Соединение
НмяПриложення);
НоваяСтрока.НачалоРаботы = Соединение.НачалоСеанса; НоваяСтрока.Соединение = Соединение.НомерСоединения;
НоваяСтрока.Пользователь = Соединение.Пользователь.Имя;
КоиецЦикла;
Э.тементыФормы.Пользователи.СоздатьКотонкиО;
Как выгрузить журнал регистрации в XML-формате?
Для анализа событий, происходивших при работе прикладного решения (например, с использованием консоли анализа журнала регистрации) может потребоваться выгрузка журнала регистрации в формате XML.
Выгрузка всего журнала может быть выполнена следующим образом:
Выі рузитьЖу риал Регистрации! "C:\log.xml");
Если требуется, например, выгрузить только события, связанные с определенными пользователем (пользователями), можно в форме расположить список (например «СписокПользователей»), заполнить его имеющимися пользователями:
Пользователи = I Іольюватели Информационной базы. Получить! ІользователейО;
Для Каждого Пользователь из Пользователи цикл НовыйЭлемент = СпнсокПользователей.ДобавитьО;
НовыйЭлемент.Пометка = Истина;
НовыйЭлемент.Значенне = Пользователь;
НовыйЭлемент.Представление = Пользователь.Имя;
КонецЦикла;
А затем, отметив нужных пользователей, выгрузить только те записи журнала регистрации, которые относятся к выбранным пользователям:
Массив = Новый Массив;
Дтя Каждого Пользователь из СписокПользователей Цикл
Если Пользователь.Пометка Тогда Массив. Добавить(Пользователь);
КонецЕсли;
КонецЦикла;
СтруктураФильтра = Новый Структура; СтруктураФильтра.ВставитьС'Пользователь". Массив); ВыгрузитьЖурналРегистращш("С:\1о§.хтГ.
СтруктураФильтра,
"Дата, Пользователь, ПредставлениеСобытия");
Как принудительно завершить работу всех пользователей информационной базы в клиент-серверном варианте работы?
Для этого можно воспользоваться возможностью программного доступа к серверу 1С:Предприятия. Нужно создать СОМ-коннектор и выполнить метод ConnectServer(), который позволяет подключиться к указанному серверу 1С:Предприятия.
Затем следует аутентифицироваться с правами администратора в выбранной информационной базе, получить все клиентские соединения этой базы и разорвать их:
Коннектор = Новый СОМОбъект("?8.СОМСоппесЮг");
Сервер = KoHHeKTop.ConneclServerC'TeslServer");
И Аутентифицироваться с административными правами в нужной базе. Сервер. АіІііАиІйеМісаііопС'Администратор","");
// Создать объект нужной информационной базы.
ИнформационнаяБаза = CepBep.CreatelnfoBaselnfoO:
Информационная База.Name = TestBasc”;
// Получить соединения базы.
Соединения Базы = Сервер.Се(ІВСошіесІіопя(ИнформационнаяБаза);
// Разорвать соединения клиентских приложений.
Для Каждого Соединение Из СоединенияБазы Цикл Сервер, ПіясоппесКСосдинение);
КонецЦикла:
Интеграция
Текстовый файл
® Как выгрузить данные из справочника в текстовый файл?
Текст = Новый ТскстовыйДокумснт;
Выборка = Справочники.Номенклатура.ВыбратьО;
Пока Выборка.СледующийО Цикл Стр = СтрЗаменить(Выборка. Наименование, Символ(34), "%квч%"): Код = Строка(Выборка.Код) + Символ(34); Текст.ДобавигьСтроку(Код + Стр);
КонецЦикла;
TeKCT.3amicaTb("c:\lemp\texI.txt");
В строке текста значения реквизитов справочника разделяются символом кавычка. Его можно получить, например, используя функцию Символ(34). В случае если символ разделителя (в данном случае -кавычка) может встречаться в выгружаемых данных, то перед помещением в строку меняем этот символ на заранее определенную комбинацию символов. В нашем случае это «%квч%». Считается, что подобная комбинация символов не может встретиться в данных.
(D Как загрузить данные из текстового файла?
Текст = Новый ТекстовыйДокумент;
Текст. Прочитать!''e:\temp\text.txl");
Для НомерСтрокн = I По Текст.КоличествоСтрокО Цикл Стр = Текст.ПолучитьСтроку(НомерСтроки);
Позиция = Найти(Стр, Символ(34));
Код = Сред(Стр. 1, Позиция-1); прНаименование = Сред(Стр. Позиция + I):
Наименование = СтрЗаменитьІпрНаименование, "%квч%", Символ(34));
Сообшить(Код + + Наименование);
КонецЦикла;
При загрузке ориентируемся на используемый разделитель значений (это кавычка). После получения значения делаем обратное преобразование для разделителя (при выгрузке данных кавычку, встречающуюся в выгружаемых строках, заменяли на комбинацию символов «%квч%»)
Работа с текстом. Модель последовательного доступа
Если в предыдущем примере текстовый документ загружался полностью, то в следующих примерах документ загружается «построчно». Это позволяет при работе с файлами больших размеров значительно уменьшить время выполнения задачи.
Запись данных в файл:
Путь = "c:\temp\text.txt";
Текст = Новый ЗаписьТекста(Пугь, КодировкаТекста.ІЛТв): Выборка = Справочники.Номенклатура.Выбрать!);
Пока Выборка.СледующийО Цикл Текст.ЗаписатьС троку( Выборка. Наименование); КонецЦикла;
Текст.За крыть!);
Текстовый файл
Чтение данных:
Путь = "c:\temp\text.txt";
Текст = Новый ЧтениеТекста(Путь, КоднровкаТекста.1)ТН8): Стр = Текст. ПрочитатьСтрокуО;
Пока Стр о Неопределено Цикл Стр = Текст.ПрочитатьСтрокуО;
Сообшнть(Стр);
КонецЦикла;
XML
ф Как из одной базы перенести документ в другую базу?
Необходимо экземпляр документа «РеализацияТоваровУслуг» (ссылка на который выбирается в диалоге создаваемой обработки) перенести в другую базу данных. Структура конфигураций идентична. Справочники (и другие сопутствующие объекты) синхронизированы по значениям внутренних идентификаторов.
Для выгрузки потребуется выполнить следующий фрагмент кода:
// Выгрузить в файл xml.
ЗаписьХМЬ=Новый ЗаиисьХМЦ); ЗаписьХМЬ.(>ткрытьФай.'[( "c:\doc. xml"); ЗаписьХМІ..ЗаписатьНачалоЭлемента("ІіооГ);
// Получить объект по ссылке. ВыгружаемынОбъект=Документ.ПолучитьОбъектО:
// С помощью средств сериализации записать объект в файл ЗаписатьХМЦЗапнсьХМЬ.ВыгружасмыйОбъект):
ЗаписьХМи.ЗаписатьКонец'ЗлемснтаО;
ЗаписьХМЬ.ЗакрытьО;
При выгрузке создаем элемент «Root» исходя из соображений, что в xml-документе должен быть только один корневой узел, а в общем случае (но не в нашем) выгружаться может не один объект.
Для загрузки выгруженного значения используем следующий фрагмент кода:
ЧтениеХМЕ=Новый ЧгениеХМЦ);
ЧтениеХ ML.Открыт ьФаГі.і("с:?1ос.хтІ")'.
//Текущим становится элемент Root.
Чтсн исХ М L. П рочитать!);
// Текущим становится элемент с документом. ЧтеннеХМЬ. Прочитать!):
// Проверить сможет ли с данным значением "справиться' // система сериализации в данной базе.
Если Возможное!ьЧтенияХМЕ(ЧтениеХМЕ) Тогда
// Получить ДокументОбъект.РеализацияТоваровУслуг
ЗагружаемыйОбъект=ПрочитатьХМЬ(ЧтениеХМЬ);
ЗагружаемыйОбъект.ЗаписатьО;
КонецЕсли:
ЧтеннеХМЕ. Закрыть!):
Как можно сформировать XML-документ произвольной структуры?
Путь к формируемому XML-документу указан в переменной «ПутьКФайлу». Используется модель последовательного доступа (работа осуществляется только с одним текущим узлом).
Запись = Новый ЗаписьХМЬ;
Запись.ОткрытьФайл(ПутьКФайлу);
Запись.ЗаписатьОбъявлениеХМЦ);
Запись.ЗаписатьНачалоЭлементаС’Корневой");
Запись.ЗаписатьАтрибут("Справочник“, "Номенклатура"): Запись.ЗаписатьКомментарийС'Краткая информация о номенклатуре"): Выборка = Справочники.Номенклатура.ВыбратьИерархическиО:
Пока Выборка.СледующийО Цикл
Если Выборка.ЭтоГруппа Тогда Продолжить;
КонецЕсли;
Запись. ЗаннсатьНачалоЭлемента( "Элемент"); Запись.ЗанисатьЛтрибутС'Код", Строка(Выборка.Код)); Запись.ЗаписатьАтрибут("Артикул", Строка(Выборка.Арт икул)); Запись.ЗаписатьТекст(Выборка.Наименование); Запись.ЗаписатьКонецЭлементаО:
КонецЦикла;
Запись.ЗаписатьКонецЭлементаО:
Запись.ЗакрытьО:
В результате будет получен файл вида (просмотр в Internet Explorer):
<?xml version="l,0" ?>
<Корневой Справочник="Номвнклатура
м>
с:Элемент Код=”6” Артикул=”1234”>В|д (капилярная)</Э.г <Элемент Код=”3” Артикул---” 1235”>Паркер "Golg"</3J18M«
<Элемент Код=”5” Артикул=”1 236”>Шариковая обычная <Элемент Код=”7” Артикул=
п1237”>КоИ!пог м</Элемент>
< Э л е м е н т К о д=” 8” А р т и к у л=
!! 12 3 8” > Ко h i n о г т </Эл емент >
< Э л е м ент К од=” 4
й А р т и к у л=
і! 12 3 9” > Ко h i n о г т м </Э л е м е н т >
<Элемент Код=”14” Артикул=”1240”>Агс!о TL 1000 ЕХ-1</
<Элемент Код=”15” Артикул=*1241
я>1т1в5Н: WS 105 ТХ</
<Элемент Код=”11
!! Артикул=
Н1242
Н>ВО8СН KGS 3760 1Е<
< Элемент К од=”12” ApTSiK’
nn=”1243”>ELECTROLUX ER 900 </Корневой>
Можно сказать, что XML-документ состоит из набора элементов. Элемент можно упрощенно представить в виде совокупности структурных единиц:
< НачалоЭлемента
ИмяАтрибута=Значение ИмяАтрибута=Значение......>
Текст
< КонецЭлемента>
Создание XML-документа с помощью объекта 3anMCbXML производится путем помещения в строгой последовательности (иначе будет нарушена структура) «частей» узлов.
Как сформировать XML-документ в строку?
Требуется, чтобы запись XML-документа производилась не в файл, а в строку. Рассмотрим пример:
Запись = Новый ЗаписьХМЦ);
Запись.УстановитьСтрокуО:
Занись.ЗаписатьОбъявлениеХМЬО;
Запись.ЗаписатьНачалоЭлемента( "Корневой"): Запись.ЗалнсатьАтрибутС'Справочник", "Номенклатура"); Запись.ЗаписатьКомментарийГ'Краткая информация о номенклатуре") Выборка = Справочники. Номенклатура. ВыбратьИерархичсскиО;
Пока Выборка.СледуюшийО Цикл
Если Выборка.'ЗгоГруппа Тогда Продолжить;
КонецЕсли;
Запись.ЗаписатьНачалоЭлементаСЭлсмент");
Запись.ЗаписатьАтрибут("Код", Строка(Выборка.Код)); Занись.ЗапнсатьАтрибутС’Артикул", Строка( Выборка. Артикул)); Запись.ЗаннсатьТекст( Выборка. Наименование);
Запись. ЗаписатьКонецЭлементаО;
КонецЦикла:
Запись.ЗаписагьКонсцЭлементаО;
Стр = Запись.Закрыть;);
Сообщить(Стр);_
Для вывода X ML-доку мента в строку после создания объекта ЗаписьХМЦ необходимо использовать метод УстановитьСтроку(). Только в этом случае метод Закрыть() вернет строку, которая будет содержать сформированный X ML-документ.
Как можно обмениваться данными, используя XML-сериализацию через файлы других форматов?
Под XML-сериализацией понимается возможность записи или чтения данных из 1С:Предприятие 8.0 в (из) XML-документ. Но фактически при выгрузке данных выгружаемое значение агрегатного типа можно посредством сериал изации преобразовывать в фрагмент XML и сохранять в файлах произвольных форматов как строковое.
Необходимо выгрузить экземпляр документа, ссылка на который находится в переменной «СсылкаНаДокумент» в текстовый файл:
3anncbXML = Новый ЗаписьХМЦ); ЗаписьХМЦУстановитьСтрокуО:
Данные = СсылкаНаДокумент.ПолучитьОбъектО: ЗаписатьХМИ ЗаписьХМЦ Данные): ТекстСообщсния = ЗаписьХМЦЗакрытьО;
Текст = Новый ТекстовынДокумент;
Текст.УстановитьТекст(ТекстСообщения):
Тскст.Записать(ПутьКФайлу);
Метод УстановитьСтрокуО устанавливает режим вывода данных не в XML-файл, а в строку (строка возвращается при выполнении метода
Закрыть()).
В другой базе необходимо загрузить данные из полученного текстового файла:
Текст = Новый ТекстовынДокумент; Текст.ІІрочитать(ПутьКФайлу);
Ч гениеХМІ. = Новый ЧтениеХМЦ);
ЧтениеХМ ЦУстановитьСтроку (Текст. ПолучитьТекстО);
Если ВозможностьЧтенняХМЦЧтениеХМЬ) Тогда Данные = ГІрочитатьХМЦЧтеннеХМІЛ;
Данные.Записать)):
КонецЕсли;
Следует отметить, что данный механизм будет работать в том случае если документ в базе данных источника и приемника имеет абсолютно одинаковую структуру.
Как можно загрузить XML документ произвольной структуры?
Содержание раздела