|
V8 Как из документа изменить табличную часть в справочнике | ☑ | ||
---|---|---|---|---|
0
tempaccount
19.08.13
✎
02:09
|
Не могу достучаться до полей ТЧ справочника.
Нужно создании документа проверять на наличие и изменять/создавать поля (строки) &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) СкладНазначения = Справочники.Склады.НайтиПоНаименованию(Объект.Склад.Наименование); Для Каждого ТекСтрока Из СкладНазначения.Материалы Цикл ТекСтрока.Количество = 5;//Тут действие, которое и выдает ошибку, т.к. нельзя изменить. .Запись(); или .Добавить(); хз как работает. КонецЦикла; КонецПроцедуры |
|||
47
Ork
19.08.13
✎
20:11
|
(45) Что в вашем понятии "элемент ТЧ"? В моем - это набор строк с полями различных типов. В том числе и ссылочных.
Или я чего не понимаю? |
|||
48
tempaccount
19.08.13
✎
20:24
|
http://rghost.ru/48230451.view
Почему-то ссылочных в нем нет. Я не правильно обращаюсь? |
|||
49
Ork
19.08.13
✎
20:30
|
(48) А ЕдининицаИзмерения? Это не СправочникСсылка? Или материал.
|
|||
50
Ork
19.08.13
✎
20:31
|
+ (49) И вообще... Что нужно? Для материала подставить ЕдиницуИзмерения?
|
|||
51
tempaccount
19.08.13
✎
20:49
|
Это я уже в ручную выбрал. А хочу автоматом, при выборе товара
|
|||
52
tempaccount
19.08.13
✎
22:17
|
Ну так Владелец вызывается от куда?
Так как товары владелец едИзм, то у едИзм будет владелец, а мне и надо найти... ааа. Вы предлагаете найти циклом из всех едИзм. &НаСервере Функция НайтиЕдиницуИзмерения(Материал) СпрСотр = СоздатьОбъект("Справочник.ЕдиницаИзмерения"); СпрСотр.ВыбратьЭлементы(); Пока СпрСотр.ПолучитьЭлемент()=1 Цикл Если СпрСотр.Наименование = Материал.Наименовние Тогда Возврат СпрСотр; КонецЕсли; КонецЦикла; Возврат 0; КонецФункции &НаКлиенте Процедура МатериалыМатериалПриИзменении(Элемент) ТекущаяСтрока = Элементы.Материалы.ТекущиеДанные; ТекущаяСтрока.ЕдиницаИзмерения = НайтиЕдиницуИзмерения(ТекущаяСтрока.Материал); КонецПроцедуры |
|||
53
tempaccount
19.08.13
✎
22:19
|
Во-первых я где-то накриворучил. Во-вторых, думаю есть решение куда элегантней.
|
|||
54
tempaccount
20.08.13
✎
00:53
|
Товарищи, ХЭЛП!
|
|||
55
tempaccount
20.08.13
✎
02:35
|
&НаСервере
Функция ВернутьЕдиницуИзмерения(Товар) Буф = Товар.ПолучитьОбъект(); СпрТ = Справочники.ЕдинцыИзмерения; СпрТ.ИспользоватьВладельца(Буф); СпрТ.ВыбратьЭлементы(1); Пока СпрТ.ПолучитьЭлемент()=1 Цикл Возврат СпрТ; КонецЦикла; Возврат Неопределено; КонецФункции &НаКлиенте Процедура ТоварыТоварПриИзменении(Элемент) ТекСтрока = Элементы.Товары.ТекущиеДанные; ТекСтрока = ВернутьЕдиницуИзмерения(ТекСтрока.Товар); КонецПроцедуры Помогите правильно написать код, справочник.Товары Владелец справочник.ЕдИзм |
|||
56
tempaccount
20.08.13
✎
02:49
|
И, еще раз, как из функции находящейся в документе, посмотреть остаток товара, по РН?
|
|||
57
Cube
20.08.13
✎
04:38
|
(55) Если единица измерения является реквизитом номенклатуры, то как-то так:
&НаКлиенте Процедура ТоварыТоварПриИзменении(Элемент) ТоварПриИзмененииНаСервере(Элементы.Товары.ТекущаяСтрока); КонецПроцедуры //ТоварыТоварПриИзменении() &НаСервере Процедура ТоварПриИзмененииНаСервере(НомерСтроки) ТекущиеДанные = Элементы.Товары[НомерСтроки]; ТекущиеДанные.ЕдИзм = ТекущиеДанные.Товар.ЕдиницаИзмерения; КонецПроцедуры //ТоварПриИзмененииНаСервере() |
|||
58
Cube
20.08.13
✎
04:42
|
(56) Запросом. Пиши так:
Запрос = Новый Запрос(""); и теперь ставь курсор внутрь двойных кавычек и жми ПКМ -> Конструктор запроса. Ну, а как строить запросы, это проще показать, чем расписать. Поэтому разбирайся сам, а у нас спрашивай только то, что не получается. |
|||
59
tempaccount
20.08.13
✎
09:57
|
(57) Нет, вот в чем вся загвоздка, что это другой справочник, подчиненный товару.
|
|||
60
Wobland
20.08.13
✎
10:00
|
(59) тогда какую из 80 единиц ты хочешь?
|
|||
61
Starhan
20.08.13
✎
10:10
|
Радченко вроде щас халявный с учебной конфой. Что мешает пройти элементарную книгу где отсеивается 90% новичков.
|
|||
62
Starhan
20.08.13
✎
10:13
|
(61)вопросов новичиков* >_<
|
|||
63
tempaccount
20.08.13
✎
10:15
|
Прошу прощения, видимо я не правильно объяснил.
Хочу при выборе товара в ТЧ формы, автозаполось поле ЕдИзм. Товар - владелец КдИзм. Соответственно, можно попробовать просто на сервер отправить ссылку на данный товар, получить этот объект, и достать из него подчиненного ЕдИзм, но функции и процедуры для меня со справкой, как Китайский язык. Можно попробовать циклом проверить все ЕдИзм и найти где родителем будет этот элемент. |
|||
64
Wobland
20.08.13
✎
10:21
|
типовая бухия
&НаКлиенте Процедура ТоварыНоменклатураПриИзменении(Элемент) ТекущиеДанные = Элементы.Товары.ТекущиеДанные; ДанныеСтрокиТаблицы = Новый Структура( ТоварыНоменклатураПриИзмененииНаСервере(ДанныеСтрокиТаблицы, ДанныеОбъекта); Процедура ТоварыНоменклатураПриИзмененииНаСервере(СтрокаТабличнойЧасти, Знач ДанныеОбъекта) СведенияОНоменклатуре = БухгалтерскийУчетПереопределяемый.ПолучитьСведенияОНоменклатуре( СтрокаТабличнойЧасти.Номенклатура, ДанныеОбъекта); Если СведенияОНоменклатуре = Неопределено Тогда Возврат; КонецЕсли; СтрокаТабличнойЧасти.ЕдиницаИзмерения = СведенияОНоменклатуре.ЕдиницаИзмерения; Функция ПолучитьСведенияОНоменклатуре(Номенклатура, ПараметрыОбъекта) Экспорт СведенияОНоменклатуре = ПолучитьСведенияОСпискеНоменклатуры(СписокНоменклатуры, ПараметрыОбъекта).Получить(Номенклатура); Функция ПолучитьСведенияОСпискеНоменклатуры(СписокНоменклатуры, ПараметрыОбъекта) Экспорт а вот тут через полный назад выясняется в том числе единица измерения какую из 200 единиц ты хочешь? |
|||
65
tempaccount
20.08.13
✎
10:35
|
(64) Естественно первую или дефолт.
Подразумевается, что ОДИН товар ОДНА ЕдИзм принадлежащая ему. Ваш код не очень ясен мне :( Суммирую вопрос: Ведь можно написать запрос, возвращающий количество ВЫБРАННОГО товара на складе? |
|||
66
Wobland
20.08.13
✎
10:41
|
(65) первая при какой сортировке? дефолт где живёт? в общем случае количество подчинённых элементов у тебя не ограничено.
можно, и даже выше пример есть |
|||
67
tempaccount
20.08.13
✎
10:49
|
(66) Первое просто. Никакой сортировки. Подразумевается ОДИН товар имеет ОДНУ ед измерения.
|
|||
68
Wobland
20.08.13
✎
10:50
|
(67) подразумевается, что один товар может иметь сколько угодно единиц, а как там в твоих частных случаях бывает - не интересно. "просто первый" - это значит, первый попавшийся
|
|||
69
tempaccount
20.08.13
✎
10:52
|
select Количество from Остатки where Склад == Элементы.Склад,
Товар == Элементы.Товары.ТекущиеДанные().Товар; Примерно такой селект но на синтаксисе 1с? |
|||
70
Wobland
20.08.13
✎
10:55
|
(69) очень примерно. даже не такой совсем. ->(40)
|
|||
71
tempaccount
20.08.13
✎
11:04
|
На счет первый попавшийся, Вы абсолютно правы.
Запрос вернет коллекцию элементов заолненую одной строкой? Ведь я суммирую количество товара Запрос.Текст = "ВЫБРАТЬ | СУММА(Остатки.Количество) КАК Количество |ГДЕ | Остатки.Товар = Элементы.Товары.ТекущиеДанные().Товар;" |
|||
72
Wobland
20.08.13
✎
11:06
|
(71) если не докапываться до текста, да, одна строка, одна олонка
|
|||
73
Cube
20.08.13
✎
11:08
|
(63) Название справочника с единицами-то какое?
|
|||
74
tempaccount
20.08.13
✎
11:08
|
(72) А если докопаться? :)
|
|||
75
tempaccount
20.08.13
✎
11:09
|
(73) ЕдинцыИзмерения
|
|||
76
Wobland
20.08.13
✎
11:09
|
(74) во-первых, есть пример правильного синтаксиса. во-вторых, гораздо интересней разом получить таблицу вида Номенклатура|Остаток и потом с ней как-то изгаляться
|
|||
77
Cube
20.08.13
✎
11:14
|
(75) Тогда так:
&НаКлиенте Процедура ТоварыТоварПриИзменении(Элемент) ТоварПриИзмененииНаСервере(Элементы.Товары.ТекущаяСтрока); КонецПроцедуры //ТоварыТоварПриИзменении() &НаСервере Процедура ТоварПриИзмененииНаСервере(НомерСтроки) ТекущиеДанные = Элементы.Товары[НомерСтроки]; Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 | ЕдиницыИзмерения.Ссылка |ИЗ | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения |ГДЕ | ЕдиницыИзмерения.Владелец = &Товар"); Запрос.УстановитьПараметр("Товар", ТекущиеДанные.Товар); Выборка = Запрос.Выполнить().Выбрать(); ТекущиеДанные.ЕдИзм = ?(Выборка.Следующий(), Выборка.Ссылка, ПредопределенноеЗначение("Справочник.ЕдиницыИзмерения.ПустаяСсылка")); КонецПроцедуры //ТоварПриИзмененииНаСервере() |
|||
78
tempaccount
20.08.13
✎
11:16
|
(76) Согласен.
Но таким образом, я могу КАЖДЫЙ раз изменяя количество товара, получать предупреждение, если запрашивается больше, чем есть. И в количестве пропишется максимально допустимое значение. Плюс этого, что при каждом изменении количества, мы получаем остаток в ДАННЫЙ МОМЕНТ, изменил количество, получил вновь остаток. &НаКлиенте Процедура ТоварыКоличествоПриИзменении(Элемент) ТекСтрока = Элементы.Товары.ТекущиеДанные; буф = ВернутьОстатокКоличество(ТекСтрока); ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество; КонецПроцедуры &НаСервере Функция ВернутьОстатокКоличество(ТекСтрока) МойЗапрос = Новый Запрос"ВЫБРАТЬ | СУММА(Остатки.Количество) КАК Количество |ГДЕ | Остатки.Товар = ТекСтрока.Товар;" Возврат МойЗапрос; КонецФункции |
|||
79
Wobland
20.08.13
✎
11:17
|
(77) а на клиенте сразу не будет доступно Номенклатура.Единица?
|
|||
80
Cube
20.08.13
✎
11:18
|
(78) Косяк этого подхода в том, что документ я могу создавать с текущей датой, а потом поменять дату на вчера... И всё, ты приплыл со своим велосипедом с квадратными колесами =))
|
|||
81
Cube
20.08.13
✎
11:18
|
(80) Проверка на остатки должна быть при проведении и точка.
|
|||
82
Wobland
20.08.13
✎
11:19
|
(78) я бы как юзер поубивал бы за такое. ввожу 20 - много, ввожу 19 - много, долблюсь, пока не угадаю, потею изо всех сил. потом перехожу к новой строке. не зря остатки проверяются при проведении
|
|||
83
tempaccount
20.08.13
✎
11:21
|
(82) Само-собой будет предупреждение и поле автозабью максимально допустим.
А вот как сумму количеств достать. Ведь не правильно написано? МойЗапрос = Новый Запрос"ВЫБРАТЬ | СУММА(Остатки.Количество) КАК Количество |ГДЕ | Остатки.Товар = ТекСтрока.Товар;" |
|||
84
Wobland
20.08.13
✎
11:24
|
(83) пусть юзеры, как дятлы, долбятся в ОК на предупреждении? дополнительно пойми, о чём говорил Cube
написано неправильно |
|||
85
Cube
20.08.13
✎
11:26
|
(84) "о чём говорил Cube написано неправильно"
Я всё правильно понял?))) |
|||
86
Wobland
20.08.13
✎
11:26
|
(85) правильно, там запятой не хватает ;)
|
|||
87
Wobland
20.08.13
✎
11:27
|
(86) тфу, то есть в (85) написано неправильно (запятая), а про колёса очень даже правильно ;)
|
|||
88
Cube
20.08.13
✎
11:27
|
(86) Ну, то есть, смысл такой: Я говорю неверно?
|
|||
89
tempaccount
20.08.13
✎
11:32
|
Мда, я уже в отчаянии. Язык сильно трудней C# и java.
Да JS, тоже с мягкой типизацией, и то куда понятней. Тут же не понятно, что за структура запроса, вроде написа, а что не нравиться не понятно. Работать со структурами Справочников и то полный попаболь. Я тоже изначально хотел при проведении. Но посчитал еще слишком трудным, хотя можно попробывать: Делать буду так: ПередЗаписью - Еще на клиенте, чтобы если количество зашкаливает, корректный отказ написать. В процедуре: 1 ТЧ Товары передаем на функцию какую-нибудь сервера: 2 На сервере обрабатывает - Достаем коллекцию товаров и их количество а дальше циклом проверяем все ли подходит, если все ок то возвращаем ЛОЖЬ, иначе ИСТИНА для Отказ Примерно так? |
|||
90
Cube
20.08.13
✎
11:36
|
(89) Не надо перед записью... Надо только при проведении.
|
|||
91
Cube
20.08.13
✎
11:36
|
(89) "Тут же не понятно, что за структура запроса, вроде написа, а что не нравиться не понятно."
Это ты про какой запрос? |
|||
92
Wobland
20.08.13
✎
11:37
|
ещё раз. изучи (40) - готовый вариант решения контроля остатков. всё при проведении, не надо мешать юзеру записывать, юзер вернётся завтра и закончит делать документ
|
|||
93
Wobland
20.08.13
✎
11:37
|
(91) ему ещё пару раз про конструктор сказать надо
|
|||
94
Odavid
20.08.13
✎
11:38
|
(4)>>В табличной части коего и сдержаться товары/материалы.
Вот всегда было интересно, зачем справочникам - ТЧ, а вот в обработках (где они ой как нужны) ТЧ нет. И в регистрах тоже. Так вы что - все материалы вместо Номенклатуры храните в ТЧ у Склады, чтоль?!? |
|||
95
Cube
20.08.13
✎
11:40
|
(94) В обработках есть ТЧ.
В регистрах ТЧ никому накуй не нужны. |
|||
96
Infsams654
20.08.13
✎
11:42
|
(89) сочувствую, таким же был 2 года назад, но ничего, "стерпится- слюбиться"
|
|||
97
Wobland
20.08.13
✎
11:43
|
(94) нужны - добавь
|
|||
98
tempaccount
20.08.13
✎
11:51
|
Да конструктор странности пишет! Почему если мне надо достать Количество товара, пишется куча всяких левых строк, к тому же я не каждую из них понимаю.
(94) Нет, я уже исправил все. Все сделано под РН Остатки |
|||
99
Cube
20.08.13
✎
11:52
|
(98) "Да конструктор странности пишет"
Если ты чего-то не понимаешь, это не означает, что "пишется куча всяких левых строк" =))) Там всё пишется по делу. Ничего лишнего там нет. |
|||
100
Cube
20.08.13
✎
11:52
|
Сотка!
|
|||
101
Wobland
20.08.13
✎
11:53
|
(98) всё потому, что ты не знаешь, как всё организовано
|
|||
102
Wobland
20.08.13
✎
11:54
|
клавиатура хоть нормальная? ничего левого не выдаёт?
|
|||
103
tempaccount
20.08.13
✎
12:01
|
Жжете :)
Позвольте по-порядку: 1) Почему поверку на количество надо, при проведении, а не перед записью? Ведь мне же нужно вызвать предупреждение, что бы юзер исправил, а не допускать проведение покупки 50 товаров, когда их всего 10. 2) На пальцах можете показать? Справочник А владелец справочника В Документ С, Содержит реквизиты табличной части, которые ссылаются на А и В. Как в форме, получить ссылку через А В? 3) Смысл в длинном запросе? Я соглашусь, что не знаю, как устроено, но БД и SQL мне известны, не знаток, но чуток знаю. И я подозреваю (лишь подозреваю), что 1с работая с БД взаимодействует с ней нормально. Соответственно, если мне надо достать сумму количеств товара по складу, ничего лишнего фигурировать не должно. |
|||
104
Wobland
20.08.13
✎
12:04
|
1) чтобы нормально записывать кривые документы. отказывать при проведении следует;
2) уходишь на сервер, дальше, например, Кубовским запросом (@Cube - человек такой); 3) "выбрать Остатки.Количество из РН.Остатки(условие про номенклатуру и период)" - ничего лишнего |
|||
105
Infsams654
20.08.13
✎
12:04
|
в (92) написано, см. как сделано в типовых
|
|||
106
Cube
20.08.13
✎
12:07
|
(103) 1). Просто сделай при проведении. Со временем поймешь. Долго объяснять.
2). Смотри (77). 3). Запрос ВСЕГДА работает быстрее кода. |
|||
107
Wobland
20.08.13
✎
12:15
|
(106) сравнивал я как-то объектные Остатки() с запросными. монопенисуально
|
|||
108
Infsams654
20.08.13
✎
12:17
|
(103)
1) могу записать для начала, без проведения, типа предполагаемых 100 млрд , ну и это ни как не отразится на остатках. Хотя планируется такой подход, с минуты на минуту... 2) если знаешь C (89), то от чего такой вопрос? |
|||
109
Cube
20.08.13
✎
12:17
|
(107) Ага, всплывала тут тема недавно, тоже говорили, что запрос медленнее... Оказалось, что выборка в коде возвращает не выборку, а указатель, а считывание данных происходит при переборе этой "выборки"... Разница в скорости была существенной. Запрос рулит и педалит.
|
|||
110
Wobland
20.08.13
✎
12:24
|
(109) .Остатки() возвращает ТЗ, .Выполнить().Выгрузить() возвращает ТЗ. скорость получения ТЗ в обоих случаях будет примерно одинакова вне зависимости от железа и данных. нужно помнить о кэшировании, конечно. не?
|
|||
111
Infsams654
20.08.13
✎
12:26
|
(107) эх, ребята, запросы в коде это как-то не хорошо. Вот вызов хранимой процедуры или функции - это то, однако, тут 1С нужно многобазовой постараться
|
|||
112
Cube
20.08.13
✎
12:27
|
(110) Если хочешь, можешь сделать замеры. Мне сегодня уже лень :)
Пока что, в моём личном чемпионате, код никогда не занимал первое место по скорости. А тестов я уже сделал с десяток, наверное... |
|||
113
Wobland
20.08.13
✎
12:28
|
(111) что такое запросы в коде?
(112) а сделаю вечером. отношение к запросам у нас одинаковое, я протестую против слова "всегда быстрее" ;) |
|||
114
Cube
20.08.13
✎
12:32
|
(113) "я протестую против слова "всегда быстрее" ;)"
А никто мне не доказывал обратное (с) Фильм "Неоспоримый". |
|||
115
Wobland
20.08.13
✎
12:49
|
==== Вариант 1: 12,292 сек. Вариант 2: 9,424 сек. Вариант 1: 12,101 сек. Вариант 2: 9,054 сек. потом поменял циклы местами: Вариант 1: 8,851 сек. Вариант 2: 11,668 сек. Вариант 1: 9,271 сек. Вариант 2: 14,896 сек. ==== вывод: НЕ (запрос всегда быстрее). есть возражения? ПС 1С:Предприятие 8.2 (8.2.18.102) |
|||
116
Cube
20.08.13
✎
12:51
|
(115) Добавь к каждому варианту перебор полученной ТЗ...
|
|||
117
Wobland
20.08.13
✎
12:53
|
(116) а вот это уже другая задача. допустим, я хочу вернуть вовне результат запроса, зачем перебирать?
|
|||
118
Cube
20.08.13
✎
12:54
|
(117) А что, боишься? :)
|
|||
119
Wobland
20.08.13
✎
12:55
|
плин, в чём разница меж двумя ТЗ? это ж переменные
|
|||
120
Cube
20.08.13
✎
12:57
|
(119) Вот я и спрашиваю - очкуешь? :)))
Добавь, посмотрим)) |
|||
121
Wobland
20.08.13
✎
13:01
|
хочешь немного уличной магии? ©
не доходит Вариант 1: 8,75 сек. //Остатки() Вариант 2: 13,209 сек. //запрос Для Каждого ТекСтрока Из ТЗ Цикл КонецЦикла; |
|||
122
Wobland
20.08.13
✎
13:02
|
Вариант 1: 8,608 сек.
Вариант 2: 11,82 сек. Для Каждого ТекСтрока Из ТЗ Цикл к=ТекСтрока.Контрагент; КонецЦикла; |
|||
123
Cube
20.08.13
✎
13:02
|
(121) Ладно, в четверг я тоже сделаю аналогичный тест. Сравним :)
P.S. Ты обработочку не удаляй пока)) |
|||
124
Wobland
20.08.13
✎
13:03
|
(123) а что четверг? копируй да вставляй
|
|||
125
Cube
20.08.13
✎
13:04
|
(124) Не, я тупым копипастом не занимаюсь =))
|
|||
126
Infsams654
20.08.13
✎
13:17
|
(113) в дельфях запрос строится в объекте. В 1С постоянно Новый Запрос() даже в модуле формы, до коле такой изврат будет не прекращен ?
|
|||
127
tempaccount
20.08.13
✎
14:37
|
{Документ.РасходнаяНакладная.Форма.ФормаДокумента.Форма(27)}: Ошибка при вызове метода контекста (Выполнить)
Выборка = Запрос.Выполнить().Выбрать(); по причине: {(4, 5)}: Таблица не найдена "Справочник.ЕдиницыИзмерения" <<?>>Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения &НаСервере Процедура ТоварПриИзмененииНаСервере(ТекущийТовар, ЕдИзм) Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 | ЕдиницыИзмерения.Ссылка |ИЗ | Справочники.ЕдинцыИзмерения КАК ЕдиницыИзмерения |ГДЕ | ЕдинцыИзмерения.Владелец = &ТекущийТовар"); Запрос.УстановитьПараметр("Товар", ТекущийТовар); Выборка = Запрос.Выполнить().Выбрать(); ЕдИзм = ?(Выборка.Следующий(), Выборка.Ссылка, ПредопределенноеЗначение("Справочник.ЕдиницыИзмерения.ПустаяСсылка")); КонецПроцедуры //ТоварПриИзмененииНаСервере() &НаКлиенте Процедура ТоварыТоварПриИзменении(Элемент) ТекСтрока = Элементы.Товары.ТекущиеДанные; ТоварПриИзмененииНаСервере(ТекСтрока.Товар, ТекСтрока.Единиц); ТекСтрока.Цена = ВернутьЦену(ТекСтрока.Товар); ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество; КонецПроцедуры |
|||
128
Wobland
20.08.13
✎
14:44
|
конструктор - эта такая хрень, вызываемая по правой кнопке мыши
|
|||
129
Wobland
20.08.13
✎
14:45
|
ну и не может указанный код вызывать указанную ошибку
|
|||
130
tempaccount
20.08.13
✎
19:12
|
Уже который день пытаюсь разобраться с конструктором запросов.
Ни отчет, ни селект нормальный ни как не запилю. Сори за нытьё |
|||
131
Cube
22.08.13
✎
07:20
|
(115) (121) (122) (123) Понеслось:
------------------------------ В выборках участвовало 3 054 записей. Количество повторов: 100. Средние значения: Выборка1: Время выборки 0,099 сек. Время обработки 0,012 сек. Итого время 0,111 сек. Выборка2: Время выборки 0,104 сек. Время обработки 0,012 сек. Итого время 0,116 сек. Конфигурация: Управление производственным предприятием, редакция 1.3 (1.3.42.1) Тип работы ИБ: Клиент-серверный Версия приложения: 8.2.18.109 Тип платформы: Windows x86 Версия ОС: version 6.1 Service Pack 1 (Build 7601) Процессор: GenuineIntel x86 Family 6 Model 23 Stepping 10 2341 MHz Оперативная память: 2 013 ------------------------------ Код обработки: Процедура ВыполнитьНажатие(Элемент) СреднееВремяВыборки1 = 0; СреднееВремяОбработки1 = 0; СреднееИтогоВремя1 = 0; СреднееВремяВыборки2 = 0; СреднееВремяОбработки2 = 0; СреднееИтогоВремя2 = 0; Индикатор = 0; ЭлементыФормы.Индикатор.МаксимальноеЗначение = КоличествоПовторов * 2; Если ВыводитьДетальныеЗаписи Тогда Сообщить("--------------- Выборка 1 ---------------"); КонецЕсли; Для Сч = 1 По КоличествоПовторов Цикл ОбработкаПрерыванияПользователя(); Точка0 = ТекущаяУниверсальнаяДатаВМиллисекундах(); Запрос = Новый Запрос("ВЫБРАТЬ | * |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки"); ТЗ1 = Запрос.Выполнить().Выгрузить(); Точка1 = ТекущаяУниверсальнаяДатаВМиллисекундах(); Для Каждого СтрокаТЗ1 ИЗ ТЗ1 Цикл Значение1 = СтрокаТЗ1.СуммаВзаиморасчетовОстаток; КонецЦикла; Точка2 = ТекущаяУниверсальнаяДатаВМиллисекундах(); Если ВыводитьДетальныеЗаписи Тогда Сообщить("Время выборки " + Формат((Точка1 - Точка0) / 1000, "ЧДЦ=3; ЧН=; ЧГ=") + " сек. Время обработки " + Формат((Точка2 - Точка1) / 1000, "ЧДЦ=3; ЧН=; ЧГ=") + " сек. Итого время " + Формат((Точка2 - Точка0) / 1000, "ЧДЦ=3; ЧН=; ЧГ=") + " сек."); КонецЕсли; СреднееВремяВыборки1 = СреднееВремяВыборки1 + (Точка1 - Точка0) / (1000 * КоличествоПовторов); СреднееВремяОбработки1 = СреднееВремяОбработки1 + (Точка2 - Точка1) / (1000 * КоличествоПовторов); СреднееИтогоВремя1 = СреднееИтогоВремя1 + (Точка2 - Точка0) / (1000 * КоличествоПовторов); Индикатор = Индикатор + 1; КонецЦикла; Если ВыводитьДетальныеЗаписи Тогда Сообщить("--------------- Выборка 2 ---------------"); КонецЕсли; Для Сч = 1 По КоличествоПовторов Цикл ОбработкаПрерыванияПользователя(); Точка0 = ТекущаяУниверсальнаяДатаВМиллисекундах(); ТЗ2 = РегистрыНакопления.ВзаиморасчетыСКонтрагентами.Остатки(); Точка1 = ТекущаяУниверсальнаяДатаВМиллисекундах(); Для Каждого СтрокаТЗ2 ИЗ ТЗ2 Цикл Значение1 = СтрокаТЗ2.СуммаВзаиморасчетов; КонецЦикла; Точка2 = ТекущаяУниверсальнаяДатаВМиллисекундах(); Если ВыводитьДетальныеЗаписи Тогда Сообщить("Время выборки " + Формат((Точка1 - Точка0) / 1000, "ЧДЦ=3; ЧН=; ЧГ=") + " сек. Время обработки " + Формат((Точка2 - Точка1) / 1000, "ЧДЦ=3; ЧН=; ЧГ=") + " сек. Итого время " + Формат((Точка2 - Точка0) / 1000, "ЧДЦ=3; ЧН=; ЧГ=") + " сек."); КонецЕсли; СреднееВремяВыборки2 = СреднееВремяВыборки2 + (Точка1 - Точка0) / (1000 * КоличествоПовторов); СреднееВремяОбработки2 = СреднееВремяОбработки2 + (Точка2 - Точка1) / (1000 * КоличествоПовторов); СреднееИтогоВремя2 = СреднееИтогоВремя2 + (Точка2 - Точка0) / (1000 * КоличествоПовторов); Индикатор = Индикатор + 1; КонецЦикла; Сообщить("------------------------------"); Сообщить("В выборках участвовало " + ТЗ1.Количество() + " записей. Количество повторов: " + КоличествоПовторов + ". Средние значения:"); Сообщить("Выборка1: Время выборки " + Формат(СреднееВремяВыборки1, "ЧДЦ=3; ЧН=; ЧГ=") + " сек. Время обработки " + Формат(СреднееВремяОбработки1, "ЧДЦ=3; ЧН=; ЧГ=") + " сек. Итого время " + Формат(СреднееИтогоВремя1, "ЧДЦ=3; ЧН=; ЧГ=") + " сек."); Сообщить("Выборка2: Время выборки " + Формат(СреднееВремяВыборки2, "ЧДЦ=3; ЧН=; ЧГ=") + " сек. Время обработки " + Формат(СреднееВремяОбработки2, "ЧДЦ=3; ЧН=; ЧГ=") + " сек. Итого время " + Формат(СреднееИтогоВремя2, "ЧДЦ=3; ЧН=; ЧГ=") + " сек."); Сообщить(" "); Сообщить("Конфигурация: " + Метаданные.Синоним + " (" + Метаданные.Версия + ")"); Сообщить("Тип работы ИБ: " + ?(Найти(СтрокаСоединенияИнформационнойБазы(), "Srvr") = 0, "Файловый", "Клиент-серверный")); СистемнаяИнформация = Новый СистемнаяИнформация; Сообщить("Версия приложения: " + СистемнаяИнформация.ВерсияПриложения); Сообщить("Тип платформы: " + СистемнаяИнформация.ТипПлатформы); Сообщить("Версия ОС: " + СистемнаяИнформация.ВерсияОС); Сообщить("Процессор: " + СистемнаяИнформация.Процессор); Сообщить("Оперативная память: " + СистемнаяИнформация.ОперативнаяПамять); Сообщить("------------------------------"); КонецПроцедуры //ВыполнитьНажатие() |
|||
132
Wobland
22.08.13
✎
07:33
|
1) интересно глянуть на ТекущаяУниверсальнаяДатаВМиллисекундах()
2) повторов мало. общее время-время выборки=5 мс. ну о чём тут говорить? практически монопенисуально ;) |
|||
133
Wobland
22.08.13
✎
07:39
|
------------------------------
В выборках участвовало 135 записей. Количество повторов: 100. Средние значения: Выборка1: Время выборки 0,005 сек. Время обработки 0,000 сек. Итого время 0,005 сек. Выборка2: Время выборки 0,004 сек. Время обработки 0,000 сек. Итого время 0,004 сек. Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.22.14) Тип работы ИБ: Клиент-серверный Версия приложения: 8.2.18.102 Тип платформы: Windows x86-64 Версия ОС: version 6.1 Service Pack 1 (Build 7601) Процессор: GenuineIntel Intel64 Family 6 Model 44 Stepping 2 2400 MHz Оперативная память: 36 852 ------------------------------ |
|||
134
Cube
22.08.13
✎
07:48
|
(131) Та же ИБ в файловом варианте:
------------------------------ В выборках участвовало 2 522 записей. Количество повторов: 1 000. Средние значения: Выборка1: Время выборки 0,056 сек. Время обработки 0,009 сек. Итого время 0,065 сек. Выборка2: Время выборки 0,054 сек. Время обработки 0,009 сек. Итого время 0,063 сек. Конфигурация: Управление производственным предприятием, редакция 1.3 (1.3.41.2) Тип работы ИБ: Файловый Версия приложения: 8.2.18.109 Тип платформы: Windows x86 Версия ОС: version 6.1 Service Pack 1 (Build 7601) Процессор: GenuineIntel x86 Family 6 Model 23 Stepping 10 2341 MHz Оперативная память: 2 013 ------------------------------ |
|||
135
Wobland
22.08.13
✎
07:49
|
"запрос всегда быстрее" = ложь?
|
|||
136
Cube
22.08.13
✎
07:51
|
(132) "повторов мало. общее время-время выборки=5 мс. ну о чём тут говорить? практически монопенисуально ;)"
Повторов больше только на другой базе можно. Это на боевой^^ Да, разница в скорости небольшая совсем... |
|||
137
Wobland
22.08.13
✎
07:53
|
а нефих время на 1000*1000 делить, кстати
В выборках участвовало 135 записей. Количество повторов: 1 000. Средние значения: Выборка1: Время выборки 3,872 сек. Время обработки 0,591 сек. Итого время 4,463 сек. Выборка2: Время выборки 2,702 сек. Время обработки 0,371 сек. Итого время 3,073 сек. |
|||
138
Cube
22.08.13
✎
07:54
|
(135) Согласись, запрос задает темп скорости, а не наоборот :))
Всё равно буду говорить, запрос всегда быстрее. Чтобы людей не вводить в заблуждение :) |
|||
139
Cube
22.08.13
✎
07:55
|
(137) У меня это средние значения вообще-то, а не общие :)
|
|||
140
Cube
22.08.13
✎
07:56
|
(133) Объем данных маленький... Погрешность большая...
|
|||
141
Wobland
22.08.13
✎
07:57
|
(139) на этих средних разница так видна, как на общимх
говори "запрос всегда лучше" ;) |
|||
142
Wobland
22.08.13
✎
07:57
|
(141) *не так видна
|
|||
143
Cube
22.08.13
✎
07:59
|
(141) Ну, можно добавить абсолютные значения, наверное.
|
|||
144
Cube
22.08.13
✎
08:01
|
(141) "запрос всегда лучше"
Что русскому хорошо, то немцу - смерть =)) Лучше/хуже это сильно размыто. Быстрее/медленнее это более конкретно. Ладно, хватит флудить уже :) |
|||
145
Wobland
22.08.13
✎
08:01
|
(143) да я и добавил в (137) - делю на 1000. короче, закрываем тему. в некоторых частных случаях запрос работает медленнее
|
|||
146
Cube
22.08.13
✎
08:03
|
(145) "в некоторых частных случаях запрос работает медленнее"
Когда влияния внешних факторов достаточно велико =)) Я думаю, что при равных условиях, результаты будут одинаковыми. Только вот создать такие условия не получится... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |