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

Рабочий стол зарплатчика
Промо
Зарплата Рабочее место v8 v8::СПР v8::УФ ЗУП3.x Россия БУ Абонемент ($m)
Назначение обработки:
– Консолидация основных операций работника кадровой службы, расчетчика заработной платы в одном окне;
– Весь цикл кадровых операций: от создания сотрудника, до ввода любого необходимого кадрового документа;
– Ввод зарплатных документов: плановых начислений, удержаний; ввода документов расчета, перерасчета, выплаты зарплаты; ввода налоговых документов.
15.01.2020
6460
7
HostHost
0
Перенос объектов 1С
Промо
Перенос данных из 1C8 в 1C8 v8 v8::УФ 1cv8.cf Абонемент ($m)
Простой и наглядный перенос объектов между любыми базами 1С 8 с предварительным анализом на возможные различия в данных (через файл, через интернет, через буфер обмена). Интерактивная настройка правил обмена на стороне источника и получателя.
В обработке есть удобный обзор по подсистемам, поиск и обработка данных по заданному фильтру. Сравнение объектов, поиск ссылок.
Конструктор кода по созданию объектов, написание скриптов и отладка мини-функций в УФ.
Отключение/включение регламентных заданий. Регистрация/снятие с регистрации объектов в планах обмена. И многое другое.
Инструменты администратора в одной обработке.
1 стартмани
16.03.2015
87515
1378
moolex
193
Выгрузка и загрузка XML для управляемых форм 8.3 (с отбором)
Обмен через XML v8 v8::УФ 1cv8.cf Абонемент ($m)
В работе постоянно приходится разделять в различные базы или объединять несколько организаций в одну базу, долгое время пользовался стандартной обработкой выгрузка-загрузка из UNIREPS 8.2, в режиме обычного приложения, но, к сожалению, для управляемого приложения стандартная обработка из UNIREPS 8.3 (Диск ИТС) не позволяет нормально сделать выгрузку с отбором, поэтому ей никогда не воспользовался. Решил что напишу обработку, которая позволит делать отборы в различных вариациях, кроме того, в обработках из UNIREPS (8.2 и 8.3) существенно отличается процесс загрузки предопределенных, что не всегда удобно при больших объемах данных. Обработка написана на базе UNIREPS 8.3, но есть существенные изменения.
Но интерфейс доработан так, чтобы обработка была похожа на старую добрую обработку из UNIREPS 8.2, к которой все так привыкли.
1 стартмани
05.11.2019
7776
140
o.kovalev
14
Настройка узлов РИБ
Механизм распределенных информационных баз (РИБ) позволяет настроить обмен данными между двумя и более идентичными конфигурациями. Под идентичными понимаются базы с абсолютно одинаковой конфигурацией (например, УТ и УТ). Данный механизм служит в основном для обмена между базами, которые разделены друг от друга территориально и нет других способов синхронизации (или в случае нестабильного интернета). Работа в таких базах производится независимо друг от друга, а обмен данными происходит через передаваемые файлы сообщений (например, через электронную почту, или посредством копирования на съемные носители).Распределенная база состоит из одного центрального узла и одного (или нескольких) периферийных узлов. Чаще всего задача обменов между узлами РИБ сводится к выгрузке данных из периферийных узлов в центральную базу.
Рассмотрим механизм создания распределенной базы на примере 1С:Управление торговлей 11.
Раздел НСИ и администрирование –> синхронизация данных –> настройка синхронизации данных –> кнопка новая синхронизация данных.
Существует два варианта настройки:
- Распределенная информационная база – предназначена для настройки нового узла обмена РИБ;
- РИБ с фильтрами – Применяется в тех случаях, когда нужно обмениваться данными не по всем организациям и/или подразделениям, находящимся в базе.
В дальнейшем примере выбран первый вариант – распределенная информационная база.
В открывшемся окне рекомендуется в первую очередь создать архивную копию базы. Нажимаем создать резервную копию, выбираем необходимый путь для создания копии и нажимаем на кнопку сохранить резервную копию. Через некоторое время копия базы будет создана по указанному пути и можно будет переходить к этапам настройки.
Переходим по ссылке настроить параметры подключения.
На этом этапе выбирается каким способом будут синхронизироваться данные. Это может быть каталог – папка на компьютере или в локальной сети, синхронизация через FTP на сервере или электронную почту. Выберем вариант использовать локальный или сетевой каталог для синхронизации данных. Именно в этот каталог будут сохраняться файлы для выгрузки и загрузки. Нажмем Далее.
Укажем наименование программы – корреспондента и префикс. На примере – ПБ. Нажмем Далее
Настройки подключения для этой программы завершены. Готово.
Переходим к следующему этапу настройки РИБ – настроить правила отправки и получения данных.
На этом этапе создается начальный образ периферийной программы. Для этого нажимаем Создание начального образа с файлами и указываем каталог, в котором создастся периферийная база. В качестве расширения должно быть указано 1Cv8.CD – программа поставит его автоматически. Нажимаем создать начальный образ.
Откроется окно создания начального образа.
Через некоторое время создание начального образа будет завершено.
Все этапы настройки распределенной информационной базы для этой программы завершены.
Добавим распределенную информационную базу в список программ, зайдем в неё и продолжим настройку.
После входа в программу автоматически открывается помощник синхронизации данных. Напомним, что настройки всегда можно открыть из раздела НСИ и администрирование –> синхронизация данных –> настройка синхронизации данных –> кнопка новая синхронизация данных – распределенная информационная база.
Нажимаем настроить параметры подключения.
Выберем каталог и нажмем Далее.
На этом этапе видм представление программ и префиксы. Далее. Нстройки подключения второй базы сохранены.
Нажмем настроить правила отправки и получения данных.
Запишем и закроем настройки. На этом настройки РИБ завершены.
Рассмотрим совместную работу с двумя базами и разберем основные нюансы работы, некоторые ошибки и методы их исправления.
Представим, что пользователи в каждой из баз зашли в карточку контрагента и поменяли в нем название. В центральной базе переименовали контрагента Маяк на Маяк_Н, а в распределенной на Маяк-н (отличие регистре буквы Н) и провели синхронизацию в обеих базах.
Проводим обмен между центральной базой и периферийным узлом РИБ (дальнейшия действия нужно сделать поочередно во всех базах РИБ) – Раздел НСИ и администрирование –> синхронизация данных –> настройка синхронизации данных – кнопка синхронизировать.
Когда синхронизация проведена, данные записываются в файлы по тому пути, который был указан в первоначальной настройке. Именно этими файлами нужно будет обмениваться между удаленными рабочими местами.
После проведения синхронизации получили одно предупрждение.
Нажав на предупреждение откроется окно, где можно проанализировать конфликты синхронизации.
Нажмем показать отличие.
И посмотрим как изменился объект.
Программа автоматически разрешила конфликт в пользу центральной базы, т.к. центральная база имеет приемущество перед периферийной.
По кнопке пересмотреть – результат решения можно поменять на противоположный.
А по кнопке подтвердить – подтверждается разрешение конфликта и он исчезнет из списка предупреждений.
Как видим совместная работа в РИБ может привести к коллизиям, когда одни и те же данные одновременно изменяются в разных узлах. Чтобы этого избежать рекомендуется настроить права доступа таким образом, чтобы изменение одних и тех же данных в разных узлах базы стало невозможным.
В завершении рассмотрим наиболее распространенные ошибки при работе с РИБ.
Конфигурация узла распределенной ИБ не соответствует ожидаемой
Данная ошибка возникает как правило из-за аварийного завершения работы программы во время обмена.
Рекомендуется выполнить следующие действия:
- Создайте архивные копии всех баз и запустите конфигуратор в центральной базе;
- Отключите основной узел с помощью специальной обработки;
- Сохраните конфигурацию в файл (Конфигурация —> Сохранить конфигурацию в файл);
- Откройте конфигуратор базы подчиненного узла и снимите конфигурацию с поддержки (Конфигурация —> Поддержка —> Настройки поддержки —> Снять с поддержки);
- Загрузите конфигурацию из ранее сохраненного файла центральной базы (Конфигурация —> Загрузить конфигурацию из файла);
- После загрузки нужно применить все изменения для базы данных (нажатие на клавишу F7);
- После реструктуризации необходимо зайти в режим предприятия и с помощью обработки установить главный узел конфигурации;
- Исправление завершено, обмен должен работать нормально.
Номер сообщения меньше либо равен ранее принятому
Чаще всего такая ошибка возникает если одна из баз была восстановлена из архивной копии. В таком случае необходимо выравнять коды сообщений узлов обмена.
- Сделать архивные копии всех баз;
- Открыть типовую обработку регистрация изменений для обмена;
- В ней нажать на гиперссылку с номерами сообщений или на кнопку изменить номера сообщений;
- В открывшемся окне обнуляем номера сообщений и нажимаем Записать.
Комментарии (0)
1С:Бухгалтерия 3.0
Платформа 1С v8.x (все механизмы)
1.
vovanoren
31.10.14 01:22
Сейчас в теме
Добрый день. У меня возникла вот такая проблема- при настройке синхронизации между УТ 10.3 БП 3.0, в пункте разрешение конфликтов случайно выбрал не ту базу для автоматического разрешения конфликтов. Каким образом теперь можно изменить базу, из которой будут приниматься объекты ????
Скопировать ссылку
- Перейти
+
–
Ответить
Избранное
Подписка
Сортировка:
Древо развёрнутое
- Дата
- Дата
- Рейтинг всех уровней
- Рейтинг 1-го уровня
- Древо развёрнутое
- Древо свернутое
Свернуть все
В этой
теме
еще нет сообщений.
Оставьте свое сообщение
Введите ваш E-mail
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.
Конвертация 2.1 – перекачка одного справочника в два, один из них подчинённый третьему (5) 0.79 $m DevКДv8 | 5 | вчера, 03:01 DWZ2 |
Как называется тип выхода питания для касс Атол 22ПТК (24В) (4) 0.1 $m Admin | 4 | 24.07.20 andrey7617 |
quickscan qd2430 не верно сканирует сигареты через RDP (12) 1 $m HardwareWindows | 12 | 23.07.20 Kuzya_brаtsk |
Консультация/помощь эксперта по технологическим вопросам (3) 30 $m DevПрограммист | 3 | 23.07.20 AlexxSys |
COM-соединение: повторяющаяся ошибка “указана неправильная идентификация” (6) 0.2 $m Admin | 6 | 22.07.20 razmochaev |
Программное изменение динамического списка (14) 0.48 $m Dev | 14 | 22.07.20 user901542 |
КА 2.4 отчет Анализ распределения НДС (5) 0.5 $m DevERP2КА2 | 5 | 21.07.20 serg_art |
Автоматическое разрешение конфликтов в среде с более, чем одним ведущим узлом (в данной статье под ведущим узлом понимается узел, который принимает запросы на изменение данных) – очень интересная область исследований. Существует несколько различных подходов и алгоритмов, в зависимости от области применения, и в данной статье будет рассмотрена технология Операциональных Преобразований (Operational Transformations, OT) для разрешения конфликтов в приложениях совместного редактирования, таких как Google Docs и Etherpad.
Совместная работа сложна с технической точки зрения, потому что несколько людей могут вносить различные изменения в один и тот же участок текста в практически одинаковые моменты времени. Так как доставка данных через интернет не осуществляется мгновенно (скорость передачи данных в оптоволокне имеет ограничения), то для имитации мгновенного отклика в каждый момент времени каждый клиент работает с локальной версией (репликой) редактируемого документа, которая может отличаться от версий других участников. И основная загвоздка – обеспечить согласованность (consistency) между локальными версиями, или другими словами – как обеспечить, что все локальные версии рано или поздно сходятся (converge) в одну и ту же, корректную версию документа (мы не можем требовать, чтобы все клиенты в какие-то моменты времени одновременно имели одну и ту же версию, так как процесс редактирования может быть бесконечным).
Старая версия Google Docs
Изначально Google Docs, как и многие другие приложения совместного редактирования документов, использовал простое сравнение содержимого различных версий документа. Предположим, что у нас два клиента – Петя и Вася и текущее состояние документа синхронизировано между ними. В старой версии гуглодоков сервер, при получении обновления от Пети, вычисляет разницу (diff) между его версией и своей и пытается слить (merge) две версии в одну наилучшим доступным способом. Затем сервер отсылает полученную версию Васе. Если у Васи есть какие-то неотправленные на сервер изменения, то процесс повторяется – необходимо слить версию от сервера с локальной Васиной и отправить снова на сервер.
Очень часто такой подход работает не очень хорошо. Например, предположим что Петя, Вася и сервер начинают с синхронизированного документа с текстом “
The quick brown fox”.
Петя выделяет жирным слова brown fox, а Вася в то же время заменяет слово fox на dog. Пусть Петины изменения пришли первыми на сервер и тот пересылает обновлённую версию Васе. Понятно, что итоговым результатом должно быть The quick brown dog, но для алгоритмов слияния недостаточно информации чтобы это понять, варианты The quick brown fox dog, The quick brown dog, The quick brown dog fox являются абсолютно корректными. (Например, в git в таких случаях вы получите конфликт слияния и придётся править руками). В этом и состоит основная проблема такого подхода – не получится быть уверенным в результатах слияния, если опираться только на содержимое документа.
Можно попытаться улучшить ситуацию и блокировать возможность другим участникам редактировать участки текста, которые кто-то уже правит. Но это не то, чего мы хотим – такой подход просто пытается избежать решения технической проблемы через ухудшение user experience, а к тому же может быть ситуация, когда два участника начали одновременно редактировать одно и то же предложение – и тогда один из них либо потеряет изменения либо ему придется вручную объединять изменения в случае вышеописанных конфликтов.
Новая версия Google Docs
В новой версии Google Docs был применён совершенно другой подход: документы хранятся как последовательность изменений и вместо сравнения содержимого мы накатываем изменения по порядку (Под порядком здесь и далее понимается отношение порядка). Зная, как пользователь изменял документ и учитывая его намерения (intentions) мы можем корректно определить итоговую версию после объединения всех правок.
Окей, теперь нужно понять когда применять изменения – нам нужен протокол взаимодействия (collaboration protocol).
В Google Docs все правки документа сводятся к трём различным операциям (operations):
- Вставка текста
- Удаление текста
- Применение стилей к тексту
Таким образом, когда вы редактируете документ, все ваши действия сохраняются ровно в этом наборе операций, и они дописываются в конец журнала изменений. При отображении документа журнал изменений будет выполнен, применяя записанные операции.
Небольшая ремарка: первым (публичном) продуктом гугла с поддержкой OT был, по всей видимости, Google Wave. Он поддерживал гораздо более широкий набор операций.
Пример
Пусть Петя и Вася начинают с одного и того же состояния “ХАБР 2017”.
Петя меняет 2017 на 2018, это на самом деле создаёт 2 операции:
В это же время Вася меняет текст на “ПРИВЕТ ХАБР 2017”:
Васе приходит Петина операция на удаление, если он просто применит её, то получится неверный текст (должна была быть удалена цифра 7):
Чтобы избежать этого, Вася должен преобразовать (transform) Петину операцию в соответствии с его текущими локальными изменениями (другими словами, операции являются контекстно-зависимыми):
Говоря чуть более формально, рассмотрим такой пример:
Тогда:
Вуаля! Описанный алгоритм и называтся Operational Transformation.
Модель согласованности
Для обеспечения согласованности было разработано несколько моделей согласованности (consistency models), рассмотрим одну из них – CCI.
CCI модель обеспечивает выполнение трёх свойств:
- Сходимость (converge): Все реплики общего документа должны быть идентичными после выполнения всех операций:
В данном примере оба пользователя начинают с идентичных реплик. Затем они изменяют документ и реплики расходятся (diverge) – так достигается минимальное время отклика. После отправки локальных изменений остальным клиентам свойство сходимости требует, чтобы итоговое состояние документа у всех клиентов стало идентичным. - Сохранность намерения (intention preservation): Намерение операции дожно сохраняться на всех репликах, в независимости от наложения выполнения нескольких операций одновременно. Намерение операции (intention of an operation) определяется как эффект от её выполнения на той копии, где она была создана.
Рассмотрим пример, где это свойство не выполняется:
Оба клиента начинают с одинаковых реплик, затем оба делают изменения. Для Пети, намерение его операции – это вставить ‘12’ на первый индекс, а для Васи – удалить символы с индексами 2 и 3. После синхронизации у Пети Васино намерение и у Васи Петино намерение нарушены. Заметим также, что реплики разошлись, но это не является требованием для рассматриваемого свойства. Корректный итоговый вариант предлагается определить читателю в качестве маленького упражнения.
- Сохранность причинности (Causality Preservation): операции должны быть выполнены в причинно-следственном порядке (основываясь на отношении произошло-до (happened before)).
Рассмотрим пример, где это свойство не выполняется:
Как вы видите, Петя отправил Васе и агенту Смиту своё изменение документа, Вася получил его первым и удалил последний символ. Из-за сетевого лага Смит получает первым Васину операцию на удаление символа, которого ещё не существует.
OT не может обеспечить выполнение свойства сохранности причинности, поэтому для этих целей используют такие алгоритмы, как векторные часы.
Дизайн OT
Одной из стратегией дизайна OT системы является разделение на три части:
- Алгоритмы контроля преобразования (transformation control algorithms): определить, когда операция (target) готова к преобразованию, относительно каких операций (reference) преобразования проводить, и в каком порядке их выполнять.
- Функции преобразования (transformation functions): выполнение преобразования на target операции с учётом влияния reference операций.
- Требования и свойства преобразований (properties and conditions): обеспечить связь между этими компонентами и выполнять проверки на корректность.
Функции преобразования
Функции преобразования можно разделить на два типа:
Пример для посимвольных операций вставок/удаления (i – вставка, d – удаление):
Tii(Ins[p1, c1], Ins[p2, c2]) {
if (p1 < p2) || ((p1 == p2) && (order() == -1)) // order() – вычисление порядка
return Ins[p1, c1]; // Tii(Ins[3, ‘a’], Ins[4, ‘b’]) = Ins[3, ‘a’]
else
return Ins[p1 + 1, c1]; // Tii(Ins[3, ‘a’], Ins[1, ‘b’]) = Ins[4, ‘a’]
}
Tid(Ins[p1, c1], Del[p2]) {
if (p1 <= p2)
return Ins[p1, c1]; // Tid(Ins[3, ‘a’], Del[4]) = Ins[3, ‘a’]
else
return Ins[p1 – 1, c1]; // Tid(Ins[3, ‘a’], Del[1]) = Ins[2, ‘a’]
}
Tdi(Del[p1], Ins[p2, c1]) {
// Попробуйте придумать сами, в качестве упражнения
}
Tdd(Del[p1], Del[p2]) {
if (p1 < p2)
return Del[p1]; // Tdd(Del[3], Del[4]) = Del[3]
else
if (p1 > p2) return Del[p1 – 1]; // Tdd(Del[3], Del[1]) = Del[2]
else
return Id; // Id – тождественный оператор
}
Давайте рассмотрим как работает протокол взаимодействия в Google Docs более детально. Пусть у нас есть сервер, Петя и Вася, и у них синхронизированная версия пустого документа.
Каждый клиент запоминает следующую информацию:
- Версия (id, ревизия) последнего изменения, полученного от сервера.
- Все изменения, сделанные локально, но не отправленные на сервер (ожидающие отправки)
- Все изменения, сделанные локально, отправленные на сервер, но без подтверждения от сервера.
- Текущее состояние документа, которое видит пользователь.
Сервер, в свою очередь, запоминает:
- Список всех полученных, но не обработанных изменений (ожидающие обработки).
- Полная история всех обработанных изменений (revision log).
- Состояние документа на момент последнего обработанного изменения.
Итак, Петя начинает со слова “Hello” в начале документа:
Клиент сначала добавил это изменение в список ожидающих отправки, а затем отправил на сервер и переместил изменения в список отправленных.
Петя продолжает печатать и уже добавил слово “Habr”. В это же время Вася напечатал “!” в его пустом (он же ещё не получил Петины изменения) документе.
Петино было добавлено в список ожидающих отправки, но не было ещё отправлено, потому что мы не отправляем больше одного изменения за раз, а предыдущее ещё не было подтверждено. Заметим также, что сервер сохранил изменения Пети в своём логе ревизий. Далее сервер отправляет их Васе и посылает подтверждение Пете (о том, что Петины первые изменения успешно обработаны)
Клиент Васи получает Петины изменения от сервера и применяет OT относительно его ожидающих отправки на сервер . Результатом становится изменение индекса вставки с 0 на 5. Отметим также, что оба клиента обновили номер последней синхронизированной ревизии с сервером на 1. И наконец, Петин клиент удаляет соответствующее изменение из списка ожидающих подтверждение от сервера.
Далее Петя и Вася отправляют свои изменения на сервер.
Сервер получает Петины изменения до (относительно введённого порядка) Васиных, поэтому он сначала обрабатывает их, и посылает Пете подтверждение. Также он посылает их Васе, и его клиент преобразовывает их относительно пока ещё неподтверждённых изменений .
Затем происходит важный момент. Сервер начинает обрабатывать изменения Васи, те, которые, по мнению Васи, имеют номер ревизии 2. Но сервер уже зафиксировал изменения у себя под номером 2, поэтому он применяет преобразование ко всем изменениям, о которых клиент Васи ещё не в курсе (в данном случае — ), и сохраняет результат под номером 3.
Как мы видим, индекс в Васином изменении был увеличен на 5, чтобы вместить Петин текст.
Процесс закончен для Пети, а Васе осталось получить новое изменение от сервера и послать подтверждение.
Рассмотрим ещё одно похожее приложение, где применяется OT – опенсорсный проект онлайн-редактора с совместным редактированием etherpad.org
В Etherpad функции преобразования слегка другие – изменения отправляются на сервер в виде набора изменений (changeset), определяемого как
где
Как вы уже понимаете, итоговый документ формируется как последовательность таких изменений, применённых по порядку к пустому документу.
Заметим, что мы не можем просто применять изменения от других участников (это, в принципе, возможно в Google Docs), потому что итоговые длины документов могут быть различны.
Например, если исходный документ был длины n, и у нас есть два изменения:
то невозможно, т.к. требует документ длины , а после он будет длины .
Для разрешения этой ситуации в Etherpad используется механизм слияния (merge): это функция, обозначаемая как , принимает на вход два изменения на одном и том же состоянии документа (здесь и далее обозначаемое как ) и производит новое изменение.
Требуется, что
Заметим, что для клиента с изменениями , получившему изменения , нет особого смысла вычислять , так как применяется к , а у текущее состояние . На самом деле, нам нужно вычислить и , такие, что
Функция, вычисляющая и , называется follow и определяется так:
Алгоритм построения следующий:
Пример:
$$display$$X = (0rightarrow 8)[«baseball”] A = (8rightarrow 5)[0 – 1, «si”, 7] /!!/ == «basil” B = (8rightarrow 5)[0, «e», 6, «ow»] /!!/ == «below»$$display$$
Вычисляем:
Вычислить предлагается в качестве упражнения.
Протокол взаимодействия по своей сути совпадает с Google Docs, разве что вычисления чуть более сложны.
- Реализация OT является очень сложной задачей с точки зрения программирования. Цитируя из википедии: Joseph Gentle, разработчик библиотеки Share.JS и бывший инженер Google Wave сказал, что “Unfortunately, implementing OT sucks. There’s a million algorithms with different tradeoffs, mostly trapped in academic papers. The algorithms are really hard and time consuming to implement correctly. […] Wave took 2 years to write and if we rewrote it today, it would take almost as long to write a second time.”
(К сожалению, написать OT очень сложно. Существует миллион алгоритмов со своими плюсами и минусами, но большинство из них – только академические исследования. Алгоритмы на самом деле очень сложны и требуют много времени для корректной их реализации. […] Мы потратили 2 года на написание Wave, и если бы пришлось сегодня написать его заново – нам потребовалось бы столько же времени)
- Необходимо сохранять абсолютно каждое изменение документа
- Concurrency Control in Groupware Systems
- What’s different about the new Google Docs: Working together, even apart
- What’s different about the new Google Docs: Conflict resolution
- Understanding and Applying Operational Transformation
- Wikipedia: Operational transformation
- High-latency, low-bandwidth windowing in the Jupiter collaboration system
- What’s different about the new Google Docs: Making collaboration fast
- Operational Transformation in Real-Time Group Editors: Issues, Algorithms, and Achievements
- Etherpad and EasySync Technical Manual
- Google TechTalks: Issues and Experiences in Designing Real-time Collaborative Editing Systems
- Operational Transformation Frequently Asked Questions and Answers