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

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

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

Часто при ведении учета в различных конфигурациях 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 25 09.11.12 04:42 Сейчас в теме
тоже интересная альтернатива.
2. DitriX 1855 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 1855 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 201 06.02.14 21:37 Сейчас в теме
9. lutic19 08.08.19 15:08 Сейчас в теме
Все очень даже хорошо, единственное думаю что:

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

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

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

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

См. также

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

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

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

27.01.2016    83028    Serginio    113    

Полезные примеры СКД, ч.2

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

Еще несколько примеров решения задач в СКД.

06.04.2021    7888    Neti    8    

Обзор полезных методов БСП 3.1.4

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

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

25.03.2021    28756    rayastar    49    

Звуковое управление в 1С 8.3

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

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    5518    velemir    31    

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

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

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

10.12.2016    39867    unichkin    74    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions

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

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    7206    comol    31    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

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

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

30.08.2020    16963    quazare    34    

Форма выбора (подбор) в управляемых формах

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

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    59971    user5300    18    

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

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

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

15.10.2018    34543    tormozit    106    

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

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

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

31.03.2020    15390    informa1555    35    

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

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

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

27.01.2020    55190    ids79    26    

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

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

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

15.01.2020    38504    John_d    22    

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

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

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

20.09.2012    81443    tormozit    131    

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

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

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

30.12.2019    30490    kuzyara    38    

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

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

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

02.12.2019    21837    YPermitin    62    

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

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

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

22.11.2019    11341    Sibars    19    

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

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

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

11.07.2007    52646    tormozit    51    

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

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

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

07.10.2019    37169    HostHost    41    

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

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

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

01.10.2019    48549    Yashazz    55    

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

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

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

12.09.2019    24440    YPermitin    27    

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

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

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

10.09.2017    49273    tormozit    74    

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

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

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

06.09.2019    87630    rpgshnik    71    

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

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

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

05.09.2019    69839    ids79    55    

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

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

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

05.09.2019    41450    YPermitin    25    

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

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

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

25.04.2019    17135    m-rv    3    

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

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

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

03.09.2019    29010    YPermitin    81    

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

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

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

17.08.2019    41991    ids79    19    

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

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

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

08.08.2019    134088    ids79    75    

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

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

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

16.04.2019    22226    m-rv    17    

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

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

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

02.08.2019    54397    avalakh    26    

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

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

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

31.07.2019    36889    json    15    

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

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

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

26.07.2019    94662    ids79    16    

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

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

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

01.06.2018    35048    m-rv    22    

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

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

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

17.07.2019    44897    ids79    27    

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

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

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

09.07.2019    31846    YPermitin    14    

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

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

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

04.07.2019    21571    SeiOkami    52    

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

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

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

05.12.2017    30040    itriot11    34    

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

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

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

02.07.2019    74899    ids79    17    

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

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

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

25.06.2019    70177    ids79    27    

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

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

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

16.05.2019    58121    YPermitin    30    

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

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

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

10.11.2018    42091    ids79    45    

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

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

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

17.04.2019    21280    Smaylukk    122    

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

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

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

07.04.2019    40975    ellavs    131    

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

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

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

28.03.2019    30688    ellavs    90    

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

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

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

14.03.2019    38690    YPermitin    53    

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

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

В статье собраны наиболее распространенные ошибки при работе с хранилищем конфигурации и способы их обхода и решения.

01.03.2019    60297    Смешной 1С    32    

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

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

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

26.02.2019    26853    Vladimir Litvinenko    28    

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

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

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

03.02.2019    58526    ids79    11