|
v7: Не могу найти ошибку в коде | ☑ | ||
---|---|---|---|---|
0
Альбатрос
21.10.11
✎
10:18
|
Вот код:
Опер.новаяПроводка(); Если Найти(Таб.Склад,"Основной склад") = 1 Тогда СчДТ = СчетПоКоду("41.1"); Получатель =Осклад.ТекущийЭлемент(); ИНаче Получатель = МХДТ.ТекущийЭлемент(); СчДТ = СчетПоКоду("41.2"); КонецЕсли; Если Найти(Таб.Контра,"Основной склад") = 1 Тогда СчКТ = СчетПоКоду("41.1"); Отправитель =Осклад.ТекущийЭлемент(); ИНаче Отправитель = МХКТ.ТекущийЭлемент(); СчКТ = СчетПоКоду("41.2"); КонецЕсли; Опер.Дебет.Счет = СчДТ; Опер.Дебет.Субконто(1,Тов.ТекущийЭлемент()); Опер.Дебет.Субконто(2,Получатель); Опер.Кредит.Счет = СчКТ; Опер.Кредит.Субконто(1,Тов.ТекущийЭлемент()); Опер.Кредит.Субконто(2,Отправитель); Если выполняется одно из условий, оба счета 41.1 Как так??? Смотрю в отладчике: Выполнилось первое условие, СчКТ = 41.1. Все верно. Далее не выполнилось второе условие. На строчке СчКТ = СчетПоКоду("41.2"); СчКТ = 41.2. Только перехожу на следующую строчку, СчКТ = 41.1. Почему??? Если оба условия не выполняются, все верно. Если выполняется второе условие, то в первом опять неверный счет. |
|||
1
SnarkHunter
21.10.11
✎
10:22
|
>> Выполнилось первое условие, СчКТ = 41.1. Все верно.
Как же верно, если там используется переменная СчДТ? |
|||
2
filh
21.10.11
✎
10:23
|
СчДТ и СчКТ не одно и тоже
|
|||
3
Альбатрос
21.10.11
✎
10:24
|
(1) Она там и должна использоваться.
Первое условие меняет счет и субконто дебета, второе - кредита. |
|||
4
Альбатрос
21.10.11
✎
10:25
|
(1) Я ошибся в написании.
Выполнилось первое условие, СчКТ = 41.1 = Выполнилось первое условие, СчДТ = 41.1 |
|||
5
Альбатрос
21.10.11
✎
10:27
|
Вот так вобщем происходит:
Смотрю в отладчике: Выполнилось первое условие, СчДТ = 41.1. Все верно. Далее не выполнилось второе условие. На строчке СчКТ = СчетПоКоду("41.2"); СчКТ = 41.2. Только перехожу на следующую строчку, СчКТ = 41.1. Почему??? |
|||
6
пипец
21.10.11
✎
10:27
|
(4) к доктору , за таблетками ...
ЗЫ у меня три зеленых не летают ... |
|||
7
Kreont
21.10.11
✎
10:27
|
Какое отношение имеет СчКТ к первому условию?
|
|||
8
Альбатрос
21.10.11
✎
10:28
|
(7) Никакого.
|
|||
9
zak555
21.10.11
✎
10:28
|
u"dyjrjl
|
|||
10
zak555
21.10.11
✎
10:28
|
*г@внокод
|
|||
11
Мимохожий Однако
21.10.11
✎
10:28
|
Метод Найти применяется для строковых переменных. Почему ты используешь именно этот метод?
|
|||
12
пипец
21.10.11
✎
10:28
|
гыгыгы
|
|||
13
пипец
21.10.11
✎
10:29
|
Если выполняется одно из условий, оба счета 41.1 Как так??? (с) просто искренне порадавало
|
|||
14
Попытка1С
21.10.11
✎
10:30
|
Вываливай весь код.
|
|||
15
Альбатрос
21.10.11
✎
10:31
|
(10) Пусть будет так, но ошибку то найди.
(11) Таб.Склад и таб.Контра и есть строковые переменные. (13)А что непонятно? Оба счета, счет кредита и счет дебета. Ты не понял сразу, да? |
|||
16
пипец
21.10.11
✎
10:32
|
(15) как раз то и понял , ггыыыыыыыы
|
|||
17
viktor_vv
21.10.11
✎
10:33
|
(5) А перед этой строчкой чему равно СчКт при первом проходе ?
|
|||
18
Альбатрос
21.10.11
✎
10:34
|
(14) Много кода. Да и косяк именно здесь.
|
|||
19
Альбатрос
21.10.11
✎
10:34
|
(17) СчКТ и СчДТ перед этими условиями равны 41.2
|
|||
20
пипец
21.10.11
✎
10:35
|
поставь перед найти , (вашумегараму) , обнуление переменных штоле
|
|||
21
Альбатрос
21.10.11
✎
10:35
|
МОжет это быть глюк платформы? здесь 026 стоит.
|
|||
22
Kreont
21.10.11
✎
10:35
|
(18) Да какой косяк, тут можно сказать линейный код, даже незнаю что тут может подглючить...
Поставь Сообщить(СчКТ и СчДТ) после каждой строки кода и смотри |
|||
23
viktor_vv
21.10.11
✎
10:36
|
(18) Косяк не здесь. И где этот код выполняется? В обработке? На форме функций нету ?
(19) Я ж спрашиваю при первом проходе. Если и при первом так, тогда где ты первый раз инициализируешь СчКт? |
|||
24
Попытка1С
21.10.11
✎
10:36
|
(21) ыыы
|
|||
25
пипец
21.10.11
✎
10:37
|
(21) единственный (последний какой видел) глюк платформы это сделать из бухсчета иерархию при трех субконто
|
|||
26
trad
21.10.11
✎
10:37
|
внешняя обработка?
перезапусти отладчик. |
|||
27
Альбатрос
21.10.11
✎
10:39
|
(23)
Счет_41_2 = СчетПоКоду("41.2"); Счет_60_1 = СчетПоКоду("60.1"); Счет_41_5 = СчетПоКоду("41.5"); Счет_90_1_2 =СчетПоКоду("90.1.2"); Счет_44_3 = СчетПоКоду("44.3"); СоздатьОперацию(Счет_41_2,Счет_41_2,МХ); Процедура СоздатьОперацию(СчДТ,СчКТ,Вид) Опер = Создатьобъект("Операция"); Опер.Новая(); Опер.ДатаОперации = ТекущаяДата(); //_____________________________________________________________________________ //_____________________________________________________________________________ //_____________________________________________________________________________ //_____________________________________________________________________________ //_____________________________________________________________________________ Если Вид = "PEREM" Тогда Сообщить("Обрабатывается файл PEREM.DBF"); Опер.Содержание = "Перенос из С-маркета. Перемещение"; ВсяСумма = 0; Таб.ВыбратьСтроки(); Пока таб.ПолучитьСтроку() =1 Цикл Если (МХДТ.НайтиПоНаименованию(Таб.Склад,0) = 0) и (Найти(Таб.Склад,"Основной склад") = 0) Тогда Сообщить("Не нашелся склад-получатель: "+Таб.Склад); ЗаписатьВЛог("Склад1",Таб.НомерСтроки); Продолжить; КонецЕсли; Если (МХКТ.НайтиПоНаименованию(Таб.Контра,0) = 0) и (Найти(Таб.Контра,"Основной склад") = 0) Тогда Сообщить("Не нашелся склад-отправитель: "+Таб.Контра); ЗаписатьВЛог("Склад2",Таб.НомерСтроки); Продолжить; КонецЕсли; Опер.новаяПроводка(); Если Найти(Таб.Склад,"Основной склад") = 1 Тогда СчДТ = СчетПоКоду("41.1"); Получатель =Осклад.ТекущийЭлемент(); ИНаче Получатель = МХДТ.ТекущийЭлемент(); СчДТ = СчетПоКоду("41.2"); КонецЕсли; Если Найти(Таб.Контра,"Основной склад") = 1 Тогда СчКТ = СчетПоКоду("41.1"); Отправитель =Осклад.ТекущийЭлемент(); ИНаче Отправитель = МХКТ.ТекущийЭлемент(); СчКТ = СчетПоКоду("41.2"); КонецЕсли; Опер.Дебет.Счет = СчДТ; Опер.Дебет.Субконто(1,Тов.ТекущийЭлемент()); Опер.Дебет.Субконто(2,Получатель); Опер.Кредит.Счет = СчКТ; Опер.Кредит.Субконто(1,Тов.ТекущийЭлемент()); Опер.Кредит.Субконто(2,Отправитель); Опер.СОдержаниеПроводки = Таб.Ном; Опер.Сумма = Число(Таб.Сум); ВсяСумма = ВсяСумма + Число(Таб.Сум); КонецЦикла; Опер.СуммаОперации = ВсяСумма; Опер.Записать(); |
|||
28
Альбатрос
21.10.11
✎
10:40
|
Вызов и процедура сначала
|
|||
29
Альбатрос
21.10.11
✎
10:45
|
Скрин проводки в 1с
http://saveimg.ru/show-image.php?id=e3ecf460256e15bfea699da14cdda271 |
|||
30
Kreont
21.10.11
✎
10:45
|
А так можеш потестить:
Сообщить("-------"); Сообщить(Таб.Склад); Сообщить(Таб.Контра); Сообщить(СчДТ); Сообщить(СчКТ); Если Найти(Таб.Склад,"Основной склад") = 1 Тогда СчДТ = СчетПоКоду("41.1"); Получатель =Осклад.ТекущийЭлемент(); Сообщить("А"); Сообщить(Таб.Склад); Сообщить(СчДТ); Сообщить(СчКТ); ИНаче Получатель = МХДТ.ТекущийЭлемент(); СчДТ = СчетПоКоду("41.2"); Сообщить("Б"); Сообщить(Таб.Склад); Сообщить(СчДТ); Сообщить(СчКТ); КонецЕсли; Если Найти(Таб.Контра,"Основной склад") = 1 Тогда СчКТ = СчетПоКоду("41.1"); Отправитель =Осклад.ТекущийЭлемент(); Сообщить("В"); Сообщить(Таб.Контра); Сообщить(СчДТ); Сообщить(СчКТ); ИНаче Отправитель = МХКТ.ТекущийЭлемент(); СчКТ = СчетПоКоду("41.2"); Сообщить("Г"); Сообщить(Таб.Контра); Сообщить(СчДТ); Сообщить(СчКТ); КонецЕсли; Выписать результаты на листок и думать :) |
|||
31
Rom_Kat
21.10.11
✎
10:45
|
Таб.Склад тип строковый?
|
|||
32
viktor_vv
21.10.11
✎
10:49
|
Сделай лучше локальные переменные для счетов. Вначале присваиваяй им значения параметров. И дальше работай с локальными переменными счетов. Оно конечно может и не в этом дело. Но переопредление параметров, если в этом нет необходимости, как-то напрягает.
|
|||
33
Альбатрос
21.10.11
✎
10:49
|
(31) да.
|
|||
34
Альбатрос
21.10.11
✎
10:57
|
(30) Результаты:
------- маг. Каравай Основной склад Максима 41.1 41.1 Б маг. Каравай 41.2 41.2 В Основной склад Максима 41.1 41.1 Ну будь добр, раскрой секрет, почему при назаначении одной перменной, меняется значение второй? |
|||
35
Зеленый Кот
21.10.11
✎
10:58
|
Алексу больше не наливать...
|
|||
36
пипец
21.10.11
✎
11:02
|
это не весь код
|
|||
37
Альбатрос
21.10.11
✎
11:05
|
Локальные переменные решили проблему. Спасибо (32)
И все же, просветите, пожалуйста, почему изначальный код не работал??? |
|||
38
viktor_vv
21.10.11
✎
11:06
|
А фиг его знает. СчДт и СчКт у тебя еще небось и как переменные модуля были объвлены, и в качестве параметров использовались. Наверное в этом дело.
|
|||
39
Альбатрос
21.10.11
✎
11:08
|
(38) Нет, только как переменные процедуры
|
|||
40
saturday_ref
21.10.11
✎
11:10
|
Вот и ответ:
СоздатьОперацию(Счет_41_2,Счет_41_2,МХ) Процедура СоздатьОперацию(СчДТ,СчКТ,Вид) Измененение счДт ОДНОЗНАЧНО приводит к изменению СчКт. Ибо это изначально одна и та же переменная. (Хоть единственная задача процедуры - создать бух.операцию, это не значит, что используемые в ней переменные забыли, откуда они взялись:)) |
|||
41
Kreont
21.10.11
✎
11:11
|
По умолчанию во все процедур. и ф-ии, я стараюсь писать так:
Процедура СоздатьОперацию(СчДТ Знач,СчКТ Знач,Вид Знач) |
|||
42
Kreont
21.10.11
✎
11:11
|
(40) +100, та же переменная
|
|||
43
viktor_vv
21.10.11
✎
11:14
|
(40) Ооо, точно. И передача параметров по ссылке.
|
|||
44
Альбатрос
21.10.11
✎
11:16
|
(40) Эээ... Присваивается одна переменая, это да. Но ведь он присваевается разным переменным. Как так 2 разных переменных связываются между собой, даже если им присваивается одно значение???
То есть, к примеру: СоздатьОперацию("1","1"); Процедура СоздатьОперацию(Строка1,Строка2) Изменение "строка1" повлечет за собой изменение "строка2"??? |
|||
45
marty0701
21.10.11
✎
11:17
|
(44)НЕт
|
|||
46
Kreont
21.10.11
✎
11:17
|
(44) В таком случае нет
|
|||
47
Альбатрос
21.10.11
✎
11:18
|
Все, я понял. =) Огромное спасибо за разъяснение !!!!
|
|||
48
Kreont
21.10.11
✎
11:20
|
Есть разница между передачи по ссылке и по значению, как раз для процедур/функций
В одном случае передается можна так сказать весь обьект(и правка его в середине ф-ии правит исходный вариант), в другом создаются локальные переменные. |
|||
49
Альбатрос
21.10.11
✎
11:26
|
(48) Да, вы правы. Еще раз спасибо! Дурная моя голова, забыл основы программирования, надо перечитать =)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |