Как декодировать (преобразовать) Unicode в 1С При разработке очередного обмена с интернет магазином через API столкнулисть что сайт возвращает ответ в виде:
Код VBS {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
из кода ясно что это JSON и используя код ПрочитатьJSON
Код 1C v 8.3 Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
В переменной ДанныеЛога будет структура в виде
В результате получилась функция с 2-мя вариантами возрата, в зависимости от того как нужно
Код 1C v 8.3 //Функция читает полученный JSON декадируя текст юникод
Функция ДекодироватьUniCodeВJSON(стрВходящая)
// стрВходящая содержит {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Вариант 1 используя перебор структуры и вывод в текстовую переменную
Текст = "";
Для каждого Элемент Из ДанныеЛога Цикл
//добавим разделитель после предыдущего значения
Текст = Текст + ?(НЕ ПустаяСтрока(Текст), Символы.ПС, "");
//добавим представление ключа и значения:
Текст = Текст + Элемент.Ключ + " = " + Элемент.Значение;
КонецЦикла;
Возврат Текст; //Вернет ok = true description = Статус заказа изменен
// Вариант 2 мспользуя ЗаписьJSON
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
ЗаписатьJSON(Запись, ДанныеЛога,);
Возврат Запись.Закрыть(); // Вернет JSON {"ok":"true","description":"Статус заказа изменен"}
КонецФункции
На просторах интернета была найдена еще одна функция:
Код 1C v 8.3 //Параметры: Строка в Юникод (обязательный) Тип: Строка. Исходная строка.
//Возвращаемое значение: Тип: Строка. Строка обработанных символов.
//Описание: Возвращает преобразованную строку из формата Unicod.
//Автор: Александр Кияница (treedo)
Функция ПереобразоватьЮникод(Строка)
ГотововаяСтрока = "" ;
МасУкр = Новый Массив(66) ;
МасУкр[0]="А"; МасУкр[1]="Б"; МасУкр[2]="В"; МасУкр[3]="Г"; МасУкр[4]="Ґ"; МасУкр[5]="Д";
МасУкр[6]="Е"; МасУкр[7]="Є"; МасУкр[8]="Ж"; МасУкр[9]="З"; МасУкр[10]="И"; МасУкр[11]="І";
МасУкр[12]="Ї"; МасУкр[13]="Й"; МасУкр[14]="К"; МасУкр[15]="Л"; МасУкр[16]="М"; МасУкр[17]="Н";
МасУкр[18]="О"; МасУкр[19]="П"; МасУкр[20]="Р"; МасУкр[21]="С"; МасУкр[22]="Т"; МасУкр[23]="У";
МасУкр[24]="Ф"; МасУкр[25]="Х"; МасУкр[26]="Ц"; МасУкр[27]="Ч"; МасУкр[28]="Ш"; МасУкр[29]="Щ";
МасУкр[30]="Ь"; МасУкр[31]="Ю"; МасУкр[32]="Я";
МасУкр[33]="а"; МасУкр[34]="б"; МасУкр[35]="в"; МасУкр[36]="г"; МасУкр[37]="ґ"; МасУкр[38]="д";
МасУкр[39]="е"; МасУкр[40]="є"; МасУкр[41]="ж"; МасУкр[42]="з"; МасУкр[43]="и"; МасУкр[44]="і";
МасУкр[45]="ї"; МасУкр[46]="й"; МасУкр[47]="к"; МасУкр[48]="л"; МасУкр[49]="м"; МасУкр[50]="н";
МасУкр[51]="о"; МасУкр[52]="п"; МасУкр[53]="р"; МасУкр[54]="с"; МасУкр[55]="т"; МасУкр[56]="у";
МасУкр[57]="ф"; МасУкр[58]="х"; МасУкр[59]="ц"; МасУкр[60]="ч"; МасУкр[61]="ш"; МасУкр[62]="щ";
МасУкр[63]="ь"; МасУкр[31]="ю"; МасУкр[65]="я";
МасКод = Новый Массив(66) ;
МасКод[0]="0410"; МасКод[1]="0411"; МасКод[2]="0412"; МасКод[3]="0413"; МасКод[4]="0490"; МасКод[5]="0414";
МасКод[6]="0415"; МасКод[7]="0404"; МасКод[8]="0416"; МасКод[9]="0417"; МасКод[10]="0418"; МасКод[11]="0406";
МасКод[12]="0407"; МасКод[13]="0419"; МасКод[14]="041A"; МасКод[15]="041B"; МасКод[16]="041C"; МасКод[17]="041D";
МасКод[18]="041E"; МасКод[19]="041F"; МасКод[20]="0420"; МасКод[21]="0421"; МасКод[22]="0422"; МасКод[23]="0423";
МасКод[24]="0424"; МасКод[25]="0425"; МасКод[26]="0426"; МасКод[27]="0427"; МасКод[28]="0428"; МасКод[29]="0429";
МасКод[30]="042C"; МасКод[31]="042E"; МасКод[32]="042F";
МасКод[33]="0430"; МасКод[34]="0431"; МасКод[35]="0432"; МасКод[36]="0413"; МасКод[37]="0491"; МасКод[38]="0434";
МасКод[39]="0435"; МасКод[40]="0454"; МасКод[41]="0436"; МасКод[42]="0437"; МасКод[43]="0438"; МасКод[44]="0456";
МасКод[45]="0457"; МасКод[46]="0439"; МасКод[47]="043A"; МасКод[48]="043B"; МасКод[49]="043C"; МасКод[50]="043D";
МасКод[51]="043E"; МасКод[52]="043F"; МасКод[53]="0440"; МасКод[54]="0441"; МасКод[55]="0442"; МасКод[56]="0443";
МасКод[57]="0444"; МасКод[58]="0445"; МасКод[59]="0446"; МасКод[60]="0447"; МасКод[61]="0448"; МасКод[62]="0449";
МасКод[63]="044C"; МасКод[31]="044E"; МасКод[65]="044F";
тмпСтрока = "" ;
Для Счетчик = 1 По СтрДлина(Строка) Цикл
Если Лев(Строка, 1) = "\" Тогда
Если Лев(Строка, 2) = "\u" Тогда
тмпСтрока = Прав(Лев(Строка, 6),4) ;
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
СтрокаЗамены = Прав(тмпСтрока, 1) ;
тмпСтрока = СтрЗаменить(тмпСтрока,СтрокаЗамены,ТРег(СтрокаЗамены));
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
Сообщить("Код символа не найден: " + тмпСтрока) ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Строка = Прав(Строка, (СтрДлина(Строка)-6)) ;
Иначе
Строка = Прав(Строка, (СтрДлина(Строка)-2)) ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + Лев(Строка, 1) ;
Строка = Прав(Строка, (СтрДлина(Строка)-1)) ;
КонецЕсли;
КонецЦикла;
Возврат ГотововаяСтрока ;
КонецФункции
Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Блокировка записей, невозможно изменить или удалить из регистра. Конфликт блокировок MS SQL + 1C При попытке удалить запись из регистра сведений - получаю ошибку: она заблокирована, ошибка блокировок и т.д.
Отключил всех пользователей, перезапустил сервер, пробую удалить - опять ошибка блокировки
Путем тестов было вяснено, что проблема не в коде, а происходит это на этапе обращения платформы к SQL серверу... после долгих поисков решений, в интернете была найдена статья, которая помогла в решении данной проблемы:
Кто что блокирует, MS SQL + 1C
В повседневной работе достаточно задействовать только первый блок "/*кто кого*/". Открываем MS SQL Server Management Studio, правой на корень - "new query" - вставляем код запроса (только верхнюю часть до "Кто что блокирует", остальное - для детального анализа), выполняем запрос (вверху есть кнопочка выполнения запроса).
Выполнив запрос, запоминаем "ID виновника", быстренько идем в консоль сервера 1С, заходим в ветку "Сеансы" нашей базы. Видим все соединения с 1С-сервером, ищем там колонку "Соединение с СУБД", чтобы увидеть соединения 1С-сервера с MSSQL-сервером. В колонке будет всего несколько заполненных значений, среди них и будет "ID виновника".
Что делать если его там нет, тут 3 варианта:
1. Вернитесь в MSSQL и сделайте запрос еще несколько раз подряд, если значения меняются или таблица вообще пуста - постоянной блокировки нет, у вас (уже) все в порядке.
2. Сеанс который блокирует MSSQL находится в другой базе т.е. блокировка не в той базе (можно попробовать задействовать ветку всех сеансов в консоли 1С-сервера) - вернитесь в MSSQL и внимательно посмотрите в колонку DB в ней находится название базы.
3. Бывает что ID процесса в 1С-консоли вообще отсутствует, такое тоже бывает если у вас есть какие-то внешние программы подключенные напрямую в базу 1С, если пускаете кого-то в MSSQL напрямую, то вариант не исключен.
Код SQL-запроса:
Код SQL SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @dbid AS smallint;
use [ВАШАБАЗА];
SET @dbid=DB_ID();
/*кто кого*/
SELECT DB_NAME(pr1.dbid) AS 'DB'
,pr1.spid AS 'ID жертвы'
,RTRIM(pr1.loginame) AS 'Login жертвы'
,pr2.spid AS 'ID виновника'
,RTRIM(pr2.loginame) AS 'Login виновника'
,pr1.program_name AS 'программа жертвы'
,pr2.program_name AS 'программа виновника'
,txt.[text] AS 'Запрос виновника'
FROM MASTER.dbo.sysprocesses pr1(NOLOCK)
JOIN MASTER.dbo.sysprocesses pr2(NOLOCK)
ON (pr2.spid = pr1.blocked)
OUTER APPLY sys.[dm_exec_sql_text](pr2.[sql_handle]) AS txt
WHERE pr1.blocked <> 0
/* Кто что блокирует */
SELECT s.[nt_username]
,request_session_id
,tran_locks.[request_status]
,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')' [Object]
,txt_blocked.[text]
,COUNT(*) [COUNT]
FROM sys.dm_tran_locks AS tran_locks WITH (NOLOCK)
JOIN sys.sysprocesses AS s WITH (NOLOCK)
ON tran_locks.request_session_id = s.[spid]
JOIN (
SELECT 'KEY' AS sResource_type
,p.[hobt_id] AS [id]
,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description]
FROM sys.partitions p
JOIN sys.objects o
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
UNION ALL
SELECT 'RID' AS sResource_type
,p.[hobt_id] AS [id]
,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description]
FROM sys.partitions p
JOIN sys.objects o
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
UNION ALL
SELECT 'PAGE'
,p.[hobt_id]
,QUOTENAME(o.name) + '.' + QUOTENAME(i.name)
FROM sys.partitions p
JOIN sys.objects o
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
UNION ALL
SELECT 'OBJECT'
,o.[object_id]
,QUOTENAME(o.name)
FROM sys.objects o
) AS RD
ON RD.[sResource_type] = tran_locks.resource_type
AND RD.[id] = tran_locks.resource_associated_entity_id
OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt_Blocked
WHERE (
tran_locks.request_mode = 'X'
AND tran_locks.resource_type = 'OBJECT'
)
OR tran_locks.[request_status] = 'WAIT'
GROUP BY
s.[nt_username]
,request_session_id
,tran_locks.[request_status]
,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')'
,txt_blocked.[text]
ORDER BY
6 DESC
IF EXISTS ( SELECT Name
FROM tempdb..sysobjects
WHERE name LIKE '#LOCK_01_01%' )
DROP TABLE #LOCK_01_01
CREATE TABLE #LOCK_01_01
(
spid INT,
dbid INT,
ObjId INT,
IndId SMALLINT,
Type VARCHAR(20),
Resource VARCHAR(50),
Mode VARCHAR(20),
Status VARCHAR(20)
)
INSERT INTO #LOCK_01_01
EXEC sp_lock
select OBJECT_NAME(ObjId) as [Имя объекта], Mode [Тип блокировки (код)],
CASE
WHEN Mode='Sch-S' THEN 'Блокировка стабильности схемы. Гарантирует, что элемент схемы, такой как таблица или индекс, не будет удален до тех пор, пока сеанс связи удерживает блокировку стабильности схемы на данный элемент схемы;'
WHEN Mode='Sch-М' THEN '= Блокировка изменения схемы. Должен поддерживаться любым сеансом связи, во время которого предполагается изменить схему данного ресурса. Гарантирует, что другие сеансы не имеют ссылок на обозначенный объект;'
WHEN Mode='S' THEN 'S = Коллективная блокировка. Удерживающему сеансу предоставлен коллективный доступ к ресурсу;'
WHEN Mode='U' THEN 'U = Блокировка обновления. Указывает блокировку обновления, полученную на ресурсы, которые со временем могут быть обновлены. Используется для предотвращения общей формы взаимоблокировки, которая возникает, когда множество сеансов блокируют ресурсы для потенциального обновления в последующее время;'
WHEN Mode='X' THEN 'X = Монопольная блокировка. Удерживающему сеансу предоставлен исключительный доступ к ресурсу;'
WHEN Mode='IS' THEN 'IS = Блокировка с намерением коллективного доступа. Указывает намерение поместить S блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='IU' THEN 'IU = Блокировка с намерением обновления. Указывает намерение поместить U блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='IX' THEN 'IX = Блокировка с намерением монопольного доступа. Указывает намерение поместить X блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='SIU' THEN 'SIU = Коллективная блокировка с намерением обновления. Указывает коллективный доступ к ресурсу с намерением получения блокировок обновления на подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='SIX' THEN 'SIX = Коллективная блокировка с намерением монопольного доступа. Указывает коллективный доступ к ресурсу с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='UIX' THEN 'UIX = Блокировка обновления с намерением монопольного доступа. Указывает блокировку обновления ресурса с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='BU' THEN 'BU = Блокировка массового обновления. Используется для массовых операций;'
--[ ELSE else_result_expression ]
END as [Тип блокировки]
,syspr.spid, syspr.dbid, syspr.open_tran, syspr.status, syspr.hostprocess, syspr.loginame, syspr.hostname
From
#LOCK_01_01
inner join master.dbo.sysprocesses as syspr
on syspr.spid = #LOCK_01_01.spid and syspr.dbid = #LOCK_01_01.dbid
where
#LOCK_01_01.Type = 'TAB'
and
#LOCK_01_01.dbid = @dbid
/* Чем занят сервер*/
SELECT s.[spid]
,s.[loginame]
,s.[open_tran]
,s.[blocked]
,s.[waittime]
,s.[cpu]
,s.[physical_io]
,s.[memusage]
INTO #sysprocesses
FROM sys.[sysprocesses] s
WAITF OR DELAY '00:00:01'
SELECT txt.[text]
,s.[spid]
,s.[loginame]
,s.[hostname]
,DB_NAME(s.[dbid]) [db_name]
,SUM(s.[waittime] -ts.[waittime]) [waittime]
,SUM(s.[cpu] -ts.[cpu]) [cpu]
,SUM(s.[physical_io] -ts.[physical_io]) [physical_io]
,s.[program_name]
FROM sys.[sysprocesses] s
JOIN #sysprocesses ts
ON s.[spid] = ts.[spid]
AND s.[loginame] = ts.[loginame]
OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt
WHERE s.[cpu] -ts.[cpu]
+ s.[physical_io] -ts.[physical_io]
> 500
OR (s.[waittime] -ts.[waittime]) > 3000
GROUP BY
txt.[text]
,s.[spid]
,s.[loginame]
,s.[hostname]
,DB_NAME(s.[dbid])
,s.[program_name]
ORDER BY
[physical_io] DESC
DROP TABLE #sysprocesses
Категория:
Администрирование Печать штрихкода в управляемом приложении Программируя под 8.2, работающем в режиме управляемого приложения, я столкнулся с проблемой печати штрихкода. Для платформы 8.1 и платформы 8.2 в режиме обычного приложения такой проблемы не было: устанавливаем элемент «1С:Печать штрихкодов» в макет и наслаждаемся вертикальными черточками. В режиме управляемого приложения вываливается ошибка:
Код 1C v 8.2 УП ОбластьВывода.Рисунки.ШтрихКод.Объект – неопределено
Что же случилось?
Дело в том, что для управляемого приложения внешние компоненты разрабатываются по другой технологии. Пример внешней компоненты для печати штрих-кода в 8.2 есть в демонстрационной конфигурации "Управляемое приложение" в макетах справочника Товары либо в конфигурации «1С:Управление торговлей» версии 11, макеты обработки «Печать этикеток и ценников».
Данная компонента, получив в качестве параметра строку штрихкода, возвращает картинку – штрихкод, которую программисту предлагается поместить в любое удобное место печатной формы.
Теперь как это сделать.
Всего обработок аж четыре штуки:
КомпонентаПечатиШтрихкодовWindows32
КомпонентаПечатиШтрихкодовWindows64
КомпонентаПечатиШтрихкодовLinux32
КомпонентаПечатиШтрихкодовLinux64
Все они загружены в одноименные макеты. Функция, подключающая внешнюю компоненту в зависимости от платформы может выглядеть так:
Код 1C v 8.х Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
// В зависимости от типа платформы подключим соответствующую внешнюю компоненту
СистемнаяИнформация = Новый СистемнаяИнформация;
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ПечатьЭтикетокИЦенников.Макет.КомпонентаПечатиШтрихкодовWindows32", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ПечатьЭтикетокИЦенников.Макет.КомпонентаПечатиШтрихкодовWindows64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ПечатьЭтикетокИЦенников.Макет.КомпонентаПечатиШтрихкодовLinux32", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
Иначе
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ПечатьЭтикетокИЦенников.Макет.КомпонентаПечатиШтрихкодовLinux64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
КонецЕсли;
// Создадим объект внешней компоненты
Если ПодключениеВыполнено Тогда
ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
Иначе
Возврат Неопределено;
КонецЕсли;
// Если нет возможности рисовать
Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда
// То картинку сформировать не сможем
Возврат Неопределено;
Иначе
// Установим основные параметры компоненты
// Если в системе установлен шрифт Tahoma
Если ВнешняяКомпонента.НайтиШрифт("Tahoma") = Истина Тогда
// Выбираем его как шрифт для формирования картинки
ВнешняяКомпонента.Шрифт = "Tahoma";
Иначе
// Шрифт Tahoma в системе отсутствует
// Обойдем все доступные компоненте шрифты
Для Сч = 0 По ВнешняяКомпонента.КоличествоШрифтов -1 Цикл
// Получим очередной шрифт, доступный компоненте
ТекущийШрифт = ВнешняяКомпонента.ШрифтПоИндексу(Сч);
// Если шрифт доступен
Если ТекущийШрифт <> Неопределено Тогда
// Они и будет шрифтом для формирования штри-кода
ВнешняяКомпонента.Шрифт = ТекущийШрифт;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Утановим размер шрифта
ВнешняяКомпонента.РазмерШрифта = 10;
Возврат ВнешняяКомпонента;
КонецЕсли;
КонецФункции
В коде выше все компоненты загружены в макеты обработки «ПечатьЭтикетокИЦенников». В принципе ничто не мешает поместить их в любое иное место. Вызов функции осуществляется командой:
Код 1C v 8.х ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода();
Если что-то не получилось – возвращает НЕОПРЕДЕЛЕНО.
Далее опишем функцию, которая, получив данные, сформирует нужную нам картинку с штрихкодом:
Код 1C v 8.х Функция ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Штрихкод, Ширина, Высота) Экспорт
// Зададим размер картинки
ВнешняяКомпонента.Ширина =Ширина;
ВнешняяКомпонента.Высота =Высота;
// Разрешим компоненте самой определять тип кода
ВнешняяКомпонента.АвтоТип = истина;
// Если код содержит контрольный символ, обязательно указываем
ВнешняяКомпонента.СодержитКС = СтрДлина(Штрихкод) = 13;
// Если отображать контрольный символ не нужно
// ВнешняяКомпонента.ВидимостьКС = Ложь;
// Формируем картинку штрихкода
ВнешняяКомпонента.ЗначениеКода = Штрихкод;
// Если установленная нами ширина меньше минимально допустимой для этого штрихкода
Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда
// Скорректируем ширину
ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода + 10;
КонецЕсли;
// Сформируем картинку
ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
// Если картинка сформировалась
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
// Формируем из двоичных данных
Возврат Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;
Возврат Неопределено;
КонецФункции
В данной функции используется автоопределение типа штрихкода командой
Код 1C v 8.х ВнешняяКомпонента.АвтоТип = истина;
Можно тип штрихкода указать вручную:
Код 1C v 8.х ВнешняяКомпонента.АвтоТип = Ложь;
ВнешняяКомпонента.ТипКода = 1; // указан тип EAN13
ТипКода - число от 0 до 15: 0 - EAN8, 1 - EAN13, 2 - EAN128. Вот полный список типов по порядку:
EAN8, EAN13, EAN128, Code39, Code128, Code16k, PDF417, Standart (Industrial) 2 of 5, Interleaved 2 of 5, Расширение Code39, Code93, ITF 14, RSS14, CodaBar, EAN13 AddOn 2, EAN13 AddOn 5.
Кроме типа штрихкода, компонента имеет ряд других свойств, например ВнешняяКомпонента.ОтображатьТекст, ВнешняяКомпонента.РазмерШрифта и прочие, можно посмотреть в свойствах.
Наконец последнее - вывод штрихкода. Для этого в макет поместим картинку с именем «Штрихкод». Получаем и выводим штрихкод в область командой:
Код 1C v 8.х ОбластьЗначение.Рисунки.Штрихкод.Картинка = ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Штрихкод, 50, 30);
Где
Штрихкод – переменная, содержащая строку штрихкода номенклатуры, 50 – требуемая ширина, 30 – высота картинки. В макете размер картинки лучше всего поставить «Реальный размер».
Замечание. Сразу бросается в глаза то, что я вручную указываю размер требуемой картинки – 50 на 30. Возникает вопрос, а нельзя ли размеры требуемой картинки получить из картинки на макете? Конечно можно:
Код 1C v 8.х ОбластьЗначение.Рисунки.Штрихкод.Ширина
ОбластьЗначение.Рисунки.Штрихкод.Высота
К сожалению, цифры получаемые этими командами почему-то слишком малы. Как получить реальный видимый размер картинки я пока не знаю, может кто подскажет?
Источник Категория:
Штрих-код (barcode) Скрипт переустанавливает Платформу 1С и прописывает нужные базы, ярлыки! Круглов Дмитрий дмитриевич :
Скрипт определяет наличие предыдущих платформ и деинсталлирует их..
далее устанавливает последнююю версию, прописывает нужные базы и прямые ярлыки
Код VBS Option Explicit
Const Server = "62.76.65.113" ' Здесь мы зададим ip нашего общего ресурса (можно задать через имя компьютера)
If Ping (Server) = True Then ' проверим доступно ли место
Dim ProductCod 'код продукта (Смотри в каталоге каждого дистрибутива платформы в файле setup.ini
Dim DistrFolder 'каталог в которм находится дистрибутив платформы
Dim cmdLine 'Параметры запуска дистрибутива
'Деинсталируем предыдущие платформы
cmdLine = "REMOVE=ALL"
ProductCod = "{375C3BB1-6F1E-4D93-9AF7-6A379133CA81}"
DistrFolder= "\\" & Server & "\1s\8.2.10.73\"
If Ustanovlena(ProductCod) Then ' Здесь и далее идет проверка на наличие установленной данной версии платформы
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
'Иногда папка остается в каталоге installer после удаления - исправим это
UdalitF older ProductCod
End If
ProductCod = "{8150646B-4F88-4415-AF2A-F96199E3DA37}"
DistrFolder= "\\" & Server & "\1s\8.2.10.77\"
If Ustanovlena(ProductCod) Then
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
'Установим текущую платформу
ProductCod = "{3D5173F0-371D-4B5D-B96A-9340D7F30431}"
DistrFolder= "\\" & Server & "\1s\8.2.10.82\"
cmdLine = "TRANSFORMS=adminstallrelogon.mst;1049.mst DESIGNERALLCLIENTS=0 THICKCLIENT=0 THINCLIENTFILE=1 THINCLIENT=1 WEBSERVEREXT=0 SERVER=0 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=0 LANGUAGES=RU"
'В данном случае мне нужны только установленные тонкие клиенты, если надо больше - поменяйте на 1, то что надо установить
If Not Ustanovlena(ProductCod) Then ' Если текущая версия не установлена - установим ее
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
ScopirovatSpisokBaz ' В любом случае обновим список ИБ (Вдруг или мы или пользователи, что-то поменяли)
End If
Sub SdelatEto (ByVal productCode, ByVal msiPackage, ByVal CmdLine)
On Error Resume Next
Dim installer
Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
installer.UILevel = 2 'молчаливая установка (варианты смотрите в Руководстве администратора 8.2 стр.185
installer.InstallProduct msiPackage,cmdLine
Set installer = Nothing
End Sub
Sub UdalitF older (ProductCod)
On Error Resume Next
Dim fso1, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.DeleteFolder WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod, True
End Sub
'Создаем список баз данных (копируем наш фал с сервера на клиент
Sub ScopirovatSpisokBaz
On Error Resume Next
Dim fso1, WSH1
Set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.CopyFile "\\" & Server & "\1s\1CEStart\ibases.v8i",WSH1.ExpandEnvironmentStrings("%AppData%") & "\1C\1CEStart\ibases.v8i", True
End Sub
'создание ярлыка
Sub createShurtcut
Dim WshShell, oShellLink, ServerBD, NameBD
ServerBD = "IZO-NoteBook"
NameBD = "1C_Dec_82"
Set WshShell = WScript.CreateObject("WScript.Shell")
Dim strDesktop : strDesktop = WshShell.SpecialFolders("Desktop")
Set oShellLink = WshShell.CreateShortcut(strDesktop & "\" & shortcutName & ".lnk")
oShellLink.TargetPath = WSHShell.ExpandEnvironmentStrings("%ProgramFiles%") & "\1cv82\Common\1cestart.exe /S" & ServerBD & "\" & NameBD 'Если не указывать параметры, то будет появлятся стандартное окно выбора ИБ, если укажем, то сразу имя пользователя-пароль
oShellLink.WindowStyle = 1
oShellLink.Description = shortcutName
oShellLink.Save
Set oShellLink = Nothing
Set WshShell = Nothing
End Sub
Function Ustanovlena(ProductCod)
On Error Resume Next
Dim fso1, oFolders, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
Set oFolders = Nothing
Set oFolders = fso1.GetFolder(WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod)
If OFolders Is Nothing Then
Ustanovlena = False
Else
Ustanovlena = True
End If
End Function
Function Ping(strHost)
' Просто пингуем наш компутер, проверяя включен ли он
Dim objPing, objRetStatus
Set objPing = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
("S_elect * FROM Win32_PingStatus WHERE address = '" & strHost & "'")
for Each objRetStatus in objPing
if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 Then
Ping = False
Else
Ping = True
End If
Next
End Function
Рябко Михаил Евгеньевич :
При установке файла 1CEnterprise 8.2.msi через GPO платформа ставилась, но потом ее не могли удалить (после выключения из групповых политик установки). Никакой unistaller ee не брал. Потом почистили реестр, вроде победили.
Более того, инсталлер не прописывал ярлыки в каталог %SystemRoot%\Installer\{8150646B-4F88-4415-AF2A-F96199E3DA37},из за этого все ярлыки были без картинок.
Даже если бы все работало, этот способ не очень понравился, т.к. для 8.2 через те же GPO нельзя прописать базы. А смысл тогда?
Далее пробовали через скрипт. Такое же непредсказуемое поведение по деинсталляции платформы. Кроме этого появлялось 2 ярлыка после установки. Один - который прописан в скрипте, другой - после работы инсталлятора. Ну ладно, написал файл трансформации, чтобы лишний ярлык не создавал, но проблема ошибки при выполнения скрипта ("Требуется объект") и деинсталляции осталась.
Точно также проблема деинсталляции и с ярлыками остается при прямой установке 1CEnterprise 8.2.msi (без трансформации, запуском из проводника), разве что из списка программ удаляется, а все файлы остаются.
В итоге пришли к решению в лоб. Раз уж запуск 1cestart.exe на расшаренной папке дает более-менее положительный результат вручную, то нужно и идти по этому пути. Написал скрипт установки. Вроде работает. Правда, чтобы ограничится установкой без запуска, пришлось создать базу-пустышку и намеренно внести ошибку в параметр запуска. Далее по комментариям все должно быть понятно.
А так есть подозрение, что причина в кривом файле 1CEnterprise 8.2.msi (ярлыки то хотя бы он должен создавать нормально?). То ли дело установка через Setip.exe - тут все в шоколаде и работает.
Итак, альтернативный скрипт (сохранить с расширением *.vbs)
Код VBS Option Explicit
'Этот скрипт выполняет установку 1С 8.2 с помощью операций типа
'copy \\Server\Adm_1C_8_2\Null-Base\Zero_dblist.v8i %AppData%\1C\1CEStart\ibases.v8i
'\\Server\Adm_1C_8_2\Kadry_Zarplata_Buh\1cestart.exe Enterprise /F \\Server\d$\Adm_1C_8_2\Null-Base
'***** Необходимо изменить на реальный каталог установки,
'***** где лежат папки с дистрибутивами типа 8.2.10.77
Const DistrFolder="\\Server\Adm_1C_8_2\"
'Если тонкого клиента ставить не собираетесь из папки setuptc, то лучше ее удалите, т.к. инсталлер
'бывает путается, что ему ставить, и несмотря на все параметры начинает ставить тонкого клиента, когда его
'об этом не просят.
'***** Для каждго набора баз (отдела) свой подкаталог, в котором располагаются 1CESCmn, 1cestart.exe,
'***** common_dblist.v8i и этот скрипт Setup 1C8_2.vbs
Const DistrFolderOtdel="Kadry_Zarplata_Buh\"
'Т.к. отключить запуск 1С при выполнении 1CEStart нельзя (а нам нужна только установка), то кроме этого скрипта должна быть
'создана пустая база в каталоге \\Server\Adm_1C_8_2\Null-Base.
'Для надежности в модуле управляемого приложения базы можно прописать процедуру
'
'Процедура ПередНачаломРаботыСистемы(Отказ)
' // Вставить содержимое обработчика.
' ЗавершитьРаботуСистемы(Ложь);
'КонецПроцедуры
'В эту же папку положить файл-пустышку общих баз Zero_dblist.v8i
Const myBase = "\\Server\Adm_1C_8_2\Null-Base"
Dim shortcutTarget : shortcutTarget = DistrFolder & DistrFolderOtdel & "1cestart.exe"
Dim WshShell
Dim strAppData
Dim objFSO
Dim strFolder1C, strFolder1CEStart, strFullFolderName, strFullFileName
'Сначала получим каталог пользователя
Set WshShell = WScript.CreateObject("WScript.Shell")
strAppData = WSHShell.SpecialFolders("AppData")
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Проверим наличие папок у пользователя и при необходимости создадим
strFolder1C = "1C"
strFolder1CEStart = "1CEStart"
strFullFolderName = objFSO.BuildPath(strAppData, strFolder1C)
If Not objFSO.FolderExists(strFullFolderName) Then
objFSO.CreateFolder strFullFolderName
End If
strFullFolderName = objFSO.BuildPath(strAppData & "\" &strFolder1C, strFolder1CEStart)
If Not objFSO.FolderExists(strFullFolderName) Then
objFSO.CreateFolder strFullFolderName
End If
'Если файл со списокм баз уже есть, то затирать его не будем
strFullFileName = objFSO.BuildPath(strFullFolderName, "ibases.v8i")
If Not objFSO.FileExists(strFullFileName) Then
'Скопируем пустой список общих баз из папки с пустой базой,
'чтобы при запуске не задавались рядовому пользователю вопросы типа "Скопировать список баз из 8.1?"
objFSO.CopyFile myBase & "\" & "Zero_dblist.v8i", strAppData & "\1C\1CEStart\ibases.v8i", True
Set objFSO = Nothing
End If
'Теперь установка
'Указан параметр nterprise вместо Enterprise, чтобы подавить запуск самой 1С из-за ошибки параметра
'т.к. нужна только инсталляция. Вот такая хитрость.
WshShell.run(shortcutTarget & " nterprise /F " & myBase)
Set WshShell = Nothing
Категория:
Администрирование Обновление платформы на клиентских машинах и восстановление списка информационных баз пользователей Периодически сталкиваюсь с проблемой обновления платформы на клиентских машинах, + периодически пользователи удаляют, изменяют или добавляют какие-то новые информационные БД.
В случае 8.2 новые релизы платформы стали штамповать чуть ли не каждый месяц, что меня повергло в уныние, разбираясь в этом вопросе понял: у кого есть домен могут легко реализовать с помощью доменных политик..Те же кто лишен домена и работает в рабочих группах, может прибегнуть к помощи кривоватого скрипта от 1С (текст скрипта приведен в руководстве администратора 8.2 стр. 185
Но как быть, если нужно одновременно снести старую платформу и поставить новую + что б еще у всех пользователей был одинаковый список информационных БД, Да и лучше, что б по ссылке вообще автоматом выбиралась нужна ИБ!
Для решения нам нужно какое-нибудь общедоступное сетевое пространство, куда мы кладем дистрибутивы платформ и нужный нам список баз (отредактированный файлик ibases.v8i)
Итак, пишем скрипт от меня с любовью и комментариями
Код VBS Option Explicit
Const Server = "62.76.65.113" ' Здесь мы зададим ip нашего общего ресурса (можно задать через имя компьютера)
If Ping (Server) = True Then ' проверим доступно ли место
Dim ProductCod 'код продукта (Смотри в каталоге каждого дистрибутива платформы в файле setup.ini
Dim DistrFolder 'каталог в которм находится дистрибутив платформы
Dim cmdLine 'Параметры запуска дистрибутива
'Деинсталируем предыдущие платформы
cmdLine = "REMOVE=ALL"
ProductCod = "{375C3BB1-6F1E-4D93-9AF7-6A379133CA81}"
DistrFolder= "\\" & Server & "\1s\8.2.10.73\"
If Ustanovlena(ProductCod) Then ' Здесь и далее идет проверка на наличие установленной данной версии платформы
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
'Иногда папка остается в каталоге installer после удаления - исправим это
UdalitF older ProductCod
End If
ProductCod = "{8150646B-4F88-4415-AF2A-F96199E3DA37}"
DistrFolder= "\\" & Server & "\1s\8.2.10.77\"
If Ustanovlena(ProductCod) Then
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
'Установим текущую платформу
ProductCod = "{3D5173F0-371D-4B5D-B96A-9340D7F30431}"
DistrFolder= "\\" & Server & "\1s\8.2.10.82\"
cmdLine = "TRANSFORMS=adminstallrelogon.mst;1049.mst DESIGNERALLCLIENTS=0 THICKCLIENT=0 THINCLIENTFILE=1 THINCLIENT=1 WEBSERVEREXT=0 SERVER=0 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=0 LANGUAGES=RU"
'В данном случае мне нужны только установленные тонкие клиенты, если надо больше - поменяйте на 1, то что надо установить
If Not Ustanovlena(ProductCod) Then ' Если текущая версия не установлена - установим ее
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
ScopirovatSpisokBaz ' В любом случае обновим список ИБ (Вдруг или мы или пользователи, что-то поменяли)
End If
Sub SdelatEto (ByVal productCode, ByVal msiPackage, ByVal CmdLine)
On Error Resume Next
Dim installer
Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
installer.UILevel = 2 'молчаливая установка (варианты смотрите в Руководстве администратора 8.2 стр.185
installer.InstallProduct msiPackage,cmdLine
Set installer = Nothing
End Sub
Sub UdalitF older (ProductCod)
On Error Resume Next
Dim fso1, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.DeleteFolder WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod, True
End Sub
'Создаем список баз данных (копируем наш фал с сервера на клиент
Sub ScopirovatSpisokBaz
On Error Resume Next
Dim fso1, WSH1
Set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.CopyFile "\\" & Server & "\1s\1CEStart\ibases.v8i",WSH1.ExpandEnvironmentStrings("%AppData%") & "\1C\1CEStart\ibases.v8i", True
End Sub
'создание ярлыка
Sub createShurtcut
Dim WshShell, oShellLink, ServerBD, NameBD
ServerBD = "IZO-NoteBook"
NameBD = "1C_Dec_82"
Set WshShell = WScript.CreateObject("WScript.Shell")
Dim strDesktop : strDesktop = WshShell.SpecialFolders("Desktop")
Set oShellLink = WshShell.CreateShortcut(strDesktop & "\" & shortcutName & ".lnk")
oShellLink.TargetPath = WSHShell.ExpandEnvironmentStrings("%ProgramFiles%") & "\1cv82\Common\1cestart.exe /S" & ServerBD & "\" & NameBD 'Если не указывать параметры, то будет появлятся стандартное окно выбора ИБ, если укажем, то сразу имя пользователя-пароль
oShellLink.WindowStyle = 1
oShellLink.Description = shortcutName
oShellLink.Save
Set oShellLink = Nothing
Set WshShell = Nothing
End Sub
Function Ustanovlena(ProductCod)
On Error Resume Next
Dim fso1, oFolders, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
Set oFolders = Nothing
Set oFolders = fso1.GetFolder(WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod)
If OFolders Is Nothing Then
Ustanovlena = False
Else
Ustanovlena = True
End If
End Function
Function Ping(strHost)
' Просто пингуем наш компутер, проверяя включен ли он
Dim objPing, objRetStatus
Set objPing = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
("S_elect * FROM Win32_PingStatus WHERE address = '" & strHost & "'")
for Each objRetStatus in objPing
if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 Then
Ping = False
Else
Ping = True
End If
Next
End Function
Напоминаю, что создать исполняющий скрипт не сложно, берем обычный текстовый файл, вставляем туда текст скрипта, сохраняем файл, меняем ему расширение с txt на vbs и можно скрипт исполнять
Источник Категория:
Администрирование