Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Размножение периодических, наверное в FAQ? (число прочтений - 10277 )
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Размножение периодических, наверное в FAQ?
22. Мая 2006 :: 12:01
Печать  
Суть задачи:
Бывают случаи, когда у нескольких элементов справочника необходимо создать идентичную историю изменения периодических реквизитов.
Например: история цен, наценок, норм упаковки и др. для нескольких товаров, отличающихся только цветом - или размером, или иным бухгалтерски не значимым параметром.
Или история всякоразных условий работы для нескольких ипостасей одного и того же контрагента.

В общем, я с этой задачей сталкивался неоднократно, так что, наверное, не одинок  Улыбка

Излагаю на примере справочника "Номенклатура". В данном случае в каждом элементе в поле ГлавныйЛист хранится ссылка на "эталонный" элемент, из которого нужно брать соответствующие реквизиты.

Фрагменты модуля формы списка номенклатурника.
Поехали....
Код
Выбрать все
Перем ИмяВрТаб; //Здесь будем хранить ID реквизитов, подлежащих синхронизации
Перем лЗапросПолн; //Единожды создадим параметрический запрос для многократного юзания


//****

Процедура ПриОткрытии()
	//..............
	//Подготовим все для запроса
	СписокМета=СоздатьОбъект("ТаблицаЗначений");
	СписокМета.НоваяКолонка("ID","Число");
	ИмяВрТаб=глУникальность(); //...ну, это по вкусу -  кто как создает имена врем.таблиц.

	лЗапрос=СоздатьОбъект("ODBCRecordSet");
	лЗапрос.Выполнить("IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE ID=OBJECT_ID('tempdb.."+ИмяВрТаб+"') AND sysstat & 0xf = 3 )
	|DROP TABLE "+ИмяВрТаб);
	лЗапрос.Выполнить("CREATE TABLE "+ИмяВрТаб+"( ID INT, PRIMARY KEY CLUSTERED (ID) )");

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

	лЗапросПолн=СоздатьОбъект("ODBCRecordSet"); //Готовим запрос
	лЗапросПолн.Подготовить("
	|set nocount on
	|
	|DECLARE @ТоварФильтр char(9)
	|
	|SET @ТоварФильтр = ?
	|
	|BEGIN TRANSACTION
	//Потенциально деструктивная операция - без транзакции никак
	|
	//Тут у меня было еще размножение непериодических реквизитов через UPDATE - долго и очевидно, выкинул нафик
	|
	|DECLARE @vu TABLE ( objid CHAR(9), PRIMARY KEY CLUSTERED (objid) )
	|
	|INSERT INTO @vu
	|SELECT ID FROM
	|$Справочник.Номенклатура (NOLOCK)
	|WHERE
	|$Справочник.Номенклатура.ГлавныйЛист = @ТоварФильтр
	|AND
	|ID <> @ТоварФильтр
	|AND
	|isfolder<>1
	//Подготовили список элементов, подлежащих обработке
	//Характерно, что дальше код универсален и вообще не зависит от вида справочника
	|
	|exec _1sp__1SCONST_TLockX
	// на всякий случай заблокировали константы
	|
	|delete from _1sconst
	|where
	|id in (select id from "+ИмяВрТаб+")
	|and
	|objid in (select * from @vu)
	|and docid = '     0   '
	// удалили предыдущую историю согласно расстрельных списков НКВД
	|
	|
	|insert into _1sconst
	|(id, objid, date, value, docid, time, actno,lineno_,tvalue)
	|select seed.id as id, tlist.objid as objid, seed.date as date, seed.value as value, seed.docid as docid, seed.time as time, seed.actno as actno, seed.lineno_ as lineno_, seed.tvalue as tvalue
	|from
	|(select * from _1sconst
	|where
	|id in (select id from "+ИмяВрТаб+")
	|and
	|objid = @ТоварФильтр
	|and docid = '     0   '
	|) seed
	|cross join
	|@vu
	|tlist
	// ну и, наконец, записали новую историю. А то раньше я часто задумывался, зачем придумали cross join :)
	|
	|COMMIT TRANSACTION
	|"
	);

	лЗапросПолн.ДобПараметр(1,14,9,0);

	//Вот теперь все действительно готово_

	//********************
КонецПроцедуры

	//Теперь, по мере надобности многократно используем.запрос по назначению - в данном случае размножаем реквизиты элемента "Ста"

	лЗапросПолн.УстПараметр(1,гМета.ЗначениеВСтрокуБД(Ста));
	лЗапросПолн.Выполнить();
 

  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Размножение периодических, наверное в FAQ?
Ответ #1 - 22. Мая 2006 :: 12:02
Печать  
Да.... и еще вдогонку

Код
Выбрать все
//а если история элементов уже синхронизирована, и нужно лишь добавить свежие изменения за сегодня, слегка модифицируем запрос:

	лЗапросСокр=СоздатьОбъект("ODBCRecordSet");
	лЗапросСокр.Подготовить("
	|set nocount on
	|
	|DECLARE @ТоварФильтр char(9)
	|
	|SET @ТоварФильтр = ?
	|
	|
	|DECLARE @ТекДата datetime
	|
	|SET @ТекДата = cast(? as datetime)
	|
	|
	|BEGIN TRANSACTION
	// ну, дальше вплоть до exec _1sp__1SCONST_TLockX неинтересно, поскольку то же самое
	|
	// а в следующих двух запросах всего лишь добавляем условие по дате
	|delete from _1sconst
	|where
	|id in (select id from "+ИмяВрТаб+")
	|and
	|objid in (select * from @vu)
	|and docid = '     0   '
	|and date = @ТекДата
	|
	|
	|insert into _1sconst
	|(id, objid, date, value, docid, time, actno,lineno_,tvalue)
	|select seed.id as id, tlist.objid as objid, seed.date as date, seed.value as value, seed.docid as docid, seed.time as time, seed.actno as actno, seed.lineno_ as lineno_, seed.tvalue as tvalue
	|from
	|(select * from _1sconst
	|where
	|id in (select id from "+ИмяВрТаб+")
	|and
	|objid = @ТоварФильтр
	|and docid = '     0   '
	|and date = @ТекДата
	|) seed
	|cross join
	|@vu
	|tlist
	|
	|COMMIT TRANSACTION
	|"
	);

	лЗапросСокр.ДобПараметр(1,14,9,0);
	лЗапросСокр.ДобПараметр(1,14,8,0);


	// и используем это безобразие вполне очевидным образом
	лЗапросСокр.УстПараметр(1,гМета.ЗначениеВСтрокуБД(Ста));
	лЗапросСокр.УстПараметр(2,Формат(РабочаяДата(),"ДГГГГММДД"));
	лЗапросСокр.Выполнить();

 

  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Размножение периодических, наверное в FAQ?
Ответ #2 - 22. Мая 2006 :: 12:06
Печать  
Прошу отметить, что это исключительно для Скуля Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Размножение периодических, наверное в FAQ?
Ответ #3 - 24. Мая 2006 :: 06:55
Печать  
artbear писал(а) 22. Мая 2006 :: 12:06:
Прошу отметить, что это исключительно для Скуля Печаль

А кому щас лекко?...

ЗЫЖ Нескромный вопрос: а какие вообще преимущества у ДБФ? Все дело в том, что я уже много лет как полностью отказался от ДБФа; может, в чем-то я не прав и в каких-то ситуациях это делать не надо?
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Размножение периодических, наверное в FAQ?
Ответ #4 - 24. Мая 2006 :: 07:02
Печать  
1) Для небольших контор сопровождать намного легче и проще ДБФ, чем Скуль - это ИМХО.
2) Вроде лицензия стоит дороже, хотя не уверен.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
x-pert
1c++ developer
Отсутствует



Сообщений: 134
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Размножение периодических, наверное в FAQ?
Ответ #5 - 24. Мая 2006 :: 07:17
Печать  
для ДБФ совершенно не обязательно использовать сервер от MS (см. стоимость лицензии сначала самогО сервера, а потом ещё и MS SQL).
Это может быть старый дряхлый пень с Новеллом или каким-нибудь линуксом.

вполне возможно ожидать использования ДБФ на каком-нибудь одиночном компьютере (если не нужно других), и под, допустим, Win98. Или вообще в линуксе из эмулятора.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Размножение периодических, наверное в FAQ?
Ответ #6 - 24. Мая 2006 :: 07:27
Печать  
У меня в прокате есть DBF на флешках, по принципу "все мое ношу с собой".

И в торговых точках в качестве кассовых терминалов.
Анализировал этот вопрос, на 1С+win+Internet получаются самые функциональные и недорогие терминалы с сеансовой связью с центром.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Размножение периодических, наверное в FAQ?
Ответ #7 - 24. Мая 2006 :: 08:35
Печать  
Спасибо оперативно откликнувшимся Улыбка
При беглом анализе обнаружил, что упомянутые ситуации меня не касаются - и слава Богу.
Ну, разве что вопрос стоимости - но он тоже практически малозначим...

Сомнения вызывает тезис насчет малых фирм и одиночных машин. Я, не задумываясь, поднимаю в филиалах (3-7 машин) SQL-сервер. В одном случае сервер используется как рабочая станция для грамотного юзера - и ничего, работают практически без сопровождения более года.
У меня на одиночной "учебно-боевой" машине успешно пашет SQL в офисе и дома. Дома еще и два инстанса с разными дефолтовыми кодовыми страницами. Дома решил разориться на двухъядерный АМД, но и на одном ядре неплохо получается - хотя и выявлена пара редких ситуаций, когда при исполнении SQL и 1С на одном и том же ядре производительность падает на порядок; в этих ситуациях, опять же, прямые запросы адназначна рулят и решают проблему.

Насчет Новелла:
В одной фирме лет 6-7 назад внедрялась система реального времени. Стоял ДБФ на Новелл 2xP-II 128Мб. Тестирование на двух рабочих станциях - без нареканий. Рабочий режим - при работе уже 4-х станций - 100% загрузки 100Мбитки, задержка реакции системы до 20 секунд. При подключении 5-й станции - постоянная нестабильность системы.
Уболтал руководство на вин-NT-сервер 2xP-III 256Мб, поднял SQL (До этого с MS SQL и 1СSQL не работал, хотя был ряд проектов под Interbase); честно говоря, боялся, что не поможет и получу по шее и по карману за растрату бабок.
В итоге при одновременной работе даже 20 раб.мест (больше не требовалось) время реакции системы - макс 4сек. После некоторой оптимизации кода под SQL (штатным 1С, т.к. технологии прямых запросов были в младенческом состоянии) ускорились еще где-то вдвое.

Вывод: ДБФ - решение для изолированных рабочих мест с незначительной нагрузкой и в ситуациях, когда минимизация стоимости - в числе основных приоритетов.
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
x-pert
1c++ developer
Отсутствует



Сообщений: 134
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Размножение периодических, наверное в FAQ?
Ответ #8 - 24. Мая 2006 :: 10:31
Печать  
Quan писал(а) 24. Мая 2006 :: 08:35:
Сомнения вызывает тезис насчет малых фирм и одиночных машин. Я, не задумываясь, поднимаю в филиалах (3-7 машин) SQL-сервер. В одном случае сервер используется как рабочая станция для грамотного юзера - и ничего, работают практически без сопровождения более года.

Скажем так - есть ещё медвежьи места, где и Win98 на машине стоит с трудом. Какой там SQL сервер?
А DBF бегает вполне неплохо.

Quan писал(а) 24. Мая 2006 :: 08:35:
Насчет Новелла:
В одной фирме лет 6-7 назад внедрялась система реального времени. Стоял ДБФ на Новелл 2xP-II 128Мб. Тестирование на двух рабочих станциях - без нареканий. Рабочий режим - при работе уже 4-х станций - 100% загрузки 100Мбитки, задержка реакции системы до 20 секунд. При подключении 5-й станции - постоянная нестабильность системы.

Это твой опыт. А есть опыт прямо обратный. Как пара десятков пользователей очень даже бодренько гоняет DBF. Причём как на новелле, так и на линуксе с самбой.
Вопросы настройки/настроек сервера - не последние вопросы В-)
  
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Размножение периодических, наверное в FAQ?
Ответ #9 - 25. Мая 2006 :: 09:44
Печать  
x-pert писал(а) 24. Мая 2006 :: 10:31:
Quan писал(а) 24. Мая 2006 :: 08:35:
Насчет Новелла:
В одной фирме лет 6-7 назад внедрялась система реального времени. Стоял ДБФ на Новелл 2xP-II 128Мб. Тестирование на двух рабочих станциях - без нареканий. Рабочий режим - при работе уже 4-х станций - 100% загрузки 100Мбитки, задержка реакции системы до 20 секунд. При подключении 5-й станции - постоянная нестабильность системы.

Это твой опыт. А есть опыт прямо обратный. Как пара десятков пользователей очень даже бодренько гоняет DBF. Причём как на новелле, так и на линуксе с самбой.
Вопросы настройки/настроек сервера - не последние вопросы В-)

А тут даже не в настройках дело: ключевые слова - "система реального времени".
В классической 1Совской схеме "создал документ на экране->записал-провел" действительно могут свободно резвиться на ДБФе несколько десятков юзверей. Вышеописанный затык возникает при попытке реализовать многопользовательскую транзакционность на уровне каждой вводимой (и выводимой на экран) циферки.
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать