Имя: Пароль:
1C
1C 7.7
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
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) Да, вы правы. Еще раз спасибо! Дурная моя голова, забыл основы программирования, надо перечитать =)