Имя: Пароль:
1C
1C 7.7
v7: Вопрос по переводу dbf 7.7 на SQL
,
0 never_sleep
 
28.05.13
11:40
Есть 2 сервера:
win2003r2 и win2008r2 - оба лицензионные.
1Ска стоит на win2003 и работает на dbf базах. Нужно срочно перевести базу на SQL. win2008 сервер пока пустует.

Если я поставлю sql2005 на win2003r2, то чтобы на нем заработала 1Ска придется подменять BkEnd.dll.

Вопрос: Если подменю этот файлик работоспособность 1Ски под dbf базами не пострадает? Ибо на одном серванте некоторое время, пока не проверю корректность выгрузки, должны будут сосуществовать 2 базы: под скуль и под ДБФ.
1 zak555
 
28.05.13
11:41
> Нужно срочно перевести базу на SQL


что за срочность ?
2 КонецЦикла
 
28.05.13
11:43
нет по идее
3 Lionee
 
28.05.13
11:45
(0) sql и dbf ващеето  разные каталоги баз данных
4 Lionee
 
28.05.13
11:45
так что меня что хочешь
5 Lionee
 
28.05.13
11:51
меня=меняй
6 never_sleep
 
28.05.13
12:03
(1) Всего то вес в 6 гигов у базы и под 2 гига у некоторых регистров. (параллельно пытаюсь свернуть базу).
(3) Файлик подменяется не в каталоге базы данных, а в каталоге установленной 1С.
7 never_sleep
 
28.05.13
12:05
сейчас, чтобы спасти ситуацию. пытаюсь одновременно пробовать разные меры выхода из ситуации. Ибо скоро один из регистров станет 2 гига, и тогда кранты :(
8 zak555
 
28.05.13
12:07
(6) сделай копию регистров
9 ЧеловекДуши
 
28.05.13
12:11
(0) Не сци, Ставь лучше так

Вынь 2003 х64, SQL 2005 х64...  и подмени файлик BkEnd.dll

Так же придется переписать запросы, для обращения к подчиненным документам, системные от 1С.
10 1Сергей
 
28.05.13
12:11
нормально патченный BkEnd.dll работает
11 ЧеловекДуши
 
28.05.13
12:12
+ И заменить выбор подчиненных документов на прямой запрос.


////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Проведен: 1 - отберать по проведенным,
//            0 - не учитывать (если ""БезУдаленых = 0"", то отбераются все документы)
//БезУдаленых:  1 - отбераются не помеченные на удаления,
//                2 - отбираются только помеченные на удаления, 0 - не учитывать
//Параметры "Проведен" и "БезУдаленых", при не нулевом значении, отрабатывают совместно по принципу "ИЛИ".
//
//Порядок: 0 - Сортровать по возрастанию, 1 - Сортировать по Убыванию.
//
//ВремяДатаТайм: 0 - Отбирать документ, как Дату и время (ИД документа не учитывается)... 1 - Учитывается еще и ИД документа
Функция глВыбратьПодчиненныеДокументы(ДатаНач,ДатаКон,Док,ТипДок="",Проведен=0,БезУдаленых=0,Порядок=0,ВремяДатаТайм=1) Экспорт
   Перем Рез;
   Перем ТЗЗапрос, СкульЗапрос;
   Перем СтрокаДляЗапроса, НомСимв, КолСимв, СтрокПоиск,СтрокПолуч;
   Перем МетаНомер, ЧтоЭто;
   
   //Для локального применения
   //глRecord1С = СоздатьОбъект("ODBCRecordSet");
   //глMeta1С = СоздатьОбъект("MetaDataWork");
   
   Если ТипЗначенияСтр(глRecord1С) <> "ODBCRecordSet" Тогда
       глRecord1С = 0;
       глRecord1С = СоздатьОбъект("ODBCRecordSet");
   КонецЕсли;
   
   Если ТипЗначенияСтр(глMeta1С) <> "MetaDataWork" Тогда
       глMeta1С = 0;
       глMeta1С = СоздатьОбъект("MetaDataWork");
   КонецЕсли;
   
   Рез = 0; //Ошибка в запросе!
   Если ТипЗначения(Док) <> 12 Тогда //12 - агрегатный тип данных 'Документ';
       Возврат Рез;
   ИначеЕсли ПустоеЗначение(Док) = 1 Тогда
       Рез = СоздатьОбъект("ТаблицаЗначений");
       Рез.НоваяКолонка("Док","Документ");
       Возврат Рез;
   КонецЕсли;
   
   Если глОтладкаSQL = 1 Тогда
       глRecord1С.Отладка(1);
   КонецЕсли;
   
   СкульЗапрос="
   |SELECT
   | dbo.sp_tohex(TabJ.IDDOCDEF,4)+TabJ.IDDOC [Док $Документ]
   |FROM
   | _1SCRDOC As TabRod(NOLOCK)
   |INNER JOIN
   | _1SJOURN As TabJ(NOLOCK) ON (TabRod.CHILDID = TabJ.IDDOC)
   |WHERE
   | TabRod.MDID = 0 -- только документы, без граф отбора
   | AND TabRod.PARENTVAL = '"+глMeta1С.ЗначениеВСамуюДлиннуюСтрокуБД(Док.ТекущийДокумент())+"'
   |";
   Если ПустоеЗначение(ДатаНач)=0 Тогда
       МетаНомер = "";
       Если ТипЗначения(ДатаНач) = 12 Тогда //Документ
           Если ВремяДатаТайм = 0 Тогда
               МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаНач.ПолучитьПозицию());
           Иначе
               МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаНач.ПолучитьПозицию())+глMeta1С.ЗначениеВСтрокуБД(ДатаНач.ТекущийДокумент());
           КонецЕсли;
       ИначеЕсли ТипЗначения(ДатаНач) = 3 Тогда //3 - тип данных Дата;
           МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(ДатаНач);
       ИначеЕсли ПустоеЗначение(Дата(ДатаНач)) = 0 Тогда
           МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(Дата(ДатаНач));
       КонецЕсли;
       Если ПустоеЗначение(МетаНомер) = 0 Тогда
             СкульЗапрос=СкульЗапрос+"
             |and TabJ.DATE_TIME_IDDOC>='"+МетаНомер+"'
           |";
       КонецЕсли;
   КонецЕсли;
   Если ПустоеЗначение(ДатаКон)=0 Тогда
       МетаНомер = "";
       Если ТипЗначения(ДатаКон) = 12 Тогда //Документ
           Если ВремяДатаТайм = 0 Тогда
               МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаКон.ПолучитьПозицию())+"Z";
           Иначе
               МетаНомер = ""+глMeta1С.ПолучитьДатуВремяИдДок(ДатаКон.ПолучитьПозицию())+глMeta1С.ЗначениеВСтрокуБД(ДатаКон.ТекущийДокумент());
           КонецЕсли;
       ИначеЕсли ТипЗначения(ДатаНач) = 3 Тогда //3 - тип данных Дата;
           МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(ДатаКон)+"Z";
       ИначеЕсли ПустоеЗначение(Дата(ДатаНач)) = 0 Тогда
           МетаНомер = ""+глMeta1С.ПолучитьСтрИзДаты(Дата(ДатаНач))+"Z";
       КонецЕсли;
       Если ПустоеЗначение(МетаНомер) = 0 Тогда
             СкульЗапрос=СкульЗапрос+"
             |and TabJ.DATE_TIME_IDDOC<='"+МетаНомер+"'
           |";
       КонецЕсли;
   КонецЕсли;
   Если ПустоеЗначение(СокрЛП(ТипДок)) = 0 Тогда
       СтрокПоиск = СокрЛП(ТипДок);
       КолСимв       = СтрЧислоВхождений(СтрокПоиск,",");
       Если КолСимв <> 0 Тогда
           КолСимв = КолСимв + 1;
           СтрокаДляЗапроса = "";
           Пока КолСимв <> 0 Цикл
               
               Если КолСимв = 1 Тогда //Он один
                   СтрокПолуч = СокрЛП(СтрокПоиск);
               Иначе
                   НомСимв       = Найти(СтрокПоиск,",");
                   Если НомСимв = 0 Тогда
                       Сообщить("Ошибка в разборе команды: "+ТипДок);
                   КонецЕсли;
                   СтрокПолуч = СокрЛП(Сред(СтрокПоиск,1,НомСимв-1));
                   СтрокПоиск = СокрЛП(Сред(СтрокПоиск,НомСимв+1));
               КонецЕсли;
               
               Если ПустоеЗначение(СтрокПолуч) = 0 Тогда
                   ЧтоЭто = ЭтоЧисло(СтрокПолуч);
                   Если СуществуетТакойВидДок(ЧтоЭто) = 1 Тогда
                       МетаНомер = глMeta1С.ИДДокумента(ЧтоЭто);
                       СтрокаДляЗапроса = СтрокаДляЗапроса + ?(ПустоеЗначение(СтрокаДляЗапроса)=1,"",",") + "'"+МетаНомер+"'";
                   КонецЕсли;
               КонецЕсли;
               
               КолСимв = КолСимв - 1;
           КонецЦикла;
           Если ПустоеЗначение(СтрокаДляЗапроса) = 0 Тогда
               СкульЗапрос=СкульЗапрос+"
               |and TabJ.IDDOCDEF in ("+СтрокаДляЗапроса+")
               |";  // '"+глMeta1С.ИДДокумента(ТипДок)+"'
           КонецЕсли;
       Иначе
           МетаНомер  = "";
           СтрокПолуч = СокрЛП(ТипДок);
           
           Если ПустоеЗначение(СтрокПолуч) = 0 Тогда
               ЧтоЭто = ЭтоЧисло(СтрокПолуч);
               Если СуществуетТакойВидДок(ЧтоЭто) = 1 Тогда
                   МетаНомер = глMeta1С.ИДДокумента(ЧтоЭто);
                   СтрокаДляЗапроса = СтрокаДляЗапроса + ?(ПустоеЗначение(СтрокаДляЗапроса)=1,"",",") + "'"+МетаНомер+"'";
               КонецЕсли;
           КонецЕсли;
           
           Если ПустоеЗначение(МетаНомер) = 0 Тогда
               СкульЗапрос=СкульЗапрос+"
               |and TabJ.IDDOCDEF='"+МетаНомер+"'
               |";
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   Если Проведен = 1 Тогда
       Если БезУдаленых = 1 Тогда
           СкульЗапрос=СкульЗапрос+"
           |and (((TabJ.CLOSED & 1) = 1) or (TabJ.IsMark = 0))
           |";
       ИначеЕсли БезУдаленых = 2 Тогда
           СкульЗапрос=СкульЗапрос+"
           |and (((TabJ.CLOSED & 1) = 1) or (TabJ.IsMark <> 0))
           |";
       Иначе
           СкульЗапрос=СкульЗапрос+"
           |and ((TabJ.CLOSED & 1) = 1)
           |";
       КонецЕсли;
   Иначе
       Если БезУдаленых = 1 Тогда
           СкульЗапрос=СкульЗапрос+"
           |and (TabJ.IsMark = 0)
           |";
       ИначеЕсли БезУдаленых = 2 Тогда
           СкульЗапрос=СкульЗапрос+"
           |and (TabJ.IsMark <> 0)
           |";
       КонецЕсли;
   КонецЕсли;
   СкульЗапрос=СкульЗапрос+"
   |ORDER BY
   |TabRod.CHILD_DATE_TIME_IDDOC "+?(Порядок=0,"ASC","DESC")+"
   |";
   
   Если глRecord1С.Подготовить(СкульЗапрос)=0 Тогда
       Сообщить("Запрос не прошел "+глRecord1С.ПолучитьОписаниеОшибки()+"
       |"+СкульЗапрос,"!");
       Возврат Рез;
   КонецЕсли;
   
   ТЗЗапрос = 0;
   ТЗЗапрос = СоздатьОбъект("ТаблицаЗначений");
   Попытка
       ЗначСпс = глRecord1С.ВыполнитьИнструкцию(,ТЗЗапрос,1);
   Исключение
       Сообщить("ВыполнитьИнструкцию: "+ОписаниеОшибки());
   КонецПопытки;
   
   Попытка
       глRecord1С.Закрыть();
   Исключение
       Сообщить("Закрыть SQL запрос: "+ОписаниеОшибки());
   КонецПопытки;
   
   Если ТипЗначенияСтр(ТЗЗапрос) <> "ТаблицаЗначений" Тогда
       Сообщить("Нет нужного параметра!","!");
   ИначеЕсли ТЗЗапрос.КоличествоКолонок() = 0 Тогда
       ТЗЗапрос.НоваяКолонка("Док","Документ");
       Сообщить("Запрос не выполнен:
       |"+СкульЗапрос,"!");
   Иначе
       Рез = ТЗЗапрос;
   КонецЕсли;
   
   Возврат Рез;
КонецФункции
12 ЧеловекДуши
 
28.05.13
12:14
+ При открытии Журнала, подчиненных документов, это Он же общий журнал, вставить такой код


   Если ТипЗначенияСтр(ДокументОснованиеЖурнала) = "Документ" Тогда // форма журнала подчиненных документов
       глVk_hook.ТекстSQL="Select JOURN.* from _1SJOURN JOURN(NOLOCK INDEX=ACDATETIME), _1SCRDOC CRDOC(NOLOCK INDEX=PARENT) where JOURN.DATE_TIME_IDDOC=CRDOC.CHILD_DATE_TIME_IDDOC and CRDOC.MDID=? and CRDOC.PARENTVAL=? and CRDOC.CHILD_DATE_TIME_IDDOC>=? and CRDOC.CHILD_DATE_TIME_IDDOC<=? order by CRDOC.MDID, CRDOC.PARENTVAL, CRDOC.CHILD_DATE_TIME_IDDOC";
       глVk_hook.НовыйSQL="Select JOURN.* from _1SJOURN JOURN(NOLOCK), _1SCRDOC CRDOC(NOLOCK) where JOURN.DATE_TIME_IDDOC=CRDOC.CHILD_DATE_TIME_IDDOC and CRDOC.MDID=? and CRDOC.PARENTVAL=? order by CRDOC.MDID, CRDOC.PARENTVAL, CRDOC.CHILD_DATE_TIME_IDDOC";
       глVk_hook.УстановитьЗаменуSQL();
   КонецЕсли;
13 Sereja
 
28.05.13
12:20
гугли "Секретный релиз". Там без подмены длл все делается
14 ЧеловекДуши
 
28.05.13
12:22
(13) Ага, прямо мана небесная :)
Подменивать, ДЛЛ или Екзе, Какая разница?
15 never_sleep
 
28.05.13
12:25
ЧеловекДуши,
пообщался с парой-тройкой франчайзи в нашем городе. Сказали, что при переходе на скуль вообще ничего в конфигурации не придется трогать. Получается наврали?
16 ЧеловекДуши
 
28.05.13
12:29
(15) Запомни, если коснешься Windows x64 (бит), то ты достойно уценишь советы франей.
А так же, если поставишь х32, то потом поймешь, что х64 было бы лучше :)

Но это все оценивается степенью мастерства в Прямых запросах.
Если вы не будете баловаться и злоупотреблять прямыми запросами, то думается и 4 Гб на 32-у битной оси у вас все пойдет :)
17 daniyar5436
 
28.05.13
12:38
Как думаете, вариант
создать аналогичную конфу на скл пустую,
перетащить справочники доки, допустим с начала года, с оригинальной дбф базы, залить начальные остатки, допустим на начало года, провести. Плохой вариант?
18 Mikeware
 
28.05.13
12:40
(17) для тупых идиотов - вполне приемлемый...
19 ЧеловекДуши
 
28.05.13
12:41
(17) Мертвый, тогда зачем SQL?
Смысл в SQL как раз в том, что ненужно резать данные, которые можно использовать для аналитики :)
20 never_sleep
 
28.05.13
13:27
(17) Как уже говорил, парралельно пытаюсь свернуть базу (подобным образом, кстати). Но это не dbf-->sql, а dbf--->dbf
вот этим методом: http://alexeev.pro/?page_id=1282
Правда один из регистров не сворачивается (1Ска упирается в потолок по оперативке 2Гб) и повисает. Остатки и партии выгрузились вроде правильно. Сейчас вот запустил выгрузку всех доков за 13 год. Тьма их. Сижу жду.
(18) А почему для тупы идиотов? Подскажите, может я зря тут стараюсь.
(16) Огромное спасибо за комментарии, учту их при миграции.
21 never_sleep
 
28.05.13
13:28
(10) Сергей, доверюсь вам и попробую. Даром что всегда можно поменять dll'ку обратно.
22 spock
 
28.05.13
13:39
(0)Переходить на v8.2 еще не предлагали?
23 never_sleep
 
28.05.13
13:43
(22) Собираюсь мигрировать на 8ку (на УТ и Бух) до конца года. Скоро даже закуплю конфигурации (пока без лицензий на доп. пользователей). Но это пока задача менее важная чем, сейчас стоит передо мной. Моя база может встать уже завтра и переход на восьмерку это не вариант решения проблемы. (хотя, разумеется, мигрировать надо)
24 Ёпрст
 
28.05.13
13:43
(15) не наврали, и патчить ничего не надо.
25 GStiv
 
28.05.13
13:51
Только буквально загружать базу в SQL, причина простая не мог даже провести свертку базы из-за ошибки -310, а там уже запустил свертку