Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Пока ВыборкаИзменений.Следующий() Цикл




// Записать данные в сообщение

// *** XML-сериализация

ЗаписатьXML(ЗаписьXML, ВыборкаИзменений.Получить());

КонецЦикла;

 

ЗаписьСообщения.ЗакончитьЗапись();

ЗаписьXML.Закрыть();

Сообщить("-------- Конец выгрузки------------");

 

КонецПроцедуры

На этом создание процедуры записи данных обмена закончено.

Создание процедуры чтения данных

Порядок создания процедуры чтения данных обмена будет таким же, как и ранее: сначала мы сформируем имя файла, содержащего данные обмена (листинг 15.15).

Листинг 15.15. Формирование имени файла, содержащего данные обмена

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

 

Каталог = КаталогВременныхФайлов();

 

// Сформировать имя файла

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_"

           + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

Возврат;

КонецЕсли;

 

УдалитьФайлы(ИмяФайла);

Сообщить("-------- Конец загрузки------------");

 

КонецПроцедуры

Мы формируем имя файла, которое надеемся найти в этом каталоге, а затем, создав новый объект Файл с таким именем, проверяем, существует ли он. Если такого файла нет, мы завершаем работу процедуры. Если же такой файл найден, нужно будет удить его после того, как все данные, содержащиеся в нем, будут обработаны.

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

Листинг 15.16. Добавление чтения найденного файла с данными обмена

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

 

Каталог = КаталогВременныхФайлов();

 

// Сформировать имя файла

ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\", "", "\") + "Message"

           + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

Возврат;

КонецЕсли;

 

// *** Чтение документов XML

// Попытаться открыть файл

ЧтениеXML = Новый ЧтениеXML;

Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение

Сообщить("Невозможно открыть файл обмена данными.");

Возврат;

КонецПопытки;

Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");

Сообщить(" - Считывается файл " + ИмяФайла);

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщить("-------- Конец загрузки------------");

 

КонецПроцедуры

Именно в этот момент мы обращаемся к механизмам записи/чтения документов XML, которые работают с ними на «базовом» уровне.

Для этого мы создаем новый объект ЧтениеXML, с помощью которого открываем найденный файл для чтения. В случае успеха мы выводим сообщение о начале загрузки данных из файла. В конце процедуры мы также прекращаем чтение XML-данных из файла методом Закрыть().

Полученные таким образом данные должны являться некоторым сообщением обмена данными. Для того чтобы представить их в терминах сообщений, мы добавим в процедуру следующий код (листинг 15.17):

Листинг 15.17. Добавление чтения заголовка XML-сообщения

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

 

Каталог = КаталогВременныхФайлов();

 

// Сформировать имя файла

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message"

     + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

Возврат;

КонецЕсли;

 

// *** Чтение документов XML

// Попытаться открыть файл

ЧтениеXML = Новый ЧтениеXML;

Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение

Сообщить("Невозможно открыть файл обмена данными.");

Возврат;

КонецПопытки;

Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");

Сообщить(" - Считывается файл " + ИмяФайла);

  

// Загрузить из найденного файла

 // *** Инфраструктура сообщений

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

// Читать заголовок сообщения обмена данными - файла XML

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщить("-------- Конец загрузки------------");

 

КонецПроцедуры

Здесь мы обращаемся к механизмам инфраструктуры сообщений планов обмена и создаем объект ЧтениеСообщенияОбмена. Используя метод этого объекта НачатьЧтение(), мы считываем заголовок XML-сообщения, в котором содержится в том числе информация об отправителе сообщения. После того как все сообщение будет нами обработано, мы заканчиваем чтение.

Теперь, когда мы представили данные обмена в виде сообщения и получили его заголовок, можно произвести одну проверку перед тем, как начать собственно обрабатывать данные (листинг 15.18).

Листинг 15.18. Добавление проверки сообщения

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

 

Каталог = КаталогВременныхФайлов();

 

// Сформировать имя файла

ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\", "", "\") + "Message"

           + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

Возврат;

КонецЕсли;

 

// *** Чтение документов XML

// Попытаться открыть файл

ЧтениеXML = Новый ЧтениеXML;

Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение

Сообщить("Невозможно открыть файл обмена данными.");

Возврат;

КонецПопытки;

Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");

Сообщить(" - Считывается файл " + ИмяФайла);

  

// Загрузить из найденного файла

// *** Инфраструктура сообщений

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

 

// Читать заголовок сообщения обмена данными - файла XML

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

  

// Сообщение предназначено не для этого узла

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда

ВызватьИсключение "Неверный узел";

КонецЕсли;

 

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщить("-------- Конец загрузки------------");

 

КонецПроцедуры

Мы проверяем, является ли отправитель сообщения тем узлом, для которого мы в данном вызове этой процедуры производим обмен данными.

Если все в порядке, то перед тем как начать чтение данных, следует удалить все записи регистрации изменений, которые были сделаны для этого узла и соответствовали номерам сообщений меньше или равным указанному в обрабатываемом нами сообщении как номер принятого. Это делается затем, чтобы исключить дублирование данных, которые уже были ранее посланы этому узлу и им обработаны (листинг 15.19).

Листинг 15.19. Удаление записей регистрации изменений для узла отправителя сообщения

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

 

Каталог = КаталогВременныхФайлов();

 

// Сформировать имя файла

ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\", "", "\") + "Message"

           + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

Возврат;

КонецЕсли;

 

// *** Чтение документов XML

// Попытаться открыть файл

ЧтениеXML = Новый ЧтениеXML;

Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение

Сообщить("Невозможно открыть файл обмена данными.");

Возврат;

КонецПопытки;

Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");

Сообщить(" - Считывается файл " + ИмяФайла);

  

// Загрузить из найденного файла

// *** Инфраструктура сообщений

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

 

// Читать заголовок сообщения обмена данными - файла XML

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

  

// Сообщение предназначено не для этого узла

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда

ВызватьИсключение "Неверный узел";

КонецЕсли;

 

// Удаляем регистрацию изменений

// для узла отправителя сообщения.

// *** Служба регистрации изменений

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);

 

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщить("-------- Конец загрузки------------");

 

КонецПроцедуры

Обратите внимание, что здесь мы обращаемся к службе регистрации изменений и используем метод УдалитьРегистрациюИзменений() для выполнения описанных действий.

Теперь, наконец, мы можем приступить к чтению непосредственно самих данных, содержащихся в сообщении (листинг 15.20).

Листинг 15.20. Чтение данных из сообщения

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

 

Каталог = КаталогВременныхФайлов();

 

// Сформировать имя файла

ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\", "", "\") + "Message"

           + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

Возврат;

КонецЕсли;

 

// *** Чтение документов XML

// Попытаться открыть файл

ЧтениеXML = Новый ЧтениеXML;

Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

 Исключение

Сообщить("Невозможно открыть файл обмена данными.");

Возврат;

КонецПопытки;

Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");

Сообщить(" - Считывается файл " + ИмяФайла);

  

// Загрузить из найденного файла

// *** Инфраструктура сообщений

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

 

// Читать заголовок сообщения обмена данными - файла XML

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

  

// Сообщение предназначено не для этого узла

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда

ВызватьИсключение "Неверный узел";

КонецЕсли;

 

// Удаляем регистрацию изменений

// Для узла отправителя сообщения

// *** Служба регистрации изменений

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);

    

// Читаем данные из сообщения

// *** XML-сериализация

Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

КонецЦикла;

 

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщить("-------- Конец загрузки------------");

 

КонецПроцедуры

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

И первое, что нам нужно сделать, – представить данные XML в виде некоторого значения, имеющего тип 1С:Предприятия. Для этого мы используем метод глобального контекста ПрочитатьXML() (листинг 15.21).

Листинг 15.21. Представление данных XML в виде значения, имеющего тип 1С:Предприятия

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

 

Каталог = КаталогВременныхФайлов();

 

// Сформировать имя файла

ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\", "", "\") + "Message"

           + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

Возврат;

КонецЕсли;

 

// *** Чтение документов XML

// Попытаться открыть файл

ЧтениеXML = Новый ЧтениеXML;

 Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение

Сообщить("Невозможно открыть файл обмена данными.");

Возврат;

КонецПопытки;

Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");

Сообщить(" - Считывается файл " + ИмяФайла);

  

// Загрузить из найденного файла

// *** Инфраструктура сообщений

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

 

// Читать заголовок сообщения обмена данными - файла XML

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

  

// Сообщение предназначено не для этого узла

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда

ВызватьИсключение "Неверный узел";

КонецЕсли;

 

// Удаляем регистрацию изменений

// для узла отправителя сообщения.

// *** Служба регистрации изменений

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

    

// Читаем данные из сообщения

// *** XML-сериализация

Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

// Читаем очередное значение

Данные = ПрочитатьXML(ЧтениеXML);

 

КонецЦикла;

 

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщить("-------- Конец загрузки------------");

 

КонецПроцедуры

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

Теперь, после того как объект 1С:Предприятия получен, следует разрешить возможную коллизию (листинг 15.22).

Листинг 15.22. Разрешение возможных коллизий

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

 

Каталог = КаталогВременныхФайлов();

 

// Сформировать имя файла

ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\", "", "\") + "Message"

           + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

Возврат;

КонецЕсли;

 

// *** Чтение документов XML

// Попытаться открыть файл

ЧтениеXML = Новый ЧтениеXML;

Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение

Сообщить("Невозможно открыть файл обмена данными.");

Возврат;

КонецПопытки;

Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");

Сообщить(" - Считывается файл " + ИмяФайла);

  

// Загрузить из найденного файла

// *** Инфраструктура сообщений

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

 

// Читать заголовок сообщения обмена данными - файла XML

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

  

// Сообщение предназначено не для этого узла

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда

ВызватьИсключение "Неверный узел";

КонецЕсли;

 

// Удаляем регистрацию изменений

// для узла отправителя сообщения

// *** Служба регистрации изменений

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

    

// Читаем данные из сообщения

// *** XML-сериализация

Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

// Читаем очередное значение

Данные = ПрочитатьXML(ЧтениеXML);

 

// Не переносим изменение, полученное

// в главный из неглавного,

// если есть регистрация изменения

Если Не ЧтениеСообщения.Отправитель.Главный

        И ПланыОбмена.ИзменениеЗарегистрировано(ЧтениеСообщения.Отправитель, Данные) Тогда

     Сообщить("- Изменения отклонены");

     Продолжить;

КонецЕсли;

 

КонецЦикла;

 

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщить("-------- Конец загрузки------------");

 

КонецПроцедуры

Возможная коллизия разрешается следующим образом: мы проверяем, является ли узел-отправитель главным узлом и есть ли записи об изменении этого объекта для этого узла в нашей базе данных. Если объект изменялся в нашей базе и отправитель не является главным узлом, мы отклоняем запись полученного объекта. Во всех остальных случаях мы принимаем изменения полученного объекта.

Теперь единственное, что нам осталось сделать, – записать полученные данные (листинг 15.23).

Листинг 15.23. Запись полученных данных

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

 

Каталог = КаталогВременныхФайлов();

 

// Сформировать имя файла

ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\", "", "\") + "Message"

           + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла);

Если Не Файл.Существует() Тогда

Возврат;

КонецЕсли;

 

// *** Чтение документов XML

// Попытаться открыть файл

ЧтениеXML = Новый ЧтениеXML;

Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

Исключение

Сообщить("Невозможно открыть файл обмена данными.");

Возврат;

КонецПопытки;

Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");

Сообщить(" - Считывается файл " + ИмяФайла);

  

// Загрузить из найденного файла

// *** Инфраструктура сообщений

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

 

// Читать заголовок сообщения обмена данными - файла XML

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

  

// Сообщение предназначено не для этого узла

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда

ВызватьИсключение "Неверный узел";

КонецЕсли;

 

// Удаляем регистрацию изменений

// для узла отправителя сообщения

// *** Служба регистрации изменений

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);

    

// Читаем данные из сообщения

// *** XML-сериализация

Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

// Читаем очередное значение

Данные = ПрочитатьXML(ЧтениеXML);

 

// Не переносим изменение, полученное

// в главный из неглавного,

// если есть регистрация изменения

Если Не ЧтениеСообщения.Отправитель.Главный

         И ПланыОбмена.ИзменениеЗарегистрировано(ЧтениеСообщения.Отправитель, Данные) Тогда

     Сообщить("- Изменения отклонены");

     Продолжить;

КонецЕсли;

 

// Записать полученные данные

Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;

Данные.ОбменДанными.Загрузка = Истина;

Данные.Записать();

КонецЦикла;

 

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

УдалитьФайлы(ИмяФайла);

Сообщить("-------- Конец загрузки------------");

 

КонецПроцедуры

Перед записью полученного объекта мы устанавливаем у него в параметрах обмена данными узел отправителя для того, чтобы система при записи этого объекта в нашей базе данных не формировала записи регистрации изменений этого объекта для того узла, от которого мы его только что получили.

Кроме этого в параметрах обмена данными мы устанавливаем свойство Загрузка, информирующее систему о том, что запись объекта будет происходить в режиме обновления данных, полученных в результате обмена. Такое указание позволяет системе упростить процедуру записи объекта, отказавшись от ряда стандартных проверок и исключив изменения связанных данных, которые выполняются при обычной записи.

На этом создание процедуры получения и обработки данных обмена закончено.

Проверка работы обмена данными

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

Запустим 1С:Предприятие в режиме отладки и установим необходимые значения в нашей центральной базе. Прежде всего, зададим значение константы ПрефиксНумерации – ЦБ (рис. 15.3).

 

Рис. 15.3. Редактирование константы

После этого откроем план обмена Филиалы и зададим параметры узла по умолчанию, т. е. параметры нашей базы. Код базы будет ЦБ, а наименование – Центральная база.

Не забудьте, что именно код идентифицирует узлы обмена в различных базах, поэтому в базе филиала мы будем создавать узлы с такими же кодами (рис. 15.4).

 

Рис. 15.4. Создание узла плана обмена

Затем создадим новый узел, который будет соответствовать базе филиала. Присвоим ему код Фил и наименование Филиал (рис. 15.5).

Рис. 15.5. Создание узла плана обмена

Теперь вызовем обработку ОбменДанными и нажмем Выполнить. В окне сообщений появится следующий текст (рис. 15.6):

 

Рис. 15.6. Окно служебных сообщений

Таким образом, в результате обмена данными центральная база сформировала файл обмена, содержащий изменения всех данных, которыми она обменивается с филиалом.

Настало время перейти к базе филиала. Запустим систему в режиме Конфигуратора и добавим в список баз новую базу с пустой конфигурацией, которая будет расположена в созданном нами каталоге базы филиала. Откроем конфигурацию и загрузим конфигурацию из файла (Конфигурация 4 Загрузить конфигурацию из файла…). Запустим 1С:Предприятие в режиме отладки.

Первым делом зададим значение константы ПрефиксНомеров – ФЛ (рис. 15.7).

 

Рис. 15.7. Редактирование константы

Затем откроем план обмена Филиал и опишем предопределенный узел (узел текущей информационной базы) кодом Фил и наименованием Филиал (рис. 15.8).

 

Рис. 15.8. Создание узла плана обмена

После этого создадим новый узел плана обмена с кодом ЦБ, наименованием Центральная база и признаком Главный (рис. 15.9).

 

Рис. 15.9. Создание узла плана обмена

Теперь для большей наглядности откроем список справочника Клиенты. Сейчас нем справочнике нет ни одного элемента. Запустим обработку ОбменДанными и нажмем Выполнить.

Справочник будет заполнен элементами, а в окне сообщений появится текст:

    Рис. 15.10. Сообщения плана обмена

Теперь проверим, как будет происходить обмен в другую сторону. Создадим в справочнике Клиенты нового клиента с произвольным наименованием. После этого снова нажмем Выполнить в открытой форме обработки ОбменДанными. Затем перейдем в центральную базу, также выполним обмен данными и убедимся, что клиент, созданный в базе филиала, перенесен в центральную базу.

Механизм распределенных информационных баз

Механизм распределенных информационных баз является развитием универсального обмена данными. Он реализует привычную, по версии 7.7, модель распределенной информационной базы, которая подразумевает наличие идентичных конфигураций во всех узлах, имеет древовидную структуру и позволяет выполнять обмен как измененными данными, так и изменениями, внесенными в конфигурацию.

Механизм распределенных информационных баз реализуется планами обмена. Для этого объект конфигурации План обмена содержит свойство Распределенная информационная база. Если это свойство установлено, для данного плана обмена включается механизм распределенных информационных баз и разработчик получает возможность создать распределенную базу исключительно интерактивными средствами, без написания кода. Такая возможность не исключает программное управление обменом, которое также доступно при работе с распределенными информационными базами. В ходе создания примера мы рассмотрим оба варианта организации обмена в распределенных информационных базах.

Основные сведения о распределенных информационных базах

Как мы уже говорили выше, распределенная информационная база должна иметь четко определенную древовидную структуру. Количество уровней в такой структуре не ограничено, главное – между двумя связанными узлами всегда должно быть определено отношение «главный – подчиненный» (рис. 15.11).

 

Рис. 15.11. Структура распределенной информационной базы

Таким образом, любой узел этой структуры может иметь произвольное количество подчиненных узлов (в том числе и ни одного). Кроме этого все узлы, кроме одного, должны иметь по одному главному узлу, и один узел не будет иметь главного узла – это корневой узел.

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

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

Изменения конфигурации будут передаваться от главного к подчиненным узлам. Изменения данных могут передаваться между любыми связанными узлами.

Разрешение коллизий также будет производиться исходя из отношения «главный - подчиненный». Если изменения выполнены одновременно и в главном, и в подчиненном узле, при обмене данными будут приняты только изменения главного узла, а изменения подчиненного отвергнуты.

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

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

Постановка задачи

В качестве примера, на котором мы проиллюстрируем использование механизма распределенных информационных баз, будет создание нескольких отделений нашего ООО «На все руки мастер». В отличие от филиалов, которые расположены в других городах, являются отдельными юридическими лицами и довольно самостоятельны в плане организации учета своей деятельности, отделения нашего ООО расположены в этом же городе, никакой юридической самостоятельностью не обладают и ведут учет в точности так, как это организовано в главном офисе. Поэтому все они используют ту же конфигурацию, что и главный офис, причем если главный офис вносит какие-либо изменения в свою конфигурацию, они должны быть своевременно внесены и в конфигурации отделений.

Для реализации такой схемы работы распределенная информационная база подойдет как нельзя лучше, и сначала мы организуем обмен с отделениями, используя исключительно интерактивные средства.

Пример интерактивного обмена в распределенной информационной базе

Для построения распределенной информационной базы нам понадобится создать еще один объект конфигурации План обмена, который мы назовем Отделения.

Для этого плана обмена мы установим свойство Распределенная информационная база (рис. 15.12).

Рис. 15.12. Установим свойство Распределенная информационная база

Перейдем на закладку Прочее и определим тот же состав данных для обмена, что и в плане обмена Филиалы: отметим все объекты конфигурации, относящиеся к подсистеме УчетУслугИМатериалов.

Запустим 1С:Предприятие в режиме отладки.

Откроем план обмена Отделения и зададим параметры центрального узла (предопределенный элемент плана обмена): код ЦБ и наименование Центральная база. После этого создадим новый узел с кодом Отд и наименованием Отделение. Обратите внимание, что для созданного нами узла стали доступны три иконки в командной панели формы плана обмена: Создать начальный образ, Записать изменения и Прочитать изменения (рис. 15.13).

Рис. 15.13. Стали доступны команды работы с распределенной информационной базой

Не откладывая в долгий ящик, воспользуемся первой из них, чтобы создать начальный образ информационной базы нашего отделения. Для этого нам потребуется сначала создать на диске новый каталог, в котором будет располагаться база отделения. После этого выполним команду Создать начальный образ и укажем, что информационная база будет расположена на данном компьютере (рис. 15.14).

 

Рис. 15.14. Создание начального образа информационной базы

На следующем шаге укажем каталог информационной базы и нажмем Готово. Система создаст в указанном каталоге начальный образ информационной базы нашего отделения.

Запустим 1С:Предприятие, подключим новую базу нашего отделения и откроем ее в конфигураторе. Обратите внимание на то, что конфигурация нашего отделения стала защищенной от изменений средствами управления распределенной информационной базой (рис. 15.15).

Рис. 15.15. Конфигурация подчиненного узла защищена от изменений средствами управления распределенной информационной базой

Запустим базу отделения в режиме отладки и откроем план обмена Отделения (рис. 15.16).

 

Рис. 15.16. Узлы плана обмена Отделения

Обратите внимание, что в базе подчиненного узла сам подчиненный узел является предопределенным узлом плана обмена, а узел центральной базы отмечен красной пиктограммой, указывающей на то, что он является главным для информационной базы отделения. Кроме этого для узла центральной базы доступны только команды Записать изменения и Прочитать изменения.

Теперь проверим работу обмена данными. Откроем список констант и зададим значение константы ПрефиксНумерации – ОТ.

После этого откроем справочник клиентов и добавим в него нового клиента. Затем выполним запись изменений для центральной базы (указав имя файла сообщения).

Перейдем в центральную базу и выполним чтение изменений в центральной базе. Убедимся, что новый клиент, созданный в базе отделения, присутствует и в центральной базе.

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

После этого закроем конфигуратор информационной базы отделения и выполним чтение изменений в базе подчиненного узла. По окончании чтения система выдаст следующее сообщение (рис. 15.17):

Рис. 15.17. Системное сообщение

В открывшемся конфигураторе базы отделения увидим, что в основной конфигурации появилась новая константа НоваяКонстанта, т. е. изменения, внесенные в конфигурацию центральной базы, были автоматически перенесены в конфигурацию подчиненного узла. Теперь единственное, что остается сделать, – это выполнить обновление конфигурации базы данных в подчиненном узле.

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

Программный обмен в распределенной информационной базе

Все описанные выше действия по обмену данными в распределенной информационной базе можно выполнить программно.

Мы создадим обработку, которая будет программно выполнять для выбранного узла все те действия, которые были рассмотрены в предыдущем разделе.

Для этого в конфигураторе центральной базы создадим новый объект конфигурации Обработка с именем ОбменСОтделениями. Создадим основную форму обработки и расположим на ней поле ввода с именем ПолеВводаОтделение, подписью Отделение: и типом ПланОбменаСсылка.Отделения (рис. 15.18).

Рис. 15.18. Редактирование формы обработки

После этого расположим в форме три кнопки: Создать начальный образ с именем КнопкаСоздатьНачальныйОбраз, Записать изменения с именем КнопкаЗаписатьИзменения и Прочитать изменения с именем КнопкаПрочитатьИзменения (рис. 15.19).

 

Рис. 15.19. Форма обработки

Начнем с создания обработчика нажатия кнопки Создать начальный образ. Текст обработчика будет выглядеть следующим образом (листинг 15.24):

Листинг 15.24. Обработчик нажатия кнопки Создать начальный образ

Процедура КнопкаСоздатьНачальныйОбразНажатие(Элемент)

 

Диалог = Новый

ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);

Диалог.Заголовок = "Укажите каталог информационной базы:";

Если Диалог.Выбрать() Тогда

ПланыОбмена.СоздатьНачальныйОбраз(ПолеВводаОтделение, "File=" + Диалог.Каталог);

Предупреждение("Создание начального образа узла завершено.");

КонецЕсли;

 

КонецПроцедуры

В начале процедуры мы вызываем диалог выбора каталога, в который будет помещен образ информационной базы, и затем выполняем метод СоздатьНачальныйОбраз() объекта ПланыОбменаМенеджер. Именно этот метод и позволяет нам создать образ подчиненного узла распределенной информационной базы. В первом параметре метода передается ссылка на узел, для которого мы хотим создать начальный образ, а во втором – строка соединения, указывающая информационную базу.

Теперь создадим обработчик нажатия кнопки Записать изменения (листинг 15.25).

Листинг 15.25. Обработчик нажатия кнопки Записать изменения

Процедура КнопкаЗаписатьИзмененияНажатие(Элемент)

 

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

Диалог.Заголовок = "Укажите файл обмена:";

Если Диалог.Выбрать() Тогда

 

// Создать и проинициализировать объект ЗаписьXML

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(Диалог.ПолноеИмяФайла);

  

// Создать объект ЗаписьСообщенияОбмена и начать запись

// сообщения

ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ЗаписьСообщения.НачатьЗапись(ЗаписьXML, ПолеВводаОтделение);

  

// Записать содержимое тела сообщения

// обмена данными распределенной ИБ

ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);   

 

// Закончить запись сообщения и запись XML

ЗаписьСообщения.ЗакончитьЗапись();

ЗаписьXML.Закрыть();

 

Предупреждение("Запись изменений завершена.");

КонецЕсли;

 

КонецПроцедуры

В начале процедуры мы вызываем диалог ввода имени файла, в который будут записаны изменения. После этого мы создаем объект ЗаписьXML для работы с этим файлом. Затем создаем объект ЗаписьСообщенияОбмена, с помощью которого будем создавать сообщение обмена. В методе НачатьЗапись(), во втором параметре, мы указываем, для какого узла обмена будет создаваться это сообщение. После этого мы выполняем метод ЗаписатьИзменения() объекта ПланыОбменаМенеджер, который и записывает изменения, предназначенные для передачи в выбранный узел, в указанное сообщение обмена. В заключение мы, как обычно, заканчиваем запись сообщения обмена и закрываем файл.

УЗНАЙ БОЛЬШЕ!

Следует отметить, что метод ЗаписатьИзменения() позволяет задать максимальное число элементов данных, которые помещаются в сообщение в рамках одной транзакции базы данных. По умолчанию все данные помещаются в сообщение в рамках одной транзакции.

Такой режим является рекомендуемым, так как гарантирует согласованность данных, помещаемых в сообщение.

Но при создании сообщения в многопользовательском режиме могут быть конфликты блокировок между транзакцией, в которой данные помещаются в сообщение, и транзакциями, выполняемыми другими пользователями. Для снижения вероятности возникновения таких конфликтов можно задать значение этого параметра, отличное от значения по умолчанию. Чем меньше значение параметра, тем меньше вероятность конфликта блокировок, но выше вероятность помещения в сообщение несогласованных данных.

Учитывая все вышесказанное, идеальным вариан-том является выполнения обмена данными в монопольном режиме. Однако такой вариант не всегда приемлем, в силу специфики организации работы конкретных информационных баз.

И последним мы создадим обработчик нажатия кнопки Прочитать изменения (листинг 15.26).

Листинг 15.26. Обработчик нажатия кнопки Прочитать изменения

Процедура КнопкаПрочитатьИзмененияНажатие(Элемент)

 

Диалог = Новый

ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

Диалог.Заголовок = "Укажите файл обмена:";

Если Диалог.Выбрать() Тогда

     

// Создать и проинициализировать объект ЧтениеXML

ЧтениеXML = Новый ЧтениеXML;

ЧтениеXML.ОткрытьФайл(Диалог.ПолноеИмяФайла);

     

// Создать объект ЧтениеСообщенияОбмена

// и начать чтение сообщения

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

  

// Прочитать содержимое тела сообщения

ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);

 

// Закончить чтение сообщения и чтение XML

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

 

Предупреждение("Чтение изменений завершено.");

КонецЕсли;

 

КонецПроцедуры

В начале процедуры мы снова вызываем диалог ввода имени файла, который будет прочитан, и создаем объект ЧтениеXML для работы с этим файлом. Затем создаем объект ЧтениеСообщенияОбмена для чтения сообщения, содержащегося в указанном файле. Затем методом ПрочитатьИзменения() объекта ПланыОбменаМенеджер мы читаем полученное сообщение. В заключение процедуры мы завершаем чтение сообщения обмена и закрываем файл.

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

Следует лишь сделать несколько заключительных замечаний.

При использовании механизма распределенных информационных баз становятся доступными четыре события объекта ПланОбменаОбъект, которые позволяют управлять отправкой и приемом данных на уровне отдельных элементов данных:

§ ПриОтправкеДанныхГлавному();

§ ПриОтправкеДанныхПодчиненному();

§ ПриПолученииДанныхОтГлавного();

§ ПриПолученииДанныхОтПодчиненного().

Эти события будут вызываться для каждого элемента данных, включаемого в сообщение. Работу этих событий можно увидеть, назначив следующие обработчики событий в модуле объекта План обмена (листинг 15.27):

Листинг 15.27. Просмотр работы событий объекта ПланОбменаОбъект

Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента)

 

Сообщить("ПриОтправкеДанныхГлавному " + ЭлементДанных);

 

КонецПроцедуры   

 

Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента)

 

Сообщить("ПриОтправкеДанныхПодчиненному " + ЭлементДанных);  

 

КонецПроцедуры

 

Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)

 

Сообщить("ПриПолученииДанныхОтГлавного " + ЭлементДанных);   

 

КонецПроцедуры

 

Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)

 

Сообщить("ПриПолученииДанныхОтПодчиненного " + ЭлементДанных);    

 

КонецПроцедуры

В первом параметре всех перечисленных событий находится тот элемент данных, для которого вызвано это событие.

Параметр ОтправкаЭлемента позволяет управлять тем, какая информация будет помещена в сообщение. Он может принимать три значения:

•   ОтправкаЭлементаДанных.Авто – значение по умолчанию. Указывает на то, что элемент данных будет помещен в сообщение;

•   ОтправкаЭлементаДанных.Удалить – в сообщение будет помещено значение, предназначенное для удаления этого элемента данных;

•   ОтправкаЭлементаДанных.Игнорировать – в сообщение не будет помещено ничего, связанного с этим элементом данных.

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

•   ПолучениеЭлементаДанных.Авто – значение по умолчанию. Если элемент данных получен от главного узла, он будет записан всегда. Если элемент данных получен от подчиненного узла, он будет записан, только если не зарегистрированы изменения для этого элемента данных;

•   ПолучениеЭлементаДанных.Принять – полученный элемент данных будет записан всегда;

•   ПолучениеЭлементаДанных.Игнорировать – проигнорировать получение элемента данных и ничего не записывать.

Также в событиях получения данных существует третий параметр – ОтправкаНазад, имеющий тип Булево. Этот параметр позволяет выполнять принудительную регистрацию изменений для полученного элемента данных в базе-получателе. Такая необходимость может возникнуть, например, когда при приеме данных от узла-отправителя обнаружено, что полученные данные противоречивы (например, в узле-отправителе была допущена ошибка при изменении данных). Тогда мы можем проигнорировать присланные изменения и, подняв флаг ОтправкаНазад, вызвать принудительную регистрацию изменений полученного элемента данных в нашей базе для узла-отправителя. В результате последующего обмена состояние этого элемента данных в узле-отправителе будет установлено таким же, как и в нашей базе.

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

Для этого следует использовать метод УстановитьГлавныйУзел() объекта ПланыОбменаМенеджер. В параметре этого метода передается ссылка на узел плана обмена распределенной информационной базы, который устанавливается главным для текущей базы. Также в этом параметре может быть передано значение Неопределено, и это приведет к тому, что у текущей информационной базы будет отсутствовать главный узел.

Рассмотрим несколько вариантов реконфигурирования структуры узлов распределенной информационной базы.

Допустим, необходимо переместить один из подчиненных узлов в корень дерева (рис. 15.20).

 

Рис. 15.20. Реконфигурирование структуры узлов

Для этого следует выполнить следующие действия (листинг 15.28):

Листинг 15.28. Перемещение Узла2 в корень дерева

 

// В информационной базе Узла2

ПланыОбменаМенеджер.УстановитьГлавныйУзел(Неопределено);

 

// В информационной базе Узла1

ПланыОбменаМенеджер.УстановитьГлавныйУзел(Узел2);

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

Таким же образом, используя значение параметра метода Неопределено, мы можем отключать от дерева отдельную информационную базу или целое поддерево (рис. 15.21, листинг 15.29).

 

Рис. 15.21. Отключение поддерева от распределенной информационной базы

Листинг 15.29. Отключение поддерева от дерева

// В информационной базе Узла1

ПланыОбменаМенеджер.УстановитьГлавныйУзел(Неопределено);

Кроме этого мы можем создавать распределенную информационную базу из отдельных информационных баз с идентичной конфигурацией (рис. 15.22, листинг 15.30).

Рис. 15.22. Информационная база из отдельных информационных баз с идентичной конфигурацией

 Листинг 15.30. Создание распределенной информационной базы из баз с идентичной конфигурацией

// В информационных базах Узла2, Узла3 и Узла4

ПланыОбменаМенеджер.УстановитьГлавныйУзел(Узел1);

Что нового мы узнали

q какие средства входят в состав механизма универсального обмена данными

q для чего предназначен объект конфигурации План обмена

q каковы основные составляющие плана обмена

q что такое узлы плана обмена

q что такое состав плана обмена, и для каких элементов данных возможен обмен данными

q что такое авторегистрация

q для чего предназначен механизм регистрации изменений

q как работает инфраструктура сообщений

q каково назначение XML-сериализации

q для чего используется запись/чтение документов XML

q как создать план обмена

q как настроить конфигурацию для обмена данными

q как реализовать обмен данными в общем виде

q как реализовать обмен данными в распределенной информационной базе

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

q как изменить структуру дерева распределенной информационной базы

q Глава 16. Анализ данных и прогнозирование

q В этой главе мы познакомимся с возможностями, которые предоставляет система 1С:Предприятие 8 для поиска и анализа закономерностей в имеющихся данных, и построения прогнозов на основе найденных закономерностей.

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

q Поскольку анализ данных подразумевает наличие большого объема исходной информации, для всех примеров, рассматриваемых далее, мы будем использовать не информационную базу нашего ООО «На все руки мастер», а некую абстрактную базу данных, которая позволит проиллюстрировать работу анализа и прогнозирования данных.

q На диске информационно – технологического сопро-вождения, в составе демонстрационной конфигурации «Анализ данных», вы можете найти универсальную обработку «Консоль анализа данных», которая позволит вам работать с анализом данных в любом прикладном решении без какого-либо программирования.

 

Общие сведения об анализе и прогнозировании данных

В общем случае анализ и прогнозирование данных связаны следующим образом.

Анализ данных позволяет найти неочевидные закономерности в анализируемых данных и представить их в виде легко воспринимаемого результата.

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

Таким образом, результаты анализа являются основой, на которой строятся последующие прогнозы.

Например, в нашей базе имеются данные о том, какие товары и когда приобретались нашими клиентами. Было замечено, что если клиент приобретал, скажем, диван УЮТ, то через некоторое время он зачастую приобретал и кресло УЮТ из того же набора мягкой мебели.

Мы хотим проанализировать данные нашей базы в следующем виде: какие существуют наиболее вероятные последовательности покупок товаров одним и тем же клиентом? Иначе говоря: как обстоят дела сейчас, если взять текущие данные и попробовать определить, какие существуют последовательности покупаемых товаров?

В терминах 1С:Предприятия 8 такой процесс анализа данных можно представить следующей схемой (рис. 16.1) :

 

Рис. 16.1. Схема анализа данных

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

Тип анализа – определяет вид результата, к которому должны быть сведены исходные данные. Система поддерживает пять различных типов анализа:

•   общая статистика – позволяет получить общую статистическую информацию об источнике данных для его предварительного исследования (количество значений и количество уникальных значений, минимальное, максимальное и среднее значение, размах, стандартное отклонение, медиана, мода, частота появления каждого значения в источнике);

•   поиск ассоциаций – предназначен для поиска часто встречаемых групп характеристик объектов и создания правил ассоциации «Если … То …» (например, такой анализ может быть использован для поиска групп товаров, часто покупаемых вместе);

•   поиск последовательностей – применяется для выявления цепочек событий, часто наблюдаемых в источнике данных (например, это может быть цепочка товаров или услуг, которые часто последовательно приобретают клиенты);

•   дерево решений – предназначен для выявления закономерностей того, что объект относится к тому или иному классу (например, при помощи дерева решения можно проанализировать, какие характеристики клиента влияют на то, что он перейдет к другому поставщику); • кластерный анализ – при помощи кластерного анализа можно объединить объекты в группы (кластеры), в которых будут находиться объекты, наиболее схожие по ряду характеристик. Например, можно сгруппировать клиентов по их характеристикам и деятельности, чтобы в дальнейшем, проанализировав полученные кластеры, принять решение о стратегии работы с клиентами определенных групп.

Анализ данных – объект встроенного языка (АнализДанных), непосредственно выполняющий анализ данных. Объекту устанавливается источник данных, задаются параметры, настраиваются колонки анализа данных. Результатом работы данного объекта является результат анализа данных, тип которого зависит от типа анализа. Каждому типу анализа соответствует свой тип результата анализа.

Результат анализа – объект встроенного языка, содержащий информацию о результате анализа. Для каждого типа анализа предусмотрен свой тип результата. Например, результатом анализа данных типа АнализДанныхДеревоРешений будет объект типа РезультатАнализаДанныхДеревоРешений.

В дальнейшем результат может быть выведен в табличный документ при помощи построителя отчета анализа данных (о нем будет рассказано далее); может быть выведен посредством программного доступа к его содержимому; может быть использован для создания модели прогноза. Любой результат анализа данных может быть сохранен для последующего использования.

Теперь рассмотрим, как выглядит прогнозирование данных. Прогнозирование является попыткой предсказать новый результат на основе некоторой совокупности новых данных и определенной ранее модели. Иными словами, прогнозирование позволяет ответить на вопрос: как будут обстоять дела, если мы будем иметь такие данные при такой модели их взаимосвязи?

Возвращаясь к нашему примеру: какой товар с большой долей вероятности клиент приобретет в следующий раз, если до этого он совершал вот такие покупки и текущие последовательности покупок товаров выглядят следующим образом?

В терминах 1С:Предприятия 8 этот процесс прогнозирования данных можно представить следующей схемой (рис. 16.2):

Рис. 16.2. Схема прогнозирования данных

Источник данных – таблица значений, результат запроса или область табличного документа, содержащая информацию, по которой необходимо построить прогноз. Например, для модели прогноза МодельПрогнозаПоискАссоциаций выборка может содержать перечень товаров документа продажи. Результат же работы модели может рекомендовать, какие товары можно еще предложить покупателю.

Модель прогноза – специальный объект, позволяющий выполнять прогноз на основании входных данных. Тип модели зависит от типа анализа данных. Например, модель, созданная для анализа данных АнализДанныхПоискАссоциаций, будет иметь тип МодельПрогнозаПоискАссоциаций. Такая модель сможет выдавать прогнозы типа: «Т. к. данный покупатель купил заданный набор товаров, то с определенной вероятностью он должен купить и другой набор товаров». На вход модели прогноза передается источник данных для прогноза. Результатом является таблица значений, содержащая прогнозируемые значения.

Таблица значений – таблица значений, состоящая из колонок, согласно настройкам результирующих колонок модели прогноза, содержащая прогнозируемые данные. Конкретное содержание таблицы определяется типом анализа данных.

Если обобщить обе схемы, представленные выше, то анализ и прогнозирование данных в терминах 1С:Предприятия 8 можно представить следующим образом (рис. 16.3):

 

Рис. 16.3. Анализ и прогнозирование данных

Как вы видите, на этой схеме появились новые прямоугольники. Мы рассмотрим их назначение в следующем разделе.

Анализ данных

Объект АнализДанных имеет возможность настройки колонок источника данных и указания параметров анализа. Каждый тип анализа подразумевает свою структуру исходных данных и свой набор параметров анализа.

Общая статистика

Тип анализа АнилизДанныхОбщаяСтатистика позволяет получать общестатистические показатели выборки, которую представляют исходные данные.

Колонки исходных данных для общестатистического анализа могут быть двух видов: содержащие непрерывные данные либо содержащие дискретные данные.

Если анализируемые значения являются числовыми или имеют тип Дата, то для такой колонки следует указывать вид данных Непрерывные. Во всех остальных случаях (в том числе при анализе значений объектного типа) следует указывать вид данных Дискретные.

Для указания того или иного вида исходных данных используется свойство объекта АнализДанных – НастройкаКолонок. Это свойство содержит коллекцию значений, элементами которой являются объекты КолонкаАнализаДанных. Каждый такой объект описывает одну колонку исходных данных. Для указания вида данных, содержащихся в колонке, нужно использовать свойство объекта КолонкаАнализаДанных – ВидДанных.

Для непрерывных и дискретных данных рассчитываются различные статистические показатели.

Для непрерывных данных рассчитывается:

§ количество значений – количество значений, присутствующих в исходной выборке;

§ минимальное значение – минимальное значение, присутствующее в исходной выборке;

§ максимальное значение – максимальное значение, присутствующее в исходной выборке;

§ среднее значение – среднее арифметическое значение выборки;

§ размах – разность между максимальным и минимальным значением выборки;

§ стандартное отклонение – среднее квадратичное отклонение, равное корню квадратному из дисперсии выборки;

§ медиана – значение, лежащее в середине выборки, упорядоченной по возрастанию или убыванию. Другими словами, медиана делит выборку пополам. Оодна половина выборки имеет значения меньше медианы, другая – больше. В случае четного числа значений выборки медиана рассчитывается как среднее арифметическое двух значений, ближайших к центру выборки.

Для дискретных данных рассчитывается:

§ количество значений – общее количество значений, присутствующих в исходной выборке;

§ количество уникальных значений – количество уникальных значений, присутствующих в исходной выборке;

§ мода – значение, наиболее часто встречающееся в исходной выборке. В выборке могут быть два или более значения, с максимальной частотой (би- или мультимодальная выборка). В этом случае в качестве моды будет взято первое найденное значение с максимальной частотой.

Кроме того, для дискретных значений рассчитывается таблица частот, содержащая следующие показатели:

§ частота – количество вхождений уникального значения в выборку;

§ относительная частота – частота, выраженная в процентах от общего количества значений выборки;

§ накопленная частота – сумма частоты значения и частот всех предыдущих значений выборки;

§ накопленная относительнаячастота – сумма относительной частоты и относительных частот всех предыдущих значений выборки.

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

Типы колонок источника данных:

§ Не используется – колонка не участвует в анализе.

Входная – содержит исходные данные для анализа. Параметры анализа данных при общестатистическом анализе не задаются.

Пример

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

Допустим, мы будем иметь следующие исходные данные для анализа (рис. 16.4).

 

Рис. 16.4. Исходные данные

Результат анализа будет выглядеть следующим образом (рис. 16.5):

Рис. 16.5. Результат анализа данных

Поиск ассоциаций

Тип анализа АнализДанныхПоискАссоциаций предназначен для поиска часто встречаемых вместе групп объектов или значений характеристик, а также выполняет поиск правил ассоциаций. Этот тип анализа может использоваться для определения часто приобретаемых вместе товаров или услуг.

Типы колонок источника данных:

§ Не используется – колонка не используется в анализе.

§ Объект – колонка содержит объект, например документ Оказание услуги.

§ Элемент – колонка содержит элемент, например номенклатуру из документа Оказание услуги.

Параметры:










Последнее изменение этой страницы: 2018-05-10; просмотров: 195.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...