Управление торговым оборудованием при размещении базы на сервере терминалов

02.08.12

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

Решение проблем с настройкой торгового оборудования при работе с базой в сервере терминалов.

Как известно, стандартная подсистема торгового обрудования в УТ10 регистрирует оборудование "на компьютер". В УТ11 сделано лучше, но на УТ10 работает еще достаточное количество организаций.

Такой подход, отчасти, логичен, так как на одном компе могут работать несколько смен кассиров, каждый из которых работает под своим пользователем 1С - и все решается одной настройкой.

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

 

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

 

Итак, приступим:

Открываем модуль обработки ТОСервер. Находим функцию ПолучитьИмяКомпьютераТО() - именно она отвечает за генерирование ключа, по которому будет сохраняться настройка ТО (в том числе - и определяться необходимость подключения ТО).

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

 

Меньше слов, больше дела:

 Функция ПолучитьИмяКомпьютераТО() Экспорт

 Если мИмяКомпьютера = Неопределено Тогда
  ДопИмя = "";
  
  // получим имя клиентского компа
  Попытка
  objShell = Новый COMОбъект("WScript.Shell");
  ДопИмя = ДопИмя + ":" + objShell.RegRead("HKEY_CURRENT_USER\Volatile Environment\CLIENTNAME");
  Исключение
  КонецПопытки;
  
  //получим параметры сервера
  Попытка
  objNet = Новый COMОбъект("WScript.NetWork");
  ИмяСервераТерминалов = objNet.ComputerName;
  ИмяПользователяWindows = objNet.UserName;
   
  ДопИмя = ДопИмя + "@" + ИмяСервераТерминалов + "\" + ИмяПользователяWindows;
  Исключение
  КонецПопытки;
  
  мИмяКомпьютера = ВРЕГ(ИмяКомпьютера() + ДопИмя);
 КонецЕсли;
 
 
 Возврат мИмяКомпьютера;

КонецФункции // ПолучитьИмяКомпьютераТО()

Пример излишне брутален, зато отлично показывает что откуда получать.

Все, что нужно - иметь Windows Script Host (что это такое и с чем его едят - можно прочитать, например, здесь: http://www.script-coding.com/WSH.html), который уже давно идет в винде"по дефолту".

 


Upd В Win7 ключ реестра HKCU\Volatile Environment:CLIENTNAME нужно смотреть как HKCU\Volatile Environment\xx:CLIENTNAME, где xx - номер терминальной сессии. В качестве решения можно использовать переменную среды:

objShell = Новый COMОбъект("WScript.Shell");
ДопИмя = ДопИмя + ":" + objShell.Environment("Process").Item("CLIENTNAME");


См. также

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7763    55    22    

66

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

16800 руб.

06.12.2023    8839    42    5    

73

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8500 руб.

10.11.2023    10412    36    20    

61

SALE! 35%

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

4800 3120 руб.

14.01.2013    187969    1138    0    

912

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    32665    106    152    

73

Инструменты администратора БД Системный администратор Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием Платные (руб)

Конфигурация Комплексная автоматизация 1.1 (и УПП 1.3 тоже) хранит файлы и изображения в справочнике Хранилище дополнительной информации в реквизите Хранилище типа ХранилищеЗначений. Та же история с ВложениямиЭлектроннойПочты. Но при этом присоединенные файлы в Электронном документообороте хранит в томах на диске. Эта доработка позволяет использовать стандартный механизм хранения файлов, изображений и вложений электронных писем в томах на диске. При этом можно разделить тома хранения по объектам конфигурации.

4200 руб.

10.11.2015    62814    94    59    

79

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    72787    625    45    

84

Инструменты администратора БД Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Многие сталкиваются с проблемой когда изображения, находящиеся в базе разные по объему и размерам. Менеджеры могут добавить файлы в очень высоком разрешении, объемом свыше 20 Мегабайт. База данных становится слишком большой, выгрузка на сайт идёт медленно и требуется много место на хостинге. Как сжать картинки и уменьшить размер базы 1С? Это можно сделать с помощью данной обработки. Существует возможность выбрать различные варианты для того чтобы уменьшить картинки: в разы, в процентах от первоначального объема, а также сделать картинки одинаковой ширины. В результате размер базы 1С значительно сократится (в зависимости от количества и размера картинок), а изображения станут небольшого объема, равными по ширине, почти без потери качества. Работает на управляемых формах для УТ 11, КА, ERP.

3000 руб.

21.07.2022    9831    7    4    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Angeros 01.08.12 04:41 Сейчас в теме
Спасибо давно хотел решить эту проблему никак руки не доходили. А нельзя было поизящнее решить проблему с отсутствующей веткой реестра?
2. SatanClaws 146 01.08.12 05:35 Сейчас в теме
(1) Это про Попытка-Исключение?
Если использовать WMI вместо WHS - точно можно.
На WHS - разве что последовательно обращаясь к каждому уровню запрашиваемого пути, но тоже не факт. Проще в Попытку все обернуть.
3. SatanClaws 146 01.08.12 05:38 Сейчас в теме
(1) Кстати, для Win7 все-равно придется использовать WMI - там ключ реестра надо запрашивать немного другой:
HKEY_CURRENT_USER\Volatile Environment\xx\CLIENTNAME, где xx - это номер подключения
И пока я не нашел, как можно узнать номер текущего подключения - значит придется через WMI писать обход ветки реестра
4. Рамзес 30 01.08.12 08:42 Сейчас в теме
Лично я решил проблему, тупо закомментарив по три строки кода, отвечающего за "ругань" в следующих функциях модуля обработки "ТОСервер":
Функция ПодключитьКлиента(Клиент) Экспорт

	Результат = мНетОшибки;
	КонечныйРезультат = мНетОшибки;

	Клиенты   = ПолучитьПараметрСервераТО("Клиенты", "Соответствие");
	Если Клиенты[Клиент] <> Неопределено Тогда
		Возврат Результат;
	КонецЕсли;

	ВидТО = Неопределено;
	Для Каждого ВидТО Из Перечисления.ВидыТорговогоОборудования Цикл
		Если Клиент.ПоддерживаетсяВидТО(ВидТО) Тогда
			Результат = ПодключитьОборудование(ВидТО, Клиент);
			Если ЗначениеЗаполнено(Результат) Тогда
				КонечныйРезультат = мОшибкаНеизвестно;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	Если ЗначениеЗаполнено(КонечныйРезультат) Тогда
		// { Админ [18.05.2012 17:24:45]  // отключил
		//мОписаниеОшибки = "Произошла ошибка при подключении торгового оборудования";
		//Ошибка = ПолучитьТекстОшибкиТО(КонечныйРезультат);
		//Сообщить(Ошибка, СтатусСообщения.Важное);
		// } Админ [18.05.2012 17:24:45]
	КонецЕсли;

	Возврат КонечныйРезультат;

КонецФункции // ПодключитьКлиента()
Показать


и

Функция ПодключитьОборудование(Вид, Клиент)

	Результат = мНетОшибки;
	ПоследняяОшибка = мНетОшибки;

	ТО      = ПолучитьТО();
	Клиенты = ПолучитьПараметрСервераТО("Клиенты",      "Соответствие");

	СтруктураПоиска = Новый Структура("Вид", Вид);
	СтрокиТО        = ТО.НайтиСтроки(СтруктураПоиска);
	Если СтрокиТО.Количество() = 0 Тогда
		Запрос = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|    РегТО.Идентификатор       КАК Идентификатор,
		|    РегТО.Модель.Наименование КАК Наименование,
		|    РегТО.Модель              КАК Модель,
		|    РегТО.Параметры           КАК Параметры
		|ИЗ
		|    РегистрСведений.ТорговоеОборудование КАК РегТО
		|ГДЕ
		|    РегТО.Вид = &Вид
		|    И РегТО.Компьютер                      = &Компьютер
		|    И РегТО.Подключено
		|");
		Запрос.УстановитьПараметр("Вид"      , Вид);
		Запрос.УстановитьПараметр("Компьютер", ПолучитьИмяКомпьютераТО());
		СтрокиТО = Запрос.Выполнить().Выгрузить();
		СтрокаТО = Неопределено;
		Для Каждого СтрокаТО Из СтрокиТО Цикл
			Идентификатор = СтрокаТО.Идентификатор;
			Наименование  = СтрокаТО.Наименование;
			Обработка     = Неопределено;
			Параметры     = ?(ПустаяСтрока(СтрокаТО.Параметры),
			                  Новый Структура(),
			                  ЗначениеИзСтрокиВнутр(СтрокаТО.Параметры));
			Модель        = СтрокаТО.Модель.Модель;
			мМодельПодключаемогоТО = Модель;

			Результат = РаботаСТорговымОборудованием.ПолучитьОбработкуОбслуживанияТО(СтрокаТО.Модель, Обработка);
			Если ЗначениеЗаполнено(Результат) Тогда
				// { Админ [18.05.2012 17:24:45]  // отключил
				//Ошибка = ПолучитьТекстОшибкиТО(Результат);
				//Сообщить(мМодельПодключаемогоТО + ": " + Ошибка, СтатусСообщения.Важное);
				//ПоследняяОшибка = Результат;
				// } Админ [18.05.2012 17:24:45]
				Продолжить;
			КонецЕсли;

			Объект    = Неопределено;
			Результат = Обработка.СоздатьОбъектДрайвера(Объект, Модель, Параметры);
			Если ЗначениеЗаполнено(Результат) Тогда
				Ошибка = ПолучитьТекстОшибкиТО(Результат);
				Сообщить(мМодельПодключаемогоТО + ": " + Ошибка, СтатусСообщения.Важное);
				ПоследняяОшибка = Результат;
				Продолжить;
			КонецЕсли;

			Результат = Обработка.Подключить(Объект);
			Если ЗначениеЗаполнено(Результат) Тогда
				// { Админ [25.05.2012 17:24:45]  // отключил
				//мОписаниеОшибки = Объект.ОписаниеОшибки;
				//Ошибка = ПолучитьТекстОшибкиТО(Результат);
				//Сообщить(мМодельПодключаемогоТО + ": " + Ошибка, СтатусСообщения.Важное);
				//ПоследняяОшибка = Результат;
				// } Админ [25.05.2012 17:24:45]
				Продолжить;
			КонецЕсли;

			Оборудование                             = ТО.Добавить();
			Оборудование.Вид                         = Вид;
			Оборудование.Ссылки                      = 1;
			Оборудование.Идентификатор               = Идентификатор;
			Оборудование.Наименование                = Наименование;
			Оборудование.Обработка                   = Обработка;
			Оборудование.Объект                      = Объект;
			Оборудование.ИмяИсточникаВнешнегоСобытия = Обработка.ПолучитьИмяИсточникаВнешнегоСобытия(Объект);

			СообщенияКлиента = Клиенты[Клиент];
			Сообщения        = Обработка.ПолучитьОписаниеСобытий(Объект);
			Сообщения.Колонки.Добавить("Идентификатор");
			Сообщения.Колонки.Добавить("Источник");
			Сообщения.Колонки.Добавить("Вид");
			Сообщения.ЗаполнитьЗначения(Идентификатор, "Идентификатор");
			Сообщения.ЗаполнитьЗначения(Оборудование.ИмяИсточникаВнешнегоСобытия, "Источник");
			Сообщения.ЗаполнитьЗначения(Вид, "Вид");

			Если НЕ ЗначениеЗаполнено(СообщенияКлиента) Тогда
				Клиенты[Клиент] = Сообщения;
			Иначе
				Для Каждого СтрокаТаблицыИсточника Из Сообщения Цикл
					СтрокаТаблицыПриемника = Клиенты[Клиент].Добавить();
					ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника, СтрокаТаблицыИсточника);
				КонецЦикла;
			КонецЕсли;

		КонецЦикла;
	Иначе
		СтрокаТО = Неопределено;
		Для Каждого СтрокаТО Из СтрокиТО Цикл
			Если СтрокаТО.Ссылки = 0 Тогда
				мМодельПодключаемогоТО = СтрокаТО.Объект.Модель;
				Результат = СтрокаТО.Обработка.Подключить(СтрокаТО.Объект);

				Если ЗначениеЗаполнено(Результат) Тогда
					мОписаниеОшибки = СтрокаТО.Объект.ОписаниеОшибки;
					Ошибка = ПолучитьТекстОшибкиТО(Результат);
					Сообщить(мМодельПодключаемогоТО + ": " + Ошибка, СтатусСообщения.Важное);
					ПоследняяОшибка = Результат;
					Продолжить;
				КонецЕсли;
				СтрокаТО.ИмяИсточникаВнешнегоСобытия = СтрокаТО.Обработка.ПолучитьИмяИсточникаВнешнегоСобытия(СтрокаТО.Объект);
			КонецЕсли;

			СообщенияКлиента = Клиенты[Клиент];
			Сообщения        = СтрокаТО.Обработка.ПолучитьОписаниеСобытий(СтрокаТО.Объект);
			Сообщения.Колонки.Добавить("Идентификатор");
			Сообщения.Колонки.Добавить("Источник");
			Сообщения.Колонки.Добавить("Вид");
			Сообщения.ЗаполнитьЗначения(СтрокаТО.Идентификатор, "Идентификатор");
			Сообщения.ЗаполнитьЗначения(СтрокаТО.ИмяИсточникаВнешнегоСобытия, "Источник");
			Сообщения.ЗаполнитьЗначения(СтрокаТО.Вид, "Вид");

			Если НЕ ЗначениеЗаполнено(СообщенияКлиента) Тогда
				Клиенты[Клиент] = Сообщения;
			Иначе
				Для Каждого СтрокаТаблицыИсточника Из Сообщения Цикл
					СтрокаТаблицыПриемника = Клиенты[Клиент].Добавить();
					ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника, СтрокаТаблицыИсточника);
				КонецЦикла;
			КонецЕсли;

			СтрокаТО.Ссылки = СтрокаТО.Ссылки + 1;
		КонецЦикла;
	КонецЕсли;

	Возврат ПоследняяОшибка;

КонецФункции // ПодключитьОборудование()
Показать
9. SatanClaws 146 01.08.12 20:29 Сейчас в теме
(4) ругань - руганью, но
а) ком-порт пытается открыться (причем, монопольно)
б) не дай бог, на этом ком-порту окажется какое-то другое оборудование

Т.е., конечно, ком-портов можно создать ажно 255 штук, благо цитрикс позволяет маппить порты с переопределением имен. Но решение все-равно некрасивое до кривизны.
Позволяет ли вообще такие фокусы стандартный РДП - сходу не скажу.
Рамзес; +1 Ответить
5. alexpvs 64 01.08.12 11:25 Сейчас в теме
// Функция возвращает строку c именем компьютера для нужд торгового оборудования.
//
// Возвращаемое значение:
// Строка - имя компьютера для торгового оборудования.
Такую проблему для терминального сервера решил следующим образом в модуле обработки "ТОСервер":
//
Функция ПолучитьИмяКомпьютераТО() Экспорт

Если мИмяКомпьютера = Неопределено Тогда
// НАЧАЛО ИЗМЕНЕНИЙ
//мИмяКомпьютера = ВРег(ИмяКомпьютера());
мИмяКомпьютера = ВРег(ИмяКомпьютера()) + "_" + ВРег(ИмяПользователя());
// КОНЕЦ ИЗМЕНЕНИЙ
КонецЕсли;

Возврат мИмяКомпьютера;

КонецФункции // ПолучитьИмяКомпьютераТО()

Таким образом, ТО настраивается для связки "компьютер" (в данном случае, один и тот же сервер терминалов) и конкретного пользователя 1С
8. SatanClaws 146 01.08.12 20:26 Сейчас в теме
(5) собственно, упрощать пример никто не запрещает - я ж даже специально написал, что "пример излишне брутален".
12. Niberu 5 02.08.12 03:13 Сейчас в теме
(5) alexpvs, давно-давно, для тис под 77 для сохранения настроек оборудования подобную связку ИмяКомпьютера&ИмяПользователя в имени файла первым делом приписал.
Сначала удивился, что в 8ке этого и сейчас нет,
но, спасибо (6) Spacer, оказывается есть.
6. Spacer 363 01.08.12 13:13 Сейчас в теме
Зачем эти танцы с бубном?
"Как известно, стандартная подсистема торгового обрудования в 1С8.* регистрирует оборудование "на компьютер"
Кто вам такое сказал?
Стандартная подсистема регистрирует оборудование не "на компьютер", а "на рабочее место".
Для этого в подсистеме есть специальный справочник "РабочиеМеста".
Каждое рабочее место представляет собой связку "Пользователь+Компьютер".
Так что если специально не извращаться, а все делать по уму, то никаких проблем с этим не возникает.
7. SatanClaws 146 01.08.12 20:24 Сейчас в теме
(6) Это где? в УТ 11 (честно, с ней не приходилось сталкиваться)?
В УТ 10 нет никаких рабочих мест - а работают на УТ 10 еще ой как много контор.

Если в УТ 11 подсистему торгового оборудования заметно переписали - обновлю статью.
11. Spacer 363 02.08.12 03:06 Сейчас в теме
(7) да, в УТ 11. Я из нее перетаскивал систему подключения ТО в УПП под тонкий клиент управляемое приложение. Наверно действительно в УТ 10 такого еще не было. Поторопился я с категоричностью суждений.
10. orehova123 02.08.12 01:51 Сейчас в теме
спасибо автору и комментаторам, закину в свою "книгу знаний"
13. vitalya24 239 07.08.12 09:12 Сейчас в теме
Интересная статья, кстати насчет торгового оборудования, сканера symbol ls1203, ls2208 и многое другое, если нужно обращайтесь, помогу в подборе и внедрении
14. karakozov 08.08.12 09:14 Сейчас в теме
Полезная информация, можно было б конечно и самому придти к решению.Но коллективный разум рулит.Автору плюс.
15. Amirzhan 16.10.12 23:49 Сейчас в теме
Здравствуйте, спасибо за статью и код... сканеры мы настроили и ФР, но вот весы перестали работать... Весы Штрих-М, в плане обмена тупо говорит что нет доступных устройств. С типовой обработкой работает гуд, с вашей, возможность выгружать товары в весы пропала... че делать ?
16. SatanClaws 146 18.10.12 04:50 Сейчас в теме
(15) А точно отключение весов связано с этим?
Вернуть взад пробовали?
Оставьте свое сообщение