Имя: Пароль:
1C
1С v8
Движение по созданному регистру
, , ,
0 Aldnepr
 
07.12.17
10:43
Создал новый регистр накопления с одним измерением- "Грузчик" и ресурсы- "Вес" и ВесПН", не могу сделать по нему движения, ругается Запись не верна! Период не может быть пустым! (Регистр накопления: Отгрузки по грузчикам; Номер строки: 1), что не доделал?

Процедура ПровестиПоГрузчику(Гр) Экспорт
                                                        
    ОбщийВес = ИтВес;
НаборЗаписей = РегистрыНакопления.ОтгрузкиПоГрузчикам.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
Запись = НаборЗаписей.Добавить();
Запись.Регистратор = ЭтотОбъект.Ссылка;
Запись.Грузчик = Гр;
Запись.Вес = 0;
Запись.ВесПН = ОбщийВес / тКоэф;
НаборЗаписей.Записать();  
    
КонецПроцедуры
1 rabbidX
 
07.12.17
10:45
Период не может быть пустым
2 Ненавижу 1С
 
гуру
07.12.17
10:45
наверное Период заполнить, логично?
3 1Садовник
 
07.12.17
10:47
Запись.Период = .... заполни нужной датой
4 Aldnepr
 
07.12.17
10:53
(3) Да, так и есть. Спасибо! Скажите, а при отмене проведения или корректировке этого документа надо удалять записи из регистра, чтобы они не задвоились? И есть ли инструмент какой то для просмотра записей регистра, что в нем накоплено
5 Веселый собака
 
07.12.17
10:56
(4) автоматические движения установи.
6 Адинэснег
 
07.12.17
10:58
семерошники подтянулись :-D
7 hhhh
 
07.12.17
10:59
(4) скопируй все мысли из типовых регистров
8 nordbox
 
07.12.17
10:59
(4)>>И есть ли инструмент какой то для просмотра записей регистра, что в нем накоплено
Есть, открой Все функции и выбери нужный тебе регистр
9 Адинэснег
 
07.12.17
10:59
она еще сырая, период какой-то все время просит в регистре накопления...
10 nordbox
 
07.12.17
11:00
(9) не издевайся над человеком
11 Волшебник
 
модератор
07.12.17
11:00
(9) Это он ещё с регистрами сведений не сталкивался. Те вообще уничтожаются одной строкой
12 Веселый собака
 
07.12.17
11:02
(11) Двумя!
13 Aldnepr
 
07.12.17
11:04
(5) где они устанавливаются?
14 Адинэснег
 
07.12.17
11:05
разберись сначала с регистрами накопления, проникся...
найди отличие РН остатов от РН оборотов...
потом покури виртуальные таблицы оборотов и таблицы остатков и оборотов
потом посмотри в консоли запросов, что всё <s>украдено</s> реализовано до нас
15 Aldnepr
 
07.12.17
11:05
(8) спасибо, нормально вроде все прописывается и в случае перепроведения и после отмены проводки. Можно успокоиться?)
16 Волшебник
 
модератор
07.12.17
11:06
(12) Одной!
17 hhhh
 
07.12.17
11:07
(15) нет нельзя,  автоматические движения - это хрень. Лучше сделай как в типовых регистрах сделано.
18 Адинэснег
 
07.12.17
11:07
(12)одной Записать();
двумя можно нечаяно отбор установить
19 Aldnepr
 
07.12.17
11:07
(11) Сталкивался. Еще та гадость) спросил разок тут- затролили только, пока отложил их
20 nordbox
 
07.12.17
11:07
(15) Ну это смотря какая у тебя задача
21 Волшебник
 
модератор
07.12.17
11:08
РегистрыСведений.СамыйВажныйРегистр.СоздатьНаборЗаписей().Записать();
22 Веселый собака
 
07.12.17
11:09
(21) Это уже намеренное вредительство. Памятка шпиону.
23 MrStomak
 
07.12.17
11:09
(18) Не можешь уничтожить РС одной строкой? Слабак!
24 Aldnepr
 
07.12.17
11:09
(20) Задача очень простая- простенький регистр для разноса перенесенного веса по грузчикам.И строить отчет по нему, и сделать как можно проще)
25 Адинэснег
 
07.12.17
11:10
26 nordbox
 
07.12.17
11:11
(24) ну поиграйся с данными. если тебя устроит то оставляй
27 nordbox
 
07.12.17
11:13
Посмотри как в типовых сделано, как у других сделано, на разных сайтах пошарься, выбери то что тебе нравится.
28 VladZ
 
07.12.17
11:13
(21) Это, конечно, они зря сделали.
Убить большой объем данных одной строкой - это нифига ненадежно.
29 Волшебник
 
модератор
07.12.17
11:16
(28) Согласен
30 Aldnepr
 
07.12.17
11:16
(21) Вот благодарка за такое! буду знать теперь, что в регистры сведений и не заходить без бахилл
31 Адинэснег
 
07.12.17
11:17
Запрос = Новый Запрос("ВЫБРАТЬ
                          |    ОтгрузкиПоГрузчикамОбороты.Грузчик КАК Грузчик,
                          |    ОтгрузкиПоГрузчикамОбороты.ВесОборот КАК ВесОборот,
                          |    ОтгрузкиПоГрузчикамОбороты.ВесПНОборот КАК ВесПНОборот
                          |ИЗ
                          |    РегистрНакопления.ОтгрузкиПоГрузчикам.Обороты КАК ОтгрузкиПоГрузчикамОбороты");
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Сообщить(Строка(Выборка)+ " перетащил " + Строка(Выборка.ВесОборот)  + " И "+ Строка(Выборка.ВесПНОборот));
    КонецЦикла;
32 Адинэснег
 
07.12.17
11:17
Сообщить(Строка(Выборка.Грузчик)+ " перетащил " + Строка(Выборка.ВесОборот)  + " И "+ Строка(Выборка.ВесПНОборот));
33 Aldnepr
 
07.12.17
11:19
(32) ))) "перетащил"+" И"+"  не сдох!"
34 Адинэснег
 
07.12.17
11:22
Можно без запросов, вызывать метод(у него кстати тоже параметры, для отбора и группировки), который вернет таблицу значений , потом таблицу обойти...
ТаблицаОборотов = РегистрыНакопления.ОтгрузкиПоГрузчикам.Обороты();
    Для Каждого СтрокаТаблицы Из ТаблицаОборотов Цикл
        Сообщить(Строка(СтрокаТаблицы.Грузчик)+ " перетащил " + Строка(СтрокаТаблицы.ВесОборот)  + " И "+ Строка(СтрокаТаблицы.ВесПНОборот));
    КонецЦикла;

но лучше сразу кури запросы
35 Aldnepr
 
07.12.17
11:24
(34) чего то записывает одну запись только, а участвует 2 грузчика и отладчик подтверждает((. Кину полный код
Процедура ПровестиПоГрузчику(Гр) Экспорт
                                                        
    ОбщийВес = ИтВес;
НаборЗаписей = РегистрыНакопления.ОтгрузкиПоГрузчикам.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
Запись = НаборЗаписей.Добавить();
Запись.Регистратор = ЭтотОбъект.Ссылка;
Запись.Период= Дата;
Запись.Грузчик = Гр;
Запись.Вес = 0;
Запись.ВесПН = ОбщийВес / тКоэф;
НаборЗаписей.Записать();  
    
КонецПроцедуры

// =========================================================
Процедура ПоГрузчикам()
    
    тКоэф = (ЗначениеЗаполнено(Грузчик1)) + (ЗначениеЗаполнено(Грузчик2)) + (ЗначениеЗаполнено(Грузчик3)) + (ЗначениеЗаполнено(Грузчик4));
    
    Если тКоэф > 0 Тогда

        Если ЗначениеЗаполнено(Грузчик1) = 1 Тогда
            ПровестиПоГрузчику(Грузчик1);
        КонецЕсли;
        Если ЗначениеЗаполнено(Грузчик2) = 1 Тогда
            ПровестиПоГрузчику(Грузчик2);
        КонецЕсли;
        Если ЗначениеЗаполнено(Грузчик3) = 1 Тогда
            ПровестиПоГрузчику(Грузчик3);
        КонецЕсли;
        Если ЗначениеЗаполнено(Грузчик4) = 1 Тогда
            ПровестиПоГрузчику(Грузчик4);
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры
36 Веселый собака
 
07.12.17
11:27
(35) ну.. все правильно.
Одна запись на 1 регистратор )
37 Aldnepr
 
07.12.17
11:29
(36) как исправить((
38 Веселый собака
 
07.12.17
11:31
(37) Отбором.
39 Aldnepr
 
07.12.17
11:32
(38) черкни если не трудно строчку
40 Aldnepr
 
07.12.17
11:33
(38) НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
есть же отбор
41 Веселый собака
 
07.12.17
11:35
(40) Это неполный отбор. добавь конкретного грузчика.
42 Табуретко
 
07.12.17
11:38
(35)НаборЗаписей.Записать(Ложь);
43 MrStomak
 
07.12.17
11:38
(41) И давно в РН можно ставить отбор на измерение?
44 Леха Дум
 
07.12.17
11:41
(27) Советовать новичку с неокрепшей психикой посмотреть как сделаны движения по регистрам в типовых??? да это просто знатный троллинг! :)
(30) там не бахилы нужны, а прямые руки :)
45 Адинэснег
 
07.12.17
11:42
какого енга у тебя грузчики в реквизитах? запихни в тч
46 MrStomak
 
07.12.17
11:42
(42) Да. После этого только нужно будет убедиться, что либо в начала регистр вручную очищается, либо стоит автоматическое удаление движений при отмене проведения.
47 Адинэснег
 
07.12.17
11:46
ЗначениеЗаполнено(Грузчик3) = 1
нахрена метод, возвращающий Булево сравнивать с числом?
забудь уже 7ку
48 Табуретко
 
07.12.17
11:46
(46) в (15) уже вроде разобрались с автоматом, не?
49 MrStomak
 
07.12.17
11:47
(48) Нет, там не было Записать(Ложь)
50 Aldnepr
 
07.12.17
11:47
(42) Так работает). При отмене проведения регистр очищается по этому регистратору, при корректировке накладной тоже меняет как надо. Можно считать задачу выполненой?
51 dezss
 
07.12.17
11:48
(40) только надо добавлять сразу все строки из этого документа движения, а не по-очереди.
52 Табуретко
 
07.12.17
11:48
(50) нет
53 Aldnepr
 
07.12.17
11:49
(52) что еще проверить?
54 Адинэснег
 
07.12.17
11:49
когда 5й грузчик устроится, или вес захотят не пропорционально распределить - заработаешь еще на тарелку супа...
55 Адинэснег
 
07.12.17
11:49
считай выолнено
56 1Садовник
 
07.12.17
11:51
Добавь просто что бы работало:
НаборЗаписей.Отбор.Грузчик.Установить(Гр);

А так по хорошему нужно ВСЕ переделывать
57 ИТ директор
 
07.12.17
11:53
(0) Чувак так никто не делает. Нужно один раз создать набор записей, заполнить его и записать. Но для начала пойдет, бгг, будешь потом смотреть и ржать над собой.
58 hhhh
 
07.12.17
11:53
(50) "Можно считать задачу выполненой" - когда деньги появятся у тебя в кармане, тогда и будешь считать выполненной. А пока забей, каждую минуту что ли будешь анализировать, считать выполненной или не считать?
59 Aldnepr
 
07.12.17
11:54
(56) а вот так отбор не работает!Поле объекта не обнаружено (Грузчик)
60 Aldnepr
 
07.12.17
11:55
(57) ну это все проделки 7,7. Не просто вывести ее, нужен мемори фул ирейз (
61 MrStomak
 
07.12.17
11:56
(56)
И давно в РН можно ставить отбор на измерение?
62 Веселый собака
 
07.12.17
11:56
(59) понравилось? )

Вот такой прикол- надо все из регистратора писать разом.
63 Веселый собака
 
07.12.17
11:57
(61) 1С- это квест! Без своих шишек руки не выпрямятся.
64 Ненавижу 1С
 
гуру
07.12.17
11:58
65 ИТ директор
 
07.12.17
11:58
(60) Вообще всё переделай тогда, движения заполняй в процедуре ОбработкаПроведения(), данные получай запросом, явную запись не вызывай.
66 hhhh
 
07.12.17
11:59
(59) ну так пробуй

+ Code

Процедура ПровестиПоГрузчику(Гр, НаборЗаписей) Экспорт
                                                        
    ОбщийВес = ИтВес;

Запись = НаборЗаписей.Добавить();
Запись.Регистратор = ЭтотОбъект.Ссылка;
Запись.Период= Дата;
Запись.Грузчик = Гр;
Запись.Вес = 0;
Запись.ВесПН = ОбщийВес / тКоэф;

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

// =========================================================

Процедура ПоГрузчикам()
    
    тКоэф = (ЗначениеЗаполнено(Грузчик1)) + (ЗначениеЗаполнено(Грузчик2)) + (ЗначениеЗаполнено(Грузчик3)) + (ЗначениеЗаполнено(Грузчик4));
    
    Если тКоэф > 0 Тогда

  НаборЗаписей = РегистрыНакопления.ОтгрузкиПоГрузчикам.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);  
    Если ЗначениеЗаполнено(Грузчик1) Тогда
            ПровестиПоГрузчику(Грузчик1, НаборЗаписей);
        КонецЕсли;
        Если ЗначениеЗаполнено(Грузчик2) Тогда
            ПровестиПоГрузчику(Грузчик2, НаборЗаписей);
        КонецЕсли;
        Если ЗначениеЗаполнено(Грузчик3) Тогда
            ПровестиПоГрузчику(Грузчик3, НаборЗаписей);
        КонецЕсли;
        Если ЗначениеЗаполнено(Грузчик4) Тогда
            ПровестиПоГрузчику(Грузчик4, НаборЗаписей);
        КонецЕсли;
НаборЗаписей.Записать();        
    КонецЕсли;

КонецПроцедуры
67 1Садовник
 
07.12.17
12:02
(61) Думал с сегодняшнего дня можно... согласен, косяк)
68 Адинэснег
 
07.12.17
12:03
ну и еще, у тебя 146% в этом коде будет "проблема последней копейки"
Общий вес 10, грузчика 3...
нужно распределить на максимальный коэффициент (хотя он у тебя всегда 1, значит на любого грузчика) остаток
69 MrStomak
 
07.12.17
12:03
Если честно, автору нужны не советы на мисте, а ударные дозы Радченко.
Всё сделано максимально неправильно.
Даже если закрыть глаза на поля Грузчик1..4, писать нужно так:
Набор = Движения.ОтгрузкиПоГрузчикам;
Набор.Записывать = истина;
Для Сч = 1 по 4 Цикл
Если НЕ ЭтотОбъект["Грузчик"+Сч].Пустая() Тогда
Запись = Набор.Добавить();
Запись.Период= Дата;
Запись.Грузчик = ЭтотОбъект["Грузчик"+Сч];
Запись.ВесПН = ОбщийВес / тКоэф;
КонецЕсли;
КонецЦикла;
70 Адинэснег
 
07.12.17
12:03
дело было не в восьмерке...
71 Адинэснег
 
07.12.17
12:06
а в начале обработки поставить...

Движения.ОтгрузкиПоГрузчикам.Записывать = Истина;    Движения.ОтгрузкиПоГрузчикам.Очистить();
72 Табуретко
 
07.12.17
12:07
щас тебе допилят до 1С совместимо ))
73 ИТ директор
 
07.12.17
12:09
(69) 4 раза запускаешь чтение объекта, если у него есть ТЧ, 4 лишних транзакции, если в ТЧ тысячи строк, это тысячи лишних чтений. Запросом надо.
74 MrStomak
 
07.12.17
12:11
(73) Ни одного чтения объекта не запускаю
75 MrStomak
 
07.12.17
12:11
И ни одного обращения к базе данных там нет.
76 Адинэснег
 
07.12.17
12:11
ЭтотОбъект["Грузчик"+Сч].Пустая()
77 ИТ директор
 
07.12.17
12:12
(74) Ты к реквизиту объекта обращаешься? Разве при этом не читается весь объект?
78 MrStomak
 
07.12.17
12:13
(76) Это не обращение к БД. Это работает даже на тонком клиенте. 1Ска умеет понимать пустые ссылки без вызова СУБД.
79 Адинэснег
 
07.12.17
12:13
(77) ну не из БД хоть, из памяти
80 MrStomak
 
07.12.17
12:14
(77)
Этот объект - это документ, который проводится. Он уже был прочитан при создании. Конструкция ЭтотОбъект["Грузчик1"] абсолютно идентична просто Грузчик1.
81 MrStomak
 
07.12.17
12:15
(77) Даже если бы я обращался по Ссылка.Грузчик - обращение к БД было бы только 1, а не 4, т.к. вызовы кешируются.
82 ИТ директор
 
07.12.17
12:17
А ну да, это же модуль объекта и читаем только его реквизиты. Чота я затупил.
83 MrStomak
 
07.12.17
12:19
(82) Код на мисте лучше не выкладывать - немедленно разведут обсуждение как всё неправильно :))
84 Адинэснег
 
07.12.17
12:21
мы семёрошника не отпинали еще, и уже между собой
85 nordbox
 
07.12.17
12:24
(83)>>немедленно разведут обсуждение как всё неправильно :))
И доведут простую задачу до абсурда )))
86 Aldnepr
 
07.12.17
12:30
(83) хоть левел тролинга на мисте и зашкаливает, даже и от модера)), но только тут можно получить оперативную и порой очень качественную инфу. На других площадках можно ждать ответа до того лета), или модеры изводят до тошноты.