Программное отключение сеансов 1С 8.2.

Публикация № 77671

Разработка - Практика программирования

Как отключить пользователей программно в клиент-серверном варианте работы 1С 8.2.

Причины возникновения проблемы

Лично у меня на релизах от 8.2.9.х до текущего 8.2.12.96 не всегда происходит полное отключение сеансов. Например, устанавливаю обновление, умный конфигуратор мне выдает кнопку "Завершить сеансы и продолжить", после нажатия на которую остается несколько подключенных соединений.

Также в течение дня часто остаются соединения по закрытым сеансам.

Зачем это нужно

Для себя нашел два пути применения:

1. Перед инсталляцией обновлений необходимо отключить пользователей от системы;

2. Регламентное задание, отвечающее за резервное копирование, должно отключить все подключенные сеансы.

В первом случае удобство состоит в том, что есть кнопка в режиме предприятия, нажав на которую происходит полное завершение.

Как это сделать

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

 

Если Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr") > 0 Тогда
   
// серверный вариант
   
Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr=");
   
ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 6);
   
ИмяСервера = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
   
// теперь ищем имя базы
   
Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Ref=");
   
ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 5);
   
ИмяБазы = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
Иначе
   
// для других способов подключения алгоритм не актуален
   
Возврат;
КонецЕсли;

 

Для работы с агентом сервера необходимо использовать COM-объект

 

Коннектор = Новый COMОбъект("v82.COMConnector");

 

который позволяет подключится к агенту сервера:

 

Агент = Коннектор.ConnectAgent(ИмяСервера);

Теперь перебираем все кластеры, в которых учавствует агент:

 

Кластеры = Агент.GetClusters();
        Для каждого
Кластер из Кластеры Цикл

 

Чтобы получить доступ к процессам кластера, необходимо аутентифицироваться, если для кластера задан администратор:

 

АдминистраторКластера = "Имя администратора кластера";
ПарольКластера = "Пароль администратора кластера";
Агент.Authenticate(Кластер, АдминистраторКластера, ПарольКластера);

 

если кластер без ограничения доступа, то следует писать так:

 

Агент.Authenticate(Кластер, , );

 

Теперь необходимо получить перечень процессов, которые обрабатывают данный кластер:

 

Процессы = Агент.GetWorkingProcesses(Кластер);
    Для каждого
Процесс из Процессы Цикл

 

Т.к. к рабочему процессу необходимо подключаться через коннектор, то необходимо вычислить порт, на котором работает данный процесс:

 

Порт = Процесс.MainPort;
// теперь есть адрес и порт для подключения к рабочему процессу
РабПроц = Коннектор.ConnectWorkingProcess(ИмяСервера + ":" + СтрЗаменить(Порт, Символы.НПП, ""));

 

Рабочий процесс необходимо для разрыва соединений. Разрыв сессий происходит через агента. Опишем подробно. Сначала необходимо аутентифицироваться в рабочем процесс по имени и паролю пользователя, у которого в базе данных есть право "Администратор":

 

РабПроц.AddAuthentication("Имя администратора БД", "Пароль администратора БД");

 

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

 

ИнформационнаяБаза = "";

Базы = Агент.GetInfoBases(Кластер);
Для каждого
База из Базы Цикл
    Если
База.Name = ИмяБазы Тогда
       
ИнформационнаяБаза = База;
        Прервать;
    КонецЕсли;
КонецЦикла;
Если
ИнформационнаяБаза = "" Тогда
   
// база не найдена
КонецЕсли;

 

Отключение сеансов

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

 

Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);
Для каждого
Сеанс из Сеансы Цикл
    Если
нРег(Сеанс.AppID) = "backgroundjob" ИЛИ нРег(Сеанс.AppID) = "designer" Тогда
       
// если это сеансы конфигуратора или фонового задания, то не отключаем
       
Продолжить;
    КонецЕсли;
    Если
Сеанс.UserName = ИмяПользователя() Тогда
       
// это текущий пользователь
       
Продолжить;
    КонецЕсли;
   
Агент.TerminateSession(Кластер, Сеанс);
КонецЦикла;

 

Также у типа "Сеанс" есть ещё много разных свойств, например, имя компьютера, данные о языке, времени и длительности подключения и тп.

Отключение соединений

Отключение соединений происходит через объект рабочего процесса. Обрабатывает соединение тип "Соединение", у которого структура свойств напоминает тип "Сеанс". Итак, как отключенить соединения:

 

СоединенияБазы = Агент.GetInfoBaseConnections(Кластер, ИнформационнаяБаза);
// Разорвать соединения клиентских приложений.
Для Каждого Соединение Из СоединенияБазы Цикл
    Если
нРег(Соединение.Application) = "backgroundjob" ИЛИ нРег(Соединение.Application) = "designer" Тогда
       
// если это соединение конфигуратора или фонового задания, то не отключаем
       
Продолжить;
    КонецЕсли;
    Если
Соединение.UserName = ИмяПользователя() Тогда
       
// это текущий пользователь
       
Продолжить;
    КонецЕсли;
   
РабПроц.Disconnect(Соединение);
КонецЦикла;

Выводы

Получен пример отключения сеансов и соединений с информационной базы. При должном знании  свойств каждого типа  (рабочий процесс, агент сервера, сеанс, соединение) можно, например, сделать откючение конкретного пользователя по расписанию (однако, совершенно другой вопрос зачем это делать) либо, используя данные конструкции, написать внешнее приложение, которое будет использовать COM-объект "v82.COMConnector".

 

P.S.

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

 

Код целиком

Если Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr") > 0 Тогда
   
// серверный вариант
   
Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr=");
   
ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 6);
   
ИмяСервера = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
   
// теперь ищем имя базы
   
Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Ref=");
   
ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 5);
   
ИмяБазы = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
Иначе
   
// для других способов подключения алгоритм не актуален
   
Возврат;
КонецЕсли;

Коннектор = Новый COMОбъект("v82.COMConnector");
Агент = Коннектор.ConnectAgent(ИмяСервера);
Кластеры = Агент.GetClusters();
Для каждого
Кластер из Кластеры Цикл
   
АдминистраторКластера = "Имя администратора кластера";
   
ПарольКластера = "Пароль администратора кластера";
   
Агент.Authenticate(Кластер, АдминистраторКластера, ПарольКластера);
   
Процессы = Агент.GetWorkingProcesses(Кластер);
    Для каждого
Процесс из Процессы Цикл
       
Порт = Процесс.MainPort;
       
// теперь есть адрес и порт для подключения к рабочему процессу
       
РабПроц = Коннектор.ConnectWorkingProcess(Имяервера + ":" + СтрЗаменить(Порт, Символы.НПП, ""));
       
РабПроц.AddAuthentication("Имя администратора БД", "Пароль администратора БД");

       
ИнформационнаяБаза = "";

       
Базы = Агент.GetInfoBases(Кластер);
        Для каждого
База из Базы Цикл
            Если
База.Name = ИмяБазы Тогда
               
ИнформационнаяБаза = База;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если
ИнформационнаяБаза = "" Тогда
           
// база не найдена
       
КонецЕсли;

       
Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);
        Для каждого
Сеанс из Сеансы Цикл
            Если
нРег(Сеанс.AppID) = "backgroundjob" ИЛИ нРег(Сеанс.AppID) = "designer" Тогда
               
// если это сеансы конфигуратора или фонового задания, то не отключаем
               
Продолжить;
            КонецЕсли;
            Если
Сеанс.UserName = ИмяПользователя() Тогда
               
// это текущий пользователь
               
Продолжить;
            КонецЕсли;
           
Агент.TerminateSession(Кластер, Сеанс);
        КонецЦикла;

       
СоединенияБазы = Агент.GetInfoBaseConnections(Кластер, ИнформационнаяБаза);
       
// Разорвать соединения клиентских приложений.
       
Для Каждого Соединение Из СоединенияБазы Цикл
            Если
нРег(Соединение.Application) = "backgroundjob" ИЛИ нРег(Соединение.Application) = "designer" Тогда
               
// если это соединение конфигуратора или фонового задания, то не отключаем
               
Продолжить;
            КонецЕсли;
            Если
Соединение.UserName = ИмяПользователя() Тогда
               
// это текущий пользователь
               
Продолжить;
            КонецЕсли;
           
РабПроц.Disconnect(Соединение);
        КонецЦикла;
    КонецЦикла;
КонецЦикла;

 

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. V_V_V 04.11.10 17:37 Сейчас в теме
Спасибо, то что нужно.
Но есть пару непоняток (для меня):
я заменил "Сервер" на "ИмяСервера" в строке
РабПроц = Коннектор.ConnectWorkingProcess(Сервер + ":" + СтрЗаменить(Порт, Символы.НПП, ""));
и в COMОбъекте Соединение нет значения UserName, т.е. не могу проверить на ИмяПользователя(). Но и в Сеанс, и в Соединение есть SessionID, пришлось выкручиваться через него (получать в Сеанс и проверять в Соединение). UserName только у меня отсутствует? Платформа 8.2.11.236.
27. dmbal 52 24.03.13 20:00 Сейчас в теме
Платформа 1С:Предприятие 8.2 (8.2.17.153).

РабПроц.Disconnect(Соединение);
по причине:
Типы не совпадают (1)

Как не пробовал, одно и тоже :(

Вариант кода следующий:

Для Каждого Соединение Из СоединенияБазы Цикл
Если нРег(Соединение.Application) = "backgroundjob" ИЛИ нРег(Соединение.Application) = "designer" Тогда
// если это соединение конфигуратора или фонового задания, то не отключаем
Продолжить;
КонецЕсли;
//Если Соединение.UserName = ИмяПользователя() Тогда
// // это текущий пользователь
// Продолжить;
//КонецЕсли;
Если (Соединение.Application = ТекПользовательApplication) и (Соединение.ConnId = ТекПользовательConnId) и (Соединение.Host = ТекПользовательHost) Тогда
// это текущий пользователь
Продолжить;
КонецЕсли;

РабПроц.Disconnect(Соединение);

КонецЦикла;
Показать
28. aprol 16.05.13 09:35 Сейчас в теме
(27) dmbal, Та же ситуация на платформе 15.319, решения не нашел.
2. V_V_V 04.11.10 18:19 Сейчас в теме
По синтакс-помощнику GetInfoBaseConnections получает массив описаний соединений информационной базы. А в описании соединения нет свойства UserName. Оно есть в свойствах соединения.
Осталось только разобраться как получить не описание соединений, а сами соединения... :D
3. V_V_V 04.11.10 21:05 Сейчас в теме
Хм... Соединения заработали только когда прописал (обгуглившись по самое ну погоди):

ИнформационнаяБаза2 = РабПроц.CreateInfoBaseInfo();
ИнформационнаяБаза2.Name = ИмяБазы;
Соединения = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза2);

При этом проверять запущенные приложения нужно не по Соединение.Application, а по Соединение.AppID. Плюс не мешало бы добавить проверку не только backgroundjob, designer, а и comconsole - а то выкинет и только что аутентифицированное COM-соединение...
Все вышесказанное абсолютно не претендует на истину - пробуйте на свой страх и риск... :D
5. Rabajaba 332 05.11.10 10:42 Сейчас в теме
(3) Спасибо за развитие, честно дальше не копал. По "Сервер" на "ИмяСервера" - это я код не подправил :)
"Плюс не мешало бы добавить проверку не только backgroundjob, designer, а и comconsole - а то выкинет и только что аутентифицированное COM-соединение... " я показал лишь пример, дальше можно расширять как угодно :) моей целью было НЕ убивать текущее фоновое задание и НЕ закрывать конфигуратор, в котором я могу что-то не сохранить :) да и вообще сама идея мочить конфигуратор - ужас.

(4) Модуль довольно специфичен, но суть проста. Объясню на примере:
01:00 запуск регламетного задания, которое генерирует *.bat файл пакетного запуска конфигуратора в режиме выгрузки ИБ, после чего мочит все соединения
01:20 регламентное задание винды стартует *.bat файл.
Поделиться можно, но там код весь на константах и не очень красив, чтобы на люди показывать :)
9. alexbur 23 30.11.11 07:03 Сейчас в теме
(3) V_V_V, Всё верно. Тоже дошёл до этого обчитавшись хелпа. Дело в том, что если делать GetInfoBaseConnections через агента сервера (а не через рабочий процесс), то мы получаем на выходе тип "Описание соединения", а не "Соединение". У него действительно нет UserName и вместо AppID есть Applications.

Если Соединение.UserName = ИмяПользователя() Тогда
// это текущий пользователь
Продолжить;
КонецЕсли;


ИМХО, чтобы не убить своё собственное соединение лучше использовать проверку на SessionID (ConnID), который есть и в соединении (сеансе). Получить SessionID (ConnID) текущего (своего) подключения можно через НомерСеансаИнформационнойБазы() (НомерСоединенияИнформационнойБазы()).
bad_wag; a--jey; PhoenixAOD; bashirov.rs; tradeagent; eeeio; +6 Ответить
10. V_V_V 30.11.11 20:29 Сейчас в теме
(9) Если ничего не путаю, то именно через SessionID я и выкрутился. Кажется об этом речь в моем первом посте шла (1).
Как давно это было... Год прошел... :)
11. alexbur 23 01.12.11 07:40 Сейчас в теме
(10) V_V_V, Ну, некоторые темы не стареют. Для меня как раз проблемой было как раз узнать ID текущего сеанса, чтобы сравнить с SesionID. Может кому нибудь тоже поможет.
4. Asdam 117 05.11.10 09:18 Сейчас в теме
Rabajaba, поделитесь, плиз, модулем регламентного задания, отвечающего за резервное копирование.
6. sound 531 11.11.10 10:48 Сейчас в теме
Материал нужный однозначно, особенно для конкретных заточек (мало ли кому что надо). А вот про скрипты для бекапов уже можно оды слагать, причем хоть на 1C хоть на VBS, вот например есть http://infostart.ru/public/19363/, там кстати любезно расписаны все обработки аналогичной направленности - бери нихачу :)
7. artur_antipin 11.10.11 14:16 Сейчас в теме
Платформа 8.2.14.519, режим серверный.
При подключении к Агенту выдает такую ошибку:
{Форма.Форма.Форма(108)}: Ошибка при вызове метода контекста (ConnectAgent)
СлужбаСервера = Соединитель.ConnectAgent(СерверБД);
по причине:
Произошла исключительная ситуация (V82.COMConnector.1): descr=Сервер недоступен (Не отвечает, завершается аварийно или порт занят другим приложением) line=556 file=Src\RemoteCreatorImpl.cpp
Кто нибудь с такой сталкивался?
8. VchikA 71 14.11.11 11:55 Сейчас в теме
(7) столкнулся с такой ошибкой. Дело в том, что строка подключения к базе данных содержало порт. Таким образом при получении имени сервера, возвращается не имя сервера("127.0.0.1"), а имя сервера + порт ("127.0.0.1:1689").
Заменил строку - все заработало:
//ИмяСервера = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1); //для стандартного порта (1541)
ИмяСервера = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 6); //для не стандартного порта (7) artur.antipin,
36. aspiid 10.09.15 18:12 Сейчас в теме
(8) VchikA,
Тоже столкнулся с этой проблемой.
Заменил строку - все заработало:
//ИмяСервера = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1); //для стандартного порта (1541)
ИмяСервера = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 6); //для не стандартного порта (7) artur.antipin,

Вот не уверен, что это правильно.
Вообще говоря, то ИмяСервера (включая порт), которое мы получаем таким образом, это адрес кластера 1с, на котором крутится эта база. Если порт стандартный, то он совпадает с именем сервера (читай агента сервера). Если порты не стандартные - то они разные.
Так вот. Если вы просто обрежете порт из адреса кластера, то получите обращение по стандартному порту, т.е. 1541, и скорее всего, попадете на другой сервер, не тот, на котором крутится данная база.
Вот в связи с этим вопрос: можно ли как то узнать полный адрес агента сервера, на котором крутится эта база?
53. Pim 168 02.08.20 15:18 Сейчас в теме
(36) для администрирования нужен порт не 1541, а 1540. Соответственно, если у вас неск. серверов, то использовать порт из строки подключения не корректно. Нужно хранить порт отдельно или получать из консоли.
12. ekean 23.12.11 12:18 Сейчас в теме
Вместо -
РабПроц = Коннектор.ConnectWorkingProcess(Имяервера + ":" + СтрЗаменить(Порт, Символы.НПП, ""));
надо -
РабПроц = Коннектор.ConnectWorkingProcess("tcp://" + Процесс.HostName + ":" + Формат(Процесс.MainPort, "ЧГ=0"));
13. mike24 13.01.12 14:59 Сейчас в теме
Автору - спасибо! Использовал для отключения юзеров при ночной выгрузке базы
вот обобщенный (рабочий!) вариант:

Если Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr") > 0 Тогда
// серверный вариант
Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr=");
ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 6);
ИмяСервера = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
// теперь ищем имя базы
Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Ref=");
ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 5);
ИмяБазы = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
Иначе
// для других способов подключения алгоритм не актуален
Возврат;
КонецЕсли;

Коннектор = Новый COMОбъект("v82.COMConnector");
Агент = Коннектор.ConnectAgent(ИмяСервера);
Кластеры = Агент.GetClusters();
Для каждого Кластер из Кластеры Цикл
АдминистраторКластера = "Имя администратора кластера";
ПарольКластера = "Пароль администратора кластера";
//Агент.Authenticate(Кластер, АдминистраторКластера, ПарольКластера);
Агент.Authenticate(Кластер,,);
Процессы = Агент.GetWorkingProcesses(Кластер);
Для каждого Процесс из Процессы Цикл
Порт = Процесс.MainPort;
// теперь есть адрес и порт для подключения к рабочему процессу
РабПроц = Коннектор.ConnectWorkingProcess(ИмяСервера + ":" + СтрЗаменить(Порт, Символы.НПП, ""));
РабПроц.AddAuthentication("admin", "pass");

ИнформационнаяБаза = "";

Базы = Агент.GetInfoBases(Кластер);
Для каждого База из Базы Цикл
Если База.Name = ИмяБазы Тогда
ИнформационнаяБаза = База;
Прервать;
КонецЕсли;
КонецЦикла;
Если ИнформационнаяБаза = "" Тогда
// база не найдена
КонецЕсли;

Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);
Для каждого Сеанс из Сеансы Цикл

Если нРег(Сеанс.AppID) = "backgroundjob" ИЛИ нРег(Сеанс.AppID) = "comconsole" Тогда
// если это сеансы com-приложения или фонового задания, то не отключаем
Продолжить;
КонецЕсли;
Если Сеанс.UserName = ИмяПользователя() Тогда
// это текущий пользователь
Продолжить;
КонецЕсли;
Агент.TerminateSession(Кластер, Сеанс);
Сообщить("Отключен сеанс "+строка(Сеанс.UserName));
КонецЦикла;

ИнформационнаяБаза2 = РабПроц.CreateInfoBaseInfo();
ИнформационнаяБаза2.Name = ИмяБазы;
СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза2);
// Разорвать соединения клиентских приложений.
Для Каждого Соединение Из СоединенияБазы Цикл
Если нРег(Соединение.AppID) = "backgroundjob" ИЛИ нРег(Соединение.AppID) = "comconsole" Тогда
Продолжить;
КонецЕсли;
Если Соединение.UserName = ИмяПользователя() Тогда
// это текущий пользователь
Продолжить;
КонецЕсли;
РабПроц.Disconnect(Соединение);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Предупреждение("Завершается работа...", 5);
ЗавершитьРаботуСистемы(Ложь);


запускаю из батника
C:\"Program Files"\1cv82\8.2.13.219\bin\1cv8.exe ENTERPRISE /sИмяСервера\ИмяБазы /nПользователь /pПароль /wa- /DisableStartupMessages /RunModeOrdinaryApplication /ExecuteShutdownusers.epf

Shutdownusers.epf - в этой внешней обработке код
OVANGE; Krick777; PhoenixAOD; ColaKola; bashirov.rs; b-dm; tradeagent; XoloD; eeeio; +9 Ответить
14. Dvornik 25 01.02.12 07:35 Сейчас в теме
В платформе 8.2.14 работает? Никто не подскажет?
15. edyardg 22 06.02.12 15:12 Сейчас в теме
Спасибо очень нужная информация
16. Marichka2 06.02.12 16:08 Сейчас в теме
Спасибо очень нужная информация, попробую у себя
17. quares 21 15.02.12 16:31 Сейчас в теме
Интересно и полезно - да. Но схема алгоритма (если читать код описанный выше) не совсем соответствует коду.
Автору 5 баллов.
18. Leoway 163 11.03.12 18:03 Сейчас в теме
Огромное спасибо, очень помогло.
19. deshi2 06.04.12 17:33 Сейчас в теме
спасибо, безгранично полезный код!
20. deshi2 06.04.12 17:49 Сейчас в теме
кстати, рекомендую на совпадение с текущей базой проверять с учетом регистра, уже нарвался. Вот так надо:

Если ВРЕГ(База.Name) = ВРЕГ(ИмяБазы) Тогда
ИнформационнаяБаза = База;
Прервать;
КонецЕсли;
succub1_5; PhoenixAOD; tradeagent; XoloD; eeeio; +5 Ответить
21. sad12345 09.07.12 13:32 Сейчас в теме
8.2.15.301
Соединение.UserName = ИмяПользователя()
ERROR:
Поле объекта не обнаружено (UserName)

FAQ:
Соединение (IInfoBaseConnectionInfo)
UserName (UserName)
Использование:

Только чтение.
Описание:

Тип: Строка.
Содержит имя пользователя 1С:Предприятия, подсоединенного к информационной базе.

Доступность:

Интеграция.

Что не так???
22. virus-1c 24.07.12 11:20 Сейчас в теме
(21) sad12345,
У меня такая же проблема

сделал так
ТекПользовательApplication = "";
ТекПользовательConnId = "";
ТекПользовательHost = "";

Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);
Для каждого Сеанс из Сеансы Цикл
Если нРег(Сеанс.AppID) = "backgroundjob" ИЛИ нРег(Сеанс.AppID) = "designer" Тогда
// если это сеансы конфигуратора или фонового задания, то не отключаем
Продолжить;
КонецЕсли;
Если Сеанс.UserName = ИмяПользователя() Тогда
// это текущий пользователь
ТекПользовательApplication = Сеанс.Connection.Application;
ТекПользовательConnId = Сеанс.Connection.ConnId;
ТекПользовательHost = Сеанс.Connection.Host;
Продолжить;
КонецЕсли;
Агент.TerminateSession(Кластер, Сеанс);
Сообщить(строка(Сеанс.UserName) + " - " + нРег(Сеанс.AppID));
КонецЦикла;

СоединенияБазы = Агент.GetInfoBaseConnections(Кластер, ИнформационнаяБаза);
// Разорвать соединения клиентских приложений.
Для Каждого Соединение Из СоединенияБазы Цикл
Если нРег(Соединение.Application) = "backgroundjob" ИЛИ нРег(Соединение.Application) = "designer" Тогда
// если это соединение конфигуратора или фонового задания, то не отключаем
Продолжить;
КонецЕсли;
//Если Соединение.UserName = ИмяПользователя() Тогда
// // это текущий пользователь
// Продолжить;
//КонецЕсли;
Если (Соединение.Application = ТекПользовательApplication) и (Соединение.ConnId = ТекПользовательConnId) и (Соединение.Host = ТекПользовательHost) Тогда
// это текущий пользователь
Продолжить;
КонецЕсли;

РабПроц.Disconnect(Соединение);
КонецЦикла;
23. m_aster 97 04.08.12 00:04 Сейчас в теме
24. Stamper 42 07.09.12 11:22 Сейчас в теме
шикарно! благодарю
был у меня еще "отключатель" от файловой базы "ProcessKiller" на vbs, но потерялся :(
никто не встречал?
25. Stepan_1c 23.11.12 05:28 Сейчас в теме
Спасибо. раньше почему то не нашел и написал свой вариант через батник. сейчас попробую через 1с :)
26. dyak84 20.03.13 19:06 Сейчас в теме
Автору огромное спасибо. Написано просто и доступно. Надоело бесконечно тестировать чужую работу пора и самому разбиратся как и что работает в 1С. Побольше бы таких статей. Протестирую и отпишусь
29. griffer 21.05.13 12:21 Сейчас в теме
Спасибо автору!
Внес небольшие изменения и использовал для закрытия сеансов и соединений оставшихся после аварийного завершения работы.
30. Stamper 42 21.05.13 16:38 Сейчас в теме
(29) griffer, выкладывайте, чего уж там :)
31. griffer 29.05.13 14:30 Сейчас в теме
(30) Stamper, не жалко - выкладываю)
В таком варианте не возникает ошибка
Типы не совпадают (1)


Если Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr") > 0 Тогда
		// серверный вариант
		Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr=");
		ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 6);
		ИмяСервера = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
		// теперь ищем имя базы
		Поиск1 = Найти(СтрокаСоединенияИнформационнойБазы(), "Ref=");
		ПодстрокаПоиска = Сред(СтрокаСоединенияИнформационнойБазы(), Поиск1 + 5);
		ИмяБазы = Лев(ПодстрокаПоиска, Найти(ПодстрокаПоиска, """") - 1);
	Иначе
		// для других способов подключения алгоритм не актуален
		Возврат;
	КонецЕсли;
	
	Коннектор = Новый COMОбъект("v82.COMConnector");
	Агент = Коннектор.ConnectAgent(ИмяСервера);
	Кластеры = Агент.GetClusters();
	
	Для ТекущийИндекс = Кластеры.GetLowerBound() По Кластеры.GetUpperBound() Цикл
		// Ищем нужный нам кластер
		Кластер = Кластеры.GetValue(ТекущийИндекс);
		Если (ВРЕГ(Кластер.HostName) = ИмяСервера) Тогда 
			Прервать; 
		КонецЕсли
	КонецЦикла;
	
	Если Кластер = НЕОПРЕДЕЛЕНО Тогда
		Сообщить("Не удалось определить рабочий кластер серверов 1С предприятия", СтатусСообщения.Важное);
		Возврат;
	КонецЕсли;
	
	Агент.Authenticate(Кластер, , );
	
	РабочиеСервера = Агент.GetWorkingServers(Кластер);
	Для Каждого РабочийСервер Из РабочиеСервера Цикл
		РабочиеПроцессы = Агент.GetServerWorkingProcesses(Кластер, РабочийСервер);
		Если РабочиеПроцессы <> НЕОПРЕДЕЛЕНО Тогда
			Для Каждого Процесс Из РабочиеПроцессы Цикл
				Если Процесс.Running <> 1 Тогда
					Продолжить; //Не тратим время на неработающие процессы 
				КонецЕсли;
				ЕстьРегПроцесса  = Ложь;
				СтрокаСоединения = "TCP://" + Процесс.HostName+":"+XMLСтрока(Процесс.MainPort);
				РабПроц = Коннектор.ConnectWorkingProcess(СтрокаСоединения);
				Если РабПроц <> Неопределено Тогда
					Базы = РабПроц.GetInfoBases();
					Если Базы  <> НЕОПРЕДЕЛЕНО Тогда
						Для Каждого База ИЗ Базы Цикл
							// Ищем нашу базу
							Если База.Name <> ИмяБазы Тогда
								Продолжить;
							КонецЕсли;
							// Восстановим админское подключение к базе (в случае ошибки и при переходе на другой рабочий процесс)
							Если НЕ ЕстьРегПроцесса Тогда
								Попытка
									РабПроц.AddAuthentication(ИмяАдминистратора, ПарольАдминистратора);
									ЕстьРегПроцесса=Истина;
								Исключение
									Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
								КонецПопытки;
							КонецЕсли;
							// Получим и обойдем все соединения с нашей базой в текущем рабочем процессе
							СоединенияБазы = РабПроц.GetInfoBaseConnections(База);
							Если СоединенияБазы <> НЕОПРЕДЕЛЕНО Тогда
								Для Каждого Соединение Из СоединенияБазы Цикл
									UserName = Соединение.UserName;
									ConnID	 = Соединение.ConnID;
									AppID    = НРег(Соединение.AppID);
									
									Если AppID = "backgroundjob" ИЛИ AppID = "designer" ИЛИ AppID = "comconsole" Тогда
										// если это соединение конфигуратора, фонового задания или наше COM-соединение или  то не отключаем
										Продолжить;
									КонецЕсли;
									
									Попытка
										Если UserName = ИмяПользователя() И ConnID <> НомерСоединенияИнформационнойБазы() Тогда
											Сообщить("Отключено соединение: " + "User=["+UserName+"] ConnID=["+ConnID+"] AppID=["+AppID+"]", СтатусСообщения.Важное);
											РабПроц.Disconnect(Соединение);
										КонецЕсли; 
									Исключение
										ЕстьРегПроцесса=Ложь;
									КонецПопытки;
								КонецЦикла; // По соединениям
								Соединение 			= НЕОПРЕДЕЛЕНО;
								СоединенияБазы 		= НЕОПРЕДЕЛЕНО;
							КонецЕсли;
						КонецЦикла; // По базам
						База				= НЕОПРЕДЕЛЕНО;
						Базы 				= НЕОПРЕДЕЛЕНО;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла; // по рабочим процессам
		КонецЕсли;
		РабПроц					= НЕОПРЕДЕЛЕНО;
		Процесс					= НЕОПРЕДЕЛЕНО;
		РабочиеПроцессы			= НЕОПРЕДЕЛЕНО;
	КонецЦикла; // по серверам
Показать
32. vers139 51 19.09.13 12:14 Сейчас в теме
Интересно, что если пытаться разорвать соединения перед завершением сеансов, то 1С выдаёт ошибку при попытке получить сеансов. Ругается на несоответствие типов в методе GetInfoBaseSessions. Поменял местами куски кода (сначала сеансы, потом соединения) и всё заработало.
33. poyson 07.05.14 09:14 Сейчас в теме
34. miller-adm 103 04.09.14 02:49 Сейчас в теме
35. gerandy 26.06.15 17:18 Сейчас в теме
Спасибо, очень полезный код!

Строчку в коде griffer
Если UserName = ИмяПользователя() И ConnID <> НомерСоединенияИнформационнойБазы() Тогда


исправил
UserName <> ИмяПользователя()
37. tolstoy 23.09.15 14:59 Сейчас в теме
Спасибо автору!
От себя добавлю: если администратор кластера не указан, то аутентификацию к агенту сервера нужно осуществлять кодом:
АгентСервера.Authenticate(Кластер,"","");

Если подключаться так, как указано в статье
Агент.Authenticate(Кластер,,);

то будет ошибка: "Указанное число параметров не соответствует ожидаемому числу".
39. DrBerg 01.10.15 12:48 Сейчас в теме
(37) tolstoy, Вместо параметров можно передать значения реквизитов формы. Если они пустые и админы не заявлены, то все проходит.
38. DrBerg 01.10.15 12:47 Сейчас в теме
А если мне нужен номер SPID, в СОМ объекте его нет. Каким образом его выудить? Консоль получает этот столбец. Есть идеи?
40. besometr 09.11.15 14:25 Сейчас в теме
Еще порт может быть не 1540:
мМассивСтрокиСоединения = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(),";");

мСтрокаИБ = мМассивСтрокиСоединения[0];
мСтрокаИБ = СтрЗаменить(мСтрокаИБ,"Srvr=","");
СерверПорт = СтрЗаменить(мСтрокаИБ,"""","");

мМассивСерверПорт = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СерверПорт,":");
Если мМассивСерверПорт.Количество() > 1 Тогда
Сервер = мМассивСерверПорт[0];
Порт = СтрЗаменить(Строка(Число(мМассивСерверПорт[1])-1), Символы.НПП, "");
ИначеЕсли мМассивСерверПорт.Количество() = 1 Тогда
Сервер = мМассивСтрокиСоединения[0];
Порт = 1540;
Иначе
Сервер = "localhost";
Порт = 1540;
КонецЕсли;

мСтрокаИБ = мМассивСтрокиСоединения[1];
мСтрокаИБ = СтрЗаменить(мСтрокаИБ,"Ref=","");
База = СтрЗаменить(мСтрокаИБ,"""","");
41. isn 15 07.12.15 11:01 Сейчас в теме
В ситуации когда необходимо было отключить пользователей столкнулся с тем что пользователей, которые не успели войти в базу и у которых висит диалог выбора логина и пароля, не отключаются от базы и конфигуратор не обновляется при наличии подключений к базе.
42. yuraer 40 15.08.16 15:34 Сейчас в теме
А кто-нибудь пробовал отключать зависшие регламентные задания таким способом?
Чем чревато такое отключение, если оно возможно?
43. etarabarova 31.01.17 11:23 Сейчас в теме
Спасибо за статью и комментарии. Очень помогло.
44. ShonLe 28.06.17 11:40 Сейчас в теме
Спасибо за статью помогла, но если более новые возможности?
45. progr-2008 118 04.08.17 14:39 Сейчас в теме
В 8.3 можно настроить время отключения спящих сеансов в конфигураторе.
46. Manticor 65 31.10.17 15:52 Сейчас в теме
Друзья, подскажите пожалуйста какими средствами программно создать новую Иб в реестре кластеров? Очень нужно
47. seregasame 16.01.18 21:09 Сейчас в теме
Соединение с рабочим процессом.CreateInfoBase (IWorkingProcessConnection.CreateInfoBase)
Соединение с рабочим процессом (IWorkingProcessConnection)
CreateInfoBase (CreateInfoBase)
Синтаксис:

CreateInfoBase(<ИнформационнаяБаза>, <Режим>)
Параметры:

<ИнформационнаяБаза> (обязательный)

Тип: Информационная база.
Информационная база. Все свойства, необходимые для создания информационной базы (Name, dbServerName, dbName, dbUser, dbPassword, Locale, [DateOffset]) должны быть заполнены.
<Режим> (обязательный)

Тип: Число.
Режим создания информационной базы:
0 - при создании информационной базы базу данных не создавать;
1 - при создании информационной базы создавать базу данных.
Возвращаемое значение:

Тип: Информационная база.

Описание:

Создает информационную базу с заданными параметрами. Требуется аутентификация администратора кластера.

Доступность:

Интеграция.
48. blgdk86 01.02.18 21:04 Сейчас в теме
GetInfoBaseSessions() - получаем сеансы
TerminateSession() - убиваем сеансы

GetInfoBaseConnections() - получаем соединения
Disconnect() - убиваем соединения

А как быть с блокировками?
GetInfoBaseLocks() - получаем блокировки
А как их убрать??

Получилось такая ситуация, что при обновлении конфигурации возникает ошибка исключительной блокировки ИБ. Т.к. есть некие зависшие соединения. Эти соединения видны через консоль кластера только в Блокировках. В сеансах и в соединениях - пусто. Как программно решить эту проблему?
50. isn 15 03.08.18 11:42 Сейчас в теме
(48) Программно решить можно, только заранее рестартить сервер приложений и очищая подключенные сеансы
49. jONES1979 19.04.18 10:04 Сейчас в теме
"учавствует" -> "участвует"

А так, вообще, спасибо! И интересно, и в работе пригодится!
51. ROM_1C 685 03.01.19 01:11 Сейчас в теме
Почему может не завершаться сеансы пользователей?
До

РабочийПроцес.AddAuthentication("test","pass");
СписокСоединенийСбазой  = РабочийПроцес.GetInfoBaseConnections(ИнфоБаза);

для Каждого стр из СписокСоединенийСбазой Цикл 
	Если  нРег(стр.AppID) = "backgroundjob" ИЛИ нРег(стр.AppID) = "comconsole" Тогда 
		Продолжить;
	КонецЕсли;
	  
	    РабочийПроцес.Disconnect(стр);
//Сообщить(стр.userName);
КонецЦикла;
Показать
52. ROM_1C 685 03.01.19 01:18 Сейчас в теме
(51) один кластер, один рабочий сеанс, AddAuthentication - проходить удачно, список соединений получаю со всеми их свойствами
Оставьте свое сообщение

См. также

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    3657    comol    21    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    35018    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    28921    John_d    22    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    21858    kuzyara    38    

Как я начал администрировать сервер 1С: Предприятие 8.3 с телефона Промо

Администрирование данных 1С Мобильная разработка v8 Бесплатно (free)

Развитие инструментов управления кластером серверов 1С:Предприятие 8.3.

14.04.2017    63124    user700211_a.straltsou    29    

Полезные процедуры и функции для программиста

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

Все мы пишем программный код и часто используем процедуры, облегчающие его написание. Ниже приведена выборка таких полезных процедур и функций.

07.10.2019    32379    HostHost    40    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    38331    Yashazz    50    

Как настроить сервер 1С по умолчанию для ПРОФ лицензии после 10.09.2019

Администрирование данных 1С v8 Бесплатно (free)

Здесь мы собираем все данные по настройкам сервера для работы ПРОФ лицензии.

11.09.2019    85032    Infostart    90    

Копирование числовых ячеек из 1С в Excel Промо

Загрузка и выгрузка в Excel Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

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

15.01.2019    27345    itriot11    27    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    61977    rpgshnik    68    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    55890    ids79    54    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    31774    YPermitin    24    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    38220    unichkin    74    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    26791    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    34195    ids79    16    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    100360    ids79    56    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    31669    tormozit    104    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    41884    avalakh    26    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    71430    ids79    12    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    38833    ids79    27    

Отчет по размерам таблиц в базе данных как одно из средств анализа проблем Промо

Статистика базы данных v8 1cv8.cf Бесплатно (free)

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

21.07.2015    34671    Aleksey.Bochkov    15    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    20221    SeiOkami    50    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    58217    ids79    26    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    26685    dmurk    146    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    78983    tormozit    131    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

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

16.05.2019    47686    YPermitin    30    

Выгрузка документа по условию

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16342    m-rv    2    

Как прикрутить ГУИД к регистру сведений

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    20842    m-rv    17    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    49663    tormozit    48    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    37252    ellavs    126    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    28299    ellavs    90    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    33656    YPermitin    53    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    46245    tormozit    74    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    44444    ids79    11    

Малоизвестная хитрость определения модуля и номера строки при возникновении исключения (без запуска отладки и конфигуратора). Несколько очень удобных, но малоиспользуемых возможностей работы в конфигураторе

Тестирование и исправление v8 Россия Бесплатно (free)

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

17.01.2019    28970    PoZiTiFFF    53    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    31854    m-rv    21    

Сервер 1С:Предприятие на Ubuntu 16.04 и PostgreSQL 9.6, для тех, кто хочет узнать его вкус. Рецепт от Капитана

Администрирование данных 1С v8 Бесплатно (free)

Если кратко описать мое отношение к Postgres: Использовал до того, как это стало мейнстримом. Конкретнее: Собирал на нем сервера для компаний среднего размера (до 50 активных пользователей 1С). На настоящий момент их набирается уже больше, чем пальцев рук пары человек (нормальных, а не фрезеровщиков). Следуя этой статье вы сможете себе собрать такой же и начать спокойную легальную жизнь, максимально легко сделать первый шаг в мир Linux и Postgres. А я побороться за 1. Лучший бизнес-кейс (лучший опыт автоматизации предприятия на базе PostgreSQL). Если, конечно, статья придется вам по вкусу.

25.12.2018    41245    capitan    149    

Чем PostgreSQL может быть полезен разработчику 1С

Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

В статье будут рассмотрены примеры, которые могут оказаться полезными в повседневной работе разработчика 1С и не только: как можно сделать снимок рабочей базы без файла резервной копии, как можно эффективно использовать табличные пространства СУБД PostgreSQL, а также как организовать простой и удобный доступ к админке СУБД посредством мобильных устройств.

20.12.2018    23609    Shmell    39    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    44412    ids79    72    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    36753    ids79    40    

Произвольный код в фоновом режиме

Практика программирования v8 1cv8.cf Бесплатно (free)

Задача: реализовать выполнение произвольного кода в фоновом режиме без изменения конфигурации, т.е. во внешней обработке.

03.09.2018    29933    zarankony    42    

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C

Математика и алгоритмы Практика программирования v8 Россия Бесплатно (free)

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

23.08.2018    40994    Rain88    49    

Тестер: частые вопросы

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    29925    grumagargler    28    

Повышаем эффективность разработки правил обмена

Практика программирования Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    28839    olegtymko    47    

Введение в механизм представлений в ЗУП ред. 3

Практика программирования v8 v8::СПР ЗУП3.x Бесплатно (free)

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    41074    xrrg    90