Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Дима4
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
1

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

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

Добрый день!
Просьба посмотреть код и отредактировать правильно, или сказать что больше редактировать нельзя..
Проблема в том что хотел создать одну инструкцию
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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2017, 16:06
Ответы с готовыми решениями:

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

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

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

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

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

18
Tklwegsd
Эксперт 1С
695 / 503 / 173
Регистрация: 24.07.2013
Сообщений: 1,788
16.03.2017, 16:26 2
Цитата Сообщение от Дима4 Посмотреть сообщение
возможно ли написать один раз или нет
Если речь о регистре Вознаграждение, то можно.
Цитата Сообщение от Дима4 Посмотреть сообщение
Сам пробовал это делать но вылетают ошибки, может не так делал..
Какие ошибки?
1
Дима4
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 16:30  [ТС] 3
Да, речь о нем
Например когда я убирал Для Каждого во втором случае то при проведении документа вылетала ошибка Движение.Период = Дата не может быть пустым
0
Tklwegsd
Эксперт 1С
695 / 503 / 173
Регистрация: 24.07.2013
Сообщений: 1,788
16.03.2017, 16:34 4
Значит не был Период заполнен, но к циклу это отношение не имеет.
1
Дима4
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
Tklwegsd
Эксперт 1С
695 / 503 / 173
Регистрация: 24.07.2013
Сообщений: 1,788
16.03.2017, 16:42 6
Откуда в регистре вторая строка? Ты же ведь одну там ожидаешь увидеть?
1
Дима4
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 16:47  [ТС] 7
В итоге да, должна быть одна строка где все просчитывается
Об этом речь?
Обработка проведения документа: движения по регистрам накопления.
0
Tklwegsd
Эксперт 1С
695 / 503 / 173
Регистрация: 24.07.2013
Сообщений: 1,788
16.03.2017, 16:49 8
Анализируй код. Откуда в этом регистре берется вторая строка?
1
Дима4
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 16:54  [ТС] 9
Для Каждого ....
Движение = Движения.Вознаграждение.Добавить();
обходим каждый вид услуги и добавляем, получается при обходе второй услуги он хочет добавить еще одну строку но не выходит?
0
Tklwegsd
Эксперт 1С
695 / 503 / 173
Регистрация: 24.07.2013
Сообщений: 1,788
16.03.2017, 17:00 10
Лучший ответ Сообщение было отмечено Дима4 как решение

Решение

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

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

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

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

Добавлено через 29 минут
С точками останова получилось что при первом обходе в поле
1C
1
ТекСтрокаПереченьНоменклатуры.Сумма;
попадает первое значение Услуги 1200, но при заходе на второй круг вылетает Ошибка "Поле объекта не обнаружено (Сумма)"...
Ему некуда класть второе значение или что это может значить?)
0
Dethmontt
Модератор
Эксперт 1С
2617 / 2417 / 407
Регистрация: 10.03.2011
Сообщений: 8,594
Записей в блоге: 1
Завершенные тесты: 1
16.03.2017, 18:08 14
Дима4, весь код в студию
0
Дима4
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 18:15  [ТС] 15
Весь код в самом первом сообщении.
Поиграл с комментариями, пришел к выводу что если другие регистры закомментировать то Ваш вариант работает!
Предполагаю что при обходе документа, когда я попадаю на ВидНоменклатуры.Материал он ищет куда ему записать сумму для этого значения, а такого поля не существует... Возможно так
0
Tklwegsd
Эксперт 1С
695 / 503 / 173
Регистрация: 24.07.2013
Сообщений: 1,788
16.03.2017, 19:02 16
Выкладывай код. Или можешь выложить конфигурацию / базу.
0
Дима4
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
Дима4
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 12
16.03.2017, 19:26  [ТС] 18
Конфигурация
1CCF.zip
0
Tklwegsd
Эксперт 1С
695 / 503 / 173
Регистрация: 24.07.2013
Сообщений: 1,788
16.03.2017, 19:34 19
Переменная Движение у тебя постоянно переприсваивается.
Пока дойдет до подсчета суммы, там уже движение другого регистра.
Пользуйся отладчиком, чтобы посмотреть какие значения в каких переменных лежат.
0
16.03.2017, 19:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2017, 19:34

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru