Мьютексы в 1С 7.7

02.07.10

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Существует ряд задач, которые требуют строго последовательного исполнения. Чаще всего это возникает при многопоточном программировании, в этом случае используются критические секции, но иногда надо синхронизировать и разные приложения - для этого существуют такие объекты ядра операционной системы как Мьютекс-ы. http://ru.wikipedia.org/wiki/Мьютекс
В статье рассказывается как можно сделать аналогичный объект средствами 1С v7.7

Существует ряд задач, которые требуют строго последовательного исполнения. Чаще всего это возникает при многопоточном программировании, в этом случае используются критические секции, но иногда надо синхронизировать и разные приложения - для этого в существуют такие объекты ядра операционной системы как Мьютекс-ы.

В википедии есть подробная статья про них, если кому интересно: http://ru.wikipedia.org/wiki/Мьютекс

Для чего это может понадобится в 1С ?

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

Отсюда вытекает задача объекта синхронизации, владеть которым в момент времени мог бы только один сеанс. Я предлагаю для этого обходится стандартными возможностями 7.7

Полное описание к задаче:

  • Должен быть объект который монопольно можно захватить из 1С.
  • Обращаться к объекту должно быть можно их разных запущенных сеансов, разных компьютеров, в идеале разных ИБ
  • При аварийном завершении сеанса захватившего объект - захват должен сниматься, что бы не оказалось подвисших блокировок.

 

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

Таким свойством обладает открытый через XBase файл dbf. На этом и построен алгоритм.

Всего работа с синхронизацией состоит в данном случае из 2х функций: Lock() и UnLock(): первая пытается захватить объект и если это получается - возвращает (1), если не получается по каким - либо причинам - возвращает (0) и тут уже делайте, что хотите: завершайте работу или в цикле пробуйте получить объект себе во владение, как угодно. Снятие блокировки происходит при вызове UnLock() или при завершении обработки (разрушении объекта XBase).

//Ж*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖSЖЖPЖЖ*ЖЖ*Ж

Перем ФайлСинхронизации, ИмяФайлаСинхронизации;

//Ж*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖSЖЖPЖЖ*ЖЖ*Ж

Функция Lock()
    Если ПустоеЗначение(ФайлСинхронизации) = 0 Тогда
        //Трас("Объект блокировки уже создан");
        Возврат 1;
    КонецЕсли;

    Попытка

        ФайлСинхронизации = СоздатьОбъект("XBase");
        ФайлСинхронизации.КодоваяСтраница(1);
        ФайлСинхронизации.ДобавитьПоле("Name","S", 64, 0);
        ФайлСинхронизации.СоздатьФайл(ИмяФайлаСинхронизации);
        ФайлСинхронизации.Добавить();
        ФайлСинхронизации.Name = ИмяПользователя();
        ФайлСинхронизации.Записать();
        ФайлСинхронизации.ЗакрытьФайл();

        Если ФС.СуществуетФайл(ИмяФайлаСинхронизации) = 1 Тогда

            ФайлСинхронизации.ОткрытьФайл(ИмяФайлаСинхронизации);

            Если ФайлСинхронизации.Первая() = 1 Тогда
                Если НРег(СокрЛП(ФайлСинхронизации.Name)) = НРег(СокрЛП(ИмяПользователя())) Тогда
                    Возврат 1;
                Иначе
                    //Трас("Не удалось получить блокировку, файл перехватил: " + ФайлСинхронизации.Name, "!");
                КонецЕсли;
            Иначе
                //Трас("Не удалось спозиционироваться в файле блокировки", "!");
            КонецЕсли;
            ФайлСинхронизации.ЗакрытьФайл();
        Иначе
            //Трас("Не удалось создать файл блокировки", "!");
        КонецЕсли;

    Исключение
        //Трас("Исключение при блокировке: " + ОписаниеОшибки(), "!");
    КонецПопытки;

    //Трас("Очищен объект блокировки (после неудачной попытки захвата)");
    ФайлСинхронизации = ПолучитьПустоеЗначение();
    Возврат 0;
КонецФункции

//Ж*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖ*ЖЖSЖЖPЖЖ*ЖЖ*Ж
Процедура UnLock()
    Если ПустоеЗначение(ФайлСинхронизации) = 1 Тогда
        //Трас("Объект блокировки не был создан");
    КонецЕсли;

    Попытка
        ФайлСинхронизации.ЗакрытьФайл();
    Исключение
        //Трас("Исключение при снятии блокировки: " + ОписаниеОшибки(), "!");
    КонецПопытки;

    //Трас("Очищен объект блокировки");
    ФайлСинхронизации = ПолучитьПустоеЗначение();
КонецПроцедуры

Перед первым вызовом началом работы надо задать полное имя для файла, который будет объектом синхронизации в ИмяФайлаСинхронизации.

 

Удачного кодинга!

 

См. также

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

Программный комплекс способный распознавать сотни листов за раз любых сканированных(фото) документов (УПД, ТОРГ12, СФ, паспорт и пр.) и загружать их в любую 1С (БП3.0, УТ, КА, УНФ, УПП, 1С7.7 ТиС, ЗУП3 и пр.), а также формировать архив сканированных документов.<br> Робот применяет до 5 способов распознавания. Максимальное качество загрузки документов из бесплатных OCR. Работает без Интернета.

10800 руб.

13.10.2022    8125    1    12    

9

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

Обработка и правила обмена данными для выгрузки документов и всех связанных с ними справочников из 1С7.7 ТиС 9.2 в 1С8.3 БП 3.0 через файл XML. В типовых конфигурациях уже есть такое решение. Это немного доработанные правила и сама обработка выгрузки, добавлена возможность устанавливать отбор по выгружаемым документам по Фирме, Контрагенту, Складу, Проекту, Автору, ЮрЛицу. А также это внешняя обработка, что даёт возможность адаптировать её под нетиповую ТиС. Обработка и правила тестировались на платформах: 1С: Предприятие 7.7 и 1С: Предприятие 8.3.18.1334. На типовых конфигурациях: «Торговля + склад», редакция 9.2 (7.70 1004) и «Бухгалтерия предприятия» редакция 3.0 (3.0.96.30).

1 стартмани

13.08.2021    8715    54    Kuzya_brаtsk    8    

11

Файловый обмен (TXT, XML, DBF), FTP ЭДО и ОФД Программист Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 1С:Торговля и склад 7.7 1С:Бухгалтерия 1.6 1С:Упрощенное налогообложение 7.7 Россия Бухгалтерский учет Абонемент ($m)

Обмениваемся УПД (УКД) с различными контрагентами через СБИС. А чтобы загрузить УПД (УКД) из 7.7 в Сбис, используем данную обработку, которая создает файл в формате XML, который можно импортировать в систему электронного документооборота. Для конфигурации "Бухгалтерский учет" (тестировалась на релизе 7.70.663) Для конфигурации "Упрощенная система налогообложения" ( тестировалась на релизе 7.70.305) Для конфигурации "Торговля и Склад 7.7" (тестировалась на релизе 7.70.1007)

1 стартмани

31.07.2021    15656    222    AndKovalchuk    50    

18

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

Перенос данных из 1С:Бухгалтерия 7.7 в БП 3.0 | Продукт является развитием и исправлением ошибок стандартной обработки для выгрузки данных из 1С Бухгалтерии 7.7 в Бухгалтерию 3.0 | Предоставляем техподдержку | Обновляем на новые релизы 1С | Перенос из 7.7 является сложным, и на рынке сложно найти специалистов 1С по "семерке" - сотрудники помогут вам выполнить переход в рамках техподдержки предлагаемого переноса данных!

45650 руб.

26.05.2020    34580    10    70    

16

Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная 7.7 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Абонемент ($m)

Разработка позволяет перенести остатки по всем счетам бух. учета из "1С:Комплексная конфигурация, редакция 4.5 (7.7)" в программу "1С:Управление предприятием ERP 2.0", на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Конфигурация "1С:Управление предприятием ERP 2.0" является полностью типовой.

5 стартмани

11.01.2019    15878    39    sulig    14    

13

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10406    malovandrey    6    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Арчибальд 2708 05.07.10 08:49 Сейчас в теме
Кто бы мог 35 лет назад подумать, что семафоры Дейкстры обзовут этаким словом :o
3. Sk0rp 119 05.07.10 10:44 Сейчас в теме
(1) Это частный случай семафора, согласен :) А вот про Дейкстру не слышал :(
2. Ish_2 1107 05.07.10 10:22 Сейчас в теме
Я про семафоры именно Дейкстры не помню или не знаю.
Зачем смущаешь публику ? Рисуешься ?
4. Арчибальд 2708 05.07.10 10:47 Сейчас в теме
(2) Отрицающий прошлое не имеет будущего ©
Известность Дейкстре принесли его работы в области применения математической логики при разработке компьютерных программ. Он активно участвовал в разработке языка программирования Алгол и написал первый компилятор Алгол-60. Будучи одним из авторов концепции структурного программирования, он «проповедовал» отказ от использования инструкции GOTO. Также ему принадлежит идея применения «семафоров» для синхронизации процессов в многозадачных системах и алгоритм нахождения кратчайшего пути на ориентированном графе с неотрицательными весами рёбер, известный как Алгоритм Дейкстры. В 1972 году Дейкстра стал лауреатом премии Тьюринга.
Когда советское правительство приняло решение о переходе советской промышленности к копированию модельного ряда IBM/360, Дейкстра (работавший в то время в конкурировавшей с IBM фирме Burroughs) назвал это решение величайшей победой Запада в холодной войне, а выбранную для клонирования модель IBM/360 (прообраз советской ЕС ЭВМ) — величайшей диверсией Запада против СССР.
5. Арчибальд 2708 05.07.10 11:12 Сейчас в теме
В первом посте ошибочка :oops: не 35, а 45
6. marsohod 123 07.07.10 11:09 Сейчас в теме
Еще один вариант.
Возможно, вы замечали, что если документ или элемент справочника открыт одним пользователем, то при попытке открыть его другим пользователем 1С выдает предупреждение о том, что запись заблокирована. На знании этого факта можно предложить другой вариант реализации.
Создаем новый справочник "Блокировки" с одним-единственным элементом и при начале некоторых действий, которые требуют указанных условий пытаемся его открыть. Если удалось - значит все в порядке. Если нет, тогда отказ.
Или (как подвариант) - все указанное делается в существующем справочнике или создается своего рода "предопределенный" документ.
9. Sk0rp 119 07.07.10 12:48 Сейчас в теме
(6)(7)(8) Как один из вариантов возможен для рассмотрения. Мне он не понравился тем, что
1. при некорректном завершении обработки, которая открыла форму - форма так и останется открытой.
2. это действительно ближе к критической секции, поскольку не получится расширить на разные базы.
3. не хочется ради этого менять структуру базы, а использовать "предопределенный" элемент чревато тем, что он на самом деле может понадобится :)
4. открытую форму запросто могут закрыть вручную, да и не красиво, когда что-то мелькает :)
10. Арчибальд 2708 07.07.10 12:59 Сейчас в теме
(9) Эти все заморочки легко разруливаются Мираклем от Абадонны 8-)
11. marsohod 123 07.07.10 14:02 Сейчас в теме
(9) именно из-за п.2 "...не получится расширить на разные базы..." этот вариант и следует относить к критической секции :)
Остальное... в общем-то решаемо, как подметил Арчибальд.
7. marsohod 123 07.07.10 11:12 Сейчас в теме
+6
Уточню: подразумевается не получение ссылки на объект, а использование функции ОткрытьФорму()
8. marsohod 123 07.07.10 11:29 Сейчас в теме
+6 +7
Строго говоря предложенный вариант уже не подпадает под определение мьютекса :)
это скорее "критическая секция" :)
12. Арчибальд 2708 07.07.10 14:18 Сейчас в теме
13. Sk0rp 119 07.07.10 15:14 Сейчас в теме
(12) Как всякая теория мало применима на практике или ОЧЕНЬ сильно устарела. Там не раскрывается понятие атомарности операций, без которого комбинации действий вида: проверить, если больше нуля уменьшить - рассматриваются как разные действия, а это прямой путь большим проблемам.
На практике даже инкремент переменной может дать очень неожиданный результат если не прикладывать специальных усилий для этого.
А современная рабочая теория это: lockfree programming.
16. Арчибальд 2708 08.07.10 07:26 Сейчас в теме
(13) Не согласен. Во-первых, семафоры именно тем и отличаются от обычных целочисленных переменных, что указанная комбинация действий атомарна. А во-вторых, аппаратная реализация "один в один" этих семафоров - это именно то, что позволило создать суперкомпьютеры (начиная с CRAY), и до сих пор успешно используется.
17. Sk0rp 119 08.07.10 10:51 Сейчас в теме
(16) Семафор Дейкстры - это скорее парадигма, чем конкретная реализация - это видно из его трудов. Это безусловно определило современные представления об объектах синхронизации, но с тех пор его идеи сильно эволюционировали.
14. bulpi 216 07.07.10 16:18 Сейчас в теме
"при падении 1С - винда сама отследит, что владельца файла больше нет и снимет с файла блокировку"
Самая хитрая ложь - это полуправда ;) Правильно написАть : Винда ДОЛЖНА сама отследить... Но не делает ни фига довольно часто. Приходится вручную снимать блокировку Unlocker -ом
15. Sk0rp 119 07.07.10 16:33 Сейчас в теме
(14) В целом согласен, хотя же это чаще случается если процесс в памяти зависнет. Такое иногда с некоторыми программами случается. С 1С у меня еще не было. А если такое случится с 1С, то там ИМХО проблемы будут посерьезнее, :) т.к. 1С-ка сама любит использовать прием с флаговыми файлами.
18. alur 22 12.07.10 15:04 Сейчас в теме
Штатный метод "Блокировка()" гораздо проще, наглядней и надежней.
19. Арчибальд 2708 12.07.10 15:16 Сейчас в теме
(18) Штатные методы работают в одной базе.
20. Sk0rp 119 12.07.10 16:09 Сейчас в теме
(18) А какой объект блокировать?
21. Арчибальд 2708 12.07.10 16:14 Сейчас в теме
(20) Это-то понятно. Завести специальный справочник - получится массив двоичных семафоров...
22. alur 22 12.07.10 17:14 Сейчас в теме
Ну для нескольких баз можно завести отдельную "блокировочную" базу "семафоров" и поднимать ее отовсюду через COM :D
23. Sk0rp 119 12.07.10 17:33 Сейчас в теме
(22) Тогда чего бы SQL не поставить и в нем записи не лочить? :)
Оставьте свое сообщение