Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Добавление одинакового реквизита в 2 базы для выполнения прямого запроса

v7: Добавление одинакового реквизита в 2 базы для выполнения прямого запроса
Я
   Franchiser
 
17.06.20 - 11:18
Есть рабочая база 7.7 и тестовая база 7.7 (полученная из архива рабочей).
Нужно добавить в обе базы в справочник одинаковый реквизит так, чтобы он был в SQL и в файле DDS одинаковым, например SP12345.
Как это проще сделать, не тратя время не восстановление базы?
   Franchiser
 
1 - 17.06.20 - 11:34
Как генерируется файл DDS, в файле MD есть информация о связи реквизитов 7.7 с полями sql?
   trad
 
2 - 17.06.20 - 11:43
(0) добавить реквизит в одной ИБ, потом загрузить (не объединить) измененную конфигурацию в другой ИБ
   trad
 
3 - 17.06.20 - 11:44
но если выполнять запросы с применением метапарсера 1с++, то можно этим вопросом не заморачиваться
   Ёпрст
 
4 - 17.06.20 - 12:22
Ну или руками поменять ид реквизита в мд и пересоздать словарик, или и сам словарик потом ручками поправить
   Ёпрст
 
5 - 17.06.20 - 12:22
ну и в табличке, поменять имя реквизита
   Franchiser
 
6 - 17.06.20 - 12:35
(2) тогда все реквизиты заменятся из другого МД, а мне нужно только 1
   Franchiser
 
7 - 17.06.20 - 12:36
(3) прямые запросы из 1с 8
   Franchiser
 
8 - 17.06.20 - 12:37
(4) TurboMD или чем?
   trad
 
9 - 17.06.20 - 13:06
(6) исходя из этого "полученная из архива рабочей" я подумал что исходно мд-шники одинаковые
   Franchiser
 
10 - 17.06.20 - 13:10
(9) она восстановленная может год назад
   trad
 
11 - 17.06.20 - 13:13
(7) у меня была такая вариация на тему:
1. пишу запросы с использованием метаимен
2. процедура выполнения получает хэш текста запроса
3. в РС по хэшу ищет пропарсенный текст запроса
3.1 если не находи, то запускает семерку по ОЛЕ.отомейшн, там парсит, и пару хэш результат парсинга в РС
4. выполняет пропарсенный текст запроса

не будет работать только в случае применения ВТ
   Franchiser
 
12 - 17.06.20 - 13:20
(11) к сожалению уже запросы написаны без матаимен. Так в принципе я иногда занимаюсь парсингом DDS.
Про ВТ не понял, как разница, любые запросы парсятся.
   Franchiser
 
13 - 17.06.20 - 13:22
Интересно каким образом реализован парсинг в 1с++ в какой компоненте или скрипте, можно ли этот алгоритм куда то выщить в язык 1с8 или vbs и использовать в 8-ке ?
   trad
 
14 - 17.06.20 - 13:28
(12) текст ВТ зависит от параметров
   ADirks
 
15 - 17.06.20 - 13:30
(13) в SQL есть такая штука, как view'шки. Генеришь себе вьюшки для всего и вся,  и пишешь запросы на чистом русском SQL, откуда угодно

типа например так
Функция СоздатьПредставление_Документ(МетаДок, фПересоздавать)
    фОшибокНет = 1;
    
    ИмяДокумента = МетаДок.Идентификатор;
    ИмяТаблицы = РадугаСервис.ИмяТаблицыШапки(ИмяДокумента);
    ИмяТаблицыТЧ = РадугаСервис.ИмяТаблицыТабличнойЧасти(ИмяДокумента);
    
    сзРеквизиты = СоздатьОбъект("СписокЗначений");
    сзРеквизиты.ДобавитьЗначение("IDDoc");
    сзРеквизиты.ДобавитьЗначение("IDDoc идДок9");
    
    Для н = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
        МетаРекв = Метаданные.ОбщийРеквизитДокумента(н);
        Если МетаРекв.Сортировка = 0 Тогда
            ИмяРекв = МетаРекв.Идентификатор;
            КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
            сзРеквизиты.ДобавитьЗначение(КолонкаРекв+" "+ИмяРекв);
        КонецЕсли;
    КонецЦикла;

    Для н = 1 По МетаДок.РеквизитШапки() Цикл
        МетаРекв = МетаДок.РеквизитШапки(н);
        ИмяРекв = МетаРекв.Идентификатор;
        КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
        сзРеквизиты.ДобавитьЗначение(КолонкаРекв+" "+ИмяРекв);
    КонецЦикла;

    Для н = 1 По МетаДок.РеквизитТабличнойЧасти() Цикл
        МетаРекв = МетаДок.РеквизитТабличнойЧасти(н);
        Если МетаРекв.ИтогПоКолонке = 1 Тогда
            ИмяРекв = МетаРекв.Идентификатор;
            КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
            сзРеквизиты.ДобавитьЗначение(КолонкаРекв+" "+ИмяРекв);
        КонецЕсли;
    КонецЦикла;

    стрРеквизиты = СписокВСтроку(сзРеквизиты, ","+РазделительСтрок+СимволТабуляции);

    ИмяПредставления = "док"+ИмяДокумента;
    ТекстЗапроса = "
    |CREATE VIEW "+ИмяПредставления+" AS
    |SELECT
    |    "+стрРеквизиты+"
    |FROM "+ИмяТаблицы+" (NoLock)
    |";
    
    Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса, фПересоздавать) = 0 Тогда
        фОшибокНет = 0;
    КонецЕсли;

    // Табличная часть

    Если МетаДок.РеквизитТабличнойЧасти() > 0 Тогда
        сзРеквизиты = СоздатьОбъект("СписокЗначений");
        сзРеквизиты.ДобавитьЗначение("IDDoc");
        сзРеквизиты.ДобавитьЗначение("IDDoc идДок9");
        сзРеквизиты.ДобавитьЗначение("LineNo_");
        сзРеквизиты.ДобавитьЗначение("LineNo_ НомерСтроки");
        Для н = 1 По МетаДок.РеквизитТабличнойЧасти() Цикл
            МетаРекв = МетаДок.РеквизитТабличнойЧасти(н);
            ИмяРекв = МетаРекв.Идентификатор;
            КолонкаРекв = "SP"+РадугаСервис.ИДОбъекта(МетаРекв);
            сзРеквизиты.ДобавитьЗначение(КолонкаРекв+" "+ИмяРекв);
        КонецЦикла;
    
        стрРеквизиты = СписокВСтроку(сзРеквизиты, ","+РазделительСтрок+СимволТабуляции);
    
        ИмяПредставления = "докТЧ"+ИмяДокумента;
        ТекстЗапроса = "
        |CREATE VIEW "+ИмяПредставления+" AS
        |SELECT
        |    "+стрРеквизиты+"
        |FROM "+ИмяТаблицыТЧ+" (NoLock)
        |";
        Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса, фПересоздавать) = 0 Тогда
            фОшибокНет = 0;
        КонецЕсли;
    КонецЕсли;
    
    Возврат 1;
КонецФункции
   ADirks
 
16 - 17.06.20 - 13:36
в сборе это выглядит примерно так

CREATE VIEW докВыписка AS
SELECT
    IDDoc,
    IDDoc идДок9,
    SP12956 Комментарий,
    SP50802 Изменение,
    SP38950 БанковскийСчет,
    SP38953 Валюта,
    SP38956 ФормироватьПроводки,
    SP38961 Приход,
    SP38970 Расход
FROM DH38949 WITH (NoLock)

CREATE VIEW докВыпискаТЧ AS
SELECT
    IDDoc,
    IDDoc идДок9,
    LineNo_,
    LineNo_ НомерСтроки,
    SP38966 ДвижениеДенежныхСредств,
    SP38967 НазначениеПлатежа,
    SP38957 КоррСчет,
    SP38958 Субконто1,
    SP38959 Субконто2,
    SP38960 Субконто3,
    SP38961 Приход,
    SP38970 Расход,
    SP38962 ОперативныйУчет,
    SP38963 РежимОплаты,
    SP38964 Распределение,
    SP38971 ПлатежныйДокумент,
    SP38968 НомерДокВходящий,
    SP38969 ДатаДокВходящий,
    SP53217 ДатаОплаты,
    SP53223 РасчДокумент
FROM DT38949 WITH (NoLock)
   trad
 
17 - 17.06.20 - 13:36
(13) так в самой 1cpp и реализован, написан на c++
исходники можно добыть на сайте 1cpp.ru
   Холст
 
18 - 17.06.20 - 13:39
(16) Спасибо за пример, в вашем примере компонента Радуга, а не 1CPP ? Будет ли работать этот же запрос создания вьюхи  в 1СРР ?
   ADirks
 
19 - 17.06.20 - 13:40
(18) радуга - это исторически сложилось :)
РадугаСервис    = СоздатьОбъект("MetaDataWork");
   Franchiser
 
20 - 17.06.20 - 13:50
(19) идея понятна, только эти вьюшки слетать наверно будут при реструктуризации.
   Franchiser
 
21 - 17.06.20 - 13:52
Мне хотелось в 8-ке написать прямой запрос на 1с++ со всеми его фишками и особенностями, и тупо передать в какую то процедуру чтобы он распарсился.
   ADirks
 
22 - 17.06.20 - 13:53
(20) не будут
   Ёпрст
 
23 - 17.06.20 - 14:17
Да ё.. поменять любой реквизит в клюшках любому реквизиту.. пара минут.
Стоит оно тог, чтоб вьюхи еще лепить для задачи в (0) ?
:)
   Ёпрст
 
24 - 17.06.20 - 14:18
*поменять ид
   Franchiser
 
25 - 17.06.20 - 14:29
(23) чем менять в МД и когда, до реструктуризации?
   Franchiser
 
26 - 17.06.20 - 19:47
Ну так какими инструментами можно менять идентификаторы в MD?
   Ёпрст
 
27 - 17.06.20 - 20:16
(26) в мд правишь ид реквизита любым средством для работы с компаундом, самое простое, gcomp. Далее в конфе загрузить измененную. Оно само создаст в табличке нкжное поле. Если надо быстро, то мд лепится на пустышке, потом подмена мд и словарика и добавления поля ручками в табличке.
   Franchiser
 
28 - 17.06.20 - 21:36
(27) короче визуальной среды нет
   Ёпрст
 
29 - 17.06.20 - 22:02
(27)есть, но оно тебе не надо
   Franchiser
 
30 - 18.06.20 - 00:40
(27)>>Далее в конфе загрузить измененную
Что если подменить мд, без загрузки изменённой и последующей реструктуризацией?


>> Если надо быстро, то мд лепится на пустышке, потом подмена мд и словарика и добавления поля ручками в табличке.

В этом случае разбор компаунда не нужен?
 
 Рекламное место пустует
   AAA
 
31 - 18.06.20 - 05:41
По моему, если руками добавлять реквизит в 2 базы с идентичным MD, то и добавится реквизит с идентичным ID
Автору темы проще было все проверить на 2 чистых базах, займет 5 минут )
   Ёпрст
 
32 - 18.06.20 - 06:22
(30)написал же, если надо быстро, то подмена мд и словарика + добавление поля руками в табличке
   Ёпрст
 
33 - 18.06.20 - 06:23
(31) мд разный, да и на "идентичных" счетчик ид может быть разным
   ADirks
 
34 - 18.06.20 - 07:40
(23) Ещё как стоит. Один раз систему слепишь, зато потом жизнь сильно упрощается. Одна отладка запросов чего стоит.
Опять же, писать запросы из одной системы в другую сильно проще. У меня есть пара мест с запросами к трём базам одновременно.
   Ёпрст
 
35 - 18.06.20 - 08:22
(34) ну, если не разовая задача то да..всякие там свои таблички с иерархией еще лепить
   Franchiser
 
36 - 18.06.20 - 11:39
(35) если разбирать MD через gcomp, затем собирать, то насколько это стабильно работает, может ли что-то сломаться/потеряться. Я смотрю у gcomp много разных опций есть при которых что-то в контейнере можно выкинуть или очистить.
   Ёпрст
 
37 - 18.06.20 - 12:40
(36) там нечему ломаться, ну разве что gcomp может облегчить и улучшить структуру мд, выкинув лишние, не используемые вещи


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.