Имя: Пароль:
1C
1C 7.7
v7: Помогите скачать с проклаба ☑
0 dakrangel
 
01.11.12
✎
14:57
Добрый день, уважаемые форумчане.
Помогите скачать с проклаба, т.к. не являюсь участником клуба. Скачать диск с разработками так же нет возможности, закрыты порты на работе:
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=5721

Вышлите на: swyper85@rambler.ru
1 zak555
 
01.11.12
✎
14:58
а самому накатать ?
2 dakrangel
 
01.11.12
✎
15:00
(1) на данном примере будет дорабатываться полная регистрация изменений, которые делаются. даже при помощи пакетной обработки + повесить все это хочу на отдельную базу в SQL. Нужен толчек, которым является данная разработка
3 ADirks
 
01.11.12
✎
18:52
в качестве хм...  толчка


Перем фЗапрашиватьПричину Экспорт;
Перем фПричинаОбязательна Экспорт;

Перем КонтДок;
Перем ВидДок;
Перем МетаДок;

Перем сзКлючевыеКолонки;
Перем сзКолонки;
//===========================================================

///******************************** ADirks 20.07.2012 ************
Процедура Конструктор()
   фЗапрашиватьПричину = 1;
   фПричинаОбязательна = 1;
КонецПроцедуры
///******************************** ADirks 20.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция сзКолонки(стрКолонки)
   Перем сз;
   сз = СтрокуВСписок(стрКолонки, ",", 1);
   
   Для н = 1 По сз.РазмерСписка() Цикл
       Имя = сз.ПолучитьЗначение(н);
       
       МетаРекв = МетаДок.РеквизитТабличнойЧасти(Имя);
       Тип = МетаРекв.Тип;
       Если ПустаяСтрока(МетаРекв.Вид) = 0 Тогда
           Тип = Тип + "." + МетаРекв.Вид;
       КонецЕсли;
       
       сз.УстановитьЗначение(н, Имя, Тип);
   КонецЦикла;
   
   Возврат сз;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Процедура Инит(_Конт, стрКлючевыеКолонки, стрКолонки) Экспорт
   Сам = Сам(Контекст);
   
   Сам.ПолучитьБазовыйКласс().Инит(_Конт);
   
   КонтДок = _Конт;
   ВидДок = КонтДок.Вид();
   МетаДок = Метаданные.Документ(ВидДок);
   
   сзКлючевыеКолонки = сзКолонки(стрКлючевыеКолонки);
   сзКолонки = сзКолонки(стрКолонки);
КонецПроцедуры
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 20.07.2012 ************
Процедура ПриЗаписи_фЗапрашиватьПричину(НовЗнач)
   фЗапрашиватьПричину = ?(НовЗнач=1, 1, 0);
КонецПроцедуры
///******************************** ADirks 20.07.2012 ************

///******************************** ADirks 20.07.2012 ************
Процедура ПриЗаписи_фПричинаОбязательна(НовЗнач)
   фПричинаОбязательна = ?(НовЗнач=1, 1, 0);
   Если фПричинаОбязательна = 1 Тогда
       фЗапрашиватьПричину = 1;
   КонецЕсли;
КонецПроцедуры
///******************************** ADirks 20.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция СоздатьТаблицы() Экспорт
   оБаза = СоздатьОбъект("ТБазаДанных");
   

   //=============================================================
   //  Шапка
   ТекстЗапроса_Таблица = "Set NoCount ON
   |CREATE TABLE РегистраторИзмененийДокумента (
   |    ID bigint Identity(1,1) Not Null Primary Key Clustered,
   |    IDDoc char(9) Not Null,
   |    Колонки varchar(1024) Not Null,
   |    Пользователь char(9) Not Null,
   |    Время DateTime Not Null,
   |    Причина varchar(1024)
   |)
   |";
   
   тзп_Индекс = "CREATE INDEX IDDoc ON РегистраторИзмененийДокумента(IDDoc)";
   Если оБаза.СоздатьТаблицу("РегистраторИзмененийДокумента", ТекстЗапроса_Таблица, тзп_Индекс) <> 1 Тогда
       Возврат 0;
   КонецЕсли;

   //=============================================================
   //  Строки
   ТекстЗапроса_Таблица = "Set NoCount ON
   |CREATE TABLE РегистраторИзмененийДокумента_Строки (
   |    ID bigint Not Null,
   |    НомерСтроки int Not Null,
   |    Комментарий varchar(1024)
   |)
   |";
   
   тзп_Индекс = "CREATE INDEX IDDoc ON РегистраторИзмененийДокумента_Строки(ID)";
   Если оБаза.СоздатьТаблицу("РегистраторИзмененийДокумента_Строки", ТекстЗапроса_Таблица, тзп_Индекс) <> 1 Тогда
       Возврат 0;
   КонецЕсли;

   
   //=============================================================
   //  Значения
   ТекстЗапроса_Таблица = "Set NoCount ON
   |CREATE TABLE РегистраторИзмененийДокумента_Значения (
   |    ID bigint Not Null,
   |    НомерСтроки int Not Null,
   |    Имя varchar(256) Not Null,
   |    Тип int Not Null,
   |
   |    Пр_до char(13),
   |    Пр_после char(13),
   |    Спр_до char(13),
   |    Спр_после char(13),
   |    Док_до char(13),
   |    Док_после char(13),
   |
   |    Дата_до DateTime,
   |    Дата_после DateTime,
   |    Строка_до varchar(512),
   |    Строка_после varchar(512),
   |    Число_до float,
   |    Число_после float
   |)
   |";
   
   тзп_Индекс = "CREATE INDEX IDDoc ON РегистраторИзмененийДокумента_Значения(ID, НомерСтроки)";
   Если оБаза.СоздатьТаблицу("РегистраторИзмененийДокумента_Значения", ТекстЗапроса_Таблица, тзп_Индекс) <> 1 Тогда
       Сообщить(ТекстЗапроса_Таблица);
       Возврат 0;
   КонецЕсли;
   
   Возврат 1;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Процедура ДобавитьКолонки(ТекстЗапроса, сзКол)
   
   Для н = 1 По сзКол.РазмерСписка() Цикл
       Тип = "";
       Имя = сзКол.ПолучитьЗначение(н, Тип);
       ТекстЗапроса = ТекстЗапроса + ",
       |    ДокТЧ."+Имя+" ["+Имя+" $"+Тип+"]";
   КонецЦикла;
КонецПроцедуры
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция тзТЧ_изБазы()
   ТекстЗапроса = "Set NoCount ON
   |SELECT
   |    ДокТЧ.lineno_";
   ДобавитьКолонки(ТекстЗапроса, сзКлючевыеКолонки);
   ДобавитьКолонки(ТекстЗапроса, сзКолонки);
   
   ТекстЗапроса = ТекстЗапроса + "
   |FROM
   |    докТЧ"+ВидДок+" ДокТЧ
   |WHERE
   |    ДокТЧ.IDDoc = :Док
   |ORDER BY
   |    ДокТЧ.lineno_
   |";
   ЗапросСКЛ.УстановитьТекстовыйПараметр("Док", КонтДок.ТекущийДокумент());
   тз = ЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса);
   
   Возврат тз;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция тзТЧ_ИзКонтекста()
   стрКолонки = СписокВСтроку(сзКлючевыеКолонки, ",") + ", " + СписокВСтроку(сзКолонки);
   тзТЧ = СоздатьОбъект("ТаблицаЗначений");
   
   КонтДок.ВыгрузитьТабличнуюЧасть(тзТЧ, стрКолонки);
   
   Возврат тзТЧ;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция стрИндекс()
   стрИндекс = ""; зпт = "";
   Для н = 1 По сзКлючевыеКолонки.РазмерСписка() Цикл
       Имя = сзКлючевыеКолонки.ПолучитьЗначение(н);
       стрИндекс = стрИндекс + зпт + Имя+"*";
       зпт = ",";
   КонецЦикла;
   Возврат стрИндекс;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция сзКлюч(ит)
   сзКлюч = СоздатьОбъект("СписокЗначений");
   Для н = 1 По сзКлючевыеКолонки.РазмерСписка() Цикл
       Имя = сзКлючевыеКолонки.ПолучитьЗначение(н);
       сзКлюч.ДобавитьЗначение(ит.Получить(, Имя));
   КонецЦикла;
   Возврат сзКлюч;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция фСтрокиСовпадают(ит1, ит2, стрКоммент)
   стрКоммент = ""; зпт = "";
   фРасхожденийНет = 1;
   
   Для н = 1 По сзКолонки.РазмерСписка() Цикл
       Имя = сзКолонки.ПолучитьЗначение(н);
       Знач1 = ит1.Получить(, Имя);
       Знач2 = ит2.Получить(, Имя);
       
       Если Знач1 <> Знач2 Тогда
           фРасхожденийНет = 0;
           стрКоммент = стрКоммент + зпт + Имя+": "+Знач1+" != "+Знач2;
           зпт = РазделительСтрок;
       КонецЕсли;
   КонецЦикла;
   
   Возврат фРасхожденийНет;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция тзИзменения() Экспорт
   итТЧ_до = СоздатьОбъект("ИндексированнаяТаблица");
   тзТЧ_изБазы = тзТЧ_изБазы();
   итТЧ_до.Загрузить(тзТЧ_изБазы);

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

           тзИзменения.тзДо = КопироватьСтруктуруТЗ(тзТЧ_изБазы);
           тзИзменения.тзДо.НоваяСтрока();
           КопироватьСтрокуТЗ(тзИзменения.тзДо, итТЧ_до);
       Иначе
           стрКоммент = "";
           итТЧ_после.НомерСтроки = нСтр;
           фСтрокиСовпадают = фСтрокиСовпадают(итТЧ_до, итТЧ_после, стрКоммент);
           Если фСтрокиСовпадают <> 1 Тогда
               тзИзменения.НоваяСтрока();
               тзИзменения._ВидРасхождения_ = стрКоммент;

               тзИзменения.тзДо = КопироватьСтруктуруТЗ(тзТЧ_изБазы);
               тзИзменения.тзДо.НоваяСтрока();
               КопироватьСтрокуТЗ(тзИзменения.тзДо, итТЧ_до);

               тзИзменения.тзПосле = КопироватьСтруктуруТЗ(тзТЧ_изБазы);
               тзИзменения.тзПосле.НоваяСтрока();
               //тзПосле = СоздатьОбъект("ТаблицаЗначений");
               //итТЧ_после.ВыгрузитьСтроку(тзПосле);
               //тзИзменения.тзПосле = тзПосле;
               КопироватьСтрокуТЗ(тзИзменения.тзПосле, итТЧ_после, 1);
               //тзИзменения.тзПосле.lineno_ = нСтр;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   
   Возврат тзИзменения;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция стрДатаСКЛ(д)
   Возврат "Convert(DateTime, '"+Формат(д, "ДГГГГММДД")+"', 112)";
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция тзп_Записать_Значения(тзИзм, сзКолонки)
   тзп = "";
   
   тзДо = тзИзм.тзДо;
   тзПосле = тзИзм.тзПосле;
   
   Для н = 1 По сзКолонки.РазмерСписка() Цикл
       Имя = сзКолонки.ПолучитьЗначение(н);
       Знач1 = тзДо.ПолучитьЗначение(1, Имя);
       Тип = ТипЗначения(Знач1);
       Попытка
           Знач2 = тзПосле.ПолучитьЗначение(1, Имя);
       Исключение
           Если Тип = 3 Тогда
               Знач2 = ПустаяДатаСКЛ;
           Иначе
               Знач2 = ПолучитьПустоеЗначение(ТипЗначенияСтр(Знач1));
           КонецЕсли;
       КонецПопытки;
       
       Если Тип = 1 Тогда
           стрКолонки = "Число_до, Число_После";
           стрЗначения = ""+Знач1+", "+Знач2;
       ИначеЕсли Тип = 2 Тогда
           Знач1 = СтрЗаменить(Знач1, "'", "''");
           Знач2 = СтрЗаменить(Знач2, "'", "''");
           стрКолонки = "Строка_до, Строка_После";
           стрЗначения = "'"+Знач1+"', '"+Знач2+"'";
           
       ИначеЕсли Тип = 3 Тогда
           стрКолонки = "Дата_до, Дата_После";
           стрЗначения = стрДатаСКЛ(Знач1)+", "+стрДатаСКЛ(Знач2);
       Иначе
           Если Тип = 10 Тогда
               Префикс = "Пр";
           ИначеЕсли Тип = 11 Тогда
               Префикс = "Спр";
           ИначеЕсли Тип = 12 Тогда
               Префикс = "Док";
           КонецЕсли;
           стрКолонки = Префикс+"_до, "+Префикс+"_После";
           стрЗначения = "'"+РадугаСервис.ЗначениеВДлиннуюСтрокуБД(Знач1)+"', '"+РадугаСервис.ЗначениеВДлиннуюСтрокуБД(Знач2)+"'";
       КонецЕсли;
       
       тзп = тзп + "
       |INSERT INTO РегистраторИзмененийДокумента_Значения (ID, НомерСтроки, Имя, Тип, "+стрКолонки+")
       |VALUES (@id, "+тзИзм.НомерСтроки+", '"+Имя+"', "+Тип+", "+стрЗначения+")";
   КонецЦикла;
   
   Возврат тзп;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
Функция Записать(тзИзм, стрПричина)
   стрКолонкиСТипами = СписокВСтроку(сзКлючевыеКолонки, ",", 0, ":") + "," + СписокВСтроку(сзКолонки, ",", 0, ":");
   
   ТекстЗапроса = "Set NoCount ON
   |DECLARE @time DateTime, @iddoc char(9), @id bigint
   |Set @time = GetDate()
   |Set @iddoc = '"+РадугаСервис.ЗначениеВСтрокуБД(КонтДок.ТекущийДокумент())+"'
   |
   |INSERT INTO РегистраторИзмененийДокумента (IDDoc, Колонки, Пользователь, Время, Причина)
   |VALUES (@iddoc, '"+стрКолонкиСТипами+"', '"+РадугаСервис.ЗначениеВСтрокуБД(Пользователь.ТекущийЭлемент())+"', @time, '"+стрПричина+"')
   |Set @id = @@IDENTITY
   |";
   
   тзИзм.ВыбратьСтроки();
   Пока тзИзм.ПолучитьСтроку() = 1 Цикл
       ТекстЗапроса = ТекстЗапроса + "
       |INSERT INTO РегистраторИзмененийДокумента_Строки (ID, НомерСтроки, Комментарий)
       |VALUES (@id, "+тзИзм.НомерСтроки+", '"+тзИзм._ВидРасхождения_+"')";
       ТекстЗапроса = ТекстЗапроса + тзп_Записать_Значения(тзИзм, сзКлючевыеКолонки);
       ТекстЗапроса = ТекстЗапроса + тзп_Записать_Значения(тзИзм, сзКолонки);
   КонецЦикла;
   
   Запрос = СоздатьОбъект("ODBCRecordSet");
   рез = Запрос.Выполнить(ТекстЗапроса);
   Если рез <> 1 Тогда
       Сообщить(Запрос.ПолучитьОписаниеОшибки(), "!");
       оЗпр = СоздатьОбъект("ТОтчет.Запрос");
       оЗпр.ПоказатьТекстЗапроса(ТекстЗапроса);
       Возврат 0;
   КонецЕсли;
   
   Возврат 1;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 19.07.2012 ************
//Функция _ФормаПослеЗаписи(Источник, фУспех) Экспорт
Функция _ПриЗаписи() Экспорт
   Сам = Сам(Контекст);
   
   тзТЧ_изБазы = тзТЧ_изБазы();
   
   тзИзм = тзИзменения();
   //РедакторТЗ(тзИзм, "тзИзм");
   
   Если тзИзм.КоличествоСтрок() = 0 Тогда
       Возврат 1;
   КонецЕсли;
   
   стрПричина = "";
   Если фЗапрашиватьПричину = 1 Тогда
       Если ВвестиСтроку(стрПричина, "Причина корректировки", 255) <> 1 Тогда
           Если фПричинаОбязательна = 1 Тогда
               Возврат 0;
           КонецЕсли;
       КонецЕсли;
       Если фПричинаОбязательна = 1 Тогда
           Если ПустаяСтрока(стрПричина) = 1 Тогда
               Предупреждение("Необходимо указать причину корректировки!", 30);
               Возврат 0;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   
   Если Записать(тзИзм, стрПричина) <> 1 Тогда
       Возврат 0;
   КонецЕсли;

   Возврат 1;
КонецФункции
///******************************** ADirks 19.07.2012 ************

///******************************** ADirks 20.07.2012 ************
Функция стСтрока_Запросы(ид, Колонки) Экспорт
   Перем ПолныйТип, Тип;
   
   сзКол = СтрокуВСписок(Колонки, ",", 1, ":");
   стрКолонки = "";
   зпт = "";
   Для н = 1 По сзКол.РазмерСписка() Цикл
       Имя = сзКол.ПолучитьЗначение(н, ПолныйТип);
       нПоз = Найти(ПолныйТип, ".");
       Если нПоз > 0 Тогда
           Тип = Лев(ПолныйТип, нПоз-1);
       Иначе
           Тип = ПолныйТип;
       КонецЕсли;
       сзКол.УстановитьЗначение(н, Имя, Тип);
       
       Если Тип = "Перечисление" Тогда
           Префикс = "Пр";
       ИначеЕсли Тип = "Справочник" Тогда
           Префикс = "Спр";
       ИначеЕсли Тип = "Документ" Тогда
           Префикс = "Док";
       Иначе
           Префикс = Тип;
       КонецЕсли;
       
       стрКолонки = стрКолонки + зпт + "    (
       |        SELECT "+Префикс+"_до
       |        FROM РегистраторИзмененийДокумента_Значения (NoLock)
       |        WHERE ID = Строки.ID AND НомерСтроки = Строки.НомерСтроки AND Имя = '"+Имя+"'
       |    ) as ["+Имя+"_до $"+Тип+"],
       |    (
       |        SELECT "+Префикс+"_после
       |        FROM РегистраторИзмененийДокумента_Значения (NoLock)
       |        WHERE ID = Строки.ID AND НомерСтроки = Строки.НомерСтроки AND Имя = '"+Имя+"'
       |    ) as ["+Имя+"_после $"+Тип+"]";
       зпт = ",
       |";
   КонецЦикла;
   
   ТекстЗапроса = "
   |SELECT
   |    Строки.ID as ID,
   |    Строки.НомерСтроки as НомерСтроки,
   |    "+стрКолонки+"
   |FROM
   |    РегистраторИзмененийДокумента_Строки Строки (NoLock)
   |WHERE
   |    Строки.ID = "+ид+"
   |";
   
   ст = оМетоды.Структура("ТекстЗапроса", ТекстЗапроса, "сзКолонки", сзКол);
   
   Возврат ст;
КонецФункции
///******************************** ADirks 20.07.2012 ************


Так-то это класс, но думаю смысл действий д.б. понятен.
Инициализация в ПриОткрытии, примерно:
   оРегистратор = СоздатьОбъект("ТРегистраторИзмененийДокумента");
   оРегистратор.Инит(Контекст, "ВидЭлемента,Товар", "Количество,Цена,Сумма,Всего,Скидка");
   оРегистратор.фЗапрашиватьПричину = 0;
4 YHVVH
 
01.11.12
✎
19:11
совсем народ обленился и обнаглел.
5 dakrangel
 
01.11.12
✎
19:19
(3) Спасибо, кое-чего для себя взял
(4) Народ не обленился, а попросил помочь скачать, чтобы не изобретать велосипед, а позаимствовать готовый и отлаженный кусок для своего замысла.

Пока дожидался помощи, выстроил временный лог в xml для определенных типов документов. Осталось перекинуть в sql и допилить.

ADirks, еще раз спасибо
6 ADirks
 
01.11.12
✎
19:36
Вот люблю, когда человек взял, и что-то позаимствовал для себя без дурных вопросов :)
7 Скользящий
 
01.11.12
✎
19:44
Обработка 2005 года. Проще скачать на торрентах проклабовский диск и пользоваться. У меня валяется где то, только искать там лень.
8 Скользящий
 
01.11.12
✎
19:54