Кто заблокировал объект ? 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    586    igor7777    1    

0

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

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

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

1 стартмани

18.02.2022    3780    0    igor7777    6    

2

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

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

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

2 стартмани

25.05.2020    5684    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    11094    phsin    20    

27

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

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

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

1 стартмани

22.04.2017    15666    4    devlabnn    2    

6

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

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

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

1 стартмани

23.09.2016    3745    1    Genyak    1    

0

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

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

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

1 стартмани

09.06.2016    27132    18    tux    3    

1

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

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

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

18.05.2016    34956    rudjuk    21    

33
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
100. Ёпрст 1063 13.07.12 12:07 Сейчас в теме
это всего лишь предопределенная проца глобальника из формекс
101. Dolly_EV 269 01.11.12 07:14 Сейчас в теме
Прикрутил... при групповом проведении на писание в SQLite тратится 1% времени. А как бы сделать так, что при групповых операциях в таблички не писалось?. Т.е. как узнать в ПриНачалеБлокировкиОбъекта(), что это групповой проведение?
102. andrewks 1368 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 1368 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 1368 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 Сейчас в теме
очень надо, не понятно что значит :
//тут создать объекты запроса/базы /табличек и прочий мусор

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

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

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

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