Имя: Пароль:
1C
1С v8
V8 Как из документа изменить табличную часть в справочнике
0 tempaccount
 
19.08.13
02:09
Не могу достучаться до полей ТЧ справочника.
Нужно создании документа проверять на наличие и изменять/создавать поля (строки)





&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    СкладНазначения = Справочники.Склады.НайтиПоНаименованию(Объект.Склад.Наименование);     
    Для Каждого ТекСтрока Из СкладНазначения.Материалы Цикл
        ТекСтрока.Количество = 5;//Тут действие, которое и выдает ошибку, т.к. нельзя изменить. .Запись(); или .Добавить(); хз как работает.
    КонецЦикла;

КонецПроцедуры
1 ОбычныйЧеловек
 
19.08.13
02:18
Вместо
СкладНазначения = Справочники.Склады.НайтиПоНаименованию(Объект.Склад.Наименование);


Напиши
СкладНазначения= Объект.Склад.ПолучитьОбъект();
2 Cube
 
19.08.13
05:16
(0) Это что, ты остаток товара на складе в реквизите хранишь что-ли?
3 Wobland
 
19.08.13
05:57
>Склады.НайтиПоНаименованию(Объект.Склад.Наименование)
это прекрасно!
4 tempaccount
 
19.08.13
10:10
Хорошо, попробую через объект.

Cube
Нет, справочник "СКЛАДЫ" содержит... склады. В табличной части коего и сдержаться товары/материалы.

Wobland
А как же мне еще найти склад, о котором идет речь? :)
5 Wobland
 
19.08.13
10:10
(4) следи внимательно за руками: Объект.Склад
6 Лодырь
 
19.08.13
10:12
(5) Шулер!
7 Wobland
 
19.08.13
10:13
(4) а зачем, интересно, во всех типовых всяческие товары на складах выделены в РН?
8 tempaccount
 
19.08.13
10:22
Спасибо, заработало!
Я поражен оперативностью форума.
Ребята, КРАСАВЧИКИ!
9 Wobland
 
19.08.13
10:23
(8) как будешь выяснять, сколько лопат приходило на склад в прошлом месяце?
10 tempaccount
 
19.08.13
10:29
Ну так регистр накопления есть.
11 Wobland
 
19.08.13
10:40
следующий вопрос. зачем ТЧ у справочника? хватит ли дублирования информации в РН и в ТЧ? достаточно ли это надёжно?
12 tempaccount
 
19.08.13
10:47
Ну логичестки рассуждая. Я предполагаю что надо все в справочнике хранить, что-бы открыл склады. Открыл склад, и смотришь что же в нем есть.
Ну по мне так РН сдела так, чисто показать действия.
Про надежность еще ни слова. Это первая программа.
НА джабе или шарпе писать куда понятней...
13 Wobland
 
19.08.13
10:50
(12) открыл отчёт по остаткам, и смотришь, что же есть на складе..
14 tempaccount
 
19.08.13
10:52
Хм... ну там же смотриться за какое-то время.
15 Wobland
 
19.08.13
10:53
(14)  открыл отчёт по остаткам, и смотришь, что же есть на складе на нужную дату..
16 tempaccount
 
19.08.13
10:58
Т.е. можно обойтись и без справочников?
А как я узнаю какой материал? Там же просто все в куче.
17 Wobland
 
19.08.13
11:00
не нужно дублировать информацию
18 tempaccount
 
19.08.13
11:05
Я тоже так считаю. Поэтому и не хотел РН заводить.
Но раз так нужно...
можете какой-нибудь небольшой пример кинуть на эту тему.
Т.к. в учебнике оч много написано :)
19 Wobland
 
19.08.13
11:07
какой пример?
20 Jonny_Khomich
 
19.08.13
11:10
Автор, ты сперва изучи курсы Гилёва или Чистова, там тебе принципы работы 1с расскажут
21 tempaccount
 
19.08.13
11:16
Я просто не понимаю почему надо в РН хранить и учитовать остатки товаров, а не в справочниках
22 Wobland
 
19.08.13
11:18
(21) для истории, для скорости работы
23 stix2010
 
19.08.13
11:19
СкладНазначения = Справочники.Склады.НайтиПоНаименованию(Объект.Склад.Наименование);

это ппц, а

СкладНазначения=Объект.Склад не тянет?

кто остатки хранит в справочнике?
24 Лодырь
 
19.08.13
11:23
(22) Историю можно получить версионированием )
25 Wobland
 
19.08.13
11:25
(24) хочу видеть, как будут вычисляться обороты за период ;)
26 Infsams654
 
19.08.13
11:26
(21) в справочнике хранятся общие сведения о товаре, в РН хранятся остатки товара, при чем по датам и по другим измерениям, например по складам. Как в справочнике это можно ?
27 Wobland
 
19.08.13
11:28
(26) легко. заводятся всякие разные реквизиты в ТЧ, вплоть до даты и вперёд
28 stix2010
 
19.08.13
11:29
ТС, ты сейчас остатки номенклатуры в справочнике Складов хранишь, а если тебе в справочнике Номенклатура нужно будет показать остатки товара по складам - ты табличную часть в справочнике Номенклатура создашь?
29 tempaccount
 
19.08.13
11:30
Wobland
Да именно так и думал! Но оказывается надо через РН все делать...
30 Cube
 
19.08.13
11:31
(21) По регистрам очень быстро строятся отчеты. В частности, ты можешь при открытии склада на форме показывать его остатки и это будет что-то вроде отчета... То есть у склада не будет табличной части, все необходимые данные будут получены запросом к регистру при открытии формы и выведены на форму.
31 Wobland
 
19.08.13
11:31
(29) дошло уже или дальше какулей бросать?
32 Cube
 
19.08.13
11:32
(29) "Но оказывается надо через РН все делать"
И это правильно.
33 tempaccount
 
19.08.13
11:34
Ну писал бы БД и под java/C# сделал бы иначе просто.
Все удаляю табличную часть СКЛАДОВ. и реализуем РН более полно
34 Wobland
 
19.08.13
11:34
(30) или тупо фильтровать дополнительное ТП на форме по складу
35 Wobland
 
19.08.13
11:35
(33) имхается мне, принцип от платформы не особо зависит. у 1С есть специально обученный механизм под всякие остатки и обороты, конечно. но что это меняет?
36 Infsams654
 
19.08.13
11:39
(27) гы :))
37 Wobland
 
19.08.13
11:52
а я, кстати, реализовывал как-то функциональность РН (с остатками и оборотами) на подчинённом справочнике. на семёрке ещё. подробностей уж не помню
38 tempaccount
 
19.08.13
11:53
Вообщем:
//Справочники
1)Склад, будет тупо содержать перечень существующих складов.
2)Материалы. Перечень доступных материалов\товаров.
3)Контрагенты. Соответственно клиенты\поставщики.

//Документы
1)Приход
2)Расход
Указывают куда и что приходит\уходит.
Все это регистрируется в РН

//Регистр накопления
1)ОстатокМатериалов.
Тут содержиться весь лог остатков.

Вопрос: Я примерно прав?
Вопрос 2: ПередОтправкойНаСервак нужно проверять на наличие товаров, во время расходов например?
Как расчитывается остаток нужного материала на нужном складе?

П.с. Заранее сорри за столь нубский вопрос. Тяжко :)
39 Wobland
 
19.08.13
11:55
(38) вопрос1: да. вопрос2: бред. запросом к ВТ Остатки нужного РН
40 Wobland
 
19.08.13
11:57
по-моему, чистовская версия контроля остатков:

    Запрос.Текст = "ВЫБРАТЬ
                   |    РасходнаяТовары.Номенклатура,
                   |    СУММА(РасходнаяТовары.Количество) КАК Количество,
                   |    СУММА(РасходнаяТовары.Сумма) КАК СуммаПродажи
                   |ПОМЕСТИТЬ ДокТЧ
                   |ИЗ
                   |    Документ.Расходная.Товары КАК РасходнаяТовары
                   |ГДЕ
                   |    РасходнаяТовары.Ссылка = &Ссылка
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    РасходнаяТовары.Номенклатура
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    ДокТЧ.Номенклатура,
                   |    ДокТЧ.Количество,
                   |    ДокТЧ.СуммаПродажи,
                   |    ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
                   |    ЕСТЬNULL(Остатки.СуммаОстаток, 0) КАК СуммаОстаток,
                   |    ЕСТЬNULL(БухРег.КоличествоОстаток,0) КАК БухКоличествоОстаток,
                   |    ЕСТЬNULL(БухРег.СуммаОстаток,0) КАК БухСуммаОстаток
                   |ИЗ
                   |    ДокТЧ КАК ДокТЧ
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
                   |                &МоментВремени,
                   |                Склад = &Склад
                   |                    И Номенклатура В
                   |                        (ВЫБРАТЬ
                   |                            А.Номенклатура
                   |                        ИЗ
                   |                            ДокТЧ КАК А)) КАК Остатки
                   |        ПО ДокТЧ.Номенклатура = Остатки.Номенклатура
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
                   |                &МоментВремени,
                   |                Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.товары),
                   |                ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура),
                   |                Субконто1 В
                   |                    (ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |                        А.Номенклатура
                   |                    ИЗ
                   |                        ДокТЧ КАК А)) КАК БухРег
                   |        ПО ДокТЧ.Номенклатура = БухРег.Субконто1";
41 Лодырь
 
19.08.13
11:58
(38) Контроль остатков выполняется при проведении. Варианта контроля два (до и после списания, типа "по старому" и "по новому").
42 Infsams654
 
19.08.13
12:25
(37) так в 7-ке можно было указывать у реквизита Периодический, т.е. как бы в одном флаконе
43 tempaccount
 
19.08.13
19:59
К сожалению, еще не проверил код "ВЫБОРКИ".
Но созрел уже вопрос:

Есть справочник А и Б.
А - владелиц Б.
В ТЧ Документа С, есть поля наименований А и Б.
Как сделать, что бы при выборе элемента А, автоматически заполнялся граф Б?

П.с. Сорри если криво написал.
Т.к. функции и процедуры 1с для меня "таинственны", есть мысль "Процедура АПриИзменении()" написать тупо цикл поиска в таблице Б. Но уверен что есть простая функция.
44 Ork
 
19.08.13
20:01
(43) Владелец - есть свойство элемента подчиненного справочника. Без всяких функций, поисков и прочего.
45 tempaccount
 
19.08.13
20:07
Свойства у элемента ТЧ такого нету.
Придется доставать объект сам? Т.е. ссылаться напрямую?
<a href='http://rghost.ru/48230451.view'><img src='http://rghost.ru/48230451/image.png' /></a>
46 tempaccount
 
19.08.13
20:08
А как редактировать свои сообщения?
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) "в некоторых частных случаях запрос работает медленнее"
Когда влияния внешних факторов достаточно велико =))
Я думаю, что при равных условиях, результаты будут одинаковыми. Только вот создать такие условия не получится...