1c: извлечение страницы из pdf документа

В настоящий момент в 1С нет встроенного средства для редактирования pdf документов, поэтому единственный выход — использовать внешние программы. Например — pdftk или ExtractPagePDF

Ниже пример реализации для ExtractPagePDF:

функция ИзвлечьСтраницуPDF(имяфайла,страница)
	answer=новый Структура("error,result",false,"");
		// вариант с ExtractPDF
		ПутьКПрограммеИзвлечения = lsОбщегоНазначенияСервер.ПутьКПрограммеРаботыСPDFФайлами();
		ИмяВременногоФайлаИзвлечения 	= ПолучитьИмяВременногоФайла("pdf");
		КаталогИзвлечения 				= ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогВременныхФайлов());			
		КодВозвратаКомпоненты = 1;
		ЗапуститьПриложение(ПутьКПрограммеИзвлечения + " 1 """ + имяфайла + """ """ + ИмяВременногоФайлаИзвлечения+""" "+Формат(страница,"ЧГ=0"), , Истина, КодВозвратаКомпоненты);			
		Если КодВозвратаКомпоненты <> 0 Тогда 				
				answer.error=true;      
				answer.result="Не удалось извлечь файлы счетов! для л/с ";
				возврат answer;
		КонецЕсли;
        answer.result=ИмяВременногоФайлаИзвлечения;	
		
		// вариант с pdftk			
		//ПутьКПрограммеИзвлечения = lsОбщегоНазначенияСервер.ПутьКПрограммеРаботыСPDFФайлами();
		//ИмяВременногоФайлаИзвлечения 	= ПолучитьИмяВременногоФайла("pdf");
		//КаталогИзвлечения 				= ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогВременныхФайлов());			
		//КодВозвратаКомпоненты = 1;      
		//страница=Формат(страница,"ЧГ=0");
		//ЗапуститьПриложение(ПутьКПрограммеИзвлечения +" """+ имяфайла + """ cat "+страница+" """ + ИмяВременногоФайлаИзвлечения+"""", , Истина, КодВозвратаКомпоненты);			
		//Если КодВозвратаКомпоненты <> 0 Тогда 				
		//		answer.error=true;      
		//		answer.result="Не удалось извлечь файлы счетов! для л/с ";
		//		возврат answer;
		//КонецЕсли;
		//answer.result=ИмяВременногоФайлаИзвлечения;	
		
		
		
	возврат answer;
конецфункции

Получение email пользователя ИБ

Задача: получение email пользователя ИБ по известному пользователю конфигурации

При разработке на платформе 1С, в рано или поздно сталкиваешся с данностью, что нужно работать с двумя разными сущностями: пользователь информационной базы (задаётся в конфигураторе), и пользователь справочника «Пользователь» в используемой конфигурации. При использовании стандартной БСП, они обычно связаны между собой при помощи реквизита «ИдентификаторПользователяИБ».

Получение email пользователя ИБ

Email пользователя может храниться в двух местах:

  1. В контактной информации пользователя в справочнике Пользователи
  2. Как реквизит Пользователя информационной базы.

И самое удивительное, что они не синхронизируются между собой, т.е. могут быть в принципе и разными.

В моём случае, нужно получение email пользователя ИБ. Решается это так:

			ПользовательИБ=ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ВыборкаДетальныеЗаписи.ОтветственныйСотрудник.ИдентификаторПользователяИБ);
			email=ПользовательИБ.АдресЭлектроннойПочты;			

1C: Генератор паролей

Функция ГенерацияСлучайногоПароля(длн)
    ГСЧ = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах());    
    СлучайнаяСтрока = "";
    Для Сч = 1 по длн Цикл        
        Набор = ГСЧ.СлучайноеЧисло(1,7);    
        Если Набор = 1 Тогда
            // это число
            СлучайныйСимвол = ГСЧ.СлучайноеЧисло(0,9);    
        ИначеЕсли Набор = 2 Тогда
            // это Большая буква латиницы
            СлучайныйСимвол = Символ(ГСЧ.СлучайноеЧисло(65,90));
        ИначеЕсли Набор >= 3 Тогда
            // это маленькая буква латиницы
            СлучайныйСимвол = Символ(ГСЧ.СлучайноеЧисло(97,122));
		КонецЕсли;			
        Если Набор >= 7 Тогда
            // это спецсимвол
			спецсимволы="!@#$&*()_-+[]^";
			поз=ГСЧ.СлучайноеЧисло(0,стрдлина(спецсимволы));
            СлучайныйСимвол =Сред(спецсимволы,поз,1);						
        КонецЕсли;
		
        СлучайнаяСтрока = СлучайнаяСтрока + СлучайныйСимвол;
    КонецЦикла;      
    Возврат(СлучайнаяСтрока);    
КонецФункции

1С: Еще раз о создании файла DOCX по шаблону без Word на сервере

Подобная статья уже была где-то на сайте, но вот еще одна, но решил актуализировать.

Итак, задача: при нажатии кнопки «В Word», сформировать на сервере файл по шаблону, сохранить его на клиент и открыть любым зарегистрированным приложением. Работать должно кроссплатформенно Linux/Windows

Создадим docx файл вида:

Решение:

{v8 Область.Тушка}

какойто текст, текст, текст. Бла-бла-бла..

{v8 АрбитражныйСудНаименование}

{/v8 Область.Тушка}

Загрузим его в макет как бинарные данные.

Далее код кнопки:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)	
	ПоказатьОповещениеПользователя("Формирую документ", "", "Формируем документ. Это может занять некоторое время", БиблиотекаКартинок.БизнесПроцесс);	
	Для Каждого ДокументСсылка Из ПараметрКоманды Цикл
		БинарныеДанные = СформироватьДокументНаСервере(ДокументСсылка);
		врмф = ПолучитьИмяВременногоФайла(".docx");
		БинарныеДанные.Записать(врмф);
		
		Оповещение = Новый ОписаниеОповещения("ЗапускПриложения", ЭтотОбъект);
		НачатьЗапускПриложения(Оповещение, врмф, , Ложь);
	 	ПоказатьОповещениеПользователя("Документ сформирован", "", "Дождитесь открытия приложения для работы с документом", БиблиотекаКартинок.БизнесПроцесс);
	КонецЦикла;		
КонецПроцедуры

&НаКлиенте
Процедура ЗапускПриложения(КодВозврата, ДополнительныйПараметр) Экспорт

КонецПроцедуры



&НаСервере
Функция СформироватьДокументНаСервере(ДокументСсылка);
	Возврат Документы.СК_КалькуляторИндексации.СгенерироватьДокумент(ДокументСсылка,"ЗаявлениеОбИндексации");
КонецФункции

Код формирования файла на сервере:

Процедура ДобавитьОписаниеОбласти(НаборОбластей, знач ИмяОбласти, знач ТипОбласти) Экспорт
	НоваяОбласть = Новый Структура;	
	НоваяОбласть.Вставить("ИмяОбласти", ИмяОбласти);
	НоваяОбласть.Вставить("ТипОбласти", ТипОбласти);	
	НаборОбластей.Вставить(ИмяОбласти, НоваяОбласть);	
КонецПроцедуры

Функция ПолучениеОписанияОбластей() Экспорт
	ОписаниеОбластей = Новый Структура;	
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "Тушка", "Общая");
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "Подвал", "Общая");
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", "ВерхнийКолонтитул");
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", "НижнийКолонтитул");
	ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийТитульныйКолонтитул", "НижнийТитульныйКолонтитул");		
	Возврат ОписаниеОбластей;		
КонецФункции		


функция ПолучитьДанныеМакета(Знач ИмяМакета)
	
	ОписаниеОбластей = Новый Соответствие;
	ДвоичныеДанныеМакетов = Новый Соответствие;
	ТипыМакетов = Новый Соответствие; 	
	ДвоичныеДанныеМакетов.Вставить(ИмяМакета, ПолучитьМакет(ИмяМакета)); 	
	ОписаниеОбластей.Вставить(ИмяМакета, ПолучениеОписанияОбластей());
	
	Макет = Новый Структура;
	Макет.Вставить("ОписаниеОбластей", ОписаниеОбластей);
	Макет.Вставить("ДвоичныеДанныеМакетов", ДвоичныеДанныеМакетов);
	Макет.Вставить("ТипыМакетов", ТипыМакетов);
	Макет.Вставить("ЛокальныйКаталогФайловПечати", Неопределено); 
	Если НЕ Макет.Свойство("ТипыМакетов") Тогда
		Макет.Макеты.Вставить("ТипыМакетов", Новый Соответствие); 
	КонецЕсли;
	
	
	Возврат Макет;                               
	
Конецфункции                    

Функция СгенерироватьДокумент(ДокументСсылка,ИмяМакета) Экспорт
	
	ДанныеОбъекта = Новый Структура;
	ДанныеОбъекта.Вставить("АрбитражныйСуд", "Самый гуманный суд в мире!");
	
	ДанныеМакетов = ПолучитьДанныеМакета(ИмяМакета);	
	
	ТипМакета = ДанныеМакетов.ТипыМакетов[ИмяМакета];
	ДвоичныеДанныеМакета = ДанныеМакетов.ДвоичныеДанныеМакетов;
	Области = ДанныеМакетов.ОписаниеОбластей;
		
	
	Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета[ИмяМакета],ТипМакета,ИмяМакета);
	
	Если Макет = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	
	ЗакрытьОкноПечатнойформы = Ложь;	
	

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

		
КонецФункции	

Нарушена целостность структуры конфигурации 1С

Уже ранее была статья на эту тему, но в этом случае все советы не помогли. Помогли другие:

  1. Найти не битую cf этой версии конфигурации
  2. Зайти битую конфигурацию, снять её с поддержки
  3. Объединить битую конфигурацию с не битой cf. В время объединения 1С предложит снова поставить её на поддержку
  4. После этой манипуляции, битая становится не битой и позволяет далее нормально штатно обновлятся
1 12 13 14 15 16 51