|
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
|
| Форум | Правила | Описание | Секции | Поиск |