Организация обмена с базой филиала (розничного магазина) в торговой сети через XML (универсальный обмен). Добавление плана обмена в типовую конфигурацию Распределенная информационная база

Планы обмена в 1С 8.3 — объект метаданных конфигурации, служащий для реализации синхронизации данных в системе 1С 8.

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

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

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

Как работать с планом обмена

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

  1. Изменяем данные (справочники, документы и т.д) в базе — план обмена запоминает изменения. Либо авторегистрацией, либо программным кодом (например метод ПланыОбмена.ЗарегистрироватьИзменения).
  2. Когда приходит время, получаем список измененных элементов — метод ПрочитатьИзменения(), выгружаем эти данные.
  3. При выгрузке/загрузке для исключения коллизий сверяем номера сообщений у плана обмена. Если они не совпадают, отменяем обмен данными, если совпадают, снимаем регистрацию изменений и увеличиваем номер сообщения.

Получите 267 видеоуроков по 1С бесплатно:

Распределенная информационная база

Если этот флаг установлен в настройках, то данный план обмена является распределенной информационной базой (РИБ).

— территориально распределенная система на основе одинаковой конфигурации 1С 8.3. РИБ помимо изменений данных умеет передавать и изменений конфигурации, что очень удобно, например, при обновлении релиза конфигурации.

Состав плана обмена

Настройка, с помощью которой разработчик управляет набором объектов для обмена:

В составе плана обмена может быть 3 состояния объекта:

  1. Не включен в план обмена — соответственно, никаким образом для такого объекта Вы не сможете настроить обмен данными по этому плану обмена.
  2. Авторегистрация Запретить — это значит, что регистрировать изменения для данного узла необходимо только программным кодом по какому-то условию, как правило, . Используется метод ПланыОбмена.ЗарегистрироватьИзменения().
  3. Авторегистрация Разрешить — если установлена данная галка, то любые изменения элемента автоматически попадут в список изменений плана обмена.

Планы обмена и производительность 1С

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

Если в Вашей организации работает более 5 человек то, скорее всего Вы пользуетесь продукцией фирмы «1С». Практически всегда в организациях устанавливаются несколько баз 1С, ведь каждая из них решает определенный спектр задач. Например, компания занимается розничными продажами и ведет бухгалтерию, в такой ситуации клиент обычно устанавливает УТ (Управление торговлей) и БП (Бухгалтерия предприятия). В роли такой компании вполне может выступать даже простое ИП с несколькими работниками!

Зачем мне настраивать обмен данными?

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

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

Кому необходимо пользоваться обменом данными между базами 1С?

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

  • У Вас более 1 одной базы 1С
  • Требуется быстрый перенос информации из одной базы в другую и наоборот
  • Нужен авто-обмен или обмен в реальном времени

Разработка и настройка обмена данными между конфигурациями 1С

Правильно разработанный обмен данными позволит Вам:

  • Проводить выгрузку и загрузку объектов из одной базы в другую
  • Выполнять обмен между разными версиями 1С
  • Обмениваться данными в реальном времени
  • Значительно сократить затраты на зарплату работникам, ведь теперь у них будет больше свободного времени
  • Сэкономить Ваше время и бюджет

Разработка правил обмена данными на примере доработанных баз УТ и БП

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

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

Первоначальная настройка обмена при этом может потребовать ряда действий, не только в части программирования, но и консалтинга, даже если мы имеем дело с однородными источниками, как в случае с продуктами на платформе «1С:Предприятие». Почему настройка обмена 1С (или, как еще это называется - синхронизация данных в 1С 8.3) может стать самой трудоемкой и недешевой задачей проекта интеграции, рассмотрим в этой статье.

Обмен данными в среде 1С позволяет:

  • Исключить двойной ввод документов;
  • Автоматизировать смежные бизнес-процессы;
  • Оптимизировать взаимодействие между распределенными подразделениями;
  • Оперативно актуализировать данные для работы специалистов разных отделов;
  • «Разграничить» разные виды учета.*

*В случае, когда данные одного вида учета существенно отличаются от другого, необходимо обеспечить конфиденциальность информации и «разграничить» информационные потоки. Например, обмен данными между 1С УТ и 1С Бухгалтерия не требует выгрузки в базу регламентного учета управленческих данных, т.е. синхронизация в 1С тут будет неполная .

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

  • Согласование состава обмена;
  • Определение транспорта (протоколов обмена);
  • Установка правил;
  • Составление расписания.

Выявление состава обмена 1С

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

*Например, при интеграции «WA: Финансист» – решения для ведения финансового учета и управления процессами казначейства, разработанного на базе «1С:Предприятие», эксперты WiseAdvice рекомендуют именно его в качестве мастер-системы. Это обусловлено наличием инструментов контроля для соблюдения правил заявочной политики, а соответственно, и для обеспечения эффективности работы решения.

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

На этом же этапе в зависимости от парка имеющихся систем и структуры предприятия определяются с форматом обмена:

Распределенная информационная база

  • РИБ подразумевает обмен между идентичными конфигурациями баз данных 1С, с четкой структурой управления «главный-подчиненный» для каждой пары обмена. Являясь элементом технологической платформы, РИБ помимо данных может передавать изменения в конфигурации и административную информацию БД (но только от главного к подчиненному).

Универсальный обмен данными в 1С

  • Механизм, позволяющий настроить обмен баз 1С, как с конфигурациями на платформе «1С:Предприятие», так и с системами сторонней разработки. Обмен осуществляется посредством перевода данных в универсальный xml-формат в соответствии с «Планами обмена».

EnterpriseData

  • Новейшая разработка фирмы 1С, предназначенная для реализации обмена данными в формате xml между продуктами, созданными на платформе «1С:Предприятие», с любыми системами автоматизации. Применение EnterpriseData упрощает доработки, связанные с обменом. Ранее при включении в систему новой конфигурации была необходима реализация механизма импорта и экспорта данных, как для нее, так и для уже имеющихся систем. Теперь системы, поддерживающие EnterpriseData, не нуждаются в доработках, имея только одну точку «входа-выхода».

Определение транспорта (протоколов обмена)

Для системы на платформе «1С:Предприятие 8» предусмотрен широкий спектр возможностей для организации обмена с любыми информационными ресурсами посредством общепринятых универсальных стандартов (xml, текстовые файлы, Excel, ADO-соединение и т.д.). Поэтому при определении транспорта для данных обмена следует отталкиваться от возможностей базы данных сторонней системы.

Синхронизация справочников

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

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

Установка правил

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

Гарантирует отсутствие потерь данных при обмене План обмена. Это составная часть любой конфигурации на платформе «1С:Предприятие», полностью описывающая порядок обмена 1С: состав данных (документы с «опознавательными» реквизитами) и узлы (информационные базы приемники-передатчики), а также активацию РИБ для избранных направлений обмена.

Любое изменение данных, занесенных в План обмена, фиксируется и получает признак «измененности». До тех пор, пока измененные данные не будут соответствовать друг другу в узлах приемника-передатчика, признак сброшен не будет, и система будет рассылать контрольные сообщения в оба узла. После выгрузки данных и подтверждения их полного соответствия в обеих системах, признак сбрасывается.

Расписание обмена в 1С

Для автоматизации регулярного обмена устанавливается периодичность выгрузки данных. Частота обмена зависит от необходимости и технических возможностей. Также конфигурации на платформе «1С:Предприятие» позволяют настроить обмен данными при наступлении какого-нибудь события.

Рассмотрев стандартный процесс реализации обмена, обратим внимание на факторы, которые потребуют доработок на разных этапах:

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

Поскольку даже стандартные действия по реализации первичного обмена данными требуют экспертных знаний, их рекомендуется проводить при участии специалистов 1С. Только после выполнения всех вышеописанных действий следует переходить к настройке обмена в конфигурации. Рассмотрим интеграцию баз данных на примере «1С:УПП» и «1С:Розница» (по этой же схеме настраивается обмен с «1С:УТ»). Также к типовой синхронизации относится обмен УПП - УПП, характерный для масштабных систем автоматизации на крупнейших промышленных предприятиях.

В подменю «Сервис» выбираем «Обмен данными c продуктами на платформе…» (выбор прямого обмена с «Розницей» зачастую грозит ошибками на уровне COM-объектов). Обратим внимание на служебное сообщение «Данная возможность недоступна».


Чтобы решить эту проблему, необходимо выбрать «Настройку обмена данными»


…и проставить галочку. Далее сообщение об ошибке игнорируем.


В настройках синхронизации данных выбираем «Создать обмен с «Розница»…



Перед настройкой параметров подключения через локальный или сетевой каталог следует убедиться, что на диске под каталог есть место. Хотя, как правило, он не занимает более 30-50 Мб, в исключительных случаях под него может потребоваться до 600 Мб. Создать необходимый каталог можно прямо из конфигуратора.



При подключении через сетевой каталог предложения настроить подключение посредством FTP-адреса и по электронной почте игнорируем, нажимая «Далее».


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



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


Для автоматизации процесса обмена необходимо настроить расписание.


Меню «Розница».


Проставляем галочку и выбираем «Синхронизацию».


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




Загружаем файл с настройками, созданный в УПП.


Проставляем галочку, адрес система подхватывает автоматически.





Действуем так же, как в УПП.









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



В случае ошибки в синхронизации «Подробно…» будет заменено на «Никогда…».


«Подробно…» открывает журнал регистрации с уточненной информацией по обмену.


Готово.


Ключевые слова: распределенная, УРБД, XML, регистрация, узел, узла, авторегистрация, начальный, образ, POP3, SMTP, ПочтовоеСообщение, периферийная, центральная, репликация, обмен

Дисклеймер и условия использования

Все случайно упомянутые в статье торговые марки принадлежат своим владельцам.
Статья опубликована под лицензией Creative Commons Attribution-Share Alike 3.0 Unported License.
http://creativecommons.org/licenses/by-sa/3.0/

Сразу замечу, что все нижеследующее относится к релизу платформы 8.0.7.36 и выше.

Шаг 1. Создание плана обмена

Создаем в конфигурации план обмена. Называем его, например "РаспределеннаяБаза". Обязательно в
свойствах плана обмена ставим флажок "Распределенная информационная база".

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

Замечание: при добавлении новых объектов в конфигурацию, они не включаются в план обмена. Т.е. после
добавления объекта его необходимо добавить в состав плана обмена.

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

В принципе, этих действий достаточно, чтобы РБД заработала в "ручном" режиме. Для этого запускаем
Предприятие, открываем наш план обмена через меню "Операции". В плане обмена всегда присутствует
предопределенный узел "с точкой". Это описание текущего узла. Его нужно открыть и заполнить. В нашем
случае будут доступны поля "Код" и "Наименование". Присвоим нашему узлу код "AA" и назовем
"Центральная". Добавим в план обмена один узел. Присвоим ему код "ВВ" и назовем "Периферийная".

Теперь мы можем создать образ периферийной базы. Делается это нажатием кнопки "Создать начальный
образ". В списке узлов должна быть выбрана периферийная база. Образ базы создается в виде готовой ИБ
в каталоге или на сервере 1С:Предприятия. (в отличие от 7.7, где образ ИБ создавался как файл
выгрузки). Далее созданную базу можно перенести в нужное место, просто скопировав файлик 1CV8.1CD
(для файлового варианта), либо через Конфигуратор через выгрузку-загрузку данных.

Если Вы откроете план обмена в периферийной ИБ, то Вы увидите, что узлом "с точкой", т.е. текущим
узлом стал узел "Периферийная", а иконка у узла "Центральная" стала красного цвета, т.е. узел
"Центральная" является главным узлом по отношению к текущему.

Обмен в "ручном" режиме можно производить при помощи кнопок "Записать изменения" и "Прочитать
изменения". В первом случае будет предложено выбрать файл, куда изменения будут записаны, во втором
- файл, откуда изменения будут считаны. Обмен ведется в формате xml. Изменения записываются для
выбранного узла.

Шаг 2. Выгрузка изменений в XML-файл и отправка по электронной почте

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

Добавляем в план обмена два реквизита: ЭлектронныйАдрес типа "строка" и "ВыполнятьОбмен" типа
"булево". В реквизите ЭлектронныйАдрес будем хранить email узла, т.е. тот адрес, на который будем
посылать сообщения обмена. Реквизит ВыполнятьОбмен нужен, чтобы быстро отключить автоматическую
посылку-отправку сообщений.

Процедуру для работы с электронной почтой сделаем универсальной, т.е. сделаем возможным
использование как MAPI (отправка-получение через почтового клиента, например, MS Outlook), так и
прямое обращение к SMTP/POP3 серверам.

Добавим в конфигурацию несколько констант:

где-нибудь в общей форме обеспечиваем редактирование значений этих констант.

Добавим общий модуль, назовем его "рбРаспределеннаяБаза". В нем пишем:

Процедура рбОтправитьСообщенияОбмена() Экспорт ИспользоватьSMTP = Константы.ИспользоватьОбменПоSMTP.Получить(); //Сначала создаем объект Почта, который в зависимости от настроек будет типа ИнтернетПочта, //если используется прямое обращение к серверам, либо Почта если используется MAPI. Если ИспользоватьSMTP Тогда //Для объекта типа ИнтернетПочта создаем и заполняем почтовый профиль. ПочтовыйПрофиль = Новый ИнтернетПочтовыйПрофиль; ПочтовыйПрофиль.АдресСервераSMTP = Константы.АдресСервераSMTPОбмена.Получить(); ПочтовыйПрофиль.ПортSMTP = Константы.ПортСервераSMTPОбмена.Получить(); ПочтовыйПрофиль.ПользовательSMTP = Константы.ПользовательСервераSMTPОбмена.Получить(); ПочтовыйПрофиль.ПарольSMTP = Константы.ПарольПользователяSMTPОбмена.Получить(); ПочтовыйПрофиль.ВремяОжидания = Константы.ВремяОжиданияСервера.Получить(); Почта = Новый ИнтернетПочта(); Попытка Почта.Подключиться(ПочтовыйПрофиль); Исключение Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю! Обмен не выполнен! " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; Иначе Почта = Новый Почта(); Попытка Почта.Подключиться(); Исключение Сообщить("" + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; КонецЕсли; //Далее выбираем все узлы из плана обмена, за исключением текущего, //у которых установлен реквизит ВыполнятьОбмен. ВыборкаУзлов = ПланыОбмена.РаспределеннаяБаза.Выбрать(); Пока ВыборкаУзлов.Следующий() Цикл Если Не ВыборкаУзлов.ВыполнятьОбмен Тогда Продолжить; КонецЕсли; Если ВыборкаУзлов.Ссылка = ПланыОбмена.РаспределеннаяБаза.ЭтотУзел() Тогда Продолжить; КонецЕсли; ЭлектронныйАдрес = СокрЛП(ВыборкаУзлов.ЭлектронныйАдрес); Если ЭлектронныйАдрес = "" Тогда Продолжить; КонецЕсли; //С помощью объектов ЗаписьXML и ЗаписьСообщения выполняем запись изменений //для выбранного узла в xml-файл. Узел = ВыборкаУзлов.Ссылка; ЗаписьXML = Новый ЗаписьXML(); ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_ " + СокрЛП(ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код) + "_ " + СокрЛП(Узел.Код) + ".xml "; ЗаписьXML.ОткрытьФайл(ИмяФайлаСообщения); ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML,Узел); ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения); ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьXML.Закрыть(); //Затем создаем новое письмо, прикрепляем к нему полученный xml-файл и //отправляем по адресу, указанному в реквизите ЭлектронныйАдрес узла. Файл = Новый Файл(ИмяФайлаСообщения); ТемаСообщения = "1С:Обмен " + СокрЛП(ПланыОбмена.РаспределеннаяБаза.ЭтотУзел().Код) + "_ " + СокрЛП(Узел.Код); Если ИспользоватьSMTP Тогда ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение; ПочтовоеСообщение.Тема = ТемаСообщения; ПочтовоеСообщение.Вложения.Добавить(ИмяФайлаСообщения, Файл.Имя); ПочтовоеСообщение.Получатели.Добавить(ЭлектронныйАдрес); Почта.Послать(ПочтовоеСообщение); Иначе ПочтовоеСообщение = Новый ПочтовоеСообщение; ПочтовоеСообщение.Тема = ТемаСообщения; ПочтовоеСообщение.Вложения.Добавить(ИмяФайлаСообщения); ПочтовоеСообщение.Получатели.Добавить(ЭлектронныйАдрес); Почта.Послать(ПочтовоеСообщение, Ложь); КонецЕсли; Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда Сообщить("ОБМЕН: Сообщение обмена для узла " + Узел.Наименование + " отправлено! ", СтатусСообщения.Информация); КонецЕсли; УдалитьФайлы(ИмяФайлаСообщения); КонецЦикла; Почта.Отключиться(); КонецПроцедуры

Рекомендую в интерфейс добавить дополнительную панель, на одну из кнопок которой повесить вызов этой
процедуры. Теперь осталось запустить Предприятие, настроить электронный адрес периферийной ИБ,
поставить галку "Выполнять обмен", нажать на кнопку процедуры на панели и бежать получать почту для
указанного эл. адреса. Должно придти письмо с темой "1С:Обмен AA_BB" и вложенным файлом
"Message_AA_BB.xml".

Итак, половина дела сделана: мы научили "восьмерку" отправлять сообщения обмена РБД по электронной
почте.

Шаг 3. Получение обновлений по электронной почте и запись их в ИБ

Теперь займемся обратной процедурой: получение обновлений по электронной почте и запись их в ИБ.

В параметры сеанса добавим параметр "ИдетОбменРаспределеннойБазы" типа Булево. Ниже я объясню его
назначение.

Добавим в общий модуль рбРаспределеннаяБаза такую процедуру:

Процедура рбПолучитьСообщенияОбмена() Экспорт ИспользоватьSMTP = Константы.ИспользоватьОбменПоSMTP.Получить(); //так же, как в процедуре рбОтправитьСообщенияОбмена(), сначала создаем объект Почта Если ИспользоватьSMTP Тогда ПочтовыйПрофиль = Новый ИнтернетПочтовыйПрофиль; ПочтовыйПрофиль.АдресСервераPOP3 = Константы.АдресСервераPOP3Обмена.Получить(); ПочтовыйПрофиль.ПортPOP3 = Константы.ПортСервераPOP3Обмена.Получить(); ПочтовыйПрофиль.Пользователь = Константы.ПользовательСервераPOP3Обмена.Получить(); ПочтовыйПрофиль.Пароль = Константы.ПарольПользователяPOP3Обмена.Получить(); ПочтовыйПрофиль.ВремяОжидания = Константы.ВремяОжиданияСервера.Получить(); Почта = Новый ИнтернетПочта(); Попытка Почта.Подключиться(ПочтовыйПрофиль); Исключение Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю! |Обмен не выполнен! ", СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; Иначе Почта = Новый Почта(); Попытка Почта.Подключиться(); Исключение Сообщить("ОБМЕН: Ошибка при подключении к почтовому профилю пользователя! |Обмен не выполнен! ", СтатусСообщения.ОченьВажное); Возврат; КонецПопытки; КонецЕсли; МассивСообщений = Новый Массив; Если ИспользоватьSMTP Тогда ВсеСообщения = Почта.Выбрать(Ложь); Иначе ВсеСообщения = Почта.Выбрать(Ложь, Ложь); КонецЕсли; //Отбираем среди всех писем те, которые имеют тему "1С:Обмен". //Маленькое, но важное замечание: //считаем, что все полученные письма с темой "1С:Обмен" предназначены //именно для текущего узла, //т.е. что у разных узлов в плане обмена РАЗНЫЕ электронные адреса. Для Каждого Сообщение Из ВсеСообщения Цикл Если Лев(Сообщение.Тема, 8 ) <> "1С:Обмен " Тогда Продолжить; КонецЕсли; Попытка МассивСообщений.Добавить(Сообщение); //Вложение письма сохраняем на диске. //Аккуратную проверку вложения оставим пока "за кадром." Вложение = Сообщение.Вложения; ИмяФайлаСообщения = КаталогВременныхФайлов() + Вложение.Name; ДанныеОбмена = Вложение.Данные; ДанныеОбмена.Записать(ИмяФайлаСообщения); //С помощью объектов ЧтениеXML и ЧтениеСообщения читаем данные //обновления из сохраненного файла. Перед записью обновлений в ИБ //устанавливаем параметр сеанса ИдетОбменРаспределеннойБазы в Истина. //Затем читаем изменения в ИБ: ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения). //Попутно сохраняем сообщения в массиве, чтобы потом их все сразу удалить. ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения); ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеXML); ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина; ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения); ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда Сообщить("ОБМЕН: Данные обмена приняты ",СтатусСообщения.Информация); КонецЕсли; Исключение Сообщить("ОБМЕН: Ошибка при получении данных обмена: " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); КонецПопытки; //После того, как чтение данных обмена закончено, возвращаем //параметру сеанса ИдетОбменРаспределеннойБазы значение Ложь. ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Ложь; Попытка УдалитьФайлы(ИмяФайлаСообщения); Исключение //если не получилось, ну и ладно КонецПопытки; КонецЦикла; Если ИспользоватьSMTP Тогда Почта.УдалитьСообщения(МассивСообщений); КонецЕсли; Почта.Отключиться(); КонецПроцедуры

Теперь про то, для чего нужен параметр сеанса ИдетОбменРаспределеннойБазы.
Дело в том, что при чтении данных методом ПланыОбмена.ПрочитатьИзменения() происходит вызов
процедур-обработчиков события ПередЗаписью() изменяемых/добавляемых объектов. И если при записи
какого-либо объекта в процедуре обработчике параметр Отказ будет установлен в значение Истина, то
при выполнении ПланыОбмена.ПрочитатьИзменения() возникнет исключение, и, соответственно, обмен
выполнен не будет. Значение параметра сеанса ИдетОбменРаспределеннойБазы может быть
проанализированно в процедурах-обработчиках, дабы избежать подобной ситуации.
С выходом редакции 12 (хотя я могу ошибаться в версиях), актуальность этого метода несколько
устарелаА, поскольку у объектов появилось свойство ПараметрыОбмена , у которого, в свою . Это свойство принимает значение Истина, когда идет
сохранение данных через план обмена.

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

Итак, мы почти вплотную приблизились к цели нашего повествования. Остался всего один шаг: запустить
выполнение процедур обмена в автоматическом режиме. Приступим.

Добавим константу ИнтервалАвтообменаРаспределеннойБазы типа Число(5,0).

В настройки пользователя добавим параметр ВыполнятьОбменРаспределенныхБаз. Для конфигурации
"Управление торговлей" это делается так:

* В план видов характеристик "НастройкиПользователей" добавим предопределенную
характеристику ВыполнятьОбменРаспределенныхБаз типа Булево.
* В форме элемента справочника "Пользователи" настраиваем изменение этого параметра (как это
сделать можно посмотреть в модуле формы, по аналогии с остальными параметрами).

В модуль рбРаспределеннаяБаза добавляем процедуру:

Процедура рбВыполнитьОбмен(прПользователь) Экспорт Если нпПолучитьЗначениеПоУмолчанию(прПользователь, "") Тогда рбПолучитьСообщенияОбмена(); рбОтправитьСообщенияОбмена(); КонецЕсли; КонецПроцедуры

в модуль приложения:

Процедура ПроверитьПодключениеАвтообмена() Экспорт Если нпПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ВыполнятьОбменРаспределенныхБаз ") И Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить() > 0 Тогда ПодключитьОбработчикОжидания("ВыполнитьАвтообмен ", Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить()); Иначе ОтключитьОбработчикОжидания("ВыполнитьАвтообмен "); КонецЕсли; КонецПроцедуры Процедура ВыполнитьАвтообмен() Экспорт рбВыполнитьОбмен(глТекущийПользователь); ОтключитьОбработчикОжидания("ВыполнитьАвтообмен "); Если нпПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ВыполнятьОбменРаспределенныхБаз ") И Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить() > 0 Тогда ПодключитьОбработчикОжидания("ВыполнитьАвтообмен ", Константы.ИнтервалАвтообменаРаспределеннойБазы.Получить()); КонецЕсли; КонецПроцедуры Процедура ОтключитьАвтообмен() Экспорт ОтключитьОбработчикОжидания("ВыполнитьАвтообмен "); КонецПроцедуры

в процедуру ПриНачалеРаботыСистемы() модуля приложения добавим такие строки:

(после подключения торгового оборудования)
...
ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Ложь; ПроверитьПодключениеАвтообмена();

Добавим на нашу панель еще пару кнопок для управления процессом: на одну вешаем процедуру
ПроверитьПодключениеАвтообмена(), на другую - ОтключитьАвтообмен()

Запускаем предприятие, настраиваем свойства пользователя и интервал автообмена и все!

Теперь при заходе в базу под этим-самым-настроенным пользователем будет запускаться обработчик
ожидания ВыполнитьАвтообмен(). Естественно, в периферийной базе тоже нужно настроить пользователя
для обмена.

Еще одно маленькое, но важное замечание:

Во всей, созданной нами прелести, присутствует одна неприятность: изменение конфигурации. При
получении периферийной базой сообщения, в котором будут содержаться изменения конфигурации, оно
будет принято, но возникнет исключительная ситуация. При этом измененная конфигурация будет
загружена. Для обновления конфигурации БД необходимо выгнать всех пользователей, зайти в
конфигуратор и выполнить обновление конфигурации БД (перед этим неплохо сделать выгрузку данных). К
сожалению, это неизбежное зло. Можно немного облегчить себе жизнь, написав коротенький bat-файл
примерно такого содержания:

1cv8.exe CONFIG /F<путь к ИБ> /N<Пользователь> /P<Пароль> /UpdateIBCfg

И еще одно замечание:

К сожалению, xml-файлы не отличаются компактностью, но, к счастью, прекрасно сжимаются. Можно в
процедуры отправки и получения сообщений добавить упаковку-распаковку файлов. COLOR="#666666">Делать это можно либо внешним архиватором, либо используя ВК, например Wheel.AddIn
(http://1c.proclub.ru/modules/mydownloads/personal.php?cid=81&lid=2714) .
С выходом 10 (кажется) редакции, предыдущее предложение несколько устарело, поскольку в платформу
были встроенны средства сжатия файлов по алгоритму ZIP. Т.е. теперь есть возможность сжимать файлы
без использования ВК.



Понравилась статья? Поделиться с друзьями: