Кто заблокировал объект ? 7.7 (SQL/DBF)

24.06.15

База данных - Инструменты администратора БД

Обработка блокировки объекта в базе для SQL/DBF варианта.

При многопользовательском режиме, пользователи часто видят перед собой картинку

 

 

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

Данная метода позволяет автоматом получить имя пользователя в окошке сообщений:

 

 

 

Для её реализации требуется загрузка внешних компонент:

Formex.dll

1cpp.dll

для DBF версии еще и

1sqlite.dll

Идея очень простая - при начале работы системы проверяется наличие таблички в базе (в SQL - табличка на сервере SQL, для DBF -  база sqlite и таблички в ней), в предопределенных событиях формекса пишется имя пользователя и ид-объекта в табличку блокировок, при обработке блокировки - показывается этот пользователь.

Метода не новая, просто мало кто выкладывал готовых решений.

Для реализации, нижеследующий код нужно поместить в глобальный модуль.

Успехов.

ЗЫ: для любителей "универсальности", предлагаю объединить оба метода в один самостоятельно.

ЗЫЫ: в монопольном режиме, база блокировок не нужна, как и их обработка в нижеописаных процедурах. Для этого

в ПриНачалеРаботыСистемы нужна всего лишь проверка на

Если МонопольныйРежим()=0 Тогда

       //тут создать объекты запроса/базы /табличек и прочий мусор

       База = ;

       Запрос = ;

       ТекстГм = " сюда пишем текст процедур ПриНачалеБлокировкиОбъекта и ОбработкаБлокирокиОбъекта";

       гСервис= СоздатьОбъект("Сервис");
       гСервис.ДобавитьГлобальныйМодуль(ТекстГМ);
 КонецЕсли;

 

ЗЫЫЫ: принимаю пожертвования в качесте благодарности на

яндекс деньги 41001277400750

wmr R285258832971

 

 

Версия для DBF-варианта:

Перем запросSQLLite;
Перем
глМД;
//======================================================================
Процедура ПриНачалеБлокировкиОбъекта(Объект)
   
Тип = ТипЗначенияСтр(Объект);
    Если (
Тип = "Документ")или(Тип="Справочник") Тогда
       
ИДОбъекта = глМД.ЗначениеВДлиннуюСтрокуБД(Объект);
       
ТекстЗапроса = "
        |    INSERT or REPLACE INTO БазаБлокировок
        |    VALUES ('"
+ИДОбъекта+"','"+ПолноеИмяПользователя()+"')
        |-- для типовой торговли можно пользовать глПользователь:
        |--    VALUES ('"
+ИДОбъекта+"','"+глПользователь.Наименование+"')
        |"
;
       
фл = 0;
        Пока
фл=0 Цикл
            Попытка
               
запросSQLLite.ВыполнитьЗапрос(ТекстЗапроса);
               
фл=1;
            Исключение
            КонецПопытки;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

//======================================================================
Процедура ОбработкаБлокировкиОбъекта(Объект, Повторить, ДопТекст)
   
Тип = ТипЗначенияСтр(Объект);
    Если (
Тип = "Документ")или(Тип="Справочник")Тогда
       
ИДОбъекта = глМД.ЗначениеВДлиннуюСтрокуБД(Объект);
       
фл=0;
        Пока
фл=0 Цикл
            Попытка
               
ИмяВредителя = запросSQLLite.ВыполнитьЗапрос("Select База.Пользователь From БазаБлокировок  База  Where База.ИДОбъекта = '"+ИДОбъекта+"'",0);
               
фл=1;
            Исключение
            КонецПопытки;
        КонецЦикла;
        Сообщить(
"" + Объект + " открыт пользователем " + ИмяВредителя,"!");
        //для красоты, можно писать так, заместо Сообщить:

        ДопТекст ="" + Объект + " открыт пользователем " + ИмяВредителя;

    КонецЕсли;
КонецПроцедуры

//======================================================================
Процедура ПриНачалеРаботыСистемы()
    ЗагрузитьВнешнююКомпоненту("1cpp.dll");
    ЗагрузитьВнешнююКомпоненту("formex.dll");
    ЗагрузитьВнешнююКомпоненту(
"1sqlite.dll");
   
база = СоздатьОбъект("SQLiteBase");
    Если ФС.
СуществуетФайл(КаталогИБ()+"ExtForms\")=0 Тогда
        ФС.
СоздатьКаталог(КаталогИБ()+"ExtForms\");
    КонецЕсли;
    Если ФС.
СуществуетФайл(КаталогИБ()+"ExtForms\DB_SQLite\")=0 Тогда
        ФС.
СоздатьКаталог(КаталогИБ()+"ExtForms\DB_SQLite\");
    КонецЕсли;
   
ИмяБД = КаталогИБ()+"ExtForms\DB_SQLite\baza.db3";
   
глМД = СоздатьОбъект("MetaDataWork");
   
база.Открыть(ИмяБД);
   
запросSQLLite = база.НовыйЗапрос();
    //запросSQLLite.ВыполнитьЗапрос("PRAGMA journal_mode=WAL"); //это прописать, ежели база в терминале
    запросSQLLite.ВыполнитьЗапрос("PRAGMA journal_mode=OFF");
    ТекстЗапроса ="
    |Create  table if not EXISTS
    |БазаБлокировок (
    |   ИДОбъекта varchar(13) primary key not null,
    |   Пользователь TEXT
    |)"
;
   
фл = 0;
    Пока
фл=0 Цикл
        Попытка
           
запросSQLLite.ВыполнитьЗапрос(ТекстЗапроса);
           
фл=1;
        Исключение
        КонецПопытки;
    КонецЦикла;
    Если МонопольныйРежим()=
1 Тогда
       
запросSQLLite.ВыполнитьЗапрос("delete from БазаБлокировок");
    КонецЕсли;
КонецПроцедуры

 

 

Версия для SQL-варианта:

 

// Глобальные переменные необходимые работы
Перем запросSQL;
Перем глМД;
//======================================================================
Процедура ПриНачалеБлокировкиОбъекта(Объект)
    Тип = ТипЗначенияСтр(Объект);
    Если (Тип = "Документ")или(Тип="Справочник") Тогда
        ИДОбъекта = глМД.ЗначениеВДлиннуюСтрокуБД(Объект);
        // для типовой торговли можно пользовать Юзверь =  глПользователь.Наименование:
        Юзверь = ПолноеИмяПользователя(); 
        ТекстЗапроса = "
        |IF Exists (SELECT * FROM Blocks WHERE ИДОбъекта = '"+ИДОбъекта+"')
        |     BEGIN
        |         UPDATE Blocks 
        |            SET 
        |               ИДОбъекта = '"+ИДОбъекта+"', Пользователь  = '"+Юзверь+"'
        |            WHERE ИДОбъекта = '"+ИДОбъекта+"'
        |     END
        |ELSE
        |      BEGIN
        |           INSERT INTO Blocks (ИДОбъекта, Пользователь)
        |          VALUES ('"+ИДОбъекта+"','"+Юзверь+"')
        |      END
        |";
        запросSQL.ВыполнитьСкалярный(ТекстЗапроса);
    КонецЕсли;    
КонецПроцедуры
//======================================================================
Процедура ОбработкаБлокировкиОбъекта(Объект, Повторить, ДопТекст)
    Тип = ТипЗначенияСтр(Объект);
    Если (Тип = "Документ")или(Тип="Справочник")Тогда
        ИДОбъекта = глМД.ЗначениеВДлиннуюСтрокуБД(Объект);
        ИмяВредителя = запросSQL.ВыполнитьСкалярный("Select Пользователь From Blocks (nolock) Where ИДОбъекта = '"+ИДОбъекта+"'");
        Сообщить("Объект:" + Объект + " открыт пользователем " + ИмяВредителя,"!");//сообщать не обязательно, если что
        Повторить =1;
        ДопТекст = "Объект:" + Объект + " открыт пользователем " + ИмяВредителя;
    КонецЕсли;
КонецПроцедуры
//======================================================================
Процедура ПриНачалеРаботыСистемы() 
    
    ЗагрузитьВнешнююКомпоненту("1cpp.dll");    
    ЗагрузитьВнешнююКомпоненту("formex.dll");    

    глМД = СоздатьОбъект("MetaDataWork");
    запросSQL = СоздатьОбъект("ODBCRecordSet");
    ТекстЗапроса ="
    |if object_id('dbo.Blocks','U') is null
    |  create table dbo.Blocks
    |                 (ИДОбъекта varchar(13) primary key not null,
    |                  Пользователь TEXT)
    |;";

    запросSQL.ВыполнитьСкалярный(ТекстЗапроса);    

    Если МонопольныйРежим()=1 Тогда
        запросSQL.ВыполнитьСкалярный("delete from dbo.Blocks");
    КонецЕсли;
КонецПроцедуры

См. также

Монопольное открытие формы обработки 1с77

Инструменты администратора БД Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

Блокировка открытия формы обработки одним пользователем.

1 стартмани

24.05.2023    618    igor7777    1    

0

Групповое переименование файлов для 1С 7.7

Инструменты администратора БД Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Простецкий скрипт переименования файлов в папке в нижний регистр, будет полезен программистам и системным администраторам имеющим навыки програмирования в 1С. Можно легко настроить под себя, спасает мне периодически час времени, может, кому еще будет полезен.

1 стартмани

18.02.2022    3790    0    igor7777    6    

2

[7.7 ТиС. СТОП-БАРДАК] Автоперенос непроведенных документов на текущий день

Инструменты администратора БД Оперативный учет 7.7 1С:Торговля и склад 7.7 Управленческий учет Абонемент ($m)

Боремся с бардаком. Работы в прошлых датах запрещены. Непроведенные документы (по разным причинам) - автоматом переносятся в начало текущего дня при запуске любого первого сеанса 1С в текущем дне. Задержка старта 1С - практически незначима. Не требует настройки, не требует допрограммирования (исключая один оператор вставки в процедуру старта системы). Можно обработку выполнять вручную с любой периодичностью.

2 стартмани

25.05.2020    5695    2    CheBurator    3    

2

Анализ 1С: Предприятие 7.7 с помощью ELK стека

Журнал регистрации Инструменты администратора БД Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

Рассмотрим систему на базе Elasticsearch, Logstash и Kibana (ELK Stack) для анализа логов 1С Предприятие 7.7 с целью визуализации и анализа событий 1С.

22.01.2019    11152    phsin    20    

28

Автоматическое объединение конфигураций 1С 7.7

Инструменты администратора БД Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

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

1 стартмани

22.04.2017    15681    4    devlabnn    2    

6

Перепроведение по счету

Инструменты администратора БД Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 Украина Бухгалтерский учет Абонемент ($m)

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

1 стартмани

23.09.2016    3753    1    Genyak    1    

0

Решение проблем с печатью, предварительным просмотром печати, пакетной печатью 1С: 7.7 в терминале

Инструменты администратора БД Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Периодически сталкивался со следующими проблемами при печати в 1С: 7.7 работающей под терминалом: 1) После замены принтера на клиентской машине 1С пытается печатать на старый принтер. 2) Отсутствует предварительный просмотр при печати. 3) Не работает печать без предварительного просмотра (пакетная печать документов). 4) В некоторых формах печатает, в некоторых нет.

1 стартмани

09.06.2016    27201    18    tux    3    

1

Логирование в 1С

Инструменты администратора БД Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Часто бывает необходимо отслеживать состояние часто повторяющихся регламентных заданий. Например, синхронизация данных с IP-телефонией, которая может производиться каждую минуту, синхронизация с сайтами, синхронизация данных с различными системами. Использовать для этих целей логирование 1С чрезвычайно неэффективно и не удобно. В таких случаях удобно использовать подход, применяемый в Unix-системах: писать логи в обычные текстовые файлы, а потом делать их обработку через эффективно работающие Unix-команды: grep, tail, cat, less и т.п.

18.05.2016    35121    rudjuk    21    

33
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
100. Ёпрст 1063 13.07.12 12:07 Сейчас в теме
это всего лишь предопределенная проца глобальника из формекс
+
101. Dolly_EV 269 01.11.12 07:14 Сейчас в теме
Прикрутил... при групповом проведении на писание в SQLite тратится 1% времени. А как бы сделать так, что при групповых операциях в таблички не писалось?. Т.е. как узнать в ПриНачалеБлокировкиОбъекта(), что это групповой проведение?
+
102. andrewks 1370 01.11.12 07:34 Сейчас в теме
(101) Dolly_EV, если я правильно помню подноготную 7.7, то можно в модуле проведения дока в разделе осн. программы установить переменную ЭтоГрупПров=0, а в самой процедуре проведения в самом конец ЭтоГрупПров=1.

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

только проверьте сначала эту фишку
+
103. Dolly_EV 269 01.11.12 08:05 Сейчас в теме
(102) проще уж завести глоб. переменную типа глГрупповаяОбработка. в Обработке документов делать ее =1, и в ПриНачалеБлокировкиОбъекта() Если глГрупповаяОбработка=0 Тогда <Пишем>. в Обработке документов, после проведения глГрупповаяОбработка=0.
А как без доп.писанины в ПриНачалеБлокировкиОбъекта() узнать, что это групповая обработка?
+
104. andrewks 1370 01.11.12 08:19 Сейчас в теме
(103) Dolly_EV, не понял про глоб.перем. она не даст ответ на поставленный вопрос.

а вот мой способ работает, сейчас проверил

Перем ЭтоГрупповоеПроведение;

Процедура ОбработкаПроведения()
	
	Сообщить("======== "+ТекущийДокумент());
	Сообщить("ЭтоГрупповоеПроведение = "+ЭтоГрупповоеПроведение);
	// тут обработчик проведения
	
	// конец обработчика проведения
	
	ЭтоГрупповоеПроведение=1;
КонецПроцедуры

ЭтоГрупповоеПроведение=0;
Показать
+
106. Dolly_EV 269 01.11.12 09:05 Сейчас в теме
(104) andrewks, а я тебя не понял. ЭтоГрупповоеПроведение=1, потом=0 пихать во все доки в процедуру ОбработкаПроведения() ?? что это дает?
У Документа есть метод ГрупповаяОбработка(), но проблема в том, что он доступен только в предопределенной процедуре ОбработкаПроведения(), т.е. в Процедура ПриНачалеБлокировкиОбъекта(Объект), к нему не обратишься типа Объект.ГрупповаяОбработка()=1.

Вобщем вот так у меня получилось:
// флаг = 1 выставляется в Обработке "ОбработкаДокументов" при Проведении/Распроведении/Удалении/ВклВыклПроводок
// по завершению: глГрупповаяОбработка=0 
Перем глГрупповаяОбработка Экспорт;

//==========================================================­============
Процедура ПриНачалеБлокировкиОбъекта(Объект)
    Тип = ТипЗначенияСтр(Объект);
    Если ((Тип = "Документ")или(Тип="Справочник")) И (глГрупповаяОбработка=0) Тогда
		ИДОбъекта = глМетаДата.ЗначениеВДлиннуюСтрокуБД(Объект);
		Юзверь = СокрП(глПользователь.Наименование);
		Если глЭтоSQL=1 Тогда
			//sql
	        ТекстЗапроса = "
	        |IF Exists (SELECT * FROM Blocks WHERE ИДОбъекта = '"+ИДОбъекта+"')
	        |     BEGIN
	        |         UPDATE Blocks 
	        |            SET 
	        |               ИДОбъекта = '"+ИДОбъекта+"', Пользователь  = '"+Юзверь+"'
	        |            WHERE ИДОбъекта = '"+ИДОбъекта+"'
	        |     END
	        |ELSE
	        |      BEGIN
	        |           INSERT INTO Blocks (ИДОбъекта, Пользователь)
	        |          VALUES ('"+ИДОбъекта+"','"+Юзверь+"')
	        |      END
	        |";
	        глЗапросSQL.ВыполнитьСкалярный(ТекстЗапроса);
		Иначе
			//dbf
	        ТекстЗапроса = "
	        |    INSERT or REPLACE INTO БазаБлокировок
	        |    VALUES ('"+ИДОбъекта+"','"+Юзверь+"')
	        |";
	        фл=0;
	        Пока фл=0 Цикл
	            Попытка
	                глЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса);
	                фл=1;
	            Исключение
	            КонецПопытки;
			КонецЦикла;
		КонецЕсли;
    КонецЕсли;
КонецПроцедуры
Показать
+
105. Dolly_EV 269 01.11.12 08:56 Сейчас в теме
+(101) про 1% - это я сильно преуменьшил, месяц перепродки - 39% времени ушло на глЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса)
Вобщем, сделал через флаг глГрупповаяОбработка.
+
107. Dolly_EV 269 01.11.12 10:06 Сейчас в теме
А вот еще бы имя пользователя терминальной сессии как отловить?
+
108. Ёпрст 1063 01.11.12 10:36 Сейчас в теме
Да уж...
флаги в обработке проведения - это моветон, как и их проверка в ПриНачалеБлокировкиОбъекта.
Достаточно в ПриНачалеРаботыСистемы проверить, что если конф открыта в монопольном режиме - ничего не делать, процы можно тупо оформить через доп глобальник формекса, выполняемый модуль, еще как - море фантазии.
andrewks; +1
111. andrewks 1370 01.11.12 14:30 Сейчас в теме
(108)
Достаточно в ПриНачалеРаботыСистемы проверить, что если конф открыта в монопольном режиме - ничего не делать

всё гениальное - просто :)
+
112. Dolly_EV 269 03.11.12 08:29 Сейчас в теме
(108) так оно (время) отжирается и НЕ в монопольном режиме при групповом проведении, а смысла сохранять инфу про блокировки мало (доки блокируются кратковременно). Так что во флаге есть смысл
+
113. Ёпрст 1063 06.11.12 10:18 Сейчас в теме
(112) для нужных доков в таком случае, нужно передавать флаг параметром в Провести(), это всё лучше, чем глобальная переменная модуля.
+
109. Ёпрст 1063 01.11.12 10:41 Сейчас в теме
+ В монопольном режиме, у меня к примеру, вообще не пишется и не проверяется табличка блокировок.
+
110. Ёпрст 1063 01.11.12 13:54 Сейчас в теме
Поправил описалово
+
114. Ёпрст 1063 06.11.12 10:21 Сейчас в теме
Да и .. если уж не монопольно перепроводишь доки, то в цикле проведения так же легко вычисляется юзверь, который "держит" документ, тем же способом, выполнив запрос к базе блокировок (у меня так сделано в таких поделках). И тут вроде, как тоже флаг не нужен.
+
115. rendalina 02.09.13 10:23 Сейчас в теме
Спасибо за такую полезную вещь! ))

В описании на компоненту Formex.dll ссылка неправильная (стоит ссылка на http://www.1cpp.ru/forumfiles/Attachments/1sqlite-with-3-7-0.zip). Наверное должна быть какая-то такая: http://www.dorex.pro/files/?formex_t.zip
+
116. sput74 02.09.13 12:54 Сейчас в теме
Думаю, надо добавить в обработку при начале работы что-то вроде

DELETE FROM Blocks WHERE Пользователь = "+Пользователь

для обработки случая вылета программы в момент блокировки
+
117. Ёпрст 1063 17.09.13 09:23 Сейчас в теме
(116) Не надо.
Если пользователь вылетел - он ничего не блокирует.
+
118. sput74 17.09.13 10:17 Сейчас в теме
(117) а запись о блокировке остается...
+
119. Ёпрст 1063 17.09.13 10:17 Сейчас в теме
120. Ёпрст 1063 17.09.13 10:20 Сейчас в теме
Как только кто-то еще откроет объект - будет новая запись, с новым пользователем.
Так что, та запись ни на что не влияет.
+
121. Ёпрст 1063 17.09.13 10:20 Сейчас в теме
Даже не новая запись, а замена старой
+
122. dyak84 17.10.13 18:19 Сейчас в теме
интересно при груповой обработке несколькими отделами одновременно ближе к концу рабочего дня что будет говорить кто заблокировал. Тут наверное будет на ети вичисления будет ити больше времени чем на обюработку саміх накладніх или нет. зарание спасибо за ответ
+
123. Ёпрст 1063 17.10.13 19:10 Сейчас в теме
Скажем так, среднее количество документов в день ~1500, количество одновременно подключенных юзьверей в базе ~70, из них, активно "колотящих" документы ~20 - влияние поделки не замечено на производительность.
А групповых обработок для правки доков (типа выстраивания пко по-порядочку, в конфе хватает).
+
124. eshtrey 16.04.14 16:34 Сейчас в теме
125. mshi 19.04.17 15:17 Сейчас в теме
Сначала стал делать как автор, а потом переделал на журнал регистрации событий. При 80-90 пользователей работает достаточно быстро.
Используется ПоставщикДанныхЖурналРегистрации из ВК 1С++

Процедура ОбработкаБлокировкиОбъекта(Объект, Повторить, ДопТекст)
	
  Тип = ТипЗначенияСтр(Объект);
  Если (Тип = "Документ") или (Тип = "Справочник")Тогда
		ЗаблокировавшийПользователь = "";
		
		Если Вопрос("Объект заблокирован!
								|Попытаться определить пользователя сделавшего это?", "Да+Нет+Отмена") <> "Да" Тогда
			Возврат;
		КонецЕсли;
		
		оЛог = СоздатьОбъект("ПоставщикДанныхЖурналРегистрации");
		Если оЛог.ОткрытьФайл() = 0 Тогда
			Предупреждение("Не удалось открыть журнал!");
			Возврат;
		КонецЕсли;
		
		НачДатаПросмотра = ТекущаяДата() - 2;
		КонДатаПросмотра = ТекущаяДата();
		
		Пока (ПустоеЗначение(ЗаблокировавшийПользователь) = 1) И (ТекущаяДата() - НачДатаПросмотра <= 8) Цикл
			Состояние("Поиск событий открытия документа за " + ПериодСтр(НачДатаПросмотра, КонДатаПросмотра));
			
			оЛог.УстановитьПериод(НачДатаПросмотра, КонДатаПросмотра);
			оЛог.ИзменитьФильтр(141, Объект);
			
			Попытка
				Если оЛог.УстановитьФильтр(0) = 0 Тогда
					Предупреждение("Ошибка при установке фильтра!");
					Возврат;
				КонецЕсли;
				
				оЛог.ВыбратьСтроки();
				Пока оЛог.ПолучитьСтроку() = 1 Цикл
					ДатаВремяБлокировки = "" + оЛог.Дата + " " + оЛог.Время;
					ЗаблокировавшийПользователь = оЛог.Пользователь;
				КонецЦикла;
				
			Исключение
				оЛог.ЗакрытьФайл();
				Возврат;
			КонецПопытки;
			
			КонДатаПросмотра = НачДатаПросмотра - 1;
			НачДатаПросмотра = КонДатаПросмотра - 2;
		КонецЦикла;
		
		оЛог.ЗакрытьФайл();
		
		Если ПустоеЗначение(ЗаблокировавшийПользователь) = 0 Тогда
			Повторить = 0;
	    ДопТекст = "Объект: " + Объект + "
				|открыт " + ДатаВремяБлокировки + "
				|пользователем " + ЗаблокировавшийПользователь;
		КонецЕсли;
  КонецЕсли;
	
КонецПроцедуры	//ОбработкаБлокировкиОбъекта
Показать
+
126. Ёпрст 1063 05.06.17 14:34 Сейчас в теме
(125) Не все события пишутся в ЖР.
+ он может быть отключен. + не надо перебирать все строки, перебирай в обратном порядке + возврат, если есть что-то сразу, не крутя весь цикл
+
127. user815833 28.01.21 12:05 Сейчас в теме
доброго дня! пожалуйста объясните как использовать этот метод, не понимаю куда и что писать?????
+
128. user815833 28.01.21 12:13 Сейчас в теме
очень надо, не понятно что значит :
//тут создать объекты запроса/базы /табличек и прочий мусор

База = ; ///////////////////////// сюда что писать?

Запрос = ; ///////////////////////// сюда что писать?

ТекстГм = " сюда пишем текст процедур ПриНачалеБлокировкиОбъекта и ОбработкаБлокирокиОбъекта"; //////////////// какой текст??? просто перенести текст из процедуры или что?

гСервис= СоздатьОбъект("Сервис");
гСервис.ДобавитьГлобальныйМодуль(ТекстГМ);
ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!
+
Оставьте свое сообщение