Ошибка СУБД. Превышен максимально допустимый размер внутреннего файла .../1CV8.CD Однажды вылетело: "Ошибка СУБД. Превышен максимально допустимый размер внутреннего файла .../1CV8.CD"
И Все! Данных больше ввести никаких нельзя. Размер Файла 1Cv8.1CD 4,5 ГБ.
Ответ: Про ограничения в файловой версии можно прочитать на последнем ИТС. Действительно - 4 Гб.
Решение: Переходить на MS SQL. В серверном варианте размер базы ограничен возможностями MS SQL сервера.
Дополнение от Andy1981:
Столкнулся с проблемой только сейчас. До этого постоянно работал на серваках, даже тестовая база была развернута на собственном скуле, который крутился у меня локально :-)
В общем-то, решение тривиально, переход на клиент-серверный вариант, и всех делов. Но! Меня задело за живое. Даже если решение очевидно, нужно сначала обосновать его, а не слепо следовать предложенному варианту. Прежде чем выносить вердикт, относительно того, как нужно поступить, исполнил элементарный скрипт на SQL, получил табличку в виде ИмяТаблицыБД|РазмерТаблицы. Прекрасно, но это позволит лишь определить, в каком классе объектов метаданных проблема. Далее, используя Enterprise Integrator получил имя справочника (в моем случае), имеющего проблемный размер. Далее дело за малым - всего-то и делов - определиться, каким образом можно оптимизировать хранение данных? В моем случае ответ оказался практически очевиден. Оптимизировать можно и нужно, и использование сервера БД нецелесообразно. Вполне возможно, что таблица распухает вполне обоснованно, тогда переход на SQL (например), является неизбежным.
Скрипт для вычисления объемов таблиц БД:
Код SQL USE MyInfoBase --Имя БД
DECLARE @tbl TABLE (
name nvarchar(128),
[rows] char(11),
reserved varchar(18),
data varchar(18),
index_size varchar(18),
unused varchar(18)
)
DECLARE @name sysname
DECLARE CUR CURSOR FOR SELECT name FROM sys.tables
OPEN CUR
FETCH NEXT FROM CUR INTO @name
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT @tbl EXEC sp_spaceused @name
FETCH NEXT FROM CUR INTO @name
END
CLOSE CUR
DEALLOCATE CUR
SELECT
name,
[rows],
reserved,
data,
index_size,
unused,
reserved_kb
FROM
(SELECT
name,
[rows],
reserved,
data,
index_size,
unused,
CONVERT (bigint, REPLACE(reserved, ' KB', '')) AS reserved_kb
FROM @tbl
) Q
ORDER BY
reserved_kb DESC
COMPUTE SUM(reserved_kb)
Категория:
Системные Ошибки Загрузка данных в 1С из PDF В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла...
И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.
Чтение PDF файлов из 1С
Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой В результате банальный текст вида Красный стул превращался в страшную кракозябру.
Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt
Поддержка командной строки:
PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]
<input PDF file> : Open an existing PDF file to convert .
[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.
[-first <page number>]: Specify the first page number.
[-last <page number>]: Specify the last page number.
[-logfile] : Write log to "C:\pdf2txt.log" file.
[-open] : Auto open the text file after it be created.
[-space] : Auto insert spaces into text file.
[-html] : Output to a HTML file, not a text file.
[-format] : Keep the page layout in the generated TXT file.
[-silent] : Disable error and warning messages.
[-blankline] : Auto delete blank line in the generated TXT file.
[-summary] : Get PDF document summary.
[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.
[-unicode] : Create UTF-8 encoding text file.
Примеры:
Код Batch File (DOS, CMD, BAT) C:\>PDF2TXT C:\input.pdf
C:\>PDF2TXT C:\input.pdf -unicode
C:\>PDF2TXT C:\input.pdf -first 10 -last 12
C:\>PDF2TXT C:\input.pdf C:\output.txt
C:\>PDF2TXT C:\input.pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input.pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt
В архиве (Скачать Вы можете из статьи по ссылке ) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо
Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С !
Код на 1С для конфигурации УТ 10.3:
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
ТекЗнч = СокрЛП(Лев(Стр,Поз-1));
Если ЗначениеЗаполнено(ТекЗнч) Тогда
МассивСтрок.Добавить(ТекЗнч);
КонецЕсли;
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
//Ищем Файлы
тч.Очистить();
НайденныеФайлы = НайтиФайлы(ПутьКPDF,"*.pdf",ложь);
Для каждого стр Из НайденныеФайлы Цикл
Нстр = ТЧ.Добавить();
Нстр.ФайлPDF = стр.Имя;
КонецЦикла;
ЭтаФорма.Обновить();
//Преобразуем PDF в TXT
Для каждого стр Из ТЧ Цикл
Попытка
pdf = СокрЛП(ПутьКPDF+"\"+стр.ФайлPDF);
txt = СтрЗаменить(pdf,"pdf","txt");
Команд = ПутьКPDF2TXT+"\pdf2txt.exe "+pdf+" "+txt;
ЗапуститьПриложение(Команд,ПутьКPDF,Истина);
стр.ФайлTXT = txt;
Исключение
стр.ФайлTXT = "!!!_ОШИБКА";
КонецПопытки;
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
КонецЦикла;
мТекущийПользователь = глЗначениеПеременной("глТекущийПользователь");
мСкладПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойСклад");
мОсновноеПодразделение = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеПодразделение");
мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов");
мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам");
мВидНоменклатурыПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойВидНоменклатуры");
мОтражатьВРеглУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете");
мОтражатьВБухУчета = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете");
мОтражатьВНалУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете");
//Создаем Документ
Для каждого стр Из ТЧ Цикл
Состояние("Загружаю: "+стр.ФайлTXT);
текдок=Новый ТекстовыйДокумент;
текдок.Прочитать(стр.ФайлTXT,"UTF-8");
ЗагрузкаТЧ=Ложь;
ДокВозвратТоваровОтПокупателя = Документы.ВозвратТоваровОтПокупателя.СоздатьДокумент();
ДокВозвратТоваровОтПокупателя.Ответственный = мТекущийПользователь;
ДокВозвратТоваровОтПокупателя.Дата = ОбщегоНазначения.ПолучитьРабочуюДату();
ДокВозвратТоваровОтПокупателя.УстановитьНовыйНомер();
ДокВозвратТоваровОтПокупателя.ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад;
ДокВозвратТоваровОтПокупателя.СкладОрдер = Склад;
ДокВозвратТоваровОтПокупателя.Подразделение = мОсновноеПодразделение;
ДокВозвратТоваровОтПокупателя.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
ДокВозвратТоваровОтПокупателя.УчитыватьНДС = ИСТИНА;
ДокВозвратТоваровОтПокупателя.СуммаВключаетНДС = ИСТИНА;
Для Ном=1 по текдок.КоличествоСтрок() цикл
ТСтр = текдок.ПолучитьСтроку(Ном);
ТекСтр = СокрЛП(ТСтр);
Если Найти(ТекСтр, "Всего по накладной")>0 Тогда
ЗагрузкаТЧ=Ложь;
//делаем пересчеты сумм, количества мест и НДС по строкам
Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя.Товары Цикл
ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
КонецЦикла;
Попытка
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
стр.Документ = ДокВозвратТоваровОтПокупателя.Ссылка;
стр.Инфо = "Все ОК";
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
//ВСЕ
Прервать;
КонецЕсли;
Если ЗагрузкаТЧ Тогда
ТекСтр = СтрЗаменить(ТекСтр, "подложке ","подложке");
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>2 Тогда
//Сообщить(СтрМ);
Попытка
НоваяСтрока = ДокВозвратТоваровОтПокупателя.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СтрМ[2]);
//НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицы.ХарактеристикаНоменклатуры;
//УстановитьСтавкуНДСВТабЧасти(НоваяСтрока, СтрокаТаблицы);
//ПроверитьНаличиеСерииНоменклатуры(НоваяСтрока, СтрокаТаблицы);
//УстановитьПризнакВеденияПоСериямНоменклатуры(НоваяСтрока);
НоваяСтрока.ЕдиницаИзмерения = НоваяСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
НоваяСтрока.Коэффициент = 1;
НоваяСтрока.Количество = Число(СтрМ[6]);
НоваяСтрока.Цена = Число(СтрМ[7]);
НоваяСтрока.Сумма = Число(СтрМ[8]);
НоваяСтрока.СуммаНДС = Число(СтрМ[11]);
НоваяСтрока.Качество = Справочники.Качество.Новый;
Попытка
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС["НДС"+Лев(СокрЛП(СтрМ[9]),2)];
Исключение
НоваяСтрока.СтавкаНДС = НоваяСтрока.Номенклатура.СтавкаНДС;
КонецПопытки;
Исключение
Сообщить("Не загружено: "+ТекСтр);
КонецПопытки;
Иначе
Продолжить;
КонецЕсли;
Иначе
// Возможно что-то будет
КонецЕсли;
//Сообщить(ТекСтр);
Если Найти(ТекСтр, "Товарная накладная")>0 Тогда
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>1 Тогда
//Сообщить(СтрМ);
ДокВозвратТоваровОтПокупателя.НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1];
ТекДата = СтрМ[2];
ДокВозвратТоваровОтПокупателя.ДатаВходящегоДокументаЭлектронногоОбмена = Дата(Прав(ТекДата,4)+Сред(ТекДата,4,2)+Лев(ТекДата,2));
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Грузополучатель:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекОрганизация = Справочники.Организации.НайтиПоРеквизиту("ИНН",текИНН);
Если ТекОрганизация=Справочники.Организации.ПустаяСсылка() Тогда
ДокВозвратТоваровОтПокупателя.Организация = Организация;
Иначе
ДокВозвратТоваровОтПокупателя.Организация = ТекОрганизация;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Поставщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПоставщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
ДокВозвратТоваровОтПокупателя.Контрагент = ТекПоставщик;
ДокВозвратТоваровОтПокупателя.ДоговорКонтрагента = ТекПоставщик.ОсновнойДоговорКонтрагента;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Плательщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПлательщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
КонецЕсли;
КонецЕсли;
Если текстр="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" Тогда
ЗагрузкаТЧ=Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПутьКPDF2TXTОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF2TXT = ДиалогОткрытия.Каталог;
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Категория:
Загрузка данных в 1С Формат конфигурационного файла программы запуска 1CEStart Формат конфигурационного файла программы запуска Файл расположен в каталоге
%APPDATA%\1C\1CEStart
В конфигурационном файле содержится следующая информация:
- Версия платформы, которую нужно использовать по умолчанию;
- Расположение списков общих баз;
- Список каталогов с установленными версиями;
- Список каталогов с дистрибутивами;
- Расположение общего конфигурационного файла.
Файл представляет собой текстовый документ в кодировке
UTF-16LE и содержит строки формата
Параметр=Значение
Описание параметров DefaultVersion - определяет версию, используемую по умолчанию. Допускается наличие нескольких строк с таким параметром.
Пример 1: DefaultVersion=8.2-8.2.9.150
Данная строка означает, что при попытке запуска информационной базы с указанием версии 8.2 будет использоваться версия 8.2.9.150.
Пример 2: DefaultVersion=8.2.9-8.2.9.100
Данная строка означает, что при попытке запуска информационной базы с версией 8.2.9 будет использоваться версия 8.2.9.100.
CommonInfoBases - указывает путь и имя файла со списком общих информационных баз.
InstalledLocation - содержит указание на каталог, в который выполнена установка 1С:Предприятие. По умолчанию это значение C:\Program Files\1Cv82.
DistributiveLocation - содержит указание на каталог, в котором будет производится поиск новой версии для автоматической установки.
CommonCfgLocation - указывает путь и имя общего конфигурационного файла. Допускается наличие нескольких строк с таким параметром.
InstallComponents - В локальном конфигурационном файле (1CEStart.cfg) содержит перечень установленных компонент. Общий файл для всех пользователей компьютера находится в каталоге \Documents and Settings\All Users\Application Data\1C\1CEStart.
В общем конфигурационном файле (1CESCmn.cfg) содержит перечень компонент, которые необходимо установить (формируется администратором системы).
Содержит строку компонентов с признаком необходимости установки, разделенных пробелом:- 0 — не устанавливать,
- 1 — устанавливать.
Возможны следующие компоненты:
- DESIGNERALLCLIENTS — все клиенты и конфигуратор.
- THINCLIENT — тонкий клиент для клиент-серверного варианта работы.
- THINCLIENTFILE — тонкий клиент с возможностью работы с файловыми информационными базами.
- SERVER — сервер 1С:Предприятия. Если программа установки запускается из программы запуска, то сервер будет установлен как приложение.
- WEBSERVEREXT — компоненты расширения для веб-сервера.
- CONFREPOSSERVER — сервер хранилища конфигураций 1С:Предприятия.
- SERVERCLIENT — компоненты для администрирования кластера серверов 1С:Предприятия.
-
CONVERT ER77 — конвертер информационных баз из версии 1С:Предприятия 7.7.
- LANGUAGES — список языков интерфейса для установки. Если указано несколько языков, они перечисляются через ",". Перечень кодов языков локализации см. здесь.
Пример: LANGUAGES=RU,UK,BG
Пример параметра: InstallComponents=THICKCLIENT=0 THINCLIENT=1 WEBSERVEREXT=0 SERVER=0 CONFREPOSSERVER=0
CONVERT ER77=0 SERVERCLIENT=1 LANGUAGES=RU,EN
В файле для всех пользователей 1CEStart.cfg могут быть указаны все настройки, аналогичного файлам пользователей, но интерактивные режимы редактирования настроек изменяют настройки в файле пользователя.
Инсталлятор записывает в All Users\Application Data\1C\1CEStart\1CEStart.cfg ключи InstalledLocation и InstallComponents.
При использовании настроек из общего конфигурационного файла и файла текущего пользователя, если ключ присутствует в обоих файлах:
Более высокий приоритет общего файла настроек для ключей: InstallComponents
Более высокий приоритет файла настроек текущего пользователя для ключей: DefaultVersion
UseHWLicenses
Остальные ключи, объединяются.
ConfigurationTemplatesLocation - указывает путь к каталогу шаблонов конфигураций. Может быть более одной записи.
Если параметр присутствует и в локальном и общем конфигурационном файле, то параметры анализируются в следующем порядке:- параметры DefaultVersion, InstallComponents в порядке описания в локальном файле, затем в порядке описания в общем файле;
- параметры InstalledLocation, DistributiveLocation, CommonInfoBases в порядке описания в общем файле, затем в порядке описания в локальном файле;
- параметры CommonCfgLocation только в локальном файле;
- параметр InstallComponents используется из общего файла (если указано) и замещает значение в локальном файле, если не указано — используется значение из локального файла.
UseHwLicenses - указывает необходимость поиска локального ключа защиты.
Пример параметра: UseHWLicenses=0 - поиск аппаратного ключа не выполняется
Пример конфигурационного файла:
Код DefaultVersion=8.2-8.2.8.256
DefaultVersion=8.2.8-8.2.8.256
DefaultVersion=8.2.9-8.2.9.14
DefaultVersion=8.3-8.3.10.27
CommonInfoBases=\\net\1cv8\mainBases.v8i
CommonInfoBases =\\net\1cv8\backBases.v8i
InstalledLocation=C:\Program Files\1cv82
InstalledLocation=C:\Program Files\1cv83
DistributiveLocation=\\net\1cv82\
DistributiveLocation=\\net\1cv83\
CommonCfgLocation=\\net\1cv8\1CESCmn.cfg
Категория:
Администрирование Загрузка данных из таблицы OpenOffice Calc v.3 Код 1C v 8.х Процедура ЗагрузитьПрайс(Кнопка)
Попытка
ServiceManager = Новый ComОбъект("com.sun.star.ServiceManager");
МетодЗагрузки = "ОО";
Исключение
Сообщить("Отсутствует приложение для загрузки файла");
КонецПопытки;
Если МетодЗагрузки = "ОО" Тогда
scr = Новый ComОбъект("MSScriptControl.ScriptControl");
scr.language = "javascript";
scr.eval("MassivParametrov = new Array()");
MassivParametrov = scr.eval("MassivParametrov");
scr.AddObject("OpenOffice", ServiceManager);
scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
scr.eval("MassivParametrov[0].Name='Hidden'");
scr.eval("MassivParametrov[0].Value=true");
Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");
URL = Convert ToURL(ПутьКПрайсу);
Doc = Desktop.LoadComponentFromURL(URL, "_blank", 0, MassivParametrov);
Doc.lockControllers();
Doc.addActionLock();
Sheets = Doc.GetSheets();;
Документ = Sheets.GetByIndex(0);
//Документ = Sheets.GetByName("Лист1");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Артикул");
ТЗ.Колонки.Добавить( "Цена");
Дальше = 1;
ТекСтрокаДок = НачальнаяСтрока;
Пока Дальше = 1 Цикл
Проверка = СокрЛП(""+Документ.getCellByPosition(0, ТекСтрокаДок).getString());
Если ПустаяСтрока(Проверка) Тогда
Прервать;
КонецЕсли;
Артикул = СокрЛП(""+Документ.getCellByPosition(КолонкаАртикула-1, ТекСтрокаДок).getString());
Попытка
Цена = Число(СокрЛП(""+Документ.getCellByPosition(КолонкаЦены-1 , ТекСтрокаДок).getString()));
Исключение
Цена = 0;
КонецПопытки;
Если (НЕ ПустаяСтрока(СокрЛП(Артикул))) и (НЕ Цена = 0) Тогда
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Артикул = Артикул;
НоваяСтрока.Цена = Цена;
КонецЕсли;
Состояние("Обрабатываем - "+ТекСтрокаДок);
ТекСтрокаДок = ТекСтрокаДок+1;
КонецЦикла;
Если ТЗ.Количество() > 0 Тогда
Док = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
Док.Дата = ДатаУстановкиЦен;
ДобавитьТипЦен = Док.ТипыЦен.Добавить();
ДобавитьТипЦен.ТипЦен = ТипЦены;
Для Каждого ТекСтрока из ТЗ Цикл
Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ТекСтрока.Артикул);
Если НЕ Номенклатура.Пустая() Тогда
НоваяСтрока = Док.Товары.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.ТипЦен = ТипЦены;
НоваяСтрока.Цена = ТекСтрока.Цена;
НоваяСтрока.Валюта = Валюта;
НоваяСтрока.ЕдиницаИзмерения = Номенклатура.ЕдиницаХраненияОстатков;
КонецЕсли;
КонецЦикла;
Если Док.Товары.Количество() > 0 Тогда
Док.Записать();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
функция Convert ToURL(FileName)
ИмяФайла = СтрЗаменить(FileName," ","%20" );
ИмяФайла = СтрЗаменить(ИмяФайла,"\","/");
Возврат "file:/" + "/localhost/" + ИмяФайла;
Конецфункции
Категория:
Работа с Microsoft Office и OpenOffice Как сформировать документ в Word из 1С? (Active Document) ВНИМАНИЕ! При использовании кодов описанных ниже, уберите символ
_
Давайте рассмотрим на примерах как это делается! =) Мне известно 2 способа:
1. Путем замены шаблонного текста в макете Wordа.
2. Путем вставки текста с помощью закладок в Wordе,
В первом случае сразу скажу, что длина строки передаваемая в функцию замены, довольно небольшая 255 символов, да и расстановка шаблонных выражений в макете Word занимает довольно много времени. Через процедуру Content.Find.Execute.
Во втором случае длина, насколько мне известно неограниченна, также воськаться с закладками намного быстрее и удобнее, чем расставлять шаблонный текст. Используя Bookmarks().S_elect(). Поэтому давайте на коде рассмотрим второй пример.
И так, для начала необходимо добавить Word макет к документу. Добавляем макет с помощью конструктора макетов указав Active document и выбрав соответствующий макет.
Называем его Акт. Открываем макет в 1Ске, ставим курсор в нужном месте, переходим в меню Вставка закладка нажимаем добавить закладку к примеру у меня это НарушенияТекст
Теперь кидаем на форму документа кнопку Сформировать и по нажатию на нее пишем код который открывает наш макет Word ищем закладку по имени и вставляет туда текст:
Код 1C v 8.х //инициализация часть 1
СсылкаМакет = ПолучитьМакет(Акт);
MSWord = СсылкаМакет.Получить();
Попытка
СсылкаМакет = MSWord.Application.Documents(1);
СсылкаМакет.Activate();
//выгружаем табличную часть с нарушениями в строку часть 2
str = Новый COMОбъект(ADODB.Stream);
str.Open();
СтрочкаТаблицы = ЭлементыФормы.Нарушения.ТекущиеДанные;
Для Каждого СтрочкаТаблицы Из Нарушения Цикл
str.WriteText( + СтрочкаТаблицы.Описание + Нарушены требования СНИПФЗГОСТ: + СтрочкаТаблицы.СНИПФЗГОСТ + Статья: + СтрочкаТаблицы.ЧастьСтатья + Символ(13),0);
КонецЦикла;
str.Position = 0;
НарушенияТекст = str.readText();
//вставляем в закладку текст с нарушениями часть 3
MSWord.Bookmarks(НарушенияТекст).S_elect();
MSWord.Application.S_election.TypeText(НарушенияТекст);
//открыть Word часть 4
СсылкаМакет.Application.Visible = Истина;
СсылкаМакет.Activate();
Исключение
//если ошибка
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;
Это пример вывода множества строчек из табличной части одной строкой, если нужно просто выгрузить какой-то реквизит то можно пропустить часть 2 и перейти к части 3.
Для выгрузки табличной части в форме таблицы можно использовать функцию автоформата, примеру код выгрузки табличной части документа Предписание:
Код 1C v 8.х Word = MSWord.Application;
Документ = Word.ActiveDocument();
//Переместиться вниз на 22 строк
Word.S_election.MoveDown(,22);
Документ.Paragraphs.Add();
//подготовка таблицы:
Rng = Word.S_election.Range;
//Формируем заголовок:
Rng.I_nsertAfter(№ п/п*Установленные нарушения и меры по их устранению*Основания);
Rng.I_nsertParagraphAfter();
//сама таблица
СтрочкаТаблицы = ЭлементыФормы.НарушенияПредписание.ТекущиеДанные;
Для Каждого СтрочкаТаблицы из НарушенияПредписание Цикл
Rng.I_nsertAfter(Строка(СтрочкаТаблицы.НомерСтроки)+*+СтрочкаТаблицы.Описание + ; + СтрочкаТаблицы.Предписание +* + СтрочкаТаблицы.СНИПФЗГОСТ + + СтрочкаТаблицы.ЧастьСтатья);
Rng.I_nsertParagraphAfter();
КонецЦикла;
Rng.Convert ToTable(*);
Документ.Tables(1).AutoFormat(17); //номер таблицы в шаблоне
Word.Visible = Истина;
Ну вот и все =)
Автор: saylolpls
Еще способ Active document
В Конфигураторе Макеты - правый клик - Добавить
Тип макета: Active document
Создать новый - Документ Microsoft Word
Меню Вставка - Поле - Автоматизация - DocVariable
Написать имя поля в графе "Новое имя:" ДатаПриказа
В модуле формы документа создаем кнопку, и в ее обработчике пишем:
Код 1C v 8.х Процедура ОсновныеДействияФормыWord(Кнопка)
АктивныйДокумент = ПолучитьМакет("Макет");
КомОбъект = АктивныйДокумент.Получить();
КомОбъект.Application.Visible=1;
КомОбъект.Variables.Item("ДатаПриказа").Value="24.01.2007";
КомОбъект.Fields.UpDate();
КомОбъект.PrintOut(); //распечатать документ
//Ожидание окончания отправки на печать...
Пока objWord.Application.BackgroundPrintingStatus<>0 Цикл
Предупреждение("Ожидание",1);
КонецЦикла;
КомОбъект.Application.Quit(); //закрыть Word
КомОбъект = 0;
КонецПроцедуры
2) добавляем не поле, а Закладку
Меню Вставка - Закладка и далее указываем ее имя ("ИмяЗакл")
Код 1C v 8.х Процедура ОсновныеДействияФормыWord(Кнопка)
АктивныйДокумент = ПолучитьМакет("Макет");
КомОбъект = АктивныйДокумент.Получить();
КомОбъект.Application.Visible=1;
КомОбъект.Bookmarks(СокрЛП("ИмяЗакл")).S_elect();
КомОбъект.Application.S_election.TypeText(СокрЛП("тест проверка"));
КонецПроцедуры
Код 1C v 8.2 УП // Параметры договора обозначены в тексте переменными вида "[%НомерДоговора%]"
Функция ПечатьДокумента() Экспорт
Договор = ПолучитьМакет("ActiveDocument_ДоговорПоставки"); // получим макет-ActiveDocument
MSWord = Договор.Получить();
Попытка
Doc = MSWord.Application.Documents(1);
Doc.Activate();
Replace = Doc.Content.Find;
FindText = "{НомерДоговора}"; // что искать - имя_шаблона
MatchCase = Ложь; // использовать регулярные выражения
MatchWholeWord = Истина; // искать слово целиком
MatchWildcards = Ложь; // испоьзовать регулярные выражения
MatchSoundsLike = Неопределено; // искать созвучные
MatchAllWordForms = Неопределено; // искать все формы слова
Forward = Истина; // искать вперед
Wrap = Неопределено; // что должен вернуть Find-объект
Format_ = Ложь; // использовать форматирование
ReplaceWith = "N777"; // текст, на который надо заменить имя_шаблона
// кратко:
//Replace.Execute(FindText,Ложь,Истина,Ложь,,,Истина,,Ложь,НомерДоговора);
Replace.Execute(
FindText,
MatchCase,
MatchWholeWord,
MatchWildcards,
MatchSoundsLike,
MatchAllWordForms,
Forward,
Wrap,
Format_,
НомерДоговора);
MSWord.Application.Visible = Истина;
MSWord.Activate();
Исключение
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;
возврат 0;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice Скрипт переустанавливает Платформу 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 после удаления - исправим это
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 CONVERT ER77=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
Категория:
Администрирование Работа с MS Word через OLE В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Код 1C v 8.х
// "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.
// "Ссылка" - ДокументСсылка (в моем случае - счет).
Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;
Word = Объект.Application;
Doc = Объект.Application.Documents(1);
Doc.Activate();
// Готовим переменную в которой будет содержимое нашего документа
// (текст, таблицы и проч).
Text = Word.S_election;
// Очистим документ
// Ctrl-A
Text.WholeStory();
// Del
Text.Delete(1, 1);
// Двигаемся на 3 строки ниже. Документ пустой, поэтому добавляем
// строки "Переводами коретки"
Text.TypeText(Символы.ВК);
Text.TypeText(Символы.ВК);
Text.TypeParagraph(); // другой вариант того же действия
// Выводим текст.
Text.TypeText("Обычный текст, набранный первую очередь");
// Курсор в конце строки
// Эмулируем нажатие Shift+Home - выделяем строку
Text.HomeKey(, 1);
// Форматирование выделенной строки
Text.Font.Bold = 9999998;
Text.Font.Size = 14;
Text.Font.Name = "Verdana";
// Сдвигаем курсор. Сдвинуть курсор по строкам возможно, только,
// если эти строки уже содержат текст, иначе ничего не произойдет.
Text.MoveUp(,2); // вверх на 2 строки
//Word.S_election.MoveDown(,числострок); // вниз
//Word.S_election.MoveLeft(,числострок); // влево
//Word.S_election.MoveRight(,числострок);// вправо
// Добавление текста. Текст выводится начиная с текщей позиции
// курсора.
Text.HomeKey(, 1);
Text.TypeText("Обычный текст, набранный во вторую очередь");
Text.MoveDown(,1); // вниз на 2 строки
Text.EndKey(); // в конец строки
Text.TypeParagraph(); // и в начало следующей строки
// Очищаем форматирование
Text.ClearFormatting();
// Добавляем таблицу.
// Получаем текущую позицию курсора
Position = Text.Range();
// Параметры: Позиция, число строк, число колонок,
// последние 2 параметра отвечают за автоподбор высоты и отображение
// границ таблицы
Table = Doc.Tables.Add(Position, 1, 6, 1, 2);
// Устанавливаем ширину колонок
Table.Columns(1).PreferredWidth=10;
Table.Columns(2).PreferredWidth=50;
Table.Columns(3).PreferredWidth=10;
Table.Columns(4).PreferredWidth=10;
Table.Columns(5).PreferredWidth=10;
Table.Columns(6).PreferredWidth=10;
// Задаем заголовки колонок
Row1=Table.Rows(1);
Row1.Cells(1).Range.Text="№ п/п";
Row1.Cells(2).Range.Text="Наименование";
Row1.Cells(4).Range.Text="Кол-во";
Row1.Cells(3).Range.Text="Ед. изм.";
Row1.Cells(5).Range.Text="Цена,руб.";
Row1.Cells(6).Range.Text="Сумма,руб.";
// Построчно выводим содержимое таблицы Товары
НомерСтроки = 1;
Для каждого СтрокаТовары Из Ссылка.Товары Цикл
Row=Table.Rows.Add();
Row.Cells(1).Range.Text=НомерСтроки;
// Выравнивание по левому краю
Row.Cells(1).Range.ParagraphFormat.Alignment = 1;
// В качестве текста можно передать только значение "простого" формата
// все агрегатные объекты, переданные как текст, что нормально для платформы 1с
// вызовут исключение.
Row.Cells(2).Range.Text=СтрокаТовары.Номенклатура.Наименование
+?(ЗначениеЗаполнено(СтрокаТовары.ХарактеристикаНоменклатуры),
" ("+СтрокаТовары.ХарактеристикаНоменклатуры+")","");
Row.Cells(4).Range.Text=Строка(СтрокаТовары.Количество);
Row.Cells(4).Range.ParagraphFormat.Alignment = 1;
Row.Cells(3).Range.Text=?(ЗначениеЗаполнено(СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения)
,СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения.Наименование,"-");
Row.Cells(3).Range.ParagraphFormat.Alignment = 1;
Row.Cells(5).Range.Text=Формат(СтрокаТовары.Цена,"ЧДЦ=2");
Row.Cells(5).Range.ParagraphFormat.Alignment = 1;
Row.Cells(6).Range.Text=Формат(СтрокаТовары.Сумма,"ЧДЦ=2");
Row.Cells(6).Range.ParagraphFormat.Alignment = 1;
НомерСтроки=НомерСтроки+1;
КонецЦикла;
// Задаем форматирование первой строки
// Если сделать это сразу, то все новые строки таблицы будут
// формироваться с тем же форматом
Row1.Range.Font.Bold = 9999998;
Row1.Range.Font.Size = 14;
Row1.Range.Font.Name = "Verdana";
Row1.Range.ParagraphFormat.Alignment = 1;
// Последняя строка...
Row = Table.Rows.Add();
Row.Range.Font.Bold = 9999998;
Row.Cells(1).Range.Text="Итого:";
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
Попытка // эта конструкция выдает исключительную ситуацию, но при этом
// результат все-равно работает))
// объединяем ячейки в конце таблицы
Table.cell(НомерСтроки+1, 1).Merge(Table.cell(НомерСтроки+1, 5));
Исключение
КонецПопытки;
Попытка
Row.Cells(1).Range.ParagraphFormat.Alignment = 3;
Row.Cells(2).Range.Text=Формат(Ссылка.Товары.Итог("Сумма"), "ЧДЦ=2");
Row.Cells(2).Range.ParagraphFormat.Alignment = 1;
Doc.Save();
Объект.Application.Quit();
Объект = Неопределено;
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:\Users\NKrylov\Desktop\Тест.docx");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;
ThisDocument = Word.Documents(1);
ThisDocument.Activate();
// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;
// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;
// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);
// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию
// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;
Bookmark = ThisDocument.Bookmarks("Закладка3");
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
Table.Rows(1).Cells(1).Range.Text = 1;
Table.Rows(1).Cells(2).Range.Text = 2;
Table.Rows(1).Cells(3).Range.Text = 3;
Table.Rows(1).Cells(4).Range.Text = 4;
Table.Rows(1).Cells(5).Range.Text = 5;
// После вывода таблицы, появится "лишняя строка", удалим ее
// в результате курсор встанет в область закладки 4
S_election.MoveDown(, 1);
S_election.Delete(1, 1);
// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)
// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.MoveUp(,4,1);
// Настроим шаблон объекта галереи списков
// Галереи списков бывают несккольких типов, 2 - нумерованные списки
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
// Формат нумератора списка - точка после символа нумерации
ListTemplate.NumberFormat = "%1.";
// стиль нумератора - арабские цифры
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
// 4 - маленькие латинские буквы.
// 2 - маленькие римские цифры.
// 58- меленькие русские буквы.
// Font = Template.Font; // можно указать форматирование текста списка
// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));
// Перейдем в конец текста
S_election.EndKey(6);
// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:\Users\NKrylov\Desktop\Новый.bmp", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.Convert ToShape();
Shape.WrapFormat.Type = 0; // по контуру...
ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Автор:
Крылов Николай Категория:
Работа с Microsoft Office и OpenOffice Преобразование XLS в MXL Конвертация таблиц из Excel в MXL - скачать
Convert er Excel v MXL:
Для 8.х -
Скачивать файлы может только зарегистрированный пользователь!
Для 7.7 -
Скачивать файлы может только зарегистрированный пользователь!
Код 1C v 8.х // Выбор файла Microsoft Excel
Procedure FileNameStartChoice(Element, StdProcessing)
StdProcessing = False;
DialogFile = New FileDialog(FileDialogMode.Open);
DialogFile.Filter = "Файлы Microsoft Excel (*.xls)|*.xls";
DialogFile.DefaultExt = "xls";
If DialogFile.Choose() Then
FileName = DialogFile.FullFileName;
EndIf;
EndProcedure // FileNameStartChoice()
// Получить список листов текущей книги
Function GetSheets(ExcelApplication)
ListS_electSheet = New ValueList;
ListS_electSheet.Add(0, "Все листы");
NumberSheet = 0;
For FirstSheet = 1 To ExcelApplication.Worksheets.Count Do
NumberSheet = NumberSheet + 1;
ListS_electSheet.Add(
NumberSheet, ExcelApplication.WorkSheets(NumberSheet).Name
);
EndDo;
Return ListS_electSheet;
EndFunction // GetSheets()
// Преобразование XLS в MXL
Procedure ButtonExecuteClick()
If IsBlankString(FileName) Then
DoMessageBox("Не указано имя файла");
Return;
EndIf;
Try
ExcelApplication = GetCOMObject(FileName); // Excel.Application
Except
DoMessageBox("Ошибка чтения файла: " + FileName + " возможно защищен паролем.");
Return;
EndTry;
S_electSheet = 0;
S_electSheet = GetSheets(ExcelApplication).ChooseItem("Выберите лист", S_electSheet);
If S_electSheet = Undefined Then
Return;
EndIf;
S_electNumberSheet1 = S_electSheet.Value;
S_electNumberSheet2 = S_electNumberSheet1;
If S_electNumberSheet1 = 0 Then
S_electNumberSheet1 = 1;
S_electNumberSheet2 = ExcelApplication.Worksheets.Count
EndIf;
frmProgressBar = GetForm("FormProgressBar");
frmProgressBar.Caption = "Обрабатывается файл: " + FileName;
frmProgressBar.Controls.ProgressBarAll.MaxValue = S_electNumberSheet2;
frmProgressBar.Controls.ProgressBarAll.Value = 0;
For NumberSheet = S_electNumberSheet1 To S_electNumberSheet2 Do
frmProgressBar.Open();
SprDoc = New SpreadsheetDocument;
Try
WorkSheet = ExcelApplication.Sheets(NumberSheet).UsedRange;
Except
DoMessageBox(ErrorDescription());
Return;
EndTry;
AllStrings = WorkSheet.Rows.Count; // Всего строк
AllColumns = WorkSheet.Columns.Count; // Всего колонок
AllCells = AllStrings * AllColumns; // Все ячейки
frmProgressBar.Controls.InfoProgressBarAll.Value = "Обрабатывается лист № " +
NumberSheet + " из " +
S_electNumberSheet2;
frmProgressBar.Controls.ProgressBarAll.Value = frmProgressBar.Controls.ProgressBarAll.Value + 1;
If AllCells < 2 Then
Continue; // Пустой лист
EndIf;
frmProgressBar.Controls.ProgressBarCur.MaxValue = AllStrings;
frmProgressBar.Controls.ProgressBarCur.Value = 0;
For CurrentString = 1 To AllStrings Do
For CurrentColumn = 1 To AllColumns Do
frmProgressBar.Controls.InfoProgressBarCur.Value = "Обрабатывается строка №: " +
TrimAll(CurrentString) +
" из " + AllStrings +
", колонка №: " +
TrimAll(CurrentColumn) +
" из " + AllColumns;
Try
CurrentCell = WorkSheet.Cells(
CurrentString,
CurrentColumn
);
SlcCell = SprDoc.Area(
CurrentString,
CurrentColumn,
CurrentString,
CurrentColumn
);
SlcCell.RowHeight = CurrentCell.RowHeight;
SlcCell.ColumnWidth = CurrentCell.ColumnWidth;
// Горизонтальное положение
SlcCell.HorizontalAlign = mListHorizontalAlign.Get(
Format(CurrentCell.HorizontalAlignment, "NG=0")
);
// Вертикальное положение
SlcCell.VerticalAlign = mListVerticalAlign.Get(
Format(CurrentCell.VerticalAlignment, "NG=0")
);
// Размещение текста
SlcCell.TextPlacement = ?(
CurrentCell.WrapText = 0,
SpreadsheetDocumentTextPlacementType.Auto,
SpreadsheetDocumentTextPlacementType.Wrap
);
FontCell = CurrentCell.Font;
// Цвет фона
SlcCell.BackColor = mColorRGB(
CurrentCell.Interior.Color
);
// Цвет текста
SlcCell.TextColor = mColorRGB(
FontCell.Color
);
SlcCell.Font = New Font(
FontCell.Name,
Number(FontCell.Size),
?(Number(FontCell.Bold) = 0,
False, True),
?(Number(FontCell.Italic) = 0,
False, True),
?(Format(Number(FontCell.Underline),"NG=0") = "-4142",
False, True),
?(FontCell.Strikethrough, // Зачеркнутый шрифт
True, False)
);
SlcCell.Text = CurrentCell.Value;
// Рамка
Try
SlcCell.LeftBorder = mStyleBorder(CurrentCell, 7);
SlcCell.TopBorder = mStyleBorder(CurrentCell, 8);
SlcCell.RightBorder = mStyleBorder(CurrentCell, 10);
SlcCell.BottomBorder = mStyleBorder(CurrentCell, 9);
Except
EndTry;
SlcCell.Details = CurrentCell.Formula;
// Объединение ячеек
If (CurrentCell.MergeCells <> 0) and
(Find(CurrentCell.MergeArea.Rows.Address(,, 2),
CurrentCell.Address(,, 2)) = 1) Then
SlcCell = SprDoc.Area(
CurrentString,
CurrentColumn,
(CurrentString + CurrentCell.MergeArea.Rows.Count - 1),
(CurrentColumn + CurrentCell.MergeArea.Columns.Count - 1)
);
SlcCell.Merge();
EndIf;
Except
Message(ErrorDescription());
EndTry;
EndDo;
frmProgressBar.Controls.ProgressBarCur.Value = frmProgressBar.Controls.ProgressBarCur.Value + 1;
UserInterruptProcessing(); // Прерывание пользователя Ctrl+Break
EndDo;
SprDoc.Show("" + TrimAll(FileName) + ", лист " + NumberSheet,"");
EndDo;
frmProgressBar.Close();
ExcelApplication = "";
EndProcedure // ButtonExecuteClick()
Категория:
Работа с Microsoft Office и OpenOffice Как открыть Конфигуратор из режима 1С:Предприятия? Код 1C v 8.х ЗапуститьСистему("DESIGNER");
Глобальный контекст
ЗапуститьСистему (RunSystem)
Синтаксис:
ЗапуститьСистему(<Дополнительные параметры комадной строки>, <Дождаться завершения>)
Параметры:
<Дополнительные параметры комадной строки> (необязательный)
Тип: Строка. Содержит дополнительные параметры, которые будет переданы новому сеансу. Если такие параметры уже есть среди текущих установок, переданные заменят текущие.
<Дождаться завершения> (необязательный)
Тип: Булево. Указывает необходимость дождаться завершения запуска системы для продолжения работы.
Значение по умолчанию: Ложь
Описание:
Запускае новый сеанс 1С:Предприятия. Новый сеанс будет запущен с текущими установками.
Примечание:
По умолчанию новая система запускается в режиме "1С:Предприятия". Если в качестве одного из дополнительных параметров будет передан ключ DESIGNER, новая система будет запущена в режиме Конфигуратора.
Пример: Конвертация обработок
Для непосредственной конвертации файла обработки нужно использовать процедуру "Конвертировать", которой в качестве параметра передается каталог содержащий собранные для конвертации обработки. В процедуре осуществляется запуск нового сеанса 1С Предприятия с текущими настройками. Ключ
DESIGNER сообщает системе о необходимости запуска в режиме "Конфигуратор":
Код 1C v 8.х Процедура Конвертировать (Каталог) Экспорт
// Запуск конфигуратора из 1С
ЗапуститьСистему("DESIGNER /Convert Files" + """" + Каталог + """", Истина);
КонецПроцедуры
Категория:
Встроенные Функции Обновление платформы на клиентских машинах и восстановление списка информационных баз пользователей Периодически сталкиваюсь с проблемой обновления платформы на клиентских машинах, + периодически пользователи удаляют, изменяют или добавляют какие-то новые информационные БД.
В случае 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 после удаления - исправим это
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 CONVERT ER77=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
Напоминаю, что создать исполняющий скрипт не сложно, берем обычный текстовый файл, вставляем туда текст скрипта, сохраняем файл, меняем ему расширение с txt на vbs и можно скрипт исполнять
Источник Категория:
Администрирование Прямой SQL запрос к базе 7.7 из базы 8.x Код 1C v 8.х РабДата=Лев(СокрЛП(РабочаяДата),10);
//НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(ДобавитьМесяц(РабочаяДата, -1 ))),10);
НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
НачМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
МойЗапрос = "
|S_elect SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RG38027.SP38026) AS Ost
|FROM RG38027, SC172, _1SJOURN, DH38011
|WHERE (RG38027.SP38024 = SC172.ID) AND (CONVERT (DATETIME , RG38027.PERIOD) = CONVERT (DATETIME , '"+НачПрошлогоМесяца+"')) AND
|(RG38027.SP38025 = _1SJOURN.IDDOC) AND (RG38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|
|U_nion ALL
|
|S_elect SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) AS Ost
|FROM RA38027, SC172, _1SJOURN, DH38011
|WHERE (RA38027.SP38024 = SC172.ID) AND (RA38027.IDDOC=_1SJOURN.IDDOC) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) <= CONVERT (DATETIME , '"+РабДата+"')) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) > CONVERT (DATETIME , '"+НачМесяца+"')) AND
|(RA38027.SP38025 = _1SJOURN.IDDOC) AND (RA38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|HAVING SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) > 0
|ORDER BY SC172.DESCR";
Connection = Новый COMОбъект("ADODB.Connection");
//Connection.Provider = Провайдер;
Connection.ConnectionString = мдСтрокаПодключения;
//Сообщить(МойЗапрос);
Попытка
Connection.Open();
Исключение
Сообщить("Подключение - bad!");
КонецПопытки;
RS = Новый COMОбъект("ADODB.Recordset");
//RS.CursorType = 3;
RS.Open(МойЗапрос, Connection );
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КонтрагентНаименование", ПолучитьОписаниеТиповС(50),"Контрагент",30);
ТЗ.Колонки.Добавить("ИДДокумента", ПолучитьОписаниеТиповС(10));
ТЗ.Колонки.Добавить("НомерДок", ПолучитьОписаниеТиповС(10),"№ заявки",10);
ТЗ.Колонки.Добавить("ДатаДок", ПолучитьОписаниеТиповС(10),"дата заявки",10);
ТЗ.Колонки.Добавить("СуммаОстаток", ПолучитьОписаниеТиповЧ(10, 2),"Сумма",15);
Пока RS.EOF() = 0 Цикл
КонтрагентНаименование = RS.Fields("DESCR").Value;
ИДДокумента = RS.Fields("SP38025").Value;
НомерДок = RS.Fields("DOCNO").Value;
ДатаДок = RS.Fields("DATADOC").Value;
СуммаОстаток = Число(RS.Fields("Ost").Value);
Если СуммаОстаток = 0 Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;
Стр=ТЗ.Добавить();
Стр.КонтрагентНаименование = КонтрагентНаименование;
Стр.ИДДокумента = ИДДокумента;
Стр.НомерДок = НомерДок;
Стр.ДатаДок = Дата(ДатаДок);
Стр.СуммаОстаток = СуммаОстаток;
RS.MoveNext();
КонецЦикла;
Категория:
COM-объекты, WMI, WSH Пример построения в Word нумерованного списка, закладок, вставки картинки, настройки ее параметров. Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудьте указать свои пути.
Тестировалось на Office 2007.
Некоторые переменные переименованы по стандарту Office: Text --> S_election. Doc --> ThisDocument.
Вот текст модуля:
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:\Users\NKrylov\Desktop\Тест.docx");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;
ThisDocument = Word.Documents(1);
ThisDocument.Activate();
// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;
// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;
// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);
// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию
// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;
Bookmark = ThisDocument.Bookmarks("Закладка3");
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
Table.Rows(1).Cells(1).Range.Text = 1;
Table.Rows(1).Cells(2).Range.Text = 2;
Table.Rows(1).Cells(3).Range.Text = 3;
Table.Rows(1).Cells(4).Range.Text = 4;
Table.Rows(1).Cells(5).Range.Text = 5;
// После вывода таблицы, появится "лишняя строка", удалим ее
// в результате курсор встанет в область закладки 4
S_election.MoveDown(, 1);
S_election.Delete(1, 1);
// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)
// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.MoveUp(,4,1);
// Настроим шаблон объекта галереи списков
// Галереи списков бывают несккольких типов, 2 - нумерованные списки
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
// Формат нумератора списка - точка после символа нумерации
ListTemplate.NumberFormat = "%1.";
// стиль нумератора - арабские цифры
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
// 4 - маленькие латинские буквы.
// 2 - маленькие римские цифры.
// 58- меленькие русские буквы.
// Font = Template.Font; // можно указать форматирование текста списка
// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));
// Перейдем в конец текста
S_election.EndKey(6);
// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:\Users\NKrylov\Desktop\Новый.bmp", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.Convert ToShape();
Shape.WrapFormat.Type = 0; // по контуру...
ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Написал Nikola23 - http://infostart.ru/public/68072/ Категория:
Работа с Microsoft Office и OpenOffice Как сохранить поле BLOB (image) как файл на диск? Наиболее эффективно это можно сделать с помощью объектов OLE Automation , работа с которыми осуществляется при помощи:
sp_OACreate, sp_OAGetProperty, sp_OASetProperty, sp_OAMethod, sp_OAGetErrorInfo, sp_OADestroy (подробное описание есть в http://technet.microsoft.com/ru-ru/library/ms203721(sql.90).aspx).
Рабочий пример процедуры (была написана для сохранения zip-архивов, хранящихся в базе):
Код CREATE PROCEDURE dbo.SaveRequestDataAsFile (
@FileName varchar(1024) --имя файла
,@FilePath varchar(1024) --путь файла
,@ReqID --некое условие на таблицу
)
AS
BEGIN
DECLARE
@Stream integer,
@Buffer varbinary(4096),
@Size integer,
@Pos integer,
@BufSize integer,
@FileNameLocal varchar(1024),
@HR integer
if RIGHT(@FilePath, 1)<>'&# 092;' begin set @FilePath=@FilePath+'&# 092;' end
set @FileNameLocal = @FilePath + @FileName
SET @BufSize = 4096
EXEC @HR = sp_OACreate 'ADODB.Stream',@Stream OUT
if @HR<>0
begin
--обработка ошибки создания объекта
EXEC [dbo].[sp_displayoaerrorinfo] @Stream ,@HR
end
EXEC @HR = sp_OASetProperty @Stream,'Type',1 -- binary
EXEC @HR = sp_OASetProperty @Stream,'Mode',3 -- write|read
EXEC @HR = sp_OAMethod @Stream,'Open'
S_elect
@Size = DATALENGTH(SrvRequests.RequestData)
FROM SrvRequests WHERE SrvRequests.RequestID = @ReqID
Set @Pos=0
WHILE @Pos < @Size BEGIN
SET @BufSize = CASE WHEN @Size - @Pos < 4096 THEN @Size - @Pos ELSE 4096 END
S_elect @Buffer = substring(SrvRequests.RequestData ,@Pos+1, @BufSize)
from SrvRequests where SrvRequests.RequestID = @ReqID
EXEC @HR = sp_OAMethod @Stream, 'Write', NULL, @Buffer
SET @Pos = @Pos + @BufSize
END
EXEC @HR = sp_OAMethod @Stream,'SaveToFile',null, @FileNameLocal,2
EXEC @HR = sp_OAMethod @Stream,'Close'
EXEC @HR = sp_OADestroy @Stream
END
Рекомендуется создать еще пару процедур для внятного описания ошибок в случае их возникновения
Код CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(255),
@hexvalue varchar(255) OUTPUT
AS
DECLARE @charvalue varchar(255)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
S_elect @charvalue = '0x'
S_elect @i = 1
S_elect @length = DATALENGTH(@binvalue)
S_elect @hexstring = '0123456789abcdef'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
S_elect @tempint = CONVERT (int, SUBSTRING(@binvalue,@i,1))
S_elect @firstint = FLOOR(@tempint/16)
S_elect @secondint = @tempint - (@firstint* 16)
S_elect @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
S_elect @i = @i + 1
END
----------------------------------------------------------------------
CREATE PROCEDURE sp_displayoaerrorinfo
@object int,
@hresult int
AS
DECLARE @output varchar(255)
DECLARE @hrhex char(10)
DECLARE @hr int
DECLARE @source varchar(255)
DECLARE @description varchar(255)
PRINT 'OLE Automation Error Information'
EXEC sp_hexadecimal @hresult, @hrhex OUT
S_elect @output = ' HRESULT: ' + @hrhex
PRINT @output
EXEC @hr = sp_OAGetErrorInfo @object, @source OUT, @description OUT
IF @hr = 0
BEGIN
S_elect @output = ' Source: ' + @source
PRINT @output
S_elect @output = ' Description: ' + @description
PRINT @output
END
ELSE
BEGIN
PRINT ' sp_OAGetErrorInfo failed.'
RETURN
END
Категория:
OLE, ActiveX Как сравнить похожие строки (неполное совпадение строк)? Ниже привожу пример функции нечеткого сравнения строк. Возвращаемое значение - от 0 (вообще не совпадает) до 1 (совпадает полностью)
По опыту, результат сравнения можно считать достоверным при совпадении больше 0.8 (80%)
Код CREATE FUNCTION fn_FuzzyCompareString(
@Stri1 varchar(250),
@Stri2 varchar(250),
@MaxLen int)
RETURNS float
AS
BEGIN
DECLARE @Str1 varchar(250), @Str2 varchar(250), @SCountVar int,
@SCountEq int, @LenStr int, @Res float
DECLARE @NumSymbStr2 int
DECLARE @Cnt1 int, @Cnt2 int
DECLARE @SubStr varchar(250)
SELECT
@LenStr=1,
@SCountVar=0 ,
@SCountEq=0,
@res=0
Set @Str1 = replace(LTRIM(RTRIM(upper(@Stri1))),'.',' ')
Set @Str2 = replace(LTRIM(RTRIM(upper(@Stri2))),'.',' ')
if ((@MaxLen <= 0) or (Len(@Str1)=0) or (Len(@Str2)=0))
Begin
Set @Res=0
End
else
begin
While (@LenStr<=@MaxLen)
BEGIN
Set @NumSymbStr2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr)<=LEN(@Str2))
BEGIN
Set @SubStr = '%'+SUBSTRING(@Str2,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str1)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END
Set @NumSymbStr2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr)<=LEN(@Str1))
BEGIN
Set @SubStr = '%'+SUBSTRING(@Str1,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str2)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END
Set @LenStr=@LEnStr+1
END
end
if @SCountVar=0
SET @Res=0
Else
BEGIN
SET @Res=Convert (Numeric (10,5),@SCountEq)/Convert (Numeric (10,5),@SCountVar)
END
RETURN @Res
END
Использование этой функции (на примере прямого запроса к справочнику ФизЛица для 1С:ТиС 7.7): в выборку попадут все физлица, у которых релевантность выше 0.8
Код DECLARE @FIO varchar(250)
Set @FIO = 'Иванов Петр'
SELECT
Спр.Code as [ФизЛицоКод],
Спр.ID as [ФизЛицо],
Спр.DESCR as [ФИО],
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3) As [Релевантность]
FROM
SC503 as Спр (nolock)
where
ISMARK = 0
and
ISFOLDER = 2
and
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3)>=0.8
GO
Категория:
Полезные, Универсальные Функции