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

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

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

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

 

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

 

См. также

Робот-загрузчик и архив документов. Распознавание/загрузка сканов документов в 1С8(7.7), архив сканированных документов.

Файловый обмен (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    7172    1    12    

8

Выгрузка из 1С ТиС 9.2 в 1С БП 3.0 с дополнительными фильтрами по Фирме, Складу, Контрагенту, Проекту, Автору и Юрлицу

Файловый обмен (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    7832    43    Kuzya_brаtsk    8    

11

Выгрузка УПД И УКД в формате ЭДО для Бухгалтерии 7.7 (ПУБ 7.7, УСН 7.7, ТиС 7.7, Комплексной 7.7)

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

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

1 стартмани

31.07.2021    13456    161    AndKovalchuk    27    

13

SALE! 10%

Перенос данных из 1С:Бухгалтерия 7.7 в БП 3.0

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

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

43889 39500 руб.

26.05.2020    32733    9    62    

16

Перенос остатков и документов (обмен) из Комплексной конфигурации 7.7, редакция 4.5, в конфигурацию Управление предприятием ERP 2.0 (Комплексная автоматизация 2.0)

Файловый обмен (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    15538    39    sulig    14    

13

Формирование строки json в 1С: 7.7

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

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

1 стартмани

10.12.2018    9183    malovandrey    1    

16

Создание в 1С 7.7 XML в формате EnterpriseData (универсальный формат обмена), версия 1.5. Инструкции и примеры переноса данных из устаревшей конфигурации 1С 7.7 в любую современную 1С 8.3, поддерживающую EnterpriseData, через Конвертацию данных 3

Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv7 Россия Абонемент ($m)

Воспользоваться современным средством переноса данных "Конвертация данных 3.0.5.3" можно только выгрузив из системы - источника данных XML в формате обмена данными EnterpriseData. В этой публикации можно скачать приемы выгрузки из 1С 7.7 универсального формата обмена для Конвертации данных 3. Выполняем перенос данных из «1С:Предприятие 7.7» в «1С:Предприятие 8.3». Используем Конвертацию данных КД 3.0 из 1c 7.7 --> 1С 8.3. На первой стадии еще не опубликовано иного способа подложить файл для Конвертации данных 3 кроме как сформировать его вручную, постараемся решить данную проблему.

1 стартмани

26.02.2018    62077    66    ksnik    5    

42
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Арчибальд 2704 05.07.10 08:49 Сейчас в теме
Кто бы мог 35 лет назад подумать, что семафоры Дейкстры обзовут этаким словом :o
3. Sk0rp 118 05.07.10 10:44 Сейчас в теме
(1) Это частный случай семафора, согласен :) А вот про Дейкстру не слышал :(
2. Ish_2 1098 05.07.10 10:22 Сейчас в теме
Я про семафоры именно Дейкстры не помню или не знаю.
Зачем смущаешь публику ? Рисуешься ?
4. Арчибальд 2704 05.07.10 10:47 Сейчас в теме
(2) Отрицающий прошлое не имеет будущего ©
Известность Дейкстре принесли его работы в области применения математической логики при разработке компьютерных программ. Он активно участвовал в разработке языка программирования Алгол и написал первый компилятор Алгол-60. Будучи одним из авторов концепции структурного программирования, он «проповедовал» отказ от использования инструкции GOTO. Также ему принадлежит идея применения «семафоров» для синхронизации процессов в многозадачных системах и алгоритм нахождения кратчайшего пути на ориентированном графе с неотрицательными весами рёбер, известный как Алгоритм Дейкстры. В 1972 году Дейкстра стал лауреатом премии Тьюринга.
Когда советское правительство приняло решение о переходе советской промышленности к копированию модельного ряда IBM/360, Дейкстра (работавший в то время в конкурировавшей с IBM фирме Burroughs) назвал это решение величайшей победой Запада в холодной войне, а выбранную для клонирования модель IBM/360 (прообраз советской ЕС ЭВМ) — величайшей диверсией Запада против СССР.
5. Арчибальд 2704 05.07.10 11:12 Сейчас в теме
В первом посте ошибочка :oops: не 35, а 45
6. marsohod 123 07.07.10 11:09 Сейчас в теме
Еще один вариант.
Возможно, вы замечали, что если документ или элемент справочника открыт одним пользователем, то при попытке открыть его другим пользователем 1С выдает предупреждение о том, что запись заблокирована. На знании этого факта можно предложить другой вариант реализации.
Создаем новый справочник "Блокировки" с одним-единственным элементом и при начале некоторых действий, которые требуют указанных условий пытаемся его открыть. Если удалось - значит все в порядке. Если нет, тогда отказ.
Или (как подвариант) - все указанное делается в существующем справочнике или создается своего рода "предопределенный" документ.
9. Sk0rp 118 07.07.10 12:48 Сейчас в теме
(6)(7)(8) Как один из вариантов возможен для рассмотрения. Мне он не понравился тем, что
1. при некорректном завершении обработки, которая открыла форму - форма так и останется открытой.
2. это действительно ближе к критической секции, поскольку не получится расширить на разные базы.
3. не хочется ради этого менять структуру базы, а использовать "предопределенный" элемент чревато тем, что он на самом деле может понадобится :)
4. открытую форму запросто могут закрыть вручную, да и не красиво, когда что-то мелькает :)
10. Арчибальд 2704 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. Арчибальд 2704 07.07.10 14:18 Сейчас в теме
Dcz ntjhbz - pltcm http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/ewd123/index.html
От же блин...
Вся теория - здесь
13. Sk0rp 118 07.07.10 15:14 Сейчас в теме
(12) Как всякая теория мало применима на практике или ОЧЕНЬ сильно устарела. Там не раскрывается понятие атомарности операций, без которого комбинации действий вида: проверить, если больше нуля уменьшить - рассматриваются как разные действия, а это прямой путь большим проблемам.
На практике даже инкремент переменной может дать очень неожиданный результат если не прикладывать специальных усилий для этого.
А современная рабочая теория это: lockfree programming.
16. Арчибальд 2704 08.07.10 07:26 Сейчас в теме
(13) Не согласен. Во-первых, семафоры именно тем и отличаются от обычных целочисленных переменных, что указанная комбинация действий атомарна. А во-вторых, аппаратная реализация "один в один" этих семафоров - это именно то, что позволило создать суперкомпьютеры (начиная с CRAY), и до сих пор успешно используется.
17. Sk0rp 118 08.07.10 10:51 Сейчас в теме
(16) Семафор Дейкстры - это скорее парадигма, чем конкретная реализация - это видно из его трудов. Это безусловно определило современные представления об объектах синхронизации, но с тех пор его идеи сильно эволюционировали.
14. bulpi 211 07.07.10 16:18 Сейчас в теме
"при падении 1С - винда сама отследит, что владельца файла больше нет и снимет с файла блокировку"
Самая хитрая ложь - это полуправда ;) Правильно написАть : Винда ДОЛЖНА сама отследить... Но не делает ни фига довольно часто. Приходится вручную снимать блокировку Unlocker -ом
15. Sk0rp 118 07.07.10 16:33 Сейчас в теме
(14) В целом согласен, хотя же это чаще случается если процесс в памяти зависнет. Такое иногда с некоторыми программами случается. С 1С у меня еще не было. А если такое случится с 1С, то там ИМХО проблемы будут посерьезнее, :) т.к. 1С-ка сама любит использовать прием с флаговыми файлами.
18. alur 22 12.07.10 15:04 Сейчас в теме
Штатный метод "Блокировка()" гораздо проще, наглядней и надежней.
19. Арчибальд 2704 12.07.10 15:16 Сейчас в теме
(18) Штатные методы работают в одной базе.
20. Sk0rp 118 12.07.10 16:09 Сейчас в теме
(18) А какой объект блокировать?
21. Арчибальд 2704 12.07.10 16:14 Сейчас в теме
(20) Это-то понятно. Завести специальный справочник - получится массив двоичных семафоров...
22. alur 22 12.07.10 17:14 Сейчас в теме
Ну для нескольких баз можно завести отдельную "блокировочную" базу "семафоров" и поднимать ее отовсюду через COM :D
23. Sk0rp 118 12.07.10 17:33 Сейчас в теме
(22) Тогда чего бы SQL не поставить и в нем записи не лочить? :)
Оставьте свое сообщение