Форум программистов, компьютерный форум, киберфорум
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/89: Рейтинг темы: голосов - 89, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
1

Обработка проведения документа: движения по регистрам накопления.

16.03.2017, 16:06. Показов 18594. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Просьба посмотреть код и отредактировать правильно, или сказать что больше редактировать нельзя..
Проблема в том что хотел создать одну инструкцию
1C
1
Для Каждого
но никак, (только две получается) получаются ошибки
1С только начал заниматься..
То же самое с
1C
1
Движение.Период = Дата;
возможно ли написать один раз или нет
Сам пробовал это делать но вылетают ошибки, может не так делал..
Спасибо!
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Процедура ОбработкаПроведения(Отказ, Режим)
    
    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;
    Движения.Вознаграждение.Записывать = Истина;
    
    Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
        Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда 
            
            // регистр ОстаткиМатериалов Расход
            Движение = Движения.ОстаткиМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
            Движение.Склад = Склад;
            Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
            
            // регистр СтоимостьМатериалов Расход
            Движение = Движения.СтоимостьМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
            Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Количество * ТекСтрокаПереченьНоменклатуры.Стоимость;
        КонецЕсли;
        
        // Регистр Продажи 
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаПереченьНоменклатуры.Номенклатура;
        Движение.Клиент = Клиент;
        Движение.Мастер = Мастер;
        Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
        Движение.Выручка = ТекСтрокаПереченьНоменклатуры.Сумма;
        Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость * ТекСтрокаПереченьНоменклатуры.Количество;
    КонецЦикла;
    
    //Регистр Вознаграждение
    Движение = Движения.Вознаграждение.Добавить();
    Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл 
        Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
            
            
            Движение.Период = Дата;
            Движение.Мастер = Мастер;
            Движение.Сумма = Движение.Сумма + ТекСтрокаПереченьНоменклатуры.Сумма;          
        КонецЕсли;     
    КонецЦикла;
    
    Если Движение.Сумма < 1000 Тогда
        Движение.Процент = 5;
    КонецЕсли;
    
    Если Движение.Сумма >= 1000 И Движение.Сумма <= 5000 Тогда
        Движение.Процент = 10;
    КонецЕсли;
    
    Если Движение.Сумма > 5000 Тогда
        Движение.Процент = 15;
    КонецЕсли;
    
    Движение.Вознаграждение = Движение.Сумма * Движение.Процент / 100;
    
КонецПроцедуры
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2017, 16:06
Ответы с готовыми решениями:

Ошибка выполнения запроса. Обработка проведения документа.
Вот такая ошибка: Ошибка при выполнении обработчика - 'ОбработкаПроведения' по причине:...

Заполнение документа данными из регистра накопления. Создание отчета по данным регистра накопления.
Изучаю 1с по методичкам не могу решить два задания Объясните что да как делается +100 в карму

Изменить значение реквизитов ТЧ документа по событию проведения другого документа
Здравствуйте.В собственной конфе 1С 8.3 есть документ &quot;ОбъектныйГрафик&quot; с ТЧ &quot;Задания&quot;. Также есть...

Задание условий для движений документа по регистрам
Друзья, помогите плиз! Имеется документ с двумя реквизитами, пусть будет РЕК1 и РЕК2 оба...

18
Эксперт 1С
843 / 606 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
16.03.2017, 16:26 2
Цитата Сообщение от Дима4 Посмотреть сообщение
возможно ли написать один раз или нет
Если речь о регистре Вознаграждение, то можно.
Цитата Сообщение от Дима4 Посмотреть сообщение
Сам пробовал это делать но вылетают ошибки, может не так делал..
Какие ошибки?
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 16:30  [ТС] 3
Да, речь о нем
Например когда я убирал Для Каждого во втором случае то при проведении документа вылетала ошибка Движение.Период = Дата не может быть пустым
0
Эксперт 1С
843 / 606 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
16.03.2017, 16:34 4
Значит не был Период заполнен, но к циклу это отношение не имеет.
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 16:39  [ТС] 5
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Процедура ОбработкаПроведения(Отказ, Режим)
    
    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;
    Движения.Вознаграждение.Записывать = Истина;
    
    Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
        Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда 
            
            // регистр ОстаткиМатериалов Расход
            Движение = Движения.ОстаткиМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
            Движение.Склад = Склад;
            Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
            
            // регистр СтоимостьМатериалов Расход
            Движение = Движения.СтоимостьМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
            Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Количество * ТекСтрокаПереченьНоменклатуры.Стоимость;
        КонецЕсли;
        
        // Регистр Продажи 
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаПереченьНоменклатуры.Номенклатура;
        Движение.Клиент = Клиент;
        Движение.Мастер = Мастер;
        Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
        Движение.Выручка = ТекСтрокаПереченьНоменклатуры.Сумма;
        Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость * ТекСтрокаПереченьНоменклатуры.Количество;
 
    
    //Регистр Вознаграждение
    Движение = Движения.Вознаграждение.Добавить();
        
        Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
            
            
            Движение.Период = Дата;
            Движение.Мастер = Мастер;
            Движение.Сумма = Движение.Сумма + ТекСтрокаПереченьНоменклатуры.Сумма;          
        КонецЕсли;     
    КонецЦикла;
    
    Если Движение.Сумма < 1000 Тогда
        Движение.Процент = 5;
    КонецЕсли;
    
    Если Движение.Сумма >= 1000 И Движение.Сумма <= 5000 Тогда
        Движение.Процент = 10;
    КонецЕсли;
    
    Если Движение.Сумма > 5000 Тогда
        Движение.Процент = 15;
    КонецЕсли;
    
    Движение.Вознаграждение = Движение.Сумма * Движение.Процент / 100;
    
КонецПроцедуры
Обработка проведения документа: движения по регистрам накопления.



Ничего не пойму.. (

а 1 вариант кода работает как нужно..
0
Эксперт 1С
843 / 606 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
16.03.2017, 16:42 6
Откуда в регистре вторая строка? Ты же ведь одну там ожидаешь увидеть?
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 16:47  [ТС] 7
В итоге да, должна быть одна строка где все просчитывается
Об этом речь?
Обработка проведения документа: движения по регистрам накопления.
0
Эксперт 1С
843 / 606 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
16.03.2017, 16:49 8
Анализируй код. Откуда в этом регистре берется вторая строка?
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 16:54  [ТС] 9
Для Каждого ....
Движение = Движения.Вознаграждение.Добавить();
обходим каждый вид услуги и добавляем, получается при обходе второй услуги он хочет добавить еще одну строку но не выходит?
0
Эксперт 1С
843 / 606 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
16.03.2017, 17:00 10
Лучший ответ Сообщение было отмечено Дима4 как решение

Решение

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

Добавлено через 30 секунд
Вынеси добавление записи регистра за цикл.

Добавлено через 2 минуты
Цитата Сообщение от Дима4 Посмотреть сообщение
получается при обходе второй услуги он хочет добавить еще одну строку но не выходит?
Добавить выходит. Записать движения не выходит, т.к. Период для новой записи уже не заполняется.
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 17:11  [ТС] 11
Спасибо огромное!
Только что понял, что сам написал..
Теперь пишет "Поле объекта не обнаружено (сумма)"

Добавлено через 3 минуты
Буду дальше анализировать!
Спасибо огромное, что натолкнули на мысль
0
Модератор
Эксперт 1С
3783 / 2963 / 589
Регистрация: 10.03.2011
Сообщений: 11,665
Записей в блоге: 1
16.03.2017, 17:15 12
1C
1
2
3
4
5
6
7
8
Движение = Движения.Вознаграждение.Добавить();
Движение.Период = Дата;
Движение.Мастер = Мастер;
Для каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
    
    Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
          Движение.Сумма = Движение.Сумма + ТекСтрокаПереченьНоменклатуры.Сумма;          
    КонецЕсли;
1
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 17:51  [ТС] 13
Ошибка не ушла

Добавлено через 29 минут
С точками останова получилось что при первом обходе в поле
1C
1
ТекСтрокаПереченьНоменклатуры.Сумма;
попадает первое значение Услуги 1200, но при заходе на второй круг вылетает Ошибка "Поле объекта не обнаружено (Сумма)"...
Ему некуда класть второе значение или что это может значить?)
0
Модератор
Эксперт 1С
3783 / 2963 / 589
Регистрация: 10.03.2011
Сообщений: 11,665
Записей в блоге: 1
16.03.2017, 18:08 14
Дима4, весь код в студию
0
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 18:15  [ТС] 15
Весь код в самом первом сообщении.
Поиграл с комментариями, пришел к выводу что если другие регистры закомментировать то Ваш вариант работает!
Предполагаю что при обходе документа, когда я попадаю на ВидНоменклатуры.Материал он ищет куда ему записать сумму для этого значения, а такого поля не существует... Возможно так
0
Эксперт 1С
843 / 606 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
16.03.2017, 19:02 16
Выкладывай код. Или можешь выложить конфигурацию / базу.
0
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 19:19  [ТС] 17
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Процедура ОбработкаПроведения(Отказ, Режим)
    
    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;
    Движения.Вознаграждение.Записывать = Истина;
    
    Движение = Движения.Вознаграждение.Добавить();
    Движение.Период = Дата;
    Движение.Мастер = Мастер;
    
    Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
        Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда 
            
            // регистр ОстаткиМатериалов Расход
            Движение = Движения.ОстаткиМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
            Движение.Склад = Склад;
            Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
            
            // регистр СтоимостьМатериалов Расход
            Движение = Движения.СтоимостьМатериалов.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
            Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Количество * ТекСтрокаПереченьНоменклатуры.Стоимость;
        КонецЕсли;
        
        // Регистр Продажи 
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаПереченьНоменклатуры.Номенклатура;
        Движение.Клиент = Клиент;
        Движение.Мастер = Мастер;
        Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
        Движение.Выручка = ТекСтрокаПереченьНоменклатуры.Сумма;
        Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость * ТекСтрокаПереченьНоменклатуры.Количество;
        Движение.Сумма = Движение.Сумма + ТекСтрокаПереченьНоменклатуры.Сумма;  
        
        //Регистр Вознаграждение
        
        
        Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
            
            Движение.Сумма = Движение.Сумма + ТекСтрокаПереченьНоменклатуры.Сумма;      
        КонецЕсли;     
        
    КонецЦикла;
    
    Если Движение.Сумма < 1000 Тогда
        Движение.Процент = 5;
    КонецЕсли;
    
    Если Движение.Сумма >= 1000 И Движение.Сумма <= 5000 Тогда
        Движение.Процент = 10;
    КонецЕсли;
    
    Если Движение.Сумма > 5000 Тогда
        Движение.Процент = 15;
    КонецЕсли;
    
    Движение.Вознаграждение = Движение.Сумма * Движение.Процент / 100;
    
КонецПроцедуры
Весь код
0
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 19:26  [ТС] 18
Конфигурация
1CCF.zip
0
Эксперт 1С
843 / 606 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
16.03.2017, 19:34 19
Переменная Движение у тебя постоянно переприсваивается.
Пока дойдет до подсчета суммы, там уже движение другого регистра.
Пользуйся отладчиком, чтобы посмотреть какие значения в каких переменных лежат.
0
16.03.2017, 19:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2017, 19:34
Помогаю со студенческими работами здесь

Проведение документа «Оказание услуги» по двум регистрам
Указав стоимость материала и в файле оказание услуги и проведя его выводится странная стоимость в...

Оптимизация проведения документа
Доброе утро, уважаемые программисты :-) При разработке конфигурации в 1С 8.2 столкнулась со...

Отмена проведения проведённого документа
Всем привет! Пытаюсь сделать запрет на проведение уже проведённого ранее документа. Почитала,...

Процедура обработки проведения документа
Документ Оказание услуг при оперативном проведение нужно чтобы бролась цена на дату проведения и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru