wiki:1c:coding

Это старая версия документа!


Изменение имени переменной в цикле

Функция ДобавитьСтрокиВТЗ(ТЗ,Строка,ТекстДок)
 стр = ТЗ.Добавить();
 Для Каждого Колонка ИЗ ТЗ.Колонки Цикл
  Стр[Колонка.Имя] = СокрЛП(ТекстДок.ПолучитьСтроку(Строка));
  Строка = Строка + 1;
 КонецЦикла;  
 Возврат Строка
КонецФункции

Запуск обработки из макета внешней обработки

  • Добавляем внешнюю обработку для запуска как макет с типом «Внешняя компонента».
  • В модуле обработки пишем функцию:
&НаСервере
Функция ПолучитьОбмен_Данными_XML_2_1_7()  Экспорт
 Обработка = ЭтотОбъект.ПолучитьМакет("EPF_Универсальный_Обмен_Данными_XML_2_1_7");
 АдресОбработкиВХранилище = ПоместитьВоВременноеХранилище(Обработка);
 
 Возврат АдресОбработкиВХранилище
 
КонецФункции
  • На форме обработки создаем событие :«При открытии», В его обработчике пишем:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
 ИмяОбработки = ПодключитьВнешнююОбработку();
 // Откроем форму подключенной внешней обработки
 Форма = ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма.УправляемаяФорма");
 //ЭтаФорма.Закрыть();
КонецПроцедуры

&НаСервере
Функция ПодключитьВнешнююОбработку()
 Возврат ВнешниеОбработки.Подключить(РеквизитФормыВЗначение("Объект").ПолучитьОбмен_Данными_XML_2_1_7(), , Ложь);
КонецФункции

Разбивка строки по разделителю на подстроки

#Если ТолстыйКлиентОбычноеПриложение Тогда
Если Счетчик % 100 = 0 Тогда
     Состояние("Загружается отчет № " + НомерОтчета + " с POS № " + ЛогНомерИзОтчета + ", строка " + Счетчик + "/" + ВсегоСтрок);
КонецЕсли;
#КонецЕсли
//Разделитель в этом случае ";"
Стр = СтрЗаменить(ФайлОтчета.ПолучитьСтроку(Счетчик), ";", Символы.ПС);
Дата = СтрПолучитьСтроку(Стр, 2);
Время = СтрПолучитьСтроку(Стр, 3);
НомерЧека        = СтрПолучитьСтроку(Стр, 6);
Сумма = СтрПолучитьСтроку(Стр, 12);

Прибавляет Нужное количество рабочих дней к дате

Не совсем рабочая функция взята здесь

 Функция РабочихДнейСДаты(НачДата,КолвоДней)  Экспорт
	//Перем РабочихДней, ОбычныхДней, ДеньНедели;
	РабочихДней = 0; 
	ОбычныхДней = 0;
	Пока РабочихДней <= Число(КолвоДней) Цикл 
		ОбычныхДней = ОбычныхДней+ 1;          
		// определим день недели 
		ДеньНедели=ДеньНедели(НачДата+(ОбычныхДней*86400));           
		// если не выходной, то прошел еще один рабочий день 
		Если ДеньНедели < 6 Тогда
			РабочихДней=РабочихДней+1;
		КонецЕсли;
	КонецЦикла;
	
	Возврат (НачДата + (ОбычныхДней*86400));
КонецФункции

Читает текст с разделителями в ТЗ

Разделитель в данном случае - ";"
 Функция ПрочитатьТекстВТЗ(ПутьКФайлу,ИмяФайла)
	Реализации = Новый ТаблицаЗначений;
	Реализации.Колонки.Добавить("Номер");
	Реализации.Колонки.Добавить("Дата");
	Реализации.Колонки.Добавить("Сумма");
	Реализации.Колонки.Добавить("ИНН");
	// загрузим текст
	Текст = Новый ТекстовыйДокумент;
	Текст.Прочитать(ПутьКФайлу+"\"+ИмяФайла);
	КоличествоСтрок = Текст.КоличествоСтрок();
        Инд = 1;
	Пока Инд <= КоличествоСтрок Цикл
		Стр = СтрЗаменить(Текст.ПолучитьСтроку(Инд),";",Символы.ПС);
		СтрТЗ = Реализации.Добавить();
		СтрТЗ.Номер = СокрЛП(СтрПолучитьСтроку(Стр,1));
		СтрТЗ.Дата = СтрПолучитьСтроку(Стр,2);
		СтрТЗ.Сумма = СтрПолучитьСтроку(Стр,3);
		СтрТЗ.ИНН = СтрПолучитьСтроку(Стр,4);
                Инд = Инд + 1;
	КонецЦикла;
	Возврат Реализации // возвращаем ТЗ
 КонецФункции

Журналирование (Логирование) работы обработки в *.txt

В имени файла слова должны идти через "_", например: "Выгрузка_реализаций"
 Функция ПолучитьЖурнал(ПутьКФайлу,ИмяФайла)
	Путь = ПутьКФайлу+"\"+Формат(ТекущаяДата(),"ДФ=dd_MM_yyyy_hh_mm_ss")+"_"+ИмяФайла+".txt";
	Журнал = Новый ТекстовыйДокумент;
	Журнал.ДобавитьСтроку("Начало работы");
	Журнал.Записать(Путь);
	Возврат Журнал
 КонецФункции

Генерация корректной ТЗ для запроса

В имени файла слова должны идти через "_", например: "Выгрузка_реализаций"
 Функция СгенерироватьТЗ()
	// описание типов в тз
	КС50 = Новый КвалификаторыСтроки(50);
	КС100 = Новый КвалификаторыСтроки(100);
	КЧ = Новый КвалификаторыЧисла(3,0);
	Массив = Новый Массив;
	Массив.Добавить(Тип("Строка"));
	ОписаниеТиповС50 = Новый ОписаниеТипов(Массив, , КС50);
	Массив.Очистить();
	Массив.Добавить(Тип("Строка"));
	ОписаниеТиповС100 = Новый ОписаниеТипов(Массив, , КС100);
	Массив.Очистить();
	Массив.Добавить(Тип("Число"));
	ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
	Товар = Новый ТаблицаЗначений;
	Товар.Колонки.Добавить("Арт",ОписаниеТиповС50);          // артикул
	Товар.Колонки.Добавить("НазваниеРус",ОписаниеТиповС100); // Название по-русски
	Товар.Колонки.Добавить("НазваниеАнг",ОписаниеТиповС100); // Название по-английски
	Товар.Колонки.Добавить("ЕдИзм",ОписаниеТиповС50);        // единица измерения
	Товар.Колонки.Добавить("ОстатокМск",ОписаниеТиповЧ);     // остаток на складе
	Возврат Товар
 КонецФункции

Код модуля обработки/отчета для добавления в дополнительные отчеты/обработки

Тестировалось на УТ 11.1 платформа 8.3. Нужно добавить код в модуль отчета/обработки.

 Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = Новый Структура;
	МассивНазначений = Новый Массив;
	МассивНазначений.Добавить("");
	
	ИмяОтчета = Метаданные().Представление();
	
	ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
	ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
	ПараметрыРегистрации.Вставить("Наименование", "Поступления номенклатуры");
	ПараметрыРегистрации.Вставить("Версия", "1.0");
	ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
	ПараметрыРегистрации.Вставить("Информация", "Прайс лист с возможностью вывода картинок. Автор ITMS");
	
	ТаблицаКоманд = ПолучитьТаблицуКоманд();
	
	ДобавитьКоманду(ТаблицаКоманд, ИмяОтчета, Метаданные().ПолноеИмя(), "ОткрытиеФормы", Истина);
	
	ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
	
	Возврат ПараметрыРегистрации;
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
	НоваяКоманда = ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление = Представление;
	НоваяКоманда.Идентификатор = Идентификатор;
	НоваяКоманда.Использование = Использование;
	НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
	НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

Вывод в Word

ПутьКФайлуМакетаНаКлиенте - путь к файлу Word для заполнения РеквизитыДляПечати - структура, где имя совпадает с именем закладки в Word

&НаСервере
Функция ПодготовкаПечати(ВидДоговораДляПечати)
	
	РеквизитыДляПечати = РеквизитФормыВЗначение("Объект").ПолучитьМакетыИРеквизитыДоговора(ЭтотОбъект,ВидДоговораДляПечати);
			
	Возврат  РеквизитыДляПечати
	
КонецФункции

&НаКлиенте
Процедура Печать(Команда)
  РеквизитыДляПечати = ПодготовкаПечати(ВидДоговора);
  // Выводим Договор ИТС
  ДвоичныеДанные = ПолучитьИзВременногоХранилища(РеквизитыДляПечати.Договор_ИТС);	
  ПутьКФайлуМакетаНаКлиенте = КаталогВременныхФайлов()+"contract_its.doc";
  ДвоичныеДанные.Записать(ПутьКФайлуМакетаНаКлиенте);
  ПечатьПФ_DOC(ПутьКФайлуМакетаНаКлиенте,РеквизитыДляПечати.ДанныеНаПечать);
КонецПроцедуры

&НаКлиенте
Процедура ПечатьПФ_DOC(ПутьКФайлуМакетаНаКлиенте,РеквизитыДляПечати)
	Попытка 
	ОбъектВорд = Новый COMОбъект("Word.Application");
	
	ОбъектВорд.Documents.Open(ПутьКФайлуМакетаНаКлиенте);
	Док = ОбъектВорд.Application.Documents(1);
	Док.Activate();
	
	Для каждого Закладка Из Док.Bookmarks Цикл
       	Значение = РеквизитыДляПечати.Получить(Закладка.Name);
		Док.Bookmarks(Закладка.Name).Select();
		Док.Application.Selection.TypeText(Значение);
		
	КонецЦикла;
	ОбъектВорд.Application.Visible = Истина;
	ОбъектВорд.Activate();
	
Исключение
	Док.Application.Quit();
	КонецПопытки;
КонецПроцедуры

Код в модуле обработки:

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

&НаСервере
Процедура ПолучитьМакеты(ВидДоговора,РеквизитыДляПечати)
	Если ВидДоговора = "ИТС" Тогда
		// Получаем макет Договора ИТС
		ИмяМакета = "ПФ_DOC_ИТС_Договор";
		ИмяШаблона = "contract_its.doc"; 
		АдресМакетаВХранилище = ПолучитьАдресМакетаВХранилище(ИмяМакета,ИмяШаблона);
		РеквизитыДляПечати.Вставить("Договор_ИТС",АдресМакетаВХранилище);
		
		// Получаем макет Приложения 1	
		ИмяМакета = "ПФ_DOC_ИТС_Договор_Приложение_1";
		ИмяШаблона = "attachment_1.doc"; 
		АдресМакетаВХранилище = ПолучитьАдресМакетаВХранилище(ИмяМакета,ИмяШаблона);
		РеквизитыДляПечати.Вставить("Приложение1",АдресМакетаВХранилище);
КонецПроцедуры

#Область Служебные_Процедуры 

// Функция - Получить адрес макета в хранилище
//
// Параметры:
//  ИмяМакета	 - 	 Имя макета, который нужно получить 
// 
// Возвращаемое значение:  Адрес файла макета в виде двоичных
//  данных во временном хранилище 
//
&НаСервере
Функция ПолучитьАдресМакетаВХранилище(ИмяМакета,ИмяШаблона)
	МакетДанные = ЭтотОбъект.ПолучитьМакет(ИмяМакета);
	Имя = КаталогВременныхФайлов()+ИмяШаблона;
	МакетДанные.Записать(Имя);
	ДвоичДанные = Новый ДвоичныеДанные(Имя);
	АдресМакетаВХранилище = ПоместитьВоВременноеХранилище(ДвоичДанные);
	Возврат АдресМакетаВХранилище
КонецФункции


&НаСервере
Функция Склонение(СтрокаФИО,ПолКонтактногоЛица,Падеж,NameDecl)
	
	Если ПолКонтактногоЛица = Перечисления.ПолФизическогоЛица.Мужской Тогда
		РезультатСклонения = NameDecl.Просклонять(СтрокаФИО, Падеж,1);
	ИначеЕсли ПолКонтактногоЛица = Перечисления.ПолФизическогоЛица.Женский Тогда
		РезультатСклонения = NameDecl.Просклонять(СтрокаФИО, Падеж,0);
	Иначе
		РезультатСклонения = NameDecl.Просклонять(СтрокаФИО, Падеж);
	КонецЕсли;
	
	Возврат РезультатСклонения
КонецФункции

// Процедура - Получить Объект NameDecl
// Получает NameDecl.dll - библиотека склонения из макета
&НаСервере
Функция ПолучитьNameDecl()
	Данные = ЭтотОбъект.ПолучитьМакет("NameDecl_zip");
	АдресNameDecl = ПоместитьВоВременноеХранилище(Данные);
	Попытка
		// Загружаем внешнюю компоненту
		ПодключитьВнешнююКомпоненту(АдресNameDecl, "Component"); 
		NameDecl = Новый("AddIn.Component.CNameDecl");
	Исключение
		// Не удалось выполнить операции с внешней компонентой
		Сообщить("Не удалось загрузить внешнюю компоненту по причине: " + ОписаниеОшибки()); 
	КонецПопытки;
	
	Возврат  NameDecl
	
КонецФункции

// Формирует фамилию и инициалы либо по переданным строкам.
//
// Параметры:
//  ФИОСтрокой	- Строка - если указан это параметр, то остальные игнорируются.
//  Фамилия		- Строка - фамилия физического лица.
//  Имя			- Строка - имя физического лица.
//  Отчество	- Строка - отчество физического лица.
//
// Возвращаемое значение:
//  Строка - фамилия и инициалы одной строкой. 
//  В параметрах Фамилия, Имя и Отчество записываются вычисленные части.
//
// Пример:
//  Результат = ФамилияИнициалыФизЛица("Иванов Иван Иванович"); // Результат = "Иванов И. И."
//
Функция ФамилияИнициалыФизЛица(ФИОСтрокой = "", Фамилия = " ", Имя = " ", Отчество = " ")
	
	ТипОбъекта = ТипЗнч(ФИОСтрокой);
	Если ТипОбъекта = Тип("Строка") Тогда
		ФИО = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СокрЛП(ФИОСтрокой), " ");
		
	Иначе
		// Используем возможно переданные отдельные строки.
		Возврат ?(Не ПустаяСтрока(Фамилия), 
		Фамилия + ?(Не ПустаяСтрока(Имя), " " + Лев(Имя,1) + "." + ?(Не ПустаяСтрока(Отчество), Лев(Отчество,1) + ".", ""), ""),
		"");
	КонецЕсли;
	
	КоличествоПодстрок = ФИО.Количество();
	Фамилия            = ?(КоличествоПодстрок > 0, ФИО[0], "");
	Имя                = ?(КоличествоПодстрок > 1, ФИО[1], "");
	Отчество           = ?(КоличествоПодстрок > 2, ФИО[2], "");
	
	Если КоличествоПодстрок > 3 Тогда
		ДополнительныеЧастиОтчества = Новый Массив;
		ДополнительныеЧастиОтчества.Добавить(НСтр("ru = 'оглы'"));
		ДополнительныеЧастиОтчества.Добавить(НСтр("ru = 'улы'"));
		ДополнительныеЧастиОтчества.Добавить(НСтр("ru = 'уулу'"));
		ДополнительныеЧастиОтчества.Добавить(НСтр("ru = 'кызы'"));
		ДополнительныеЧастиОтчества.Добавить(НСтр("ru = 'гызы'"));
		
		Если ДополнительныеЧастиОтчества.Найти(НРег(ФИО[3])) <> Неопределено Тогда
			Отчество = Отчество + " " + ФИО[3];
		КонецЕсли;
	КонецЕсли;
	
	Возврат ?(Не ПустаяСтрока(Фамилия), 
	Фамилия + ?(Не ПустаяСтрока(Имя), " " + Лев(Имя, 1) + "." + ?(Не ПустаяСтрока(Отчество), Лев(Отчество, 1) + ".", ""), ""),
	"");
	
КонецФункции

// Получение адреса отработка ошибок
// 
// Возвращаемое значение:
//   вид адреса 
//   1 - юридический
//   2 - фактический
Функция ПолучитьпредставлениеАдреса(ВидАдреса,Контрагент)
	
	МассивКонтрагентов = Новый Массив;
	МассивКонтрагентов.Добавить(Контрагент);

	МассивАдресов = Новый Массив;
	Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
	// вид адреса 
	Если ВидАдреса = 1 Тогда
		Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
		
	ИначеЕсли ВидАдреса = 2 Тогда
		Вид = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
	КонецЕсли;
	
	МассивАдресов = КонтактнаяИнформацияУНФ.КонтактнаяИнформацияОбъектов(МассивКонтрагентов,Тип,Вид);
	
	Если МассивАдресов.Количество()>0 Тогда
		ПредставлениеАдреса = МассивАдресов[0].Представление;
	Иначе
		ПредставлениеАдреса = "";
	КонецЕсли;			

	
	Возврат ПредставлениеАдреса
КонецФункции


#КонецОбласти
  • wiki/1c/coding.1562545301.txt.gz
  • Последнее изменение: 2019/07/08 03:21
  • anton