Мьютексы в 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 Тогда
        //Трас("Объект блокировки не был создан");
    КонецЕсли;

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

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

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

 

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

 

См. также

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    35780    11    77    

17

Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v7.7 1C77 Платные (руб)

Универсальная обработка для 1С 7.7 по конвертации XML-файла заранее неизвестной структуры в Таблицу значений с возможностью вывода наглядной печатной формы формата MXL (с возможностью свёртки узлов XML) и/или наглядной печатной формы формата Excel (с возможностью свёртки узлов XML).

1000 руб.

16.01.2018    26900    9    0    

13

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

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

10800 руб.

13.10.2022    8882    1    12    

9

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

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

25.04.2022    2605    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    9807    69    Kuzya_brаtsk    8    

11

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

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

1 стартмани

31.07.2021    17886    299    AndKovalchuk    65    

18

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

Данная обработка предназначена для выгрузки файла из программы 1С: Предприятие 7.7 Конфигурации «Торговля и Склад 9.2» в файл CSV для загрузки в кассу МТС. Тестирование проводилось на релизах 937 и 998. В теории должна работать на всех типовых релизах конфигурации «Торговля и Склад 9.2».

1 стартмани

07.02.2021    10547    5    Kuzya_brаtsk    1    

7

Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v7.7 1C77 Бесплатно (free)

Выгрузка данных на FTP на примере в конфигурации Штрих-М Кассир 1.10.

12.05.2020    5446    Ignatov_mu    21    

7
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Арчибальд 2709 05.07.10 08:49 Сейчас в теме
Кто бы мог 35 лет назад подумать, что семафоры Дейкстры обзовут этаким словом :o
3. Sk0rp 119 05.07.10 10:44 Сейчас в теме
(1) Это частный случай семафора, согласен :) А вот про Дейкстру не слышал :(
2. Ish_2 1115 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 не поставить и в нем записи не лочить? :)
Оставьте свое сообщение