Список работ

1С:Предприятие. Географическая схема

Содержание

Введение

Объект конфигурации 1С:Предприятие используется для отображения объемов продаж в виде круговых диаграмм, размещаемых на карте Российской Федерации. Круговые диаграммы строятся по данным, хранимым регистром оборотов Продажи, пополняемым в результате проведения одноименного документа.
В документе фиксируется контрагент, а в табличной части документа – реализованные товары. Покупатель товаров берется из справочника Контрагенты, а товары – из справочника Номенклатура.
Справочник Контрагенты снабжен реквизитом Город, выбираемым из справочника Города, подчиненного справочнику Республики.
Таким образом, для демонстрации круговых диаграмм на карте РФ необходимо создать конфигурацию, имеющую следующие объекты:

Чтобы не отвлекаться от основной цели – демонстрации географической схемы, все объекты конфигурации создаются предельно простыми.
Для заполнения справочников и генерации документов создаются соответствующие обработки.
Дополнительно формируется отчет о продажах (в виде табличного документа), а также приводятся примеры употребления некоторых методов и обработчиков событий объекта Географическая схема и его подобъектов.
С целью снижения объема выводимых и обрабатываемых данных справочник Регионы замещается справочником Республики, содержащим названия республик РФ.
Кроме того, формулируется задача для последующей проработки, предусматривающая создание двух слоев (shape-файлов) географической схемы, их импорт в 1С, создание 1С-конфигурации, подобной вышеописанной, и воспроизведение гистограмм на одном из слоев географической схемы, построенной на основе упомянутых выше shape-файлов.

Тестовая конфигурация

Справочники и заполнение справочников

Справочник Республики

Справочник Республики имеет два реквизита:

В справочник вводятся названия и коды республик РФ из файла rpblcs.txt (после решетки следует код республики):

Адыгея # 0100000000000
Башкортостан # 0200000000000
Бурятия # 0300000000000
Алтай # 0400000000000
Дагестан # 0500000000000
Ингушетия # 0600000000000
Кабардино-Балкарская # 0700000000000
Калмыкия # 0800000000000
Карачаево-Черкесская # 0900000000000
Карелия # 1000000000000
Коми # 1100000000000
Марий Эл # 1200000000000
Мордовия # 1300000000000
Саха /Якутия/ # 1400000000000
Северная Осетия - Алания # 1500000000000
Татарстан # 1600000000000
Тыва # 1700000000000
Удмуртская # 1800000000000
Хакасия # 1900000000000
Чеченская # 2000000000000
Чувашская - Чувашия # 2100000000000

Ввод данных из файла обеспечивает следующий код:

Процедура КнопкаВыполнитьНажатие(Кнопка)
 дК = метаданные["справочники"]["Республики"].длинаКода;
 если дК <> 13 тогда
  предупреждение("Плохая длина кода");
  возврат;
 конецЕсли;
 м = "C:\rpblcs.txt";
 т = новый текстовыйДокумент;
 т.Прочитать(м);
 для к = 1 по т.КоличествоСтрок() цикл
  с = т.ПолучитьСтроку(к);
  п = найти(с, " # ");
  кд = сред(с, п + 3);
  если справочники.Республики.НайтиПоКоду(кД).Пустая() тогда
   р = лев(с, п - 1);
   сообщить(р + " " + кд);
   бкт = справочники.Республики.СоздатьЭлемент();
   бкт.код = кд;
   бкт.Наименование = р;
   бкт.Записать();
  конецЕсли;
 конецЦикла;
КонецПроцедуры

Форма списка заполненного справочника приведена на рис. 1.

Форма списка справочника Республики

Рис. 1. Справочник Республики после загрузки данных

Справочник Города

Справочнику Республики подчинен справочник Города с реквизитами:

Справочник заполняется данными из файла cts.txt, приведенного в прил. П1.
Каждая строка файла содержит название города республики РФ и после решетки его код, например:

Майкоп # 0100000100000
Адыгейск # 0100000200000
Уфа # 0200000100000

Республика-владелец города находится по первым двум символам кода города.
Заполнение справочника данными файла cts.txt обеспечивает следующий код:

процедура КнопкаВыполнитьНажатие(Кнопка)
 очиститьСообщения();
 дК = метаданные["справочники"]["Города"].длинаКода;
 если дК <> 13 тогда
  предупреждение("Плохая длина кода");
  возврат;
 конецЕсли;
 м = "C:\cts.txt";
 т = новый текстовыйДокумент;
 т.Прочитать(м);
 л = 0;
 для к = 1 по т.КоличествоСтрок() цикл
  с = т.ПолучитьСтроку(к);
  п = найти(с, " # ");
  кд = сред(с, п + 3);
  если справочники.Города.НайтиПоКоду(кД).Пустая() тогда
   кд2 = лев(кд, 2);
   ндн = ложь;
   // Поиск республики
   в = справочники.Республики.Выбрать();
   пока в.Следующий() цикл
    если лев(в.код, 2) = кд2 тогда
     бкт = справочники.Города.СоздатьЭлемент();
     бкт.Владелец = в.Ссылка;
     ндн = истина;
     прервать;
    конецЕсли;
   конецЦикла;
   // Найдена
   если ндн тогда
    грд = лев(с, п - 1);
    сообщить(грд + " " + кд);
    бкт.код = кд;
    бкт.Наименование = грд;
    бкт.Записать();
    л = л + 1;
   конецЕсли;
  конецЕсли;
 конецЦикла;
конецПроцедуры

Города республики Адыгея показаны на рис. 2.

Форма списка справочника Города

Рис. 2. Фрагмент справочника Города после загрузки данных

Данные в файлы rpblcs.txt и cts.txt выгружены из российского классификатора городов.

Справочник Контрагенты

Справочник Контрагенты имеет 3 реквизита:

Заполнение справочника обеспечивает следующий код:

// Формирует код контрагента
// Например, вернет 000000007, если к = 7
функция нКД(к, дК)
 кД = строка(к);
 д = стрДлина(кД);
 пока д < дК цикл
  кД = "0" + кД;
  д = стрДлина(кД);
 конецЦикла;
 возврат кД;
конецФункции

процедура КнопкаВыполнитьНажатие(Кнопка)
 очиститьСообщения();
 дК = метаданные["справочники"]["Контрагенты"].длинаКода;
 // Число генерируемых записей
 вс = 100;
 // Получим таблицу ссылок на города
 з = новый запрос;
 з.Текст = "выбрать ссылка из справочник.Города";
 тз = з.Выполнить().Выгрузить();
 // Число элементов в справочнике Города
 кГрдв = тз.Количество();
 кГрдв = кГрдв - 1;
 ГСЧ = Новый ГенераторСлучайныхЧисел;
 для к = 1 по вс цикл
  кд = нКД(к, дК);
  если справочники.Контрагенты.НайтиПоКоду(кД).Пустая() тогда
   бкт = справочники.Контрагенты.СоздатьЭлемент();
   бкт.код = кД;
   бкт.наименование = "Кнт" + к;
   бкт.город = тз[ГСЧ.СлучайноеЧисло(0, кГрдв)][0];
   бкт.Записать();
  конецЕсли;
 конецЦикла;
конецПроцедуры

Форма списка справочника приведена на рис. 3.

Форма списка справочника Контрагенты

Рис. 3. Заполнен справочник Контрагент

Справочник Номенклатура

Справочник Номенклатура имеет 3 реквизита:

Элементы справочника разбиты на 3 группы:

Заполнение справочника обеспечивает следующий код:

// Формирует код номенклатуры
// Например, вернет 000000037, если к = 37
функция нКД(к, дК)
 кД = строка(к);
 д = стрДлина(кД);
 пока д < дК цикл
  кД = "0" + кД;
  д = стрДлина(кД);
 конецЦикла;
 возврат кД;
конецФункции

процедура КнопкаВыполнитьНажатие(Кнопка)
 очиститьСообщения();
 дК = метаданные["справочники"]["Номенклатура"].длинаКода;
 вс = 100;
 ГСЧ = Новый ГенераторСлучайныхЧисел;
 // Генерация номенклатуры
 для к = 1 по вс цикл
  кд = нКД(к, дК);
  если справочники.Номенклатура.НайтиПоКоду(кД).Пустая() тогда
   бкт = справочники.Номенклатура.СоздатьЭлемент();
   бкт.код = кД;
   бкт.наименование = "твр" + к;
   бкт.цена = ГСЧ.СлучайноеЧисло(5, 15) * 100;
   бкт.Записать();
  конецЕсли;
 конецЦикла;
 // Формирование групп номенклатуры
 мс = новый массив(3);
 мс[0] = "Дешевые";
 мс[1] = "Средние";
 мс[2] = "Дорогие";
 для к = 0 по 2 цикл
  если справочники.Номенклатура.НайтиПоНаименованию(мс[к]).Пустая() тогда
   бкт = справочники.Номенклатура.СоздатьГруппу();
   бкт.наименование = мс[к];
   бкт.Записать();
  конецЕсли;
 конецЦикла;
 // Распределяем номенклатуру по группам
 в = справочники.Номенклатура.Выбрать();
 пока в.Следующий() цикл
  если в.ЭтоГруппа тогда продолжить конецЕсли;
  если в.Родитель.Пустая() тогда
   бкт = в.ПолучитьОбъект();
   если в.цена < 800 тогда
    к = 0;
   иначеЕсли в.цена < 1200 тогда
    к = 1;
   иначе
    к = 2;
   конецЕсли;
   бкт.Родитель = справочники.Номенклатура.НайтиПоНаименованию(мс[к]);
   бкт.Записать();
  конецЕсли;
 конецЦикла;
конецПроцедуры

Форма списка справочника приведена на рис. 4.

Форма списка справочника Номенклатура

Рис. 4. Фрагменты группы "Средние" справочника Номенклатура

Регистр и документ Продажи

Регистр

Регистр оборотов Продажи имеет следующие измерения и ресурсы.
Измерения:

Ресурсы:

Регистр в результате проведения документа Продажи фиксирует проданные товары в разрезе городов, запоминая количество и сумму торговой операции.
Форма списка регистра приведена на рис. 5.

Форма списка регистра Продажи

Рис. 5. Регистр Продажи

Документ

Документ Продажи имеет табличную часть Товары и один реквизит:

Контрагент – СправочникСсылка.Контрагенты.

Реквизиты табличной части Товары:

Форма документа показана на рис. 6.

Форма документа Продажи

Рис. 6. Документ Продажи

При изменении номенклатуры в поле Цена табличной части документа подставляется значение из справочника Номенклатура:

Процедура ТоварыНоменклатураПриИзменении(Элемент)
 тс = элементыФормы.Товары.ТекущаяСтрока;
 тс.цена = тс.номенклатура.цена;
КонецПроцедуры

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

Процедура ОбработкаПроведения(Отказ, Режим)
 Движения.Продажи.Записывать = Истина;
 Движения.Продажи.Очистить();
 Для Каждого ТекСтрокаТовары Из Товары Цикл
  Движение = Движения.Продажи.Добавить();
  Движение.Период = Дата;
  Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
  Движение.Контрагент = Контрагент;
  Движение.Количество = ТекСтрокаТовары.Количество;
  Движение.Сумма = ТекСтрокаТовары.Цена * ТекСтрокаТовары.Количество;
 КонецЦикла;
КонецПроцедуры

Генерация документов Продажи

Начальное заполнение регистра Продажи выполняется в результате генерации и проведения одноименных документов:

процедура КнопкаВыполнитьНажатие(Кнопка)
 очиститьСообщения();
 если документы.Продажи.Выбрать().Следующий() тогда
  предупреждение("Не могу продолжить: список документов не пуст");
  возврат;
 конецЕсли;
 // Число создаваемых документов
 вс = 500;
 // Таблица ссылок на контрагентов
 з = новый запрос;
 з.Текст = "выбрать ссылка из справочник.Контрагенты";
 тзК = з.Выполнить().Выгрузить();
 // Таблица ссылок на номенклатуру
 з.Текст = "выбрать ссылка из справочник.Номенклатура где не ссылка.этоГруппа";
 тзН = з.Выполнить().Выгрузить();
 тзн.ВыбратьСтроку();
 // Значения дя генератора случайных чисел
 кКнт = тзК.Количество() - 1;
 кТвр = тзН.Количество() - 1;
 ГСЧ = Новый ГенераторСлучайныхЧисел;
 дтТ = текущаяДата();
 чД = 180;
 // Дата первого документа
 дтН = дтТ - чД * 24 * 3600;
 // Шаг по времени в секундах
 шС = (дтТ - дтН) / вс;
 для к = 1 по вс цикл
  бкт = документы.Продажи.СоздатьДокумент();
  дтН = дтН + шС;
  бкт.Дата = дтН;
  бкт.Контрагент = тзК[ГСЧ.СлучайноеЧисло(0, кКнт)][0];
  // Число товаров
  чТ = ГСЧ.СлучайноеЧисло(3, 9);
  для к2 = 1 по чТ цикл
   твр = бкт.Товары.Добавить();
   нмклтр = тзН[ГСЧ.СлучайноеЧисло(0, кТвр)][0];
   твр.Номенклатура = нмклтр;
   твр.Количество = ГСЧ.СлучайноеЧисло(2, 8);
   твр.Цена = нмклтр.цена;
  конецЦикла;
  бкт.Записать(режимЗаписиДокумента.Проведение);
  сообщить("Добавлен № " + бкт.Номер);
 конецЦикла;
конецПроцедуры

Форма списка документа после генерации документов показана на рис. 7.

Форма списка документа Продажи

Рис. 7. Часть списка автоматически полученных документов Продажи

Географическая схема

Отчет Гео

Для работы с географической схемой создается отчет Гео, снабженный элементом управления ПолеГеографическойСхемы с именем "гС". В область построения этого поля выводится географическая схема, определенная в макете отчета. Например, выполнение кода, если в макет "мкт" загружена карта России,

гео = элементыФормы.гС;
гео.Очистить();
гео.Вывести(получитьМакет("мкт"));
гео.ОтображатьЗаголовок = Истина;
гео.ОбластьЗаголовка.текст = "Россия";

обеспечит приведенный на рис. 8 результат.

Выведена географическая схема

Рис. 8. Отчет Гео

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

Замечание. Для выбора поля географической схемы в конфигураторе следует употребить меню Форма - Список элементов управления формой.

При открытии формы отчета выполняется следующий код:

процедура приОткрытии()
 всяКарта();
конецПроцедуры

процедура всяКарта()
 // "гС" - поле географической схемы отчета Гео
 гео = элементыФормы.гС;
 гео.Очистить();
 гео.ПоддержкаМасштаба = режимОтображенияГеографическойСхемы.ВсеДанные;
 гео.Вывести(получитьМакет("мкт"));
 гео.ОтображатьЗаголовок = Истина;
 гео.ОбластьЗаголовка.текст = "Россия";
 показатьНазванияСтолицРеспублик();
конецПроцедуры

Код процедуры показатьНазванияСтолицРеспублик приведен ниже.
Отчет имеет реквизит "спГ" типа СписокЗначений. В этот список заносятся названия столиц республик РФ (рис. 9).

Список столиц республик РФ

Рис. 9. Выбор столицы республики для отображения на карте РФ

Список употребляется в процедуре ПоказатьСтолицу, показывающей на карте РФ выбранный в списке "спГ" город.

процедура ПоказатьСтолицу(Кнопка)
 грд = спГ.выбратьЭлемент("Выбор столицы республики");
 если грд <> неопределено тогда
  // "гС" - поле географической схемы отчета Гео
  гео = элементыФормы.гС;
  сг = гео.слои.города;
  // Получаем значение грдС типа ТочечныйОбъектГеографическойСхемы
  грдС = сг.объекты.получить(грд.Значение);
  грдС.типОтрисовки = типОтображенияТочечногоОбъектаГеографическойСхемы.Маркер;
  грдС.маркер = типМаркераГеографическойСхемы.МаленькийКвадрат;
  // Красный квадрат
  грдС.цвет = новый цвет(255, 0, 0);
 конецЕсли;
конецПроцедуры

Процедура выполняется после нажатия на кнопку Город отчета Гео. Результат показан на рис. 10.

Отображает Петрозаводск

Рис. 10. Петрозаводск на карте РФ

Макет географической схемы

Макет "мкт" отчета создается как Географическая схема (рис. 11), которая загружается из файла РоссияРегионыИСтолицы.geo при создании макета.

Тип макета - Географическая схема

Рис. 11. Создание макета с картой РФ

Файл с географической схемой имеется на диске ИТС фирмы 1С.
Макет после загрузки географической схемы показан на рис. 12.

Географическая схема в макете отчета

Рис. 12. Макет с картой РФ

В географической схеме 2 слоя, которые можно наблюдать в конфигураторе, выбрав "Настройка слоев" из контекстного меню.
Имеющиеся в файле РоссияРегионыИСтолицы.geo серии слоя Регионы показаны на рис. 13, а серии слоя Города - на рис. 14.

Таблица с сериями слоя Регионы

Рис. 13. Серии слоя Регионы

Таблица с сериями слоя Города

Рис. 14. Серии слоя Города

Имя серии данных используется, в частности, для получения значения серии указанного объекта, например, после выполнения кода

// "гС" - поле географической схемы отчета Гео
гео = элементыФормы.гС;
сг = гео.слои.города;
грд = сг.объекты.получить(1);
названиеГорода = сг.получитьЗначение(грд, сг.серии.название);
сообщить(названиеГорода.значение);

будет выведено название 1-го по списку города, заданного на слое Города рассматриваемой географической схемы.

Замечание. Метод ПолучитьЗначение возвращает значение типа ЗначениеСерииСлояГеографическойСхемы.

Отображение столиц регионов на карте РФ

Вывод названий столиц обеспечит следующий код, адресующий к серии НАЗВАНИЕ на слое ГОРОДА:

// "гС" - поле географической схемы отчета Гео
гео = элементыФормы.гС;
гео.слои.города.серии.название.типОтображения = типОтображенияСерииСлояГеографическойСхемы.Текст;

Отображение столиц республик на карте РФ

Приводимый ниже код обеспечивает отображение столиц республик РФ. Столицы иных субъектов РФ не отображаются.

процедура показатьНазванияСтолицРеспублик()
 // "гС" - поле географической схемы отчета Гео
 гео = элементыФормы.гС;
 // Устанавливаем обновление = ложь, чтобы избежать вопросов о сохранении изменений
 гео.обновление = ложь;
 сг = гео.слои.города;
 сг.серии.название.типОтображения = типОтображенияСерииСлояГеографическойСхемы.Текст;
 // Формируем таблицу значений с кодами городов республик РФ
 з = новый запрос;
 з.текст = "выбрать код из справочник.Города";
 тз = з.Выполнить().Выгрузить();
 // Управляем видимостью названий городов регионов,
 // оставляя видимыми названия только столиц республик РФ
 для к = 0 по сг.объекты.количество() - 1 цикл
  грд = сг.объекты.получить(к);
  кодГорода = сг.получитьЗначение(грд, сг.серии.код_кладр);
  кодГорода = кодГорода.значение;
  // Заменяем неразрывный пробел на строку нулевой длины
  кодГорода = стрЗаменить(кодГорода, символ(160), "");
  // Поправляем коды городов, не имеющих ведущего символа "0"
  если стрДлина(кодГорода) = 24 тогда кодГорода = "0" + кодГорода конецЕсли;
  кодГорода = лев(кодГорода, 13);
  с = тз.Найти(кодГорода, "код");
  если с = неопределено тогда
   грд.видимость = ложь;
  иначе
   грд.видимость = истина;
   // Добавляем запись в список городов
   названиеГорода = сг.получитьЗначение(грд, сг.серии.название);
   названиеРегиона = сг.получитьЗначение(грд, сг.серии.регион);
   спГ.добавить(к, названиеГорода.значение + "(" + названиеРегиона.значение + ")");
  конецЕсли;
 конецЦикла;
 спГ.СортироватьПоПредставлению();
 гео.Обновление = истина;
конецПроцедуры

Процедура формирует также список значений "спГ" ("спГ" - это реквизит отчета Гео типа СписокЗначений), используемый процедурой ПоказатьСтолицу.
В загруженной географической схеме коды регионов и городов имеют тип Число. При представлении числа в виде строки триады разделяются символом неразрывного пробела (код символа 160), например, код Петрозаводска:

1°000°000°100°000°000°000°000°000

В символьном представления кода 25 символов. Если символьное представление имеет длину 24, то в начало этого представления следует добавить символ "0" (например, ведущий нуль нужно добавить в символьное представление кода Элисты).
Чтобы обеспечить поиск столиц республик в таблице значений с кодами городов (таблица "тз"), в символьном представлении кода убирается неразрывный пробел и в результате берутся первый 13 символов.
Названия столиц республик РФ можно наблюдать на рис. 15.

Показаны названия столиц республик РФ

Рис. 15. Выполнена процедура ПоказатьНазванияСтолицРеспублик

Замечание. В загруженной карте отсутствует Горно-Алтайск - столица республики Алтай.

Выбор региона

Поле географической схемы различает событие Выбор, что позволяет, в частности, отобразить выбранный регион (рис. 16).

Показана Архангельская область

Рис. 16. Выбрана Архангельская область

Обработку выбора обеспечивает следующая процедура:

процедура геоВыбор(Элемент, ОбъектСхемы, Серия, СтандартнаяОбработка)
 стандартнаяОбработка = ложь;
 оП = объектСхемы.ОграничивающийПрямоугольник;
 двг = оП.ДолготаВосточнойГраницы;
 дзг = оП.ДолготаЗападнойГраницы;
 щсг = оП.ШиротаСевернойГраницы;
 щюг = оП.ШиротаЮжнойГраницы;
 // "гС" - поле географической схемы отчета Гео
 гео = элементыФормы.гС;
 м = новый массив(1);
 м[0] = оП;
 ргн = гео.слои.регионы;
 бкт = ргн.объекты;
 // Получаем название выбранного региона
 для каждого бк из бкт цикл
  если двг = бк.ОграничивающийПрямоугольник.ДолготаВосточнойГраницы тогда
   гео.ОбластьЗаголовка.текст = ргн.получитьЗначение(бк, ргн.серии.найти("НАЗВАНИЕ")).значение;
   прервать;
  конецЕсли;
 конецЦикла;
 оБ = гео.ОтображаемаяОбласть;
 оБ.ДолготаВосточнойГраницы = двг;
 оБ.ДолготаЗападнойГраницы = дзг;
 оБ.ШиротаСевернойГраницы = щсг;
 оБ.ШиротаЮжнойГраницы = щюг;
 гео.ПоддержкаМасштаба = режимОтображенияГеографическойСхемы.ЗаданнаяОбласть;
конецПроцедуры

Возврат ко всей карте выполняется посля нажатия на кнопку Все данные или на кнопку Вся карта.
В первом случае будет выполнена

Процедура ОсновныеДействияФормыВсеДанные(Кнопка)
 // "гС" - поле географической схемы отчета Гео
 элементыФормы.гС.ПоддержкаМасштаба = режимОтображенияГеографическойСхемы.ВсеДанные;
 элементыФормы.гС.ОбластьЗаголовка.текст = "Россия";
КонецПроцедуры

а во втором случае будет выполенена

Процедура ОсновныеДействияФормыВсяКарта(Кнопка)
 всяКарта();
КонецПроцедуры

Просмотр географической схемы

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

// Вызывается при нажатии на кнопку "Из файла" формы отчета Гео
процедура основныеДействияФормыВсяКартаИзФайла(Кнопка)
 фм = "c:\1cinfo\GEOSCHEMES\РоссияРегионыИСтолицы.geo";
 ф = новый файл(фм);
 если ф.Существует() тогда
  гео2 = новый географическаяСхема;
  гео2.Прочитать(фм);
  гео2.ОтображатьЗаголовок = Истина;
  гео2.ОбластьЗаголовка.текст = "Карта России";
  гео2.показать();
  показатьНазванияВсехСтолиц(гео2);
 иначе
  предупреждение("Пусто");
 конецЕсли;
конецПроцедуры

процедура показатьНазванияВсехСтолиц(геоТ)
 геоТ.обновление = ложь;
 сг = геоТ.слои.города;
 сг.серии.название.типОтображения = типОтображенияСерииСлояГеографическойСхемы.Текст;
 геоТ.Обновление = истина;
конецПроцедуры

Отображение оборотов на карте РФ

Объемы продаж товаров отображаются в виде круговых диаграмм (рис. 17).

Круговые диаграммы продаж изделий

Рис. 17. Продажи по группам товаров

Каждая диаграмма имеет 3 сектора, ассоциируемых с объемами продаж дешевых, средних и дорогих товаров.
Соответствие между группой и сектором устанавливается по цвету последнего и отображается в легенде географической схемы.
Количественные характеристики объемов (сумм) продаж, можно посмотреть, наведя на диаграмму мышь. В частности, при позиционировании на зеленом секторе Средние диаграммы Карелии будут отображены следующие сведения:

Средние: Средние (31.98%) (730 800.00)

Название регионе: "Карелия Респ"
Дешевые: 164 300.00
Средние: 233 700.00
Дорогие: 332 800.00
Площадь региона: "172.4"
Столица региона: "Петрозаводск"
Код региона: " 1 000 000 000 000 000 000 000 000"
Экономический регион: "Северо-Западный"

Описанные результаты обеспечивает следующая процедура (вызывается при нажатии на кнопку Обороты формы отчета Гео):

// Объемы выводятся без ограничения периода
процедура ОсновныеДействияФормыОбороты(Кнопка)
 // "гС" - поле географической схемы отчета Гео
 гео = элементыФормы.гС;
 гео.Очистить();
 гео.обновление = ложь;
 гео.Вывести(получитьМакет("мкт"));
 гео.ОтображатьЛегенду = Истина;
 гео.ОтображатьЗаголовок = Истина;
 гео.ОбластьЗаголовка.текст = "Продажи по республикам";
 ргн = гео.слои.регионы;
 гео.УстановитьСвойствоОбъектов(ргн.объекты, "ОтображатьДанные", ложь);
 // Отображаем название регионов
 серияРегионов = ргн.серии.найти("НАЗВАНИЕ");
 серияРегионов.типОтображения = типОтображенияСерииСлояГеографическойСхемы.Текст;
 // Формируем таблицу значений с группами справочника Номенклатура
 з = новый запрос;
 з.Текст = "выбрать ссылка из справочник.номенклатура где ссылка.этоГруппа";
 таблГрупп = з.Выполнить().Выгрузить();
 // Добавляем серию Обороты на слой Регионы и элементы легенды в область легенды
 // Массив цветов для серий (групп номенклатуры)
 м = новый массив(3);
 м[0] = новый цвет(0, 0, 255); // Дешевые
 м[1] = новый цвет(0, 255, 0); // Средние
 м[2] = новый цвет(255, 0, 0); // Дорогие
 к = 0;
 для каждого грп из таблГрупп цикл
  грпМ = грп.ссылка.наименование;
  серия = ргн.серии.добавить(грпМ);
  серия.типОтображения = типОтображенияСерииСлояГеографическойСхемы.Круговая;
  серия.режимОтображенияЗначений = режимОтображенияЗначенийСерии.ОтображатьКакЗначение;
  серия.значение = грп.ссылка;
  серия.текст = грпМ;
  серия.базовыйЦветФигуры = м[к];
  серия.имяГруппыСерий = "Обороты";
  серия.формат = "ЧДЦ=2";
  элементЛегенды = гео.областьЛегенды.Элементы.Добавить();
  элементЛегенды.серия = серия;
  элементЛегенды.текстПодписи = грпМ;
  элементЛегенды.отображатьШкалу = типОтображенияШкалыЭлементаЛегендыГеографическойСхемы.НеОтображать;
  к = к + 1;
 конецЦикла;
 з = новый запрос;
 з.Текст = "выбрать контрагент.город.владелец.код как кодРеспублики, сумма(сумма),
 | номенклатура.родитель как группа
 | из регистрНакопления.Продажи
 | сгруппировать по контрагент.город.владелец.код, номенклатура.родитель
 | упорядочить по контрагент.город.владелец.код , номенклатура.родитель";
 р = з.Выполнить();
 тз = р.Выгрузить();
 // Формируем значения серий, равными объемам продаж по группам номенклатуры в разрезе республик
 для каждого с из тз цикл
  // Дополняем код республики, взятый из справочника, до 25 символов и преобразуем код в число
  кДР = число(с.кодРеспублики + "000000000000");
  рг = ргн.найтиПоЗначению(кДР);
  если рг = неопределено тогда
   сообщить("Не найдена республика с кодом " + кДР);
   продолжить;
  конецЕсли;
  рг.видимость = истина;
  рг.отображатьДанные = истина;
  // Поиск серии по наименованию группы номенклатуры
  серия = ргн.серии.найти(с.группа.наименование);
  ргн.установитьЗначение(рг, серия, с.сумма, с.группа.наименование, новый структура("КодТопологии, Номенклатура", кДР, серия.значение));
 конецЦикла;
 гео.обновление = истина;
конецПроцедуры

Отчет по объемам продаж

Добавим в отчет макет (табличный документ) "Продажи" (рис. 18) и, используя этот макет, выведем отчет (рис. 19) по объемам продаж (без ограничения периода), содержащий те же данные, что и приведенные на рис. 17 круговые диаграммы.

макет Объемы продаж

Рис. 18. Макет отчета Объемы продаж

Табличный документ Объемы продаж

Рис. 19. Объемы продаж по регионам с разбивкой по группам номенклатуры

Приведенный результат обеспечивает следующий код:

// Отчет по объемам продаж
з = новый запрос;
з.Текст = "выбрать контрагент.город.владелец.наименование как названиеРеспублики, сумма(сумма)
| из регистрНакопления.Продажи
| сгруппировать по контрагент.город.владелец.наименование, номенклатура.родитель
| упорядочить по контрагент.город.владелец.наименование, номенклатура.родитель";
тз = з.Выполнить().Выгрузить();
мкт = получитьМакет("Продажи");
тД = новый табличныйДокумент;
ом = мкт.ПолучитьОбласть("зг");
тД.Вывести(ом);
ом = мкт.ПолучитьОбласть("ргн");
омП = ом.Параметры;
к = 0;
пока к < тз.Количество() цикл
 омП.ргн = тз[к][0];
 омП.до800 = формат(тз[к][1], "ЧЦ=10; ЧДЦ=2"); // Дешевые
 омП.от800 = формат(тз[к + 2][1], "ЧЦ=10; ЧДЦ=2"); // Средние
 омП.от1200 = формат(тз[к + 1][1], "ЧЦ=10; ЧДЦ=2"); // Дорогие
 тД.Вывести(ом);
 к = к + 3;
конецЦикла;
тд.Показать("Объемы продаж");

Задание для самостоятельной проработки

Перечень решаемых задач

Цель самостоятельной работы - приобретение навыков создания простых объектов и употребления географических схем 1С:Предприятие.
В самостоятельной работе

  1. Создается конфигурация, обеспечивающая накопление сведений о просмотрах кинофильмов, например, следующих жанров:
  2. Кинотеатры, в которых демонстрируются фильмы, показываются на слое географической схеме в виде прямоугольников (рис. 20).

    Слой географической схемы с кинотеатрами

    Рис. 20. Географическая схема с образами кинотеатров

  3. На втором слое географической схемы в виде треугольников обозначаются условные указатели на кинотеатры (рис. 21).

    Слой географической схемы с указателями

    Рис. 21. Условные указатели

  4. Создается отчет, формирующий на географической схеме гистограммы посещения кинотеатров в разрезе кинофильмов выбранных жанров (рис. 22).

    Гистограммы просмотров кинофильмов выбранных жанров

    Рис. 22. Географическая схема с гистограммами просмотров

    При этом указатель на наиболее посещаемый кинотеатр заливается красным цветом, а на наименее посещаемый - синим.
  5. Создается и выводится табличный документ с информацией о просмотренных фильмах в разрезе кинотеатров и выбранных жанров.

Создание слоев (shape-файлов) географической схемы

Слои географической схемы можно создать, например, запустив MakeShape. Слой с приведенными на рис. 20 прямоугольниками создан после ввода следующих данных:

Таблица с координатами прямоугольников на слое географической схемы

Слой с приведенными на рис. 21 треугольниками создан после ввода следующих данных:

Таблица с координатами треугольников на слое географической схемы

При сохранении слоя, например под именем sm, создаются 3 следующих файла:

Для импорта слоя в 1С к ним следует добавить пустой текстовый файл sm.prj.

Импорт слоя в 1С:Предприятие

Можно придерживаться следующей схемы:

  1. Создать чистый макет с географической схемой.
  2. Открыть макет в конфигураторе и выбрать контекстное меню "Настройка слоев".
  3. В списке слоев нажать на кнопку Добавить (+) и выбрать shape-файл, например, sm.shp.
  4. В диалоге "Параметры импорта слоя" оставить только одну серия, выставить флажок "Заполнить свойство..." (рис. 25) - кнопка Импортировать.
Параметры импорта слоя

Рис. 25. Импорт слоя из файла sm.shp

Заключение

Рассмотрены некоторые вопросы употребления географических схем 1С:Предприятие. Для иллюстрации объекта создана тестовая конфигурация, позволяющая фиксировать продажи изделий в разрезе городов республик и групп товаров. По накопленным данным о продажах на географической схеме и в табличном документе отображены объемы продаж. В географической схеме для вывода результата использованы круговые диаграммы.
Дополнительные навыки создания и использования географических схем можно получить, выполнив, например, выше сформулированную самостоятельную работу.

Приложение П1. Города республик РФ

Названия и коды городов республик РФ хранит файл cts.txt:

Майкоп # 0100000100000
Адыгейск # 0100000200000
Уфа # 0200000100000
Агидель # 0200000200000
Нефтекамск # 0200000300000
Октябрьский # 0200000400000
Салават # 0200000500000
Сибай # 0200000600000
Кумертау # 0200000700000
Межгорье # 0200000800000
Стерлитамак # 0200001400000
Баймак # 0200600100000
Белебей # 0200900100000
Белорецк # 0201100100000
Межгорье # 0201100200051
Бирск # 0201300100000
Благовещенск # 0201500100000
Ишимбай # 0202600100000
Мелеуз # 0203500100000
Туймазы # 0204400100000
Учалы # 0204600100000
Янаул # 0205200100000
Давлеканово # 0205900100000
Дюртюли # 0206000100000
Улан-Удэ # 0300000100000
Северобайкальск # 0300000200000
Закаменск # 0300700100000
Бабушкин # 0300900200000
Кяхта # 0301200100000
Северобайкальск # 0301700200051
Гусиноозерск # 0301800100000
Горно-Алтайск # 0400000100000
Махачкала # 0500000100000
Дагестанские Огни # 0500000200000
Избербаш # 0500000300000
Каспийск # 0500000400000
Южно-Сухокумск # 0500000500000
Дербент # 0500000600000
Кизилюрт # 0500000700000
Кизляр # 0500000800000
Хасавюрт # 0500000900000
Буйнакск # 0500001000000
Магас # 0600000100000
Карабулак # 0600000200000
Назрань # 0600000300000
Малгобек # 0600000400000
Назрань # 0600100100051
Рустам # 0600300001700
Малгобек # 0600300100051
Карабулак # 0600400200051
Нальчик # 0700000100000
Баксан # 0700200100000
Майский # 0700400100000
Прохладный # 0700500100000
Терек # 0700600100000
Нарткала # 0700700100000
Чегем # 0700800100000
Тырныауз # 0701000100000
Элиста # 0800000100000
Городовиковск # 0800200100000
Лагань # 0800600100000
Черкесск # 0900000100000
Карачаевск # 0900000200000
Сторожевая-2 # 0900300001500
Теберда # 0900400200000
Усть-Джегута # 0900800100000
Петрозаводск # 1000000100000
Костомукша # 1000000400000
Сортавала # 1000000700000
Беломорск # 1000200100000
Кемь # 1000400100000
Кондопога # 1000500100000
Лахденпохья # 1000600100000
Медвежьегорск # 1000800100000
Олонец # 1001000100000
Питкяранта # 1001100100000
Больничный # 1001200009000
Пудож # 1001300100000
Сегежа # 1001400100000
Суоярви # 1001500100000
Сыктывкар # 1100000100000
Воркута # 1100000200000
Вуктыл # 1100000300000
Инта # 1100000400000
Печора # 1100000500000
Сосногорск # 1100000600000
Усинск # 1100000700000
Вохр # 1100000700299
Ухта # 1100000800000
Воркута # 1100200100051
Вуктыл # 1100300100051
Инта # 1100500100051
Емва # 1100600100000
Печора # 1100900100051
Сосногорск # 1101100100051
Усинск # 1101600100051
Микунь # 1101700200000
Ухта # 1102000100051
Йошкар-Ола # 1200000100000
Волжск # 1200000200000
Козьмодемьянск # 1200000300000
Волжск # 1200200100051
Козьмодемьянск # 1200300100051
Звенигово # 1200400100000
Саранск # 1300000100000
Ардатов # 1300200100000
Инсар # 1301000100000
Ковылкино # 1301300100000
Краснослободск # 1301500100000
Рузаевка # 1301800100000
Темников # 1302000100000
Олекминск # 1400000000200
Якутск # 1400000100000
Нерюнгри # 1400000200000
Алдан # 1400300100000
Томмот # 1400300200000
Верхоянск # 1401000200000
Вилюйск # 1401100100000
Ленск # 1401500100000
Мирный # 1401700100000
Удачный # 1401700200000
Нюрба # 1402100100000
Олекминск # 1402300100000
Среднеколымск # 1402500100000
Покровск # 1403200100000
Владикавказ # 1500000100000
Алагир # 1500200100000
Ардон # 1500300100000
Дигора # 1500400100000
Моздок # 1500700100000
Беслан # 1500800100000
Казань # 1600000100000
Набережные Челны # 1600000200000
Агрыз # 1600200100000
Азнакаево # 1600300100000
Альметьевск # 1600800100000
Арск # 1601000100000
Бавлы # 1601200100000
Бугульма # 1601400100000
Буинск # 1601500100000
Елабуга # 1601900100000
Заинск # 1602000100000
Зеленодольск # 1602100100000
Лаишево # 1602500100000
Лениногорск # 1602600100000
Мамадыш # 1602700100000
Менделеевск # 1602800100000
Мензелинск # 1602900100000
Нижнекамск # 1603100100000
Нурлат # 1603300100000
Болгар # 1603800100000
Тетюши # 1603900100000
Набережные Челны # 1604000100051
Чистополь # 1604300100000
Кызыл # 1700000100000
Ак-Довурак # 1700000200000
Чадан # 1700400100000
Туран # 1700900100000
Шагонар # 1701400100000
Ижевск # 1800000100000
Сарапул # 1800000200000
Воткинск # 1800000300000
Глазов # 1800000400000
Можга # 1800000500000
Воткинск # 1800500100051
Глазов # 1800600100051
Городок-67 # 1800900002799
Камбарка # 1801100100000
Можга # 1801800100051
Абакан # 1900000100000
Саяногорск # 1900000200000
Черногорск # 1900000300000
Абаза # 1900000400000
Сорск # 1900000500000
Сорск # 1900800200051
Грозный # 2000000100000
Аргун # 2000000200000
Гудермес # 2000500100000
Урус-Мартан # 2001000000100
Шали # 2001200100000
Чебоксары # 2100000100000
Алатырь # 2100002200000
Канаш # 2100002300000
Новочебоксарск # 2100002400000
Шумерля # 2100002500000
Козловка # 2100800100000
Мариинский Посад # 2101200100000
Цивильск # 2101600100000
Ядрин # 2102000100000

Литература

  1. Синтаксис-помощник 1С:Предприятие.

Список работ

Рейтинг@Mail.ru