Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Обновить реквизиты регистра (число прочтений - 2200 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Обновить реквизиты регистра
09. Февраля 2011 :: 07:36
Печать  
База ДБФ.
Есть регистр, в который хочу добавить один реквизит. Значение этого реквизита - один из реквизитов измерения. Но перепроводить документы за весь период учета что-то боязно. Если б база была на SQL, проблем бы не было - сделать апдейт таблички с нужными условиями. А как бы поступить с ДБФ?
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Обновить реквизиты регистра
Ответ #1 - 09. Февраля 2011 :: 08:07
Печать  
Так через OLE DB не подходит? Только надо зайти в базу в немонопольном режиме.
Я так делал, вроде все ок
Тоже доки перепроводить очень не хотелось, а в регистр добавилось еще одно измерение.

вот кусок кода, если что Улыбка
Код
Выбрать все
        _Результат.Очистить();
	_Результат.НоваяКолонка("Регистр","Строка",70,,"Регистр");
	_Результат.НоваяКолонка("Обработано","Число",10,,"Обработано");
	Если _ОтгрузкаПокупателям = 1 Тогда
		_ЗапросOLEDB.СоздатьКоманду();
		_Текст = "
		|UPDATE Рег from $Регистр.ОтгрузкаПокупателям as Рег
		|SET $Рег.Поставка = Рег.iddoc
		|";
		_ЗапросOLEDB.Текст = _Текст;
		_рез = _ЗапросOLEDB.ВыполнитьСкалярный(0);
		_Результат.НоваяСтрока();
		_Результат.Регистр = "ОтгрузкаПокупателям";
		_Результат.Обработано = _рез;
	КонецЕсли;
	Если _ВозвратОтПокупателей = 1 Тогда
		_ЗапросOLEDB.СоздатьКоманду();
		_Текст = "
		|UPDATE Рег from $Регистр.ВозвратОтПокупателей as Рег
		|LEFT JOIN $ДокументСтроки.ВозвратОтПокупателей as Док
		|ON Док.iddoc = Рег.iddoc and Док.lineno = Рег.lineno
		|SET $Рег.Поставка = " + ставка") + "
		|";
		_ЗапросOLEDB.Текст = _Текст;
		_рез = _ЗапросOLEDB.ВыполнитьСкалярный(0);
		_Результат.НоваяСтрока();
		_Результат.Регистр = "ВозвратОтПокупателей";
		_Результат.Обработано = _рез;
	КонецЕсли;
	Если _РеализацияПокупателям = 1 Тогда
		_ЗапросOLEDB.СоздатьКоманду();
		_Текст = "
		|UPDATE Рег from $Регистр.РеализацияПокупателям as Рег
		|LEFT JOIN $ДокументСтроки.РеализацияПокупателям as Док
		|ON Док.iddoc = Рег.iddoc and Док.lineno = Рег.lineno
		|SET $Рег.Поставка = " + ставка") + "
		|";
		_ЗапросOLEDB.Текст = _Текст;
		_рез = _ЗапросOLEDB.ВыполнитьСкалярный(0);
		_Результат.НоваяСтрока();
		_Результат.Регистр = "РеализацияПокупателям";
		_Результат.Обработано = _рез;
	КонецЕсли; 

  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Обновить реквизиты регистра
Ответ #2 - 09. Февраля 2011 :: 08:09
Печать  
Там вроде ж что-то с индексами потом твориться непонятное.
Или я что-то путаю?
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Обновить реквизиты регистра
Ответ #3 - 09. Февраля 2011 :: 08:11
Печать  
Ну дык убей их и переиндексируй Улыбка
Я так в свое время все свои базы перелопатил, вроде все было в поряде.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Обновить реквизиты регистра
Ответ #4 - 09. Февраля 2011 :: 08:20
Печать  
Ладно, буду пробовать. Спасибо.
А что у тебя вот это:
Код
Выбрать все
ставка") 

  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Обновить реквизиты регистра
Ответ #5 - 09. Февраля 2011 :: 09:29
Печать  
Да это у меня пережиток моей безграмотности на момент проектирования БД - сделал одно из измерений типа "Документ",
а надо было "Документ.<КонретныйВид>.

Соответсвенно в запросах необходимо использовать substr() при фильтрации по измерению, чтобы отсекать <ВидДокумента>.

Вот и вставил проверку по метаданным, а то вдруг решу исправить регистр, тогда весь код придется перелапачивать..

Наверное сумбурно объяснил.. Улыбка
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Обновить реквизиты регистра
Ответ #6 - 09. Февраля 2011 :: 09:31
Печать  
вот кусок старого запроса

Код
Выбрать все
      _Текст = "
	|SELECT
	|  SUM(Кол) as [Кол :Число.16.2],
	|  SUM(СуммаОтп) as [СуммаОтп :Число.16.2],
	|  SUM(СуммаРозн) as [СуммаРозн :Число.16.2]
	|FROM
	|  (SELECT
	|     Р.Товар AS Товар,
	|     Р.Кол AS Кол,
	|     Р.СуммаОтп AS СуммаОтп,
	|     Р.СуммаРозн AS СуммаРозн
	|   FROM
	|     РегистрИтоги_ОстаткиТовара as Р
	|   WHERE
	|     period = :НачПредМесяца
	|     AND Р.Товар = :Товар";
	Если ПустоеЗначение(_ФильтрПоставщик) = 0 Тогда _ДобавитьВЗапрос(_Текст,"","     AND Р.Поставщик = :Поставщик"); КонецЕсли;
	Если ПустоеЗначение(_ФильтрНакл) = 0 Тогда _ДобавитьВЗапрос(_Текст,"","     AND substr(Р.Накл,5) = :Накл"); КонецЕсли;
	_Текст = _Текст + "
	|
	|   UNION ALL
	|
	|   SELECT
	|     Р.Товар AS Товар,
	|     Р.Кол * (1 - Р.debkred * 2) AS Кол,
	|     Р.СуммаОтп * (1 - Р.debkred * 2) AS СуммаОтп,
	|     Р.СуммаРозн * (1 - Р.debkred * 2) AS СуммаРозн
	|   FROM
	|     Регистр_ОстаткиТовара AS Р
	|   INNER JOIN
	|     Журнал jr ON Р.iddoc = jr.iddoc
	|           AND (jr.date BETWEEN :НачМесяца AND :ДатаОстатков)
	|           AND (jr.ОстаткиТовараФР = 1)
	|           AND Р.Товар = :Товар";
	Если ПустоеЗначение(_ФильтрПоставщик) = 0 Тогда _ДобавитьВЗапрос(_Текст,"","           AND Р.Поставщик = :Поставщик"); КонецЕсли;
	Если ПустоеЗначение(_ФильтрНакл) = 0 Тогда _ДобавитьВЗапрос(_Текст,"","           AND substr(Р.Накл,5) = :Накл"); КонецЕсли;
	_Текст = _Текст + "
	|  )";
 

  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Обновить реквизиты регистра
Ответ #7 - 09. Февраля 2011 :: 09:34
Печать  
а вот как стало
Код
Выбрать все
_Текст = "
	|SELECT
	|  SUM(Кол) as [Кол :Число.16.2],
	|  SUM(СуммаОтп) as [СуммаОтп :Число.16.2],
	|  SUM(СуммаРозн) as [СуммаРозн :Число.16.2]
	|FROM
	|  (SELECT
	|     Р.Кол AS Кол,
	|     Р.СуммаОтп AS СуммаОтп,
	|     Р.СуммаРозн AS СуммаРозн
	|   FROM
	|     РегистрИтоги_ОстаткиТовара as Р
	|   WHERE
	|     period = :НачПредМесяца";
	//Если ПустоеЗначение(_ФильтрДоговор) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","     AND Договор = :Перечисление.ВидДоговора." + _ФильтрДоговор.Идентификатор()); КонецЕсли;
	Если ПустоеЗначение(_ФильтрДоговор) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","     AND " + _ЗапросSQLite.СформироватьУсловие("Договор",_ФильтрДоговор)); КонецЕсли;
	Если ПустоеЗначение(_ФильтрПоставщик) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","     AND Р.Поставщик = :Поставщик"); КонецЕсли;
	Если ПустоеЗначение(_ФильтрНакл) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","     AND Р.Накл = " +  + ":Накл"); КонецЕсли;
	Если ПустоеЗначение(_ФильтрТовар) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","     AND Р.Товар = :Товар"); КонецЕсли;
	_Текст = _Текст + "
	|   UNION ALL
	|
	|   SELECT
	|     Р.Кол * (1 - Р.debkred * 2) AS Кол,
	|     Р.СуммаОтп * (1 - Р.debkred * 2) AS СуммаОтп,
	|     Р.СуммаРозн * (1 - Р.debkred * 2) AS СуммаРозн
	|   FROM
	|     Регистр_ОстаткиТовара AS Р
	|   INNER JOIN
	|     Журнал jr ON Р.iddoc = jr.iddoc
	|           AND (jr.date BETWEEN :НачМесяца AND :ДатаОстатков)
	|           AND (jr.ОстаткиТовараФР = 1)";
	//Если ПустоеЗначение(_ФильтрДоговор) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","           AND Договор = :Перечисление.ВидДоговора." + _ФильтрДоговор.Идентификатор()); КонецЕсли;
	Если ПустоеЗначение(_ФильтрДоговор) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","           AND " + _ЗапросSQLite.СформироватьУсловие("Договор",_ФильтрДоговор)); КонецЕсли;
	Если ПустоеЗначение(_ФильтрПоставщик) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","           AND Р.Поставщик = :Поставщик"); КонецЕсли;
	Если ПустоеЗначение(_ФильтрНакл) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","           AND Р.Накл = " +  + ":Накл"); КонецЕсли;
	Если ПустоеЗначение(_ФильтрТовар) = 0 Тогда _ЗапросSQLite.ДобавитьВЗапрос(_Текст,"","           AND Р.Товар = :Товар"); КонецЕсли;
	_Текст = _Текст + "
	|  )"; 

  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Обновить реквизиты регистра
Ответ #8 - 09. Февраля 2011 :: 09:35
Печать  
вот эти функции

Код
Выбрать все
Функция Документ_РеквизитТЧ_Вид(_Документ,_Реквизит,_Вид) Экспорт
	_ИзмерениеВид = Метаданные.Документ(_Документ).РеквизитТабличнойЧасти(_Реквизит).Вид;
	Если ПустоеЗначение(_ИзмерениеВид) = 1 Тогда Возврат ":ВидДокумента." + _Вид + " || ";
	Иначе Возврат ""; КонецЕсли;
КонецФункции

Функция Документ_РеквизитТЧ_Ид(_Документ,_Реквизит,_Ид) Экспорт
	_ИзмерениеВид = Метаданные.Документ(_Документ).РеквизитТабличнойЧасти(_Реквизит).Вид;
	Если ПустоеЗначение(_ИзмерениеВид) = 1 Тогда Возврат "substr(" + _Ид + ",5)";
	Иначе Возврат _Ид; КонецЕсли;
КонецФункции

Функция Регистр_Измерение_Вид(_Регистр,_Измерение,_Вид) Экспорт
	_ИзмерениеВид = Метаданные.Регистр(_Регистр).Измерение(_Измерение).Вид;
	Если ПустоеЗначение(_ИзмерениеВид) = 1 Тогда Возврат ":ВидДокумента." + _Вид + " || ";
	Иначе Возврат ""; КонецЕсли;
КонецФункции

Функция Регистр_Измерение_Ид(_Регистр,_Измерение,_Ид) Экспорт
	_ИзмерениеВид = Метаданные.Регистр(_Регистр).Измерение(_Измерение).Вид;
	Если ПустоеЗначение(_ИзмерениеВид) = 1 Тогда Возврат "substr(" + _Ид + ",5)";
	Иначе Возврат _Ид; КонецЕсли;
КонецФункции 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать