Обработка
ПечатьЭтикеток использует компоненту "1С:Печать штрихкодов"(доступную на диске ИТС) для печати штрих-кодов(далее ШК). Эта компонента поддерживает следующие типы штрих-кодов: EAN8, EAN13, EAN128, Code39, Code128.
Что делать если на предприятии используется отличный ШК, например Interleave 2 of 5, для которго есть системный шрифт @IDAutomationSHI25M, используемый для вывода ШК на экран или на принтер.
Рассмотрим как проще всего добавить поддержку этого типа ШК в обработке
ПечатьЭтикеток .
Первым делом скопируем общий макет Этикетка в макет для вывода нашего штрих-кода ЭтикеткаInterleave. В этом макете надо удалить элемент управления, связанный с компонентой "1С:Печать штрихкодов". И оформить центральное поле как параметр табличного документа ШтрихКод, выводимый шрифтом @IDAutomationSHI25M.
Далее разрешаем запуск обработки даже с неустановленной компонентой т.к. для вывода нашего ШК компонента не нужна. Для этого комментируем строчку в модуле формы обработки:
Код 1C v 8.х Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
КомпонентШК = Новый COMОбъект( "V8.Barcod.1" ) ;
Макет = ПолучитьОбщийМакет( "Этикетка" ) ;
ЭтикеткаОбласть = Макет. ПолучитьОбласть( 1 , 1 , 4 , 2 ) ;
ЭтикеткаОбласть. Рисунки. Штрихкод. Объект. Сообщение = "1111111111116" ;
Исключение
Сообщить( "Компонента 1С:Печать штрихкодов не установлена на данном компьютере!
|Возможна печать только штрих-кодов Interleave!" , СтатусСообщения. Важное) ;
КонецПопытки ;
КонецПроцедуры
В общем модуле УправлениеРозничнойТорговлей также есть место проверки на компоненту
Код 1C v 8.х #Если Клиент Тогда
Процедура ПечатьЭтикеток(Товары = Неопределено) Экспорт
В обработке есть место, где выполняется проверка типа ШК. Наш ШК сейчас не пройдет проверку и печать выполнена не будет. Чтоб печать выполнялась необходимо исправить функцию в общем модуле УправлениеРозничнойТорговлей.
Код 1C v 8.х
Функция ПолучитьЗначениеТипаШтрихкодаДляЭУ(ТипКода) Экспорт
Перем Значение;
Если ТипКода = ПланыВидовХарактеристик. ТипыШтрихкодов. EAN8 Тогда
Значение = 0 ;
ИначеЕсли ТипКода = ПланыВидовХарактеристик. ТипыШтрихкодов. EAN13 Тогда
Значение = 1 ;
ИначеЕсли ТипКода = ПланыВидовХарактеристик. ТипыШтрихкодов. EAN128 Тогда
Значение = 2 ;
ИначеЕсли ТипКода = ПланыВидовХарактеристик. ТипыШтрихкодов. Code39 Тогда
Значение = 3 ;
ИначеЕсли ТипКода = ПланыВидовХарактеристик. ТипыШтрихкодов. Code128 Тогда
Значение = 4 ;
ИначеЕсли ТипКода = ПланыВидовХарактеристик. ТипыШтрихкодов. Interleave20FS Тогда
Значение = 100 ;
Иначе
Значение = - 1 ;
КонецЕсли ;
Возврат Значение;
КонецФункции
Мы на завершающем этапе, вносим изменения непосредственно в обработку.
Код 1C v 8.х Процедура Печать(ТаблицаТоваров) Экспорт
флВремЕстьInterleave = Ложь ;
флВремЕстьНеInterleave = Ложь ;
Для Каждого СтрокаИзСписка Из ТаблицаТоваров Цикл
Если СтрокаИзСписка. ТипШтрихкода = ПланыВидовХарактеристик. ТипыШтрихкодов. Interleave20FS Тогда
флВремЕстьInterleave = Истина ;
Иначе
флВремЕстьНеInterleave = Истина ;
КонецЕсли ;
Если флВремЕстьInterleave и флВремЕстьНеInterleave Тогда
Предупреждение( "В списке одновременно встречаются штрих-коды несовместимых типов,
|Штрих-коды Interleave необходимо печатать отдельно от остальных!" ) ;
Возврат ;
КонецЕсли ;
КонецЦикла ;
Таб = Новый ТабличныйДокумент;
Таб. ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Этикетка" + СокрЛП( ИмяКомпьютера( ) ) ;
Если флВремЕстьInterleave Тогда
Макет = ПолучитьОбщийМакет( "ЭтикеткаInterleave" ) ;
Иначе
Макет = ПолучитьОбщийМакет( "Этикетка" ) ;
КонецЕсли ;
Если Не флВремЕстьInterleave Тогда
РисунокШтрихкод = ЭтикеткаОбласть. Рисунки. Штрихкод;
КонецЕсли ;
Если Не флВремЕстьInterleave Тогда
РисунокШтрихкод. Расположить( ОбластьШтрихкод) ;
КонецЕсли ;
Если УправлениеРозничнойТорговлей. ПроверитьШтрихКод( СтрокаИзСписка. ШтрихКод,
СтрокаИзСписка. ТипШтрихкода) Тогда
Если флВремЕстьInterleave Тогда
ЭтикеткаОбласть. Параметры. Установить( 0 ,
СформироватьШтрихКодДляМакетаЭтикеткаInterleave( СтрокаИзСписка. ШтрихКод) ) ;
ЭтикеткаОбласть. Области. ОбластьШтрихкод. Шрифт =
Новый Шрифт( ЭтикеткаОбласть. Области. ОбластьШтрихкод. Шрифт, , РезмерШрифтаInterleave) ;
Иначе
Попытка
ЭтикеткаОбласть. Рисунки. Штрихкод. Объект. ТипКода = ТипКода;
ЭтикеткаОбласть. Рисунки. Штрихкод. Объект. Сообщение = СтрокаИзСписка. ШтрихКод;
Исключение
КонецПопытки ;
КонецЕсли ;
Последний штрих это добавить регулятор размера шрифта (в коде переменная РезмерШрифтаInterleave) на форму обработки:
источник Надоели просить меня запостить рабочие модули работы с AD, вот запостил, в качестве бонуса убийца любого процесса в памяти любого компа.
p.s. для работы нужны определенные права.
Автор:
vde69
Код 1C v 8.х Функция ПолучитьСписокДоменов () Экспорт
Результат = Новый Массив( ) ;
objNameSpace = "" ;
Попытка objNameSpace = ПолучитьCOMОбъект( "WinNT:" ) ;
м = Новый Массив( ) ; м. Добавить( "domain" ) ;
м2 = Новый COMSafeArray( м, "VT_VARIANT" ) ;
objNameSpace. Filter = м2 ;
Для каждого item Из objNameSpace Цикл
Результат. Добавить( item. Name) ;
КонецЦикла ;
Исключение
Результат. Очистить( ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокГруппВДомене (ИмяДомена, ТипГрупп = "GlobalGroup" ) Экспорт
Результат = Новый Массив( ) ;
objNameSpace = "" ;
Попытка objNameSpace = ПолучитьCOMОбъект( "WinNT://" + СокрЛП( ИмяДомена) ) ;
м = Новый Массив( ) ;
м. Добавить( ТипГрупп) ;
м2 = Новый COMSafeArray( м, "VT_VARIANT" ) ;
objNameSpace. Filter = м2 ;
Для каждого item Из objNameSpace Цикл
Результат. Добавить( item. Name) ;
КонецЦикла ;
Исключение
Результат. Очистить( ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокПользователейВГруппеДомена (ИмяДомена, ИмяГруппы) Экспорт
Результат = Новый Массив( ) ;
objNameSpace = "" ;
Попытка
objNameSpace = ПолучитьCOMОбъект( "WinNT://" + СокрЛП( ИмяДомена) + "/" + СокрЛП( ИмяГруппы) + ", Group" ) ;
Для каждого item Из objNameSpace. Members( ) Цикл
Результат. Добавить( item. Name) ;
КонецЦикла ;
Исключение
Результат. Очистить( ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПользовательВГруппеДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь ;
Массив = ПолучитьСписокПользователейВГруппеДомена ( СокрЛП( ИмяДомена) , ИмяГруппы) ;
Для каждого элМассив из Массив Цикл
Если ВРег( элМассив) = ВРег( СокрЛП( ИмяПользователя) ) Тогда
Результат = Истина ;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Возврат Результат;
КонецФункции
Функция ДобавитьПользователяВГруппуДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь ;
element_user = "" ;
element_group = "" ;
Попытка
element_user = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user" ) ;
element_group = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group" ) ;
element_group. Add( element_user. ADsPath) ; element_group. SetInfo( ) ;
Результат = Истина ;
Исключение
Результат = Ложь ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция УдалитьПользователяИзГруппыДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь ;
element_user = "" ;
element_group = "" ;
Попытка element_user = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user" ) ;
element_group = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group" ) ;
element_group. Remove( element_user. ADsPath) ;
element_group. SetInfo( ) ;
Результат = Истина ;
Исключение
Результат = Ложь ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Процедура ЗаполнитьПочтовыеАдресаИзAD()
Попытка
conn = ПолучитьCOMОбъект( "" , "ADODB.Connection" ) ;
conn. Provider = "ADSDSOObject" ;
conn. Open( "Active Directory Provider" ) ;
Исключение Предупреждение( "Ошибка подключения к Active Directory!" ) ;
Возврат ;
КонецПопытки ;
Для Каждого Стр из Таблица Цикл
Если НЕ ПустаяСтрока( Стр. Логин) Тогда
Попытка
query = "SEL ECT ADsPath FR OM 'LDAP://DC=" + СокрЛП( Домен. Код) + "' WHERE SAMAccountName='" + Стр. Логин+ "'" ;
rs = conn. Execute( query) ;
Пока НЕ rs. EOF( ) Цикл
obj = ПолучитьCOMОбъект( rs. Fields( 0 ) . Value) ;
Если obj. Class= "user" Тогда
Стр. НоваяПочта= СокрЛП( obj. EmailAddress) ;
Если Стр. НоваяПочта< > Стр. СтараяПочта Тогда
Стр. Установить= Истина ;
КонецЕсли ;
КонецЕсли ;
rs. MoveNext( ) ;
КонецЦикла ;
Исключение
Сообщить( "Ошибка получения почты для логина :" + Стр. Логин) ;
КонецПопытки ;
КонецЕсли ;
КонецЦикла ;
conn. Close( ) ;
КонецПроцедуры
Функция УдалитьПроцесс (ИмяКомпьютера, НазваниеПроцесса, Логин, Пароль) Экспорт
Попытка COM = Новый COMОбъект ( "WbemScripting.SWbemLocator" ) ;
Серв = COM. ConnectServer( СокрЛп( ИмяКомпьютера) , "\root\cimv2" , СокрЛП( Логин) , СокрЛП( Пароль) ) ;
СписокПроцессов = Серв. execQuery( "Sel ect * fr om Win32_Process Where Name = '" + СокрЛП( НазваниеПроцесса) + "'" ) ;
Для каждого item Из СписокПроцессов Цикл
item. Terminate( ) ;
КонецЦикла ;
Исключение
Возврат Ложь ;
КонецПопытки ;
Возврат Истина ;
КонецФункции
Код 1C v 8.х
Функция ПолучитьMailПоПользователю(СсылкаПользователь)
Адрес= "" ;
ПользовательИБ= ПользователиИнформационнойБазы. НайтиПоИмени( СокрЛП( СсылкаПользователь. Код) ) ;
Если ПользовательИБ< > Неопределено Тогда
Если ПользовательИБ. АутентификацияОС Тогда
ПользовательОС= СтрЗаменить( ПользовательИБ. ПользовательОС, "\" , "/" ) ;
Попытка
ЮзерАД= ПолучитьCOMОбъект( "WinNT:" + ПользовательОС+ ",user" ) ;
LDAP= ПолучитьCOMОбъект( "LDAP://CN=" + ЮзерАД. FullName+ ",OU=Common Users,OU=Regular Users,DC=" + Домен+ ",DC=local" ) ;
Адрес= LDAP. Mail;
Исключение
КонецПопытки ;
КонецЕсли ;
КонецЕсли ;
Возврат Адрес;
КонецФункции
Пример обработки загрузки данных на управляемой форме, с определением необходимости передачи файла на сервер:
Код 1C v 8.2 УП &НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. Открытие) ;
Диалог. Фильтр = "*.xml|*.xml" ;
Если Диалог. Выбрать( ) Тогда
Объект. ИмяФайла = Диалог. ПолноеИмяФайла;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
ЗапуститьПриложение( Объект. ИмяФайла) ;
КонецПроцедуры
&НаКлиенте
Процедура Загрузить(Команда)
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы( ) ;
ws = НСтр( СтрокаСоединения, "ws" ) ;
ИмяСервера = НСтр( СтрокаСоединения, "Srvr" ) ;
Если ИмяСервера = "" Тогда
Если ws = "" Тогда
ПередачаФайлаНаСервер = Ложь ;
Иначе
ПередачаФайлаНаСервер = Истина ;
КонецЕсли ;
Иначе
ПередачаФайлаНаСервер = ( ИмяКомпьютера( ) < > ИмяСервера) ;
КонецЕсли ;
Если ПередачаФайлаНаСервер Тогда
ПоместитьФайл( АдресХранилища, Объект. ИмяФайла, , Ложь , УникальныйИдентификатор) ;
КонецЕсли ;
ЗагрузитьСервер( ) ;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьСервер()
ЧтениеXML = Новый ЧтениеXML;
Если ПередачаФайлаНаСервер Тогда
ИмяВременногоФайла = ПолучитьИмяВременногоФайла( "xml" ) ;
ДвоичныеДанные = ПолучитьИзВременногоХранилища( АдресХранилища) ;
ДвоичныеДанные. Записать( ИмяВременногоФайла) ;
ЧтениеXML. ОткрытьФайл( ИмяВременногоФайла) ;
Иначе
ЧтениеXML. ОткрытьФайл( Объект. ИмяФайла) ;
КонецЕсли ;
ОбъектXDTO = ФабрикаXDTO. ПрочитатьXML( ЧтениеXML) ;
ЧтениеXML. Закрыть( ) ;
Сообщить( "Загрузка завершена" ) ;
КонецПроцедуры
Для этого можно расположить в форме табличное поле (например, с именем Пользователи) и воспользоваться методом глобального контекста ПолучитьСоединенияИнформационнойБазы(), который возвращает массив, состоящий из описаний соединений с текущей информационной базой:
Код 1C v 8.х МассивСоединений = ПолучитьСоединенияИнформационнойБазы( ) ;
Колонки = Пользователи. Колонки;
Колонки. Добавить( "Пользователь" , , , 10 ) ;
Колонки. Добавить( "Приложение" , , , 10 ) ;
Колонки. Добавить( "НачалоРаботы" , , , 10 ) ;
Колонки. Добавить( "Компьютер" , , , 10 ) ;
Колонки. Добавить( "Соединение" , , , 10 ) ;
Для Каждого Соединение из МассивСоединений цикл
НоваяСтрока = Пользователи. Добавить( ) ;
НоваяСтрока. Компьютер = Соединение. ИмяКомпьютера;
НоваяСтрока. Приложение = ПредставлениеПриложения( Соединение. ИмяПриложения) ;
НоваяСтрока. НачалоРаботы = Соединение. НачалоСеанса;
НоваяСтрока. Соединение = Соединение. НомерСоединения;
НоваяСтрока. Пользователь = Соединение. Пользователь. Имя;
КонецЦикла ;
ЭлементыФормы. Пользователи. СоздатьКолонки( ) ;