Использование Web-сервисов для синхронизации баз данных в режиме online 1С8.2 (8.1) .

08.11.12

Интеграция - WEB-интеграция

Часто при ведении учета в различных конфигурациях 1С возникает необходимость выполнения обмена данных. Для решения этой задачи принято использовать Универсальный обмен данными XML или другие внешние обработки, общим у которых является использование текстовых файлов посредников.
Я предлагаю использовать Web-сервисы 1С.

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

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

  1. Например, компания использует: CRM систему учета, для ведения учета взаимоотношений с клиентами; БП 2.0 для ведения взаиморасчетов с клиентами в разрезе счетов; Счета выставляемые клиентам создаются в торговой базе, а оформление заказов поставщикам исходя из потребности клиентов в базе ориентированной на работу с пайсами поставщиков. При таком разделенном построении учета, для выставления счета в одной из баз к примеру требуется завести карточку клиента в другой базе с тем чтобы данные о контрагенте так же были доступны в базе со счетами.
  2. Помимо синхронизации первичных данных, может возникнуть необходимость построения сводного отчета по данным из нескольких баз, что тоже потребует обращения к внешним данным в online режиме.

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

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

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

Что нам потребуется для того чтобы задача возникла и могла быть решена.

  1. Сервер 1С, с установленной web компонентой;
  2. веб-сервер (например IIS 6.0);
  3. Две или более конфигурации учетных систем.

 Что нам потребуется для решения задачи.

Создадим в базе "Закупки" Web-сервис "Синхронизация", и добавим ему Операцию "СинхронизироватьТовар", со строковыми параметрами.

  1. "GuidТовара" - сюда будем передавать уникальный идентификатор товара, присвоенный в базе Продаж.
  2. "GuidРодителя" - уникальный идентификатор родителя данного товара.
  3. "стрСтруктураРеквизитов" - Структура реквизитов товара в виде примитивных типов (число, строка, дата, булево), преобразованная в строку.
  4. "этоГруппа" - реквизит, котрый позволит нам, не раскрывая всей структуры реквизитов товара, узнать, является ли товар группой и соответственно его обработать.
  5. "стрТаблицаЕденицИзмерения" - Таблица, содержащая описание доступных единиц измерения для товара

 

Далее потребуется опубликовать данный сервис на веб сервере. для этого нужно будет создать текстовый файл "wssinhron.1cws", в каталоге сайта, опубликованном на веб сервере. Библиотека wsisapi.dll, должна быть подключена. Проще всего корректную настройку работы веб сервера с 1С можно провести, опубликовав веб приложение через конфигуратор Администрирование->"Публикация на веб сервере".

Единственным минусом является, то что в версии 8.2 файлы веб сервисов *.1cws, сами не создаются. Возможно просто мне не хватает знаний по этому вопросу, но для публикации веб-сервисов я пользуюсь блокнотом.

Также следует учесть что на серверах 64x следует использовать wsisapi.dll из поставки 1с 64x, даже если сам сервер 1С у вас 86x.

Итак создаем файл "wssinhron.1cws" с текстом.


{Название вашего сервера 1С}";Ref="{Название базы. у нас это "Market"}";"/>

 

Далее перейдем в модуль обработки нашего Сервиса, для наглядности я приведу пример кода своей разработки

//стрТаблицаЕдиницИзмерения - таблица в строке с колонками.
//GUIDЕдиницы
//Базовая - булево
//Коэффициент
//ЕдиницаИзмерения - код классификатора Единиц измерения.
//Утверждено - булево
//******************************
//ТаблицаГабаритов С колонками
//ВидУпаковки (строковое значение)
//Длина
//ширина
//высота
//объем
//ОбъемныйВес
//Вес
//ФормаОснования
//ВесБрутто
//*****************************

//стрСтруктураРеквизитов - структура с праметрами
//Наименование
//код
//ПометкаУдаления
//ВидТовара - идентификатор перечисления
//GUIDПроизводителя - GUID производителя
//СтавкаНДС - число ставка
//Жив - булево
Функция СинхронизироватьТовар(GUIDтовара, GUIDродителя, этоГруппа, Уровень, стрСтруктураРеквизитов, стрТаблицаЕдиницИзмерения,стрТаблицаТНВЭД)
Попытка
    СтруктураРеквизитов = ЗначениеИзСтрокиВнутр(стрСтруктураРеквизитов);
    ТоварСсылка = Справочники.Товары.НайтиПоРеквизиту("GUIDтовара",СокрЛП(GUIDтовара));
    Если СокрЛП(GUIDродителя)<>"" тогда
        ТоварРодитель = Справочники.Товары.НайтиПоРеквизиту("GUIDтовара",СокрЛП(GUIDродителя));
    иначе
        ТоварРодитель = Справочники.Товары.ПустаяСсылка();
    КонецЕсли;

    Если ТоварРодитель.Пустая() и Уровень<>"0" тогда
        Если СтруктураРеквизитов.ПометкаУдаления тогда
            Возврат "ОК";
        КонецЕсли;
            возврат "0 Не найден родитель товара";
        КонецЕсли;
        Если СокрЛП(GUIDтовара) = "" тогда
            возврат "0 Не верный ГУИД товара";
        КонецЕсли;
        //заполним реквизиты
        Если ТоварСсылка.Пустая() тогда
            ТоварСсылка = Справочники.Товары.НайтиПоКоду(СтруктураРеквизитов.Код);
        КонецЕсли;
        Если ТоварСсылка.Пустая() тогда

            Если этоГруппа="1" тогда
                ТоварОбъект = Справочники.Товары.СоздатьГруппу();
            иначе
                ТоварОбъект = Справочники.Товары.СоздатьЭлемент();
            КонецЕсли;
                ТоварОбъект.GUIDтовара = GUIDтовара;
        иначе
            ТоварОбъект = ТоварСсылка.ПолучитьОбъект();
            ТоварОбъект.GUIDтовара = GUIDтовара;
        КонецЕсли;
        ТоварОбъект.Родитель = ТоварРодитель;

        ТоварОбъект.Наименование = СтруктураРеквизитов.Наименование;

        ТоварОбъект.Код = СтруктураРеквизитов.Код;
        .....................

        Если этоГруппа="1" тогда 
        иначе
            Если СтруктураРеквизитов.менеджер <> "" тогда
            ......................
            КонецЕсли;

            //
            Если ТоварОбъект.Производитель.Пустая() тогда
                Если СтруктураРеквизитов.Производитель<>"" тогда
                    ТекПроизводитель = справочники.Производители.НайтиПоНаименованию(СтруктураРеквизитов.Производитель);
                    Если ТекПроизводитель.Пустая() тогда
                        НовПроизводитель = Справочники.Производители.СоздатьЭлемент();
                    иначе
                        НовПроизводитель = ТекПроизводитель.ПолучитьОбъект();
                    КонецЕсли;
                    НовПроизводитель.GUID = СтруктураРеквизитов.GUIDПроизводителя;
                    НовПроизводитель.Наименование = СтруктураРеквизитов.Производитель;
                    НовПроизводитель.Записать();
                    ТоварОбъект.Производитель = НовПроизводитель.ссылка;
                КонецЕсли;
            КонецЕсли;
            ТоварОбъект.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию(СтруктураРеквизитов.СтавкаНДС,Истина);

        КонецЕсли;

        ТоварОбъект.Записать();
        ТоварОбъект.УстановитьПометкуУдаления(СтруктураРеквизитов.ПометкаУдаления,Ложь);

        ТоварСсылка = ТоварОбъект.Ссылка;
        ТоварОбъект = Null;

        //Синхронизируем Единицы измерения
        ТаблицаЕдиниц = ЗначениеИзСтрокиВнутр(стрТаблицаЕдиницИзмерения);
        Для каждого строка из ТаблицаЕдиниц цикл
            ЕдиницаСсылка = Справочники.ЕдиницыИзмерения.НайтиПоРеквизиту("GUIDЕдиницы",строка.GUIDЕдиницы);
            Если не ЕдиницаСсылка.Пустая() тогда
                ЕдиницаОбъект = ЕдиницаСсылка.ПолучитьОбъект();
                ЕдиницаОбъект.УстановитьПометкуУдаления(строка.ПометкаУдаления,Ложь);
            иначе
                Если строка.ПометкаУдаления тогда
                    продолжить;
                КонецЕсли;
                ЕдиницаОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
                ЕдиницаОбъект.GUIDЕдиницы = строка.GUIDЕдиницы;
            КонецЕсли;

            ЕдиницаОбъект.Код = строка.Код;
            ЕдиницаОбъект.Наименование = строка.Наименование;
            ....................

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

        ТоварОбъект = ТоварСсылка.ПолучитьОбъект();
        ТоварОбъект.ВремяСинхронизации = ТекущаяДата();
        ТоварОбъект.Синхронизирован = истина;
        ТоварОбъект.Записать();
    исключение

        //в случае возникновение ошибки вывод результата облегчит поиск причины.
        Возврат ОписаниеОшибки();
    КонецПопытки;

    //Если все прошло успешно сообщим методу вызвашему веб сервис об успешном выполнении.
    Возврат "ОК";
КонецФункции

 

Теперь, как вызвать веб-сервис, не зациклив при этом систему.

в нашем справочнике "Товары" в базах "Продажи" и "Закупки" нам потребуются служебные реквизиты.

  1. "GUIDтовара" - строковый реквизит (50)
  2. "ВремяСинхронизации" - Реквизит с типом Дата и Время
  3. "Синхронизирован" - тип булево.


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

Перем передавать Экспорт;

Процедура ПередЗаписью(Отказ)

Процедура ПриЗаписи(Отказ)

Функция Синхронизация()

передавать = истина;

Таким образом получится что при любой инициализации модуля наша переменная всегда имеет значение истина.

Рассмотрим наши процедуры

Процедура ПередЗаписью(Отказ)
    #Если не ВнешнееСоединение тогда                          

        //На случай двустороннего обмена данными, необходимо ограничить возможность вызова процедур синхронизации при записи спарвочника из режима внешнего соединения.
        Если передавать = истина тогда
            Синхронизирован = Ложь;
        КонецЕсли;
    #КонецЕсли
КонецПроцедуры

 

Процедура ПриЗаписи(Отказ)
    #Если не ВнешнееСоединение тогда

        Если Константы.СинхронизироватьБазы.Получить() и передавать тогда
            Синхронизация();

        КонецЕсли;

    #КонецЕсли
КонецПроцедуры


Функция Синхронизация()
    GUIDтовара = СокрЛП(ссылка.УникальныйИдентификатор());
    Если ссылка.Уровень()>0 тогда
        GUIDродителя = СокрЛП(ссылка.Родитель.УникальныйИдентификатор());
        Уровень = ссылка.Уровень()
    иначе
        GUIDродителя = "";
        Уровень = "0";
    КонецЕсли;
    Если ЭтоГруппа тогда
        СтрэтоГруппа = "1";
    иначе
        СтрэтоГруппа = "0";
    КонецЕсли;
    СтруктураРеквизитов = Новый Структура;
    //заполним структуру параметров которые мы бы хотели передать в базу приемник.

    СтруктураРеквизитов.Вставить("Наименование",Наименование);
    СтруктураРеквизитов.Вставить("код",код);
    ....................

    Если не ЭтоГруппа тогда
        Если ОсновнойПоставщик.Пустая() тогда
            ......................
        иначе
            .....................
        КонецЕсли;

    КонецЕсли;

    стрСтруктураРеквизитов = ЗначениеВСтрокуВнутр(СтруктураРеквизитов);

    ТаблицаЕдиницИзмерения = Новый ТаблицаЗначений;
    //GUIDЕдиницы
    //Базовая - булево
    //Коэффициент
    //ЕдиницаИзмерения - код классификатора Единиц измерения.
    //Утверждено - булево
    //ТаблицаГабаритов

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

        НовСтрока.ТаблицаГабаритов = ЗначениеВСтрокуВнутр(ТаблицаГабаритов);
    КонецЦикла

    // т.к. наш вебсервис принимает в себя только строковые параметры, преобразуем наши таблицы в строки.
    стрТаблицаЕдиницИзмерения = ЗначениеВСтрокуВнутр(ТаблицаЕдиницИзмерения);

    есть = Ложь;
    колПопыток = 0;
    Пока не Есть и колПопытокцикл
        Попытка
            Определение = Новый WSОпределения(Константы.WebАдресМаркетинга.Получить()+"wssinhron.1cws"+"?wsdl",ПараметрыСеанса.Пользователь.Код,ПараметрыСеанса.Пользователь.ПарольЗакупок);
            Прокси = Новый WSПрокси(Определение, "www.market-sinhron.gor", "Синхронизация", "СинхронизацияSoap");
            Прокси.Пароль = ПараметрыСеанса.Пользователь.ПарольЗакупок;
            Прокси.Пользователь = ПараметрыСеанса.Пользователь.Код;
            Результат = Прокси.СинхронизироватьТовар(GUIDтовара, GUIDродителя, СтрЭтоГруппа, Уровень, стрСтруктураРеквизитов, стрТаблицаЕдиницИзмерения, стрТаблицаТНВЭД);
            Определение = Null;
            Прокси = Null;
            есть = Истина;
        исключение
            колПопыток = колПопыток+1;
            Определение = Null;
            Прокси = Null;
        КонецПопытки;
    КонецЦикла;
    Если колПопыток=100 тогда
        #Если Клиент тогда
            сообщить(ОписаниеОшибки());
            Предупреждение("Ошибка синхронизации. отсутствует подключение.");
        #КонецЕсли
    КонецЕсли;
    передавать = ложь;
    сообщить(Результат);
    Если Лев(Результат,2)="ОК" тогда
        Синхронизирован = Истина;
        ВремяСинхронизации = ТекущаяДата();
        Записать();
    КонецЕсли;

    Если СокрЛП(Результат)="0 Не найден родитель товара" тогда
        #Если Клиент тогда
            Сообщить("вызов синхронизации родителя");
        #КонецЕсли
        ОбъектРодитель = родитель.ПолучитьОбъект();
        ОбъектРодитель.Записать();
        Записать();
    КонецЕсли;

КонецФункции

Таким образом остается добавить в событие формы элемента "ПриЗаписи()"

передавать = истина;

Синхронизация();

И мы сможем записывать наш элемент сколько угодно раз не вызывая зацикливания.

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

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

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

Построение сводных отчетов

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

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    17801    19    22    

17

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    19886    13    17    

17

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    14436    42    8    

18

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    1208    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Il 30 09.11.12 04:42 Сейчас в теме
тоже интересная альтернатива.
2. DitriX 2102 09.11.12 14:17 Сейчас в теме
(0) вот недавно сделал аналогичную тему, только синхронизировал 3 интренет магазина с базой.
Делается это все немного не так :)
Во первых, у вас указано в теме:
Что нам потребуется для того чтобы задача возникла и могла быть решена.
1. Сервер 1с, с установленной web компонентой;
2. веб-сервер (например IIS 6.0);
3. Две или более конфигурации учетных систем.

Но таким образом - вы не решите проблему нескольких баз, так как GUID у вас только один указывается, тот что в реквизите.
Т.е. в вашем случае - количество реквизитов должно быть равно 3 * (Количество баз - 1).

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

Когда это делается Подпиской на событие?
И почему в две функции?
Учтите, если вы в момент записи делаете такое, то в случае, когда вторая база не доступна, то соап будет несколько секунд висеть.
Идем дальше, представьте себе, что вы групповой обработкой меняете реквизит, это же будет паника :)

Вобщем идея у вас правильная, но подход не тот :)
Если кому то будет интересно, то могу написать статью, о том, как это делать правильно :)
3. allert73 92 09.11.12 14:46 Сейчас в теме
(2) DitriX,
На во первых. дополнительных реквизитов GUID достаточно одного набора, при условии что одна из баз должна считаться первичной, а в остальные базы реквизит GUID будет записываться как уникальный идентификатор первичной базы. В этом случае синхронизация вызываемая не из первичной базы, должна быть обращена в первую очередь к базе первичной с параметром GUID="", и в случае создания нового элемента синхронизация должна возвращать GUID этого элемента. у мена ответ вгялядит примерно так. 'Возврат "ОК "+СокрЛП(ТекДокОбъект.Ссылка.УникальныйИдентификатор());'. Вызов синхронизаций во вторичные базы будет осуществляться с уже заполненным реквизитом GUID.

На во вторых. в случае записи элемента справочника действительно можно было бы обойтись одним ПриЗаписи().
в ПередЗаписью() возникает необходимость для случая документа. дело в том что документ может записываться как проведенным так и не проведенным. Бывает так что во время проведения документа он немного меняется в частности признак проведен у него становится Истиной. Я использую перед записью так.

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

РежимЗаписиДок = РежимЗаписи;
Если не ДокументОснование.Склад.Пустая() тогда
Склад = ДокументОснование.Склад;
КонецЕсли;
#Если Клиент тогда
Если передавать тогда
Синхронизирован = Ложь;
КонецЕсли;
#КонецЕсли

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

Затем в процедурах ОбработкаПроведения() и ПриЗаписи() добавляю проверку.
Процедура ПриЗаписи(Отказ)
Если РежимЗаписиДок<>РежимЗаписиДокумента.Проведение тогда
отказ = не Синхронизировать();
КонецЕсли;
КонецПроцедуры
Действительно из примера со справочником этот можно было бы исключить.
4. allert73 92 09.11.12 14:48 Сейчас в теме
(2)а вообще спасибо за конструктивную критику :)
5. DitriX 2102 09.11.12 15:37 Сейчас в теме
(4) не за что, самому приятно поговорить с умным человеком, но давайте посмотрим глубже, вот вам скрин. На нем четко видно, что эта схема подойдет для любых объектов, в которых есть надобность синхронизации.
Кроме этого, у меня в справочнике номенклатуры - есть около 10 доп реквизитов.
Из вашей схемы я не совсем уяснил, как вы передаете значения остальных реквизитов?
Так же как и единицы измерения?
Так же вопрос - почему вы выбрали GUID? Почему не по коду какому-то например? Видь их сравнивать намного сложнее, если что то пошло не так :)
Так же не совсем понятно, что происходит в случае, если вы записали элемент, а вторая база в этот момент была не доступна? Ну или в той базе например был открыт этот элемент, и база-приемник не смогла его записать?

Если колПопыток=100 тогда

Я так понял вы пытаетесь 100 раз достучаться до сервера, как это влияет на производительность? В случае если второй сервер не доступен?

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

Вы правы, не хватает опыта, можете скачать архив с моей публикации http://infostart.ru/public/128699/, там по полочкам разложено - как создать веб-сервис и какие камни вас ожидают.
Прикрепленные файлы:
7. allert73 92 09.11.12 16:39 Сейчас в теме
(5) DitriX, Извиняюсь, забыл указать получателя в комментарии. текст ответа в комментарии 6.
6. allert73 92 09.11.12 16:35 Сейчас в теме
все реквизиты которые необходимо синхронизировать я передаю в структуре значений преобразованной в строку. Согласен что перебор реквизитов объекта через его метаданные(что позволило бы использовать общий обработчик для различных типов объектов) был бы эффективным, но только для случая когда реквизиты объекта во всех базах совпадают, например в практике процедуры синхронизации происходят между Базами CRM(от раруса), УПП(от 1с), самодельные база "регистрации Продаж и Остатков" и база "регистрации Потребности, себестоимости и закупок" и набор реквизитов справочников и документов довольно таки сильно отличается.

Единицы измерения у меня подчиненный справочник. их я передаю как таблицу значений опять же преобразованную в строку, то же самое делаю и с табличными частями объектов(преобразую таблицы в строку), также имеется реквизит базовая единица измерения который передается в качестве GUIDа нужной единицы, и обрабатывается уже после того как обработана переданная таблица единиц. Код по передачи данных большинства реквизитов в статье заменен на многоточия. (т.к. статья писалась лишь с целью показать альтернативную возможность синхронизации данных)
но вот кстати процедура передачи Единицы измерения в примере есть.
Что касается прочих реквизитов которые имеют не примитивные типы (например реквизит "Поставщик"), то в зависимости от пожелания: элементы принадлежащие набору данных с типом данных реквизитов, можно также синхронизировать. Очевидно что вызов процедур синхронизации для значений которые присваиваются реквизитам элемента, происходит раньше синхронизации самого элемента.

Почему ГУИД а не код, дело в том, что по определенным причинам, код и номер(для объекта документа) являются величинами переменными, в то время как УникальныйИдентифкатор() величина постоянная.

О том что делать в случае если базы к которым мы стучим не доступны, например можно сделать так, как указоно в предыдущем комментарии.
Процедура ПриЗаписи(Отказ)
Если РежимЗаписиДок<>РежимЗаписиДокумента.Проведение тогда
отказ = не Синхронизировать();
КонецЕсли;
КонецПроцедуры

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

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

Насчет Сотни Раз. Фиговое решение согласен. Однажды на практике как то вышло так что запрос к веб-серверу обрабатывался с третьей попытки. Вообще давно пора от этого куска избавиться.
8. almas 258 06.02.14 21:37 Сейчас в теме
Спасибо за публикацию.
9. lutic19 08.08.19 15:08 Сейчас в теме
Все очень даже хорошо, единственное думаю что:

1) эта строчка явно лишняя:

//заполним реквизиты
Если ТоварСсылка.Пустая() тогда
ТоварСсылка = Справочники.Товары.НайтиПоКоду(СтруктураРеквизитов.Код);
КонецЕсли;

зачем искать по коду, когда синхронизируешь по GUIDтовара? Если будут номенклатуры одинаковые по кодам - это не есть good.

2) в цикле подключаться к веб-сервису, который может быть не доступен, тоже не есть good.
10. alexusus 21.04.22 15:54 Сейчас в теме
Добрый день. Есть две базы данных. Между ними настраивается обмен через web-сервис, лететь будут справочники. Можно ли настроить обмен только зарегистрированных объектов к выгрузке и как? Хотелось бы немного теории.
Оставьте свое сообщение