Фильтрация узлов при обмене РИБ в типовой конфигурации 8.1

15.10.12

Интеграция - Обмен между базами 1C

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

Скачать файлы

Наименование Файл Версия Размер
Тексты функций в модуле обработки (то что в статье) скачивать необязательно, т.к. в статье все тексты есть
.epf 5,70Kb
5
.epf 5,70Kb 5 Скачать

Фильтрация узлов при обмене

 

Проблема

 

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

Бывает, что пользователи (обычно администраторы или программисты) любят делать копии базы для различных целей. Часто эти копии потом открывают  в файловом режиме, но иногда могут делать копии и на сервере, например для различных тестов или разработок. При этом даже специалисты часто забывают отключать автообмен. Тогда и возникает данная проблема: с копии базы может выгрузиться файл обмена в рабочий ресурс обмена (например, на ftp ресурс). Тогда, если рабочая база не успеет переписать неправильный файл, то  в рабочую базу может загрузиться файл обмена не с рабочей базы, а с его копии, что может привести к ошибочному изменению данных.

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

 

Решение

 

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

Следующий  вариант реализации  был использован в типовой конфигурации Бухгалтерии Предприятия 2.0, но, скорее всего, годиться и для других типовых конфигураций, разработанных на обычных формах (например, для Управление торговли 10,3)

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

 

Srvr="Сервер1С";Ref="РабочаяБаза"; для серверного варианта или File="\\Сервер1С\С\ПапкаРабочейБазы"; для файлового варианта информационной базы.

 

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

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

 info: 

[CODE]

Srvr="Сервер1С ";Ref="РабочаяБаза";

[/CODE]

 

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

 

При чтении же этого файла обмена на другом узле будем проверять соответствие строки соединения из файла обмена правильной строке соединения из реквизита «Параметры» соответствующего узла обмена.

 

Реализация записи дополнительной информации:

 

В Общем модуле «ПроцедурыОбменаДанными», в процедуре «ЗаписатьСообщенияСИзмененеиямиДляУзла» после кода

Если ЭтоРИБ Тогда

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

ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);

Вставляем ссылку на нашу процедуру:

 

ЗаписатьДопИнфо(ЗаписьСообщения,ЗаписьXML,УзелОбмена);

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

 

Процедура ЗаписатьДопИнфо(ЗаписьСообщения,ЗаписьXML,УзелОбмена) Экспорт
    если
ПроверятьСтрокуСоединенияУзла(ПолучитьСтрокуСоединенияУзла(УзелОбмена)) тогда
       
ЗаписьXML.ЗаписатьНачалоЭлемента("info");
       
ЗаписьXML.ЗаписатьАтрибут("dop_info", "Строка");
       
ВключитьСтоку=СтрокаСоединенияИнформационнойБазы();
       
ЗаписьXML.ЗаписатьТекст(ВключитьСтоку);
       
ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЕсли;
КонецПроцедуры

 

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

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

 

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

 

Функция ПроверятьСтрокуСоединенияУзла(стр_изУзла)
    если
стр_изУзла="" тогда
        возврат Ложь;
    иначе
        Возврат Истина;
    КонецЕсли;
КонецФункции

z88;

 

Реализация чтения дополнительной информации:

 

В Общем модуле «ПроцедурыОбменаДанными», в процедуре «ЗагрузитьCообщениеСИзменениямиОтРИБУзла» после кода

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

Комментируем следующую строку

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

и вместо него вставляем ссылку на нашу процедуру:

 

ПроверитьВозможностьЗагрузки(СтруктураНастроекОбменаДанными.ДанныеНастройки.УзелИнформационнойБазы,ЧтениеСообщения,ЧтениеXML);

 

 

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

Процедура ПроверитьВозможностьЗагрузки(УзелОбмена,ЧтениеСообщения,ЧтениеXML) Экспорт
    Попытка
       
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
       
ОписаниеОшибки= ПроверитьПравильностьУзла(УзелОбмена,ЧтениеСообщения,ЧтениеXML);
    Исключение
       
ОписаниеОшибки=ОписаниеОшибки();
        если
ЧтениеXML<>Неопределено тогда
           
ОписаниеОшибки=ОписаниеОшибки+" (номер сообщения = " + ЧтениеXML.Значение+" номер ранее принятого = "+СтрЗаменить(УзелОбмена.НомерПринятого,символы.НПП,"")+") ";
           
ОписаниеОшибки1= ПроверитьПравильностьУзла(УзелОбмена,ЧтениеСообщения,ЧтениеXML);
            если
ОписаниеОшибки1<>"" тогда
               
ОписаниеОшибки=ОписаниеОшибки1 + Символы.ПС + ОписаниеОшибки;
            КонецЕсли;
        КонецЕсли;
    КонецПопытки;

    если
ОписаниеОшибки<>"" тогда
        ВызватьИсключение
ОписаниеОшибки;
    КонецЕсли;
КонецПроцедуры

 

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

 

Функция ПроверитьПравильностьУзла(УзелОбмена,ЧтениеСообщения,ЧтениеXML)
   
// ограничим чтение для непридвиденных случаев (неправильных файлов)
   
для счетчик=1 по 30  цикл
       
ЧтениеXML_Имя=ЧтениеXML.Имя;
       
ЧтениеXML.Прочитать();
       
СтрокаСоединения=ЧтениеXML.Значение;
        если
ЧтениеXML_Имя="info" тогда
           
Строки_изУзла=ПолучитьСтрокуСоединенияУзла(УзелОбмена);
            если Не
ПроверятьСтрокуСоединенияУзла(Строки_изУзла) тогда
               
ОписаниеОшибки="";
            иначе
               
ОписаниеОшибки=ПроверкаСтрокиСоединенияУзла(Строки_изУзла,СтрокаСоединения);
            КонецЕсли;

            если
ОписаниеОшибки="" тогда
               
// читаем конец элемента info
               
ЧтениеXML.Прочитать();

               
// позиционируемся на начало элемента v8de:Changes
               
ЧтениеXML.Прочитать();
                возврат
"";
            иначе
                Возврат
ОписаниеОшибки;
            КонецЕсли;
        КонецЕсли;

        если
ЧтениеXML.Имя="v8de:Changes" или ЧтениеXML.Имя="v8de:Data" тогда
       
// позиционируемся на начало элемента v8de:Changes
           
ЧтениеXML.Прочитать();
            возврат
"";
        КонецЕсли;
    КонецЦикла;;
    Возврат
"";
КонецФункции

 

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

Например, сервер может называться по имени, или же как «localhost» или же может быть задан IP адрес. Причем IP для локальной базы может быть задан как 127.0.0.1. Для файлового варианта тоже местонахождение базы может быть задана несколькими способами:

 

Srvr="Сервер1С";Ref="РабочаяБаза";

Srvr="localhost";Ref="РабочаяБаза";

Srvr="192.168.0.1 ";Ref="РабочаяБаза";

Srvr="127.0.0.1 ";Ref="РабочаяБаза";

File="\\Сервер1С\С\ПапкаРабочейБазы";

File="\\192.168.0.1\С\ПапкаРабочейБазы";

File="C:\Базы1С\ПапкаРабочейБазы"; где С:- локальный диск.

File="Z:\ПапкаРабочейБазы"; где Z:- подсоединенный диск.

Обмен может идти с одного компьютера (например автообмен из сервера), или же обмен может быть сделан вручную пользователями разных компьютеров. Если на разных компьютерах и у разных пользователей прописаны разные строки соединения, то в реквизите «Параметры» нужно включить несколько «правильных» строк соединения через разделитель «//»

Например: Srvr="Сервер1С";Ref="РабочаяБаза";//Srvr="localhost";Ref="РабочаяБаза";//Srvr="192.168.0.1 ";Ref="РабочаяБаза";

Но для большей гарантии того, что файл идет с правильного узла, конечно, лучше настроить на всех компьютерах и для всех пользователей единую, универсальную  строку соединения, например: Srvr="Сервер1С";Ref="РабочаяБаза"; или File="\\Сервер1С\С\ПапкаРабочейБазы"; Здесь выбран вариант имени сервера,  так как IP часто могут меняться, а имя сервера обычно редко меняется.

В клиент-серверном варианте, для того, чтобы при автообмене в файл записывалась правильная строка соединения, мы должны в списке баз на сервере поменять (если нужно) строку соединения на правильный, т.к. обычно системные администраторы любят при настройке базы писать не имя сервера, а  localhost или 127.0.0.1. Здесь есть тонкость:

необходимо проверить 2 файла на сервере приложений, в которых сохранены строки настроек баз 1С на сервере:

впапке C:\Program Files (x86)\1cv82\srvinfo\  или C:\Program Files\1cv82\srvinfo\ в файле srvribrg.lst  проверить, что стоит в строке настройки рабочей базы

Второй файл лежит в следующей папке: C:\ProgramFiles (x86)\1cv82\srvinfo\reg_1541  или C:\ProgramFiles\1cv82\srvinfo\reg_1541 (обычно, эта папка единственная в папке \1cv82\srvinfo\) в файле 1CV8Reg.lst  также проверить настройку строки соединения.

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

 z88;

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

 

z88;

Функция ПроверкаСтрокиСоединенияУзла(знач Строки_изУзла,знач СтрокаСоединения)
   
СтрокаСоединения=ВРег(СтрокаСоединения);
   
МассивСтрок=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Строки_изУзла, "//");
    для Каждого
СтрокаИзУзла из МассивСтрок Цикл
        если
СтрокаСоединения=ВРег(СтрокаИзУзла) тогда
            возврат
"";
        КонецЕсли;
    КонецЦикла;
    Если
МассивСтрок.Количество()=1 тогда
       
ОписаниеОшибки = " Файл обмен из неправильного узла ("+СтрокаСоединения+"). Файл не будет загружен! Правильный узел = "+СтрокаИзУзла+". ";
    иначе
       
ОписаниеОшибки = " Файл обмен из неправильного узла ("+СтрокаСоединения+"). Файл не будет загружен! Правильные узлы = "+Строки_изУзла+". ";
    КонецЕсли;
    Возврат
ОписаниеОшибки;
КонецФункции

 

См. также

SALE! 20%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

Обмен между базами 1C Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) в продаже с 2015 года, постоянно работаем над их развитием | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

45650 36520 руб.

04.08.2015    159657    363    267    

345

SALE! 15%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 22572 руб.

12.06.2017    134907    722    291    

388

SALE! 20%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

34650 27720 руб.

15.04.2019    68399    178    138    

111

SALE! 20%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

43450 34760 руб.

03.12.2020    34163    80    58    

78

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 25200 руб.

23.07.2020    46271    196    64    

156

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2. Переносятся начальные остатки, документы и справочники

Обмен между базами 1C Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

В продаже с 2014г. | Воспользовались более 122 предприятий! | Перенос данных из БП 3.0 в УТ 11 | из БП 3.0 в КА 2 | из БП 3.0 в ERP | Сэкономьте свое время - используйте готовое решение для перехода! | Постоянно работаем над развитием переноса данных | Обновляем на новые релизы 1С | Есть фильтр выгрузки по организациям | Переносятся начальные остатки на выбранную дату, документы за период времени и вся возможная справочная информация | Перенос сделан на технологии КД 2 (правила конвертации данных)

50722 45650 руб.

31.10.2014    231383    124    327    

295

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9203    9    8    

10

SALE! 10%

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.223.x) и БП 3.0 (3.0.149.x). Правила подходят для версии ПРОФ и КОРП.

28000 25200 руб.

15.12.2021    20232    132    38    

90
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. WKBAPKA 214 16.10.12 09:41 Сейчас в теме
да бывало такое... но я бы, как человек ленивый, уже бы не делал сравнение при загрузке, а делал перед выгрузкой сравнение по списку... т.е. используя предложенный вариант хранения списка баз...
2. alfir70 191 16.10.12 10:06 Сейчас в теме
(1) WKBAPKA,
сравнение перед выгрузкой - менее надежный вариант, т к решение принимает выгружаемая база а не загружаемая
по опыту работы со мнигими филиалами в других городах, могу сказать что система должна иметь защиту от дураков
т.к. если есть возможность ошибиться, то чедовек находит это шанс и ошибается
например в той же филиальной базе кто то может просто подкорректировать список по каими то необъяснимым причинам и выгрузить все таки файл из копии базы

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

и мне еше в этой стандартной обработке пришлось удалить кнопку "зарегистрировать все" по тем же причинам

так что я считаю что за целостность своих данных должен отвечат хозяин своей базы и не загружать ненужное
это то же из опыта - обычно за то что выгружают - относяться менее отвественно, чем за то что загружают
некоторые могут даже на "всякий случай" загуржать файл сначала на тестовую базу и только потом на рабочую.
3. WKBAPKA 214 16.10.12 10:17 Сейчас в теме
список можно загрузить в макет, он при обмене гарантированно попадет во все переферийные базы и никто не сможет его подкорректировать... вот вам и защита от дураков ;)
4. alfir70 191 16.10.12 10:29 Сейчас в теме
(3) WKBAPKA,
можно и так

но когда проверяшь при загрузке можно более оперативно - на ходу корректировать зарузку

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

это может быть актуально елси запакованнй файл выгрзуки - более 50 мБайт

также филиал может перйти на другой сервер, с файлового на сервер или еще как то изменить свою строку соединения - тогда быстрый способ возобновить обмен - именно в случае фильтрации при загрузке.
5. aspirator23 339 17.10.12 07:44 Сейчас в теме
Да, информация актуальна. Тоже имеем обмены и тоже приходится за ними смотреть
Оставьте свое сообщение