Обработка
ПечатьЭтикеток использует компоненту "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.х #Если Клиент Тогда
// Печать этикеток со штрих-кодом
//
Процедура ПечатьЭтикеток(Товары = Неопределено) Экспорт
//am+ Эта проверка нам не нужна, во первых она выполняется ПередОткрытием в форме обработки.
// Кроме того у нас есть тип штрихкода, который печататется без компоненты.
//Попытка
// КомпонентШК = Новый COMОбъект("V8.Barcod.1");
//Исключение
// Сообщить("Компонента 1С:Печать штрихкодов не установлена на данном компьютере!", СтатусСообщения.Важное);
// Возврат;
//КонецПопытки;
//am-
В обработке есть место, где выполняется проверка типа ШК. Наш ШК сейчас не пройдет проверку и печать выполнена не будет. Чтоб печать выполнялась необходимо исправить функцию в общем модуле УправлениеРозничнойТорговлей.
Код 1C v 8.х
// Возвращает значение типа штрих-кода для использования в ЭУ
// "1С:Печать штрих-кодов"
//
// Параметры
// ТипКода - ПланыВидовХарактеристик.ТипыШтрихкодов - тип, значение для которого
// нужно получить
//
// Возвращаемое значение:
// Число, которое может быть присвоено свойству ЭУ "ТипКода"
//
Функция ПолучитьЗначениеТипаШтрихкодаДляЭУ(ТипКода) Экспорт
Перем Значение;
Если ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN8 Тогда
Значение = 0;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13 Тогда
Значение = 1;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN128 Тогда
Значение = 2;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Code39 Тогда
Значение = 3;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Code128 Тогда
Значение = 4;
//am+
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Interleave20FS Тогда
Значение = 100;
//am-
Иначе
Значение = -1;
КонецЕсли;
Возврат Значение;
КонецФункции // ПолучитьЗначениеТипаШтрихкодаДляЭУ()
Мы на завершающем этапе, вносим изменения непосредственно в обработку.
Код 1C v 8.х Процедура Печать(ТаблицаТоваров) Экспорт
//am+ Так как у нас два разных макета, то нам нельзя смешивать типы ШК
// печатаемые в разных макетах. Выполним проверку.
флВремЕстьInterleave = Ложь;
флВремЕстьНеInterleave = Ложь;
Для Каждого СтрокаИзСписка Из ТаблицаТоваров Цикл
Если СтрокаИзСписка.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.Interleave20FS Тогда
флВремЕстьInterleave = Истина;
Иначе
флВремЕстьНеInterleave = Истина;
КонецЕсли;
Если флВремЕстьInterleave и флВремЕстьНеInterleave Тогда
Предупреждение("В списке одновременно встречаются штрих-коды несовместимых типов,
|Штрих-коды Interleave необходимо печатать отдельно от остальных!");
Возврат;
КонецЕсли;
КонецЦикла;
//am-
Таб = Новый ТабличныйДокумент;
Таб.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Этикетка"+СокрЛП(ИмяКомпьютера());
//am+ Используем наш макет.
Если флВремЕстьInterleave Тогда
Макет = ПолучитьОбщийМакет("ЭтикеткаInterleave");
Иначе
//am-
Макет = ПолучитьОбщийМакет("Этикетка");
КонецЕсли;
//am+ Некоторые строки в нашем макете не заработают, необходимо добавить условие.
Если Не флВремЕстьInterleave Тогда
//am-
РисунокШтрихкод = ЭтикеткаОбласть.Рисунки.Штрихкод;
КонецЕсли;
//am+
Если Не флВремЕстьInterleave Тогда
//am-
РисунокШтрихкод.Расположить(ОбластьШтрихкод);
КонецЕсли;
Если УправлениеРозничнойТорговлей.ПроверитьШтрихКод(СтрокаИзСписка.ШтрихКод,
СтрокаИзСписка.ТипШтрихкода) Тогда
//am+ здесь мы установим размер шрифта (об этом в конце статьи) и зададим параметр ШтрихКод нашего макета для вывода
Если флВремЕстьInterleave Тогда
ЭтикеткаОбласть.Параметры.Установить(0,
СформироватьШтрихКодДляМакетаЭтикеткаInterleave(СтрокаИзСписка.ШтрихКод));
ЭтикеткаОбласть.Области.ОбластьШтрихкод.Шрифт =
Новый Шрифт(ЭтикеткаОбласть.Области.ОбластьШтрихкод.Шрифт,,РезмерШрифтаInterleave);
Иначе
//am-
Попытка //попытку нужно добавить т.к. если компонента не установлена, то будут ошибки.
ЭтикеткаОбласть.Рисунки.Штрихкод.Объект.ТипКода = ТипКода;
ЭтикеткаОбласть.Рисунки.Штрихкод.Объект.Сообщение = СтрокаИзСписка.ШтрихКод;
Исключение
КонецПопытки;
КонецЕсли;
Последний штрих это добавить регулятор размера шрифта (в коде переменная РезмерШрифтаInterleave) на форму обработки:
источник Круглов Дмитрий дмитриевич :
Скрипт определяет наличие предыдущих платформ и деинсталлирует их..
далее устанавливает последнююю версию, прописывает нужные базы и прямые ярлыки
Код 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 после удаления - исправим это
UdalitFolder 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 UdalitFolder (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
Удалить все строки табличного поля документа.
Код 1C v 8.х ОтражениеВУчете.Очистить(); // ОтражениеВУчете - название табличного поля
Как в табличной части документа удалить строки только с нулевым значением реквизита "Количество"?
Код 1C v 8.х //Получим документ и укажем параметры поиска
ОбъектДок = СсылкаДок.ПолучитьОбъект();
СтруктураДляПоиска = Новый Структура("Количество", 0);
ТабличнаяЧастьДок = ОбъектДок.Товары;
//Получаем список строк соответсвтвующих отбору, и перебором удаляем.
МассивПустыхСтрок = ТабличнаяЧастьДок.НайтиСтроки(СтруктураДляПоиска);
Для каждого Строка Из МассивПустыхСтрок Цикл
ТабличнаяЧастьДок.Удалить(Строка);
КонецЦикла;
ОбъектДок.Записать(); // Записываем изменения в документе
Как удалить все строки, кроме тех которые соответсвуют заданному отбору?
Код 1C v 8.х // Укажем условия отбора: Нужно оставить только строки где СубконтоКт1 = РБПНаПФР
ПараметрыОтбора = Новый Структура("СубконтоКт1", Справочники.РасходыБудущихПериодов.РБПНаПФР);
//Теперь выгружаем табличную часть в таблицу значений
ТЗисходн=ОтражениеВУчете.Выгрузить();
//Скопируем ТЗ с заданным отбором в новую ТЗ
ТЗнов = ТЗисходн.Скопировать(ПараметрыОтбора);
//Очистим табличную часть
ОтражениеВУчете.Очистить();
//Загружем в табличную часть новую таблицу значений
ОтражениеВУчете.Загрузить(ТЗнов);
В режиме управляемого приложения конструкция:
Код 1C v 8.2 УП Для каждого Запись из ТабличнойЧасти Цикл
Если Запись.НадоУдалить Тогда
ТабличнойЧасти.Удалить(Запись);
КонецЕсли;
КонецЦикла;
Работает некорректно, так как переписывает табличную часть и меняет индексы, сразу после удаления и Цикл полностью не обходит.
Решение пришло такое:
Код 1C v 8.2 УП КолВо = Объект.ТабличнойЧасти.Количество()-1;
ИндексСтроки = КолВо;
Для счетчик = 0 по КолВо Цикл
Запись = Объект.ТабличнойЧасти.Получить(ИндексСтроки);
если Запись.НадоУдалить тогда
Объект.ТабличнойЧасти.Удалить(Запись);
КонецЕсли;
ИндексСтроки = ИндексСтроки - 1;
КонецЦикла;