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

Публикация № 159824

Разработка - Практика программирования

Часто при ведении учета в различных конфигурациях 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 пространство имен и внести соответствующие изменения в вызов веб сервиса из базы продаж в базу закупок и опубликовать его.

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

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

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

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

Специальные предложения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2) в цикле подключаться к веб-сервису, который может быть не доступен, тоже не есть good.
Оставьте свое сообщение

См. также

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

10.12.2016    37791    unichkin    74    

Как я собрал для себя высокопроизводительный и бесплатный облачный бекенд для 1С на PosgreSQL + PostgREST

Производительность и оптимизация (HighLoad) WEB Интеграция Мобильная разработка Администрирование веб-серверов v8 Бесплатно (free)

В этой статье я расскажу о проблемах бека для мобильных приложений или другого фронта, который требует производительности, быстрой реакции и отказоустойчивости, и как я решил это благодаря opensource проекту PostgREST и СУБД Postgre SQL 12. Проведу простой тест производительности для сравнения 1С с данным решением. Это может быть полезно всем, кто разрабатывает мобильные приложения либо фронтсайд-приложения для 1С на чем угодно - на мобильной платформе или на нативном языке или на Simple UI. И также обзор новых функций SimpleUI для связи с этим бекендом.

31.03.2020    13400    informa1555    31    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    30645    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    26464    John_d    22    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    30981    tormozit    100    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    20146    kuzyara    33    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    17668    YPermitin    72    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    8802    Sibars    19    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

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

20.09.2012    78499    tormozit    131    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

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

07.10.2019    30883    HostHost    40    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

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

01.10.2019    35660    Yashazz    50    

Самый примитивный HTTP-сервис в мире

WEB v8 Бесплатно (free)

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

12.09.2019    22121    YPermitin    26    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

11.07.2007    49050    tormozit    42    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

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

06.09.2019    55490    rpgshnik    63    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    52557    ids79    54    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    30117    YPermitin    24    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    45484    tormozit    74    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

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

03.09.2019    26054    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    32796    ids79    16    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    91223    ids79    52    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16203    m-rv    2    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    38584    avalakh    25    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    25665    json    15    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    65449    ids79    12    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    20580    m-rv    17    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    37341    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    26923    YPermitin    14    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

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

04.07.2019    19956    SeiOkami    50    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    31308    m-rv    21    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

02.07.2019    51108    ids79    17    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    55447    ids79    25    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    25924    dmurk    146    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    28499    itriot11    34    

1Script.Web. Интернет-приложения на языке 1С

WEB OneScript Инструментарий разработчика v8 Бесплатно (free)

Запросы рынка таковы, что любое современное клиент-серверное приложение должно иметь веб-интерфейс. Почему бы не писать такие приложения на языке 1С? Андрей Овсянкин расскажет о возможностях разработки веб-приложений на базе 1Script, рассмотрит перспективы этого направления и в качестве демонстрации покажет «боевое» веб-приложение на новом движке – кроссплатформенную консоль администрирования парка кластеров 1С.

20.05.2019    20663    Evil Beaver    33    

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

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

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

16.05.2019    45307    YPermitin    30    

HTML-клиент у конфигурации 1С

WEB v8 Бесплатно (free)

Приветствую. В этой публикации опишу свой опыт создания html-клиента для конфигурации 1С с помощью http-сервисов. HTML-клиент в этом случае - это frontend (html + css+ js), который генерирует и выдает пользователю конфигурация + backend, который тоже реализован в этой же конфигурации.

17.04.2019    19285    Smaylukk    121    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    77146    Serginio    110    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    36219    ellavs    126    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

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

28.03.2019    27852    ellavs    90    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    32347    YPermitin    53    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    35695    ids79    40    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

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

26.02.2019    22857    Vladimir Litvinenko    27    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    42006    ids79    9    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    29591    grumagargler    28    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

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

26.12.2018    27678    ids79    31    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

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

14.12.2018    42843    ids79    72    

Ускоряем 1С: модули с повторным использованием возвращаемых значений Промо

Практика программирования v8 Бесплатно (free)

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

04.09.2017    53546    m-rv    61    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    38218    ids79    42    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

13.11.2018    50828    Unk92    25