Имя: Пароль:
1C
1С v8
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

обMSScriptControl = Новый COMОбъект("MSScriptControl.ScriptControl");
обMSScriptControl.language = "javascript";
НН=1000;

// вариант 1
Старт=обMSScriptControl.eval("new Date().getTime()");
Для й=0 По НН Цикл
    Запрос=Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ПрочиеРасчетыОстатки.*
    |ИЗ
    |    РегистрНакопления.ПрочиеРасчеты.Остатки КАК ПрочиеРасчетыОстатки";
    ТЗ=Запрос.Выполнить().Выгрузить();
КонецЦикла;
Финиш=обMSScriptControl.eval("new Date().getTime()");
Сообщить("Вариант 1: "+(Финиш-Старт)/1000+" сек.");

// вариант 2
Старт=обMSScriptControl.eval("new Date().getTime()");
Для й=0 По НН Цикл
    ТЗ=РегистрыНакопления.ПрочиеРасчеты.Остатки();
КонецЦикла;
Финиш=обMSScriptControl.eval("new Date().getTime()");
Сообщить("Вариант 2: "+(Финиш-Старт)/1000+" сек.");

====
Вариант 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) "в некоторых частных случаях запрос работает медленнее"
Когда влияния внешних факторов достаточно велико =))
Я думаю, что при равных условиях, результаты будут одинаковыми. Только вот создать такие условия не получится...