Добро пожаловать,
Поиск
Иногда возникает необходимость защитить свое творение, представлен разработанный мною подход, дорогие читатели, на ваше суждение и понимание, данная статья посвещена конфигурированию в 8 версии.
Итак для начала вы создали отчет, обработку или документ который конечно же является шедевром и те ноу хау которые вы там воплотили, не хочется по каким либо причинам, моральным или материальным, делится с клиентом.
1) Разработчики восьмой платформы для этих целей нам предлагают закрыть модуль паролем. Ну что же, большое вам за это спасибо.
Однажды у меня возникла ситуация когда клиент пожелал платить деньги позже, ну что же, хорошо, но прокактить вам жадины меня не придется, работа была сделана в срок и естественно была запоролена.
2) Но ведь от этого она не теряет свой функционал и рабочие свойства, мне могут сказать что работа выполнена плохо и денег мы вам не дадим. Ну что ж, в свой запороленый модуль я вставил такой код:
//СИСТЕМА ЗАЩИТЫ
Код Функция ПрекратитьРаботу()
ПрекратитьРаботу = ?(ВосстановитьЗначение("ПрекратитьРаботу123456789")=
Неопределено,Ложь,
Истина);
Если ТекущаяДата()>'20071231' или ПрекратитьРаботу Тогда
СохранитьЗначение("ПрекратитьРаботу123456789",Истина);
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Который вызывался перед ключевой процедурой или функцией, как вы видите она привязана ко времени и когда оно, время, приходит значение сохраняется даже перевод стрелок не спасает вредного клиента от головной боли, и ему придется раскошелится или связаться с разработчиком.
3)Идем дальше, бывают ситуации когда нужно позволить пользователю обновить конфигурацию, но если вы поставили пароль то при объединении он его обязательно спросит, что же делать, мой вам совет выполните все ваши важные и ключевые процедуры, функции (Даже можно включить вызов из них функции защиты) в экпортном виде, в модуле внешней обработки (модуль которой конечно вы закрыли).
Обработка готова и ваш документ умеет к ней обращатся, теперь нужно сохранить ее в двоичном виде макета, в объекте метаданных который вы разрабатывали.
Можно использовать такой код :
Код ДвоичныеДанные = Документы.[ваш документ ].ПолучитьМакет("Макет");
ВременнаяОбработка = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ВременнаяОбработка);
НашаСекретнаяОбработка = ВнешниеОбработки.Создать(ВременнаяОбработка);
И теперь обращаясь к нашим любимым процедурам через созданную и закрытую обработку, мы не имеем проблем с обновлением.
Источник публикации
Разместил: Legavaz/
В статье продемонстрированы программные методы экспортирования данных из программы "1С:Предприятие 7.7".
Экспорт данных из 1С в Текстовой файл TXT, CSV
Код //сохранение данных таблицы значений в текстовой файл
//аргументы: М - таблица значений
Процедура ВыполнитьЭкспорт(М)
Т=СоздатьОбъект("Текст");
//выборка
М.ВыбратьСтроки();
Пока М.ПолучитьСтроку()=1 Цикл
Состояние("Экспорт: "+
Цел(М.НомерСтроки/М.КоличествоСтрок()
0)+"%");
тФирма=М.Фирма.ПолныйКод();
тТовар=М.Товар.ПолныйКод();
тСклад=М.Склад.ПолныйКод();
тКоличество=М.Количество;
Т.ДобавитьСтроку("Фирма="+тФирма+";Товар="+тТовар+";Склад="+тСклад+
";Количество="+тКоличество+";");
КонецЦикла;
//файл
Файл="export"+Формат(ДатаК,"Д ГГГГММДД")+".csv";
Т.Записать(Файл);
Сообщить("Файл с данными сохранен в каталоге
экспортной БД: "+КаталогИБ()+Файл);
КонецПроцедуры
Экспорт данных из 1С в файл dBase формата DBF
Код //процедура записывает данные об использовании
отчёта в файл dBase формата DBF
Процедура гЗаписатьСтатистикуИспользованияОтчета(ИдентификаторОтчета) Экспорт
//путь к файлу; имя файла не должно превышать 8 знаков
Путь=КаталогИБ()+"Stat.dbf";
//создание нового файла
Б=СоздатьОбъект("XBase");
Если ФС.СуществуетФайл(Путь)=0 Тогда
//добавление полей
Б.ДобавитьПоле("REPORT","S",100,0);
Б.ДобавитьПоле("USER","S",50,0);
Б.ДобавитьПоле("DATE","D",10,0);
Б.ДобавитьПоле("TIME","S",5,0);
//создание файла
Б.СоздатьФайл(Путь);
Б.ЗакрытьФайл();
КонецЕсли;
//открытие файла
Б.ОткрытьФайл(Путь);
Если Б.Открыта()=0 Тогда
Сообщить("Не удалось открыть файл DBF","!");
Возврат;
КонецЕсли;
//добавление записи
Б.Добавить();
Б.Date=ТекущаяДата();
Б.Time=ТекущееВремя();
Б.Report=СокрЛП(ИдентификаторОтчета);
Б.User=гПользователь.Наименование;
Б.Записать();
//закрытие файла
Б.ЗакрытьФайл();
КонецПроцедуры
Экспорт данных из 1С на лист MS Excel
Код //функция создаёт новую книгу в MS Excel и выгружает табличную часть заданного документа
Процедура гМногострочка_Экспортировать(Док) Экспорт
//документ
Д=СоздатьОбъект("Документ");
Д.НайтиДокумент(Док);
//приложение
Оле=СоздатьОбъект("Excel.Application");
Если ФлагВидимость=1 Тогда
Оле.Visible=1;
КонецЕсли;
Книга=Оле.Workbooks().Add();
Книга.Windows(1).Caption=Д.ПредставлениеВида()+" "+СокрЛП(Д.НомерДок);
Лист=Книга.Activesheet;
//шапка
Колонка=0;
Для i=1 По Метаданные.Документ(Д.Вид()).РеквизитТабличнойЧасти() Цикл
Ж=Метаданные.Документ(Д.Вид()).РеквизитТабличнойЧасти(i);
//колонка
Колонка=Колонка+1;
Ячейка=Лист.Cells(1,Колонка);
//текст
Ячейка.Value=Ж.Идентификатор;
//форматирование
Ячейка.Font.Bold=1;
Если Ж.Тип="Число" Тогда
Попытка
Лист.Columns(Колонка).NumberFormat="# ##0.00";
Исключение
Лист.Columns(Колонка).NumberFormat="# ##0,00";
КонецПопытки;
КонецЕсли;
КонецЦикла;
//строки
Д.ВыбратьСтроки();
Пока Д.ПолучитьСтроку()=1 Цикл
Лист.Range("A"+Число(Д.НомерСтроки+1)).Select();
Колонка=0;
//многострочка
Для i=1 По Метаданные.Документ(Д.Вид()).РеквизитТабличнойЧасти() Цикл
Ж=Метаданные.Документ(Д.Вид()).РеквизитТабличнойЧасти(i);
Колонка=Колонка+1;
//значение
Значение=Д.ПолучитьАтрибут(Ж.Идентификатор);
Лист.Cells(Д.НомерСтроки+1,Колонка).Value=СокрЛП(Значение);
КонецЦикла;
КонецЦикла;
//авто подбор ширины
Лист.Cells.EntireColumn.AutoFit();
//закрепление области
Лист.Range("A2").Select();
Оле.ActiveWindow.FreezePanes=1;
Оле.Visible=1;
КонецПроцедуры
Управление MS Word из 1С
Методы работы с MS Word через OLE активно использованы в конфигурации "Договоры". Для определения числового кода текстовых констант MS Word использована обработка "Константы VBA".
* Конфигурация "Договоры"
* Универсальная обработка "Константы VBA"
Код //поиск текста в открытом документе MS Word
Функция Текст_Найти(Оле,аТекст)
Текст=СокрЛП(аТекст);
//поиск
Оле.Selection.Find.ClearFormatting();
Оле.Selection.Find.Text=Текст;
Оле.Selection.Find.MatchCase=0;
Оле.Selection.Find.MatchWholeWord=0;
Оле.Selection.Find.MatchWildcards=0;
Оле.Selection.Find.MatchSoundsLike=0;
Оле.Selection.Find.MatchAllWordForms=0;
Оле.Selection.Find.Forward=1;
Оле.Selection.Find.Wrap=wdFindContinue;
Оле.Selection.Find.Format=0;
Ответ=Оле.Selection.Find.Execute();
//найден
Если Оле.Selection.Find.Found()=0 Тогда
Сообщить("Текст не найден: "+Текст);
Возврат(0);
Иначе
Возврат(1);
КонецЕсли;
КонецФункции
//поиск и замена текста в документе MS Word
Процедура Договор_Заменить()
//путь
Если ФС.ВыбратьФайл(0,Файл,Каталог,"Открыть старый файл","Файлы MS Word|*.doc")=0 Тогда
Возврат;
КонецЕсли;
//приложение
Оле=СоздатьОбъект("Word.Application");
Оле.Documents.Open(Каталог+Файл,,1);
//переход курсора в начало текста
Оле.Selection.HomeKey(wdStory);
//замена Номер договора
Если Текст_Найти(Оле,"ДОГОВОР")=1 Тогда
Оле.Selection.EndKey(wdLine,wdCharacter);
Оле.Selection.TypeText("ДОГОВОР № "+гНомерДок(НомерДок));
КонецЕсли;
//замена Дата договора
Если Текст_Найти(Оле,Константа.ГодСтарый)=1 Тогда
Оле.Selection.MoveLeft(wdWord,3);
Оле.Selection.EndKey(wdLine,wdCharacter);
Оле.Selection.TypeText(ДатаДоговора());
КонецЕсли;
//переход курсора в начало текста
Оле.Selection.HomeKey(wdStory);
Оле.Visible=1;
//предупреждение
Предупреждение("Создание нового договора копированием старого выполнено.");
КонецПроцедуры
Экспорт данных в файл формата XML
Код //процедура выгружает элементы справочника "Физические лица" в файл формата XML
Процедура Лица_Выгрузить()
//справочник
С=СоздатьОбъект("Справочник.Лица");
//анализатор
Анализатор=СоздатьОбъект("AddIn.XMLParser");
Корень=Анализатор.СоздатьДокумент();
//данные
Данные=Корень.СоздатьПодчиненныйЭлемент("Данные");
Данные.УстановитьАтрибут("Дата",ТекущаяДата());
Данные.УстановитьАтрибут("Время",ТекущееВремя());
Данные.УстановитьАтрибут("Автор",гПользователь.Наименование);
//наполнение
Группа=Данные;
С.ВыбратьЭлементы();
Пока С.ПолучитьЭлемент()=1 Цикл
Если С.ЭтоГруппа()=1 Тогда
Группа=Данные.СоздатьПодчиненныйЭлемент(С.Наименование);
Иначе
Э=Группа.СоздатьПодчиненныйЭлемент("Лицо");
Э.Значение=С.Код;
Э.УстановитьАтрибут("Наименование",С.Наименование);
КонецЕсли;
КонецЦикла;
//запись
Корень.Записать("C:\People.xml");
Предупреждение("ОК");
КонецПроцедуры
Управление MS Outlook из 1С
Код //создать новое сообщение из 1С в MS Outlook
Процедура Письмо_Создать()
//приложение
Попытка
Оле=CreateObject("Outlook.Application");
ЕстьОшибка=0;
Исключение
Предупреждение("Не удалось создать письмо в MS Outlook!");
ЕстьОшибка=1;
КонецПопытки;
//адрес
Адрес=СокрЛП(Лицо.АдресЭ);
//письмо
Если ЕстьОшибка=0 Тогда
//Outlook
Письмо=Оле.CreateItem(0);
Письмо.Subject=Клиент.Наименование+?(Лицо.Выбран()=0,"",", "+Лицо.Наименование);
Письмо.Body=гЛицо(Лицо);
Если ПустаяСтрока(Адрес)=0 Тогда
Письмо.Recipients.Add(Адрес);
КонецЕсли;
Если ПустаяСтрока(Путь)=0 Тогда
Письмо.Attachments.Add(Путь);
КонецЕсли;
Письмо.Display();
Иначе
//тема
Тема=Клиент.Наименование;
Если Лицо.Выбран()=1 Тогда
Тема=Тема+", "+Лицо.Наименование+"&body="+СокрЛП(Лицо.Имя);
КонецЕсли;
ЗапуститьПриложение("mailto:"+Адрес+"?subject="+Тема);
КонецЕсли;
КонецПроцедуры
//создать запись в календаре событий
Процедура Календарь_Создать()
//приложение
Попытка
Оле=CreateObject("Outlook.Application");
Исключение
Предупреждение("Не удалось создать запись в календаре событий в MS Outlook!");
Возврат;
КонецПопытки;
//задача
Задача=Оле.CreateItem(1);
Задача.Subject="Название встречи";
Задача.Start="01.11.2007 15:00:00";
Задача.End="01.11.2007 16:00:00";
Задача.Body="Описание встречи";
Задача.Location="Место встречи";
Задача.ReminderMinutesBeforeStart=30;
Задача.BusyStatus=0;
Задача.MeetingStatus=0;
Задача.Sensitivity=2;
Задача.Save();
КонецПроцедуры
//создать новую задачу из 1С в MS Outlook
Процедура Задача_Создать()
//приложение
Попытка
Оле=CreateObject("Outlook.Application");
Исключение
Предупреждение("Не удалось создать задачу в MS Outlook!");
Возврат;
КонецПопытки;
//задача
Задача=Оле.CreateItem(3);
Задача.Subject=Клиент.Наименование;
Задача.StartDate=ДатаДок+Константа.Фирма.ПериодСобытие;
Задача.Display();
Если Лицо.Выбран()=1 Тогда
Задача.Body=
""+Лицо.Наименование+"
|"+гЛицо(Лицо)+"
|"+СокрЛП(Лицо.Должность)+"
|моб. "+СокрЛП(Лицо.ТелефонМ)+"
|гор. "+СокрЛП(Лицо.ТелефонГ);
КонецЕсли;
КонецПроцедуры
Запустить из 1С страницу Интернет, отправить электронное почтовое сообщение
//создание почтового сообщения в ассоциированном почтовом клиенте с заданным электронным адресом
Процедура гКнопкаПочта(Значение) Экспорт
Если ПустаяСтрока(Значение)=0 Тогда
ЗапуститьПриложение("mailto:"+СокрЛП(Значение));
КонецЕсли;
КонецПроцедуры
//открытие страницы Интернет по заданному адресу в ассоциированном Интернет-браузере
Процедура гКнопкаИнтернет(Значение) Экспорт
Если ПустаяСтрока(Значение)=0 Тогда
ЗапуститьПриложение(СокрЛП(Значение));
КонецЕсли;
КонецПроцедуры
Внимание! Если у вас не получилось найти нужную информацию, используйте
рубрикатор или воспользуйтесь
поиском .
книги по программированию исходники компоненты шаблоны сайтов C++ PHP Delphi скачать