Модификация стандартного механизма УРБД в 1С 7.7


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

Предистория:

Выполнял автоматизацию работы торговой компании на 1С 7.7. Заказчиком предъявлялись такие функциональные требования, реализовать которые на стандартной конфигурации «Торговля и склад» было очень проблематично. Чтобы не втискиваться в рамки типовой конфигурации, пришлось разработать новую конфигурацию с нуля. Как показала практика был сделан верный выбор. В результате, проведение документов работает в 3 раза быстрее, чем в типовой конфигурации (сделано на прямых запросах 1С++) и база жива до сих пор (центральная база уже более 50 ГБ). Одним из пунктов задания была организация обмена между базами таким образом, чтобы филиалы не могли видеть данные друг друга, но в центральной базе была полная информация. Проблема запуска стандартного механизма УРБД заключалась в том, что в состав филиала входило всегда 2 периферийные базы: офис и склад. И стандартная схема УРБД такого поведения не предусматривала. Конечно можно было воспользоваться замечательным «Менеджером обмена данными» Павла Баскира, но не решалась проблема автоматического обновления конфигураций удалённых баз (на дворе был 2005 год). Была еще другая обработка ToyURBD Павла Шемякина, но у меня не получилось ее запустить в нужном мне варианте. В итоге пришлось написать обработку, которая реализует нестандартный обмен на 1С++ и автоматизирует процесс отправки и получения файлов обмена. 

Что делает обработка:

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

Проверялось на релизе:

Платформа 1С 7.7.27, 1С++ 2.0.3.7. Работает только для SQL-редакции 1С.

Подробности:

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

При создании периферийных баз необходимо выбирать режим обмена Полный. Первые 2 символа кода базы резервируются под группу, третий символ используется для идентификации базы. Разумеется код Центральной базы нужно выбрать таким образом, чтобы он не пересекался ни с одной группой. Предлагаю использовать код «ЦБ » для центральной базы, а для периферийных баз первая буква кода будет совпадать с названием города, вторая — «Ф» указывает, что это филиал и третья указывает на место работы базы. Таким образом код базы «КФС» можно расшифровать как К — Киевский, Ф — филиал, С — склад; МФО: М — Московский, Ф — филиал, О — офис.

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

«DELETE FROM _1SUPDTS WHERE (DBSIGN LIKE ‘» + тГлавныеКоды.ГлавныйКод + «%’) AND » +
«NOT ((SUBSTRING(OBJID, 7, 3) LIKE ‘» + тГлавныеКоды.ГлавныйКод + «%’) OR (SUBSTRING(OBJID, 7, 3) LIKE ‘» + КодГлавнойБазы + «%’)) » +
» AND ((TYPEID > 0) AND (OBJID <> ‘ 0 ‘))»; // TYPEID нужно чтобы не удалялся признак отправки md

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

Даже при очень большом количестве записей в таблице _1CUPDTS время фильтрации не превышало 10 секунд.

Порядок встраивания:

Работает в виде встроенной и внешней обработки. Может вызываться интерактивно.

Порядок запуска:

Открыть обработку и нажать кнопку «Фильтровать таблицу обновлений». 

3 Comments

  1. Andreyyy

    Для DBF бы еще что-нибудь подобное. Клиент на «пустышках» работает, некоторые неудобства есть.

    Reply
  2. axxell

    (1) Andreyyy,

    Насколько я помню 1С++ поддерживает работу с запросами и с dbf базами. Вполне возможно, что и там будет работать. Тут еще нужно и время на проверку потратить.

    Reply
  3. CheBurator

    Обработку можно применять и для дбф, скорректировав «движок» запроса.

    а так — как раз подойдет для обрезки чужих данных и при обычной схеме ЦБ-многоПБ

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *