Мьютексы в 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 1C:Бухгалтерия 1C77 Россия Платные (руб)

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

10800 руб.

13.10.2022    8651    1    12    

9

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

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

25.04.2022    2495    zhenyat    7    

8

Файловый обмен (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    9566    63    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    17334    279    AndKovalchuk    61    

18

SALE! 10%

Файловый обмен (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 | Перенос из 7.7 является сложным, и на рынке сложно найти специалистов 1С по "семерке" - сотрудники помогут вам выполнить переход в рамках техподдержки предлагаемого переноса данных!

55778 50200 руб.

26.05.2020    35436    10    75    

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    16125    39    sulig    14    

13

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

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

1 стартмани

10.12.2018    11052    malovandrey    7    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Арчибальд 2709 05.07.10 08:49 Сейчас в теме
Кто бы мог 35 лет назад подумать, что семафоры Дейкстры обзовут этаким словом :o
3. Sk0rp 119 05.07.10 10:44 Сейчас в теме
(1) Это частный случай семафора, согласен :) А вот про Дейкстру не слышал :(
2. Ish_2 1114 05.07.10 10:22 Сейчас в теме
Я про семафоры именно Дейкстры не помню или не знаю.
Зачем смущаешь публику ? Рисуешься ?
4. Арчибальд 2709 05.07.10 10:47 Сейчас в теме
(2) Отрицающий прошлое не имеет будущего ©
Известность Дейкстре принесли его работы в области применения математической логики при разработке компьютерных программ. Он активно участвовал в разработке языка программирования Алгол и написал первый компилятор Алгол-60. Будучи одним из авторов концепции структурного программирования, он «проповедовал» отказ от использования инструкции GOTO. Также ему принадлежит идея применения «семафоров» для синхронизации процессов в многозадачных системах и алгоритм нахождения кратчайшего пути на ориентированном графе с неотрицательными весами рёбер, известный как Алгоритм Дейкстры. В 1972 году Дейкстра стал лауреатом премии Тьюринга.
Когда советское правительство приняло решение о переходе советской промышленности к копированию модельного ряда IBM/360, Дейкстра (работавший в то время в конкурировавшей с IBM фирме Burroughs) назвал это решение величайшей победой Запада в холодной войне, а выбранную для клонирования модель IBM/360 (прообраз советской ЕС ЭВМ) — величайшей диверсией Запада против СССР.
5. Арчибальд 2709 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. Арчибальд 2709 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. Арчибальд 2709 07.07.10 14:18 Сейчас в теме
13. Sk0rp 119 07.07.10 15:14 Сейчас в теме
(12) Как всякая теория мало применима на практике или ОЧЕНЬ сильно устарела. Там не раскрывается понятие атомарности операций, без которого комбинации действий вида: проверить, если больше нуля уменьшить - рассматриваются как разные действия, а это прямой путь большим проблемам.
На практике даже инкремент переменной может дать очень неожиданный результат если не прикладывать специальных усилий для этого.
А современная рабочая теория это: lockfree programming.
16. Арчибальд 2709 08.07.10 07:26 Сейчас в теме
(13) Не согласен. Во-первых, семафоры именно тем и отличаются от обычных целочисленных переменных, что указанная комбинация действий атомарна. А во-вторых, аппаратная реализация "один в один" этих семафоров - это именно то, что позволило создать суперкомпьютеры (начиная с CRAY), и до сих пор успешно используется.
17. Sk0rp 119 08.07.10 10:51 Сейчас в теме
(16) Семафор Дейкстры - это скорее парадигма, чем конкретная реализация - это видно из его трудов. Это безусловно определило современные представления об объектах синхронизации, но с тех пор его идеи сильно эволюционировали.
14. bulpi 217 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. Арчибальд 2709 12.07.10 15:16 Сейчас в теме
(18) Штатные методы работают в одной базе.
20. Sk0rp 119 12.07.10 16:09 Сейчас в теме
(18) А какой объект блокировать?
21. Арчибальд 2709 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 не поставить и в нем записи не лочить? :)
Оставьте свое сообщение