Имя: Пароль:
1C
 
Формирование сложных проводок. Функция СложнаяПроводка() не работает
0 ildus
 
30.03.06
13:40
Комплексная конфа. необходимо по документам формировать сложные проводки. в справочнике проводок по хоз. операциям настроил проводки, при проведении выдало ошибку "не выбран счет дебета или кредита" (в глПолучитьТаблицуПроводок), исправил
                       ЗабалансовыйСчетД = Макс(ПустоеЗначение(Таблица.СчетД), Таблица.СчетД.Забалансовый);
                       ЗабалансовыйСчетК = Макс(ПустоеЗначение(Таблица.СчетК), Таблица.СчетК.Забалансовый);

на

                       ЗабалансовыйСчетД = Таблица.СчетД.Забалансовый;
                       ЗабалансовыйСчетК = Таблица.СчетК.Забалансовый;

далее, таблица проводок успешно сформировалась, в процедуре глЗаполнитьОперациюПроводками() есть участок кода, который не работает:
   ТаблицаПроводок.ВыбратьСтроки();
   Пока ТаблицаПроводок.ПолучитьСтроку() = 1 Цикл
       
       Если (ТаблицаПроводок.СчетД.Выбран() = 0) И (ТаблицаПроводок.СчетК.Забалансовый = 0) Тогда
           Если Операция.СложнаяПроводка() = 0 Тогда
               Операция.НоваяПроводка();
           Иначе
               Операция.НоваяКорреспонденция();
           КонецЕсли;
           
       ИначеЕсли (ТаблицаПроводок.СчетК.Выбран() = 0) И (ТаблицаПроводок.СчетД.Забалансовый = 0) Тогда
           Если Операция.СложнаяПроводка() = 0 Тогда
               Операция.НоваяПроводка();
           Иначе
               Операция.НоваяКорреспонденция();
           КонецЕсли;
           
       Иначе
           Операция.НоваяПроводка();
       КонецЕсли;

почему-то функция Операция.СложнаяПроводка() всегда возвращает 0, вместо 1, в результате вместо формирования второй корреспонденции первой проводки формируется вторая проводка. почему??
1 у лю 427
 
30.03.06
13:44
лучше оставь их в покое...
там камни есть - башку можешь разбить...
2 ildus
 
30.03.06
13:50
(1) никак нельзя оставить. какие именно камни?
3 selenat
 
30.03.06
13:59
(0) Ты офигел править глПолучитьТаблицуПроводок.  не боишься, что у тебя слетят проводки у других доков?
4 ildus
 
30.03.06
14:58
(3) нет, т.к. в этом месте всего-лишь проверка на пустое значение счета у незабалансовых счетов. а у других документов никто проводки не изменял, так что все д.б. правильно. причем в процедуре глЗаполнитьОперациюПроводками() уже 1С предусмотрена возможность формирования сложных проводок (см. фрагмент кода), однако из-за того что почему-то Операция.СложнаяПроводка() = 0, работает неправильно., видимо программисты из 1С недоделали эту возможность поэтому и отключили выбор пустого счета в глПолучитьТаблицуПроводок().
5 ildus
 
30.03.06
17:25
up
6 ildus
 
30.03.06
22:00
up
7 Бешеная Нога
 
30.03.06
22:09
ну и я то же апну, АП
8 ildus
 
31.03.06
09:27
up
9 Iran
 
31.03.06
09:48
А если попробовать такое условие:
Если (Опер.НомерКорреспонденции() > 1) Тогда
10 ildus
 
31.03.06
10:16
(9) нет, так не получится, т.к. НомерКорреспонденции() всегда возвращает 1, пока не введена вторая корреспонденция. а вместо второй корреспонденции вводится новаяПроводка()
НомерКорреспонденции()
Назначение:
Определяет номер текущей корреспонденции в операции.
Возвращает: номер корреспонденции, 1 - если проводка не сложная.
11 BessTolkovaya
 
31.03.06
10:25
Я чего-то не поняла. Ты же формируешь операцию, добавляешь новые проводки.
И что ты хочешь от СложнаяПроводка(), которая определяет является ли текущая проводка сложной, если на первом шаге у тебя вообще проводок нету? Ну а дальше по твоему алгоритму и быть не может
12 ildus
 
31.03.06
10:36
(11) первый проход:
Операция.СложнаяПроводка()=0 -это правильно
выполнется НоваяПроводка()
далее уазывается один из счетов (дебет или кредит) пустой, второй - балансовый, колич-во,сумма.
второй проход:
Операция.СложнаяПроводка()=0 -это НЕ правильно, должно вернуть 1, т.к. при первом проходе один счет не указан, значит проводка сложная
на следующих проходах должно выполняться НоваяКорреспонденция() вместо НоваяПроводка()
13 ildus
 
31.03.06
10:37
+(12) пока не закроется сумма сложной проводки
14 ildus
 
31.03.06
11:23
Пока сложнаяПроводка()=0 цикл
 АП !!
КонецЦикла;
15 ildus
 
31.03.06
11:44
up
16 ildus
 
31.03.06
11:59
я так понял быстрее тупо прописать все проводки непосредственно в модуле проведения документа, чем дожидаться ответа, и дорабатывать глПриПроведении()
17 ildus
 
31.03.06
13:41
кстати послал в 1С тот же вопрос, интересно что они ответят через недельку
18 ildus
 
31.03.06
14:12
ответили удивитильно быстро:

Настройка конфигурации для нужд конкретного пользователя не входит в функции линии консультации.

По вопросам настройки нужно обращаться к партнерам фирмы 1С в вашем регионе.

С уважением,
отдел тех. поддержки "1С".
Тел. (495) 688-10-01
19 ildus
 
31.03.06
16:32
похоже что 1С не дает консультаций по встроенному языку, зачем тогда продают книжки вместе с программой?
20 BessTolkovaya
 
31.03.06
17:22
(12) Из преведенного в начале фрагмента не видно, где и как у тебя "далее уазывается один из счетов (дебет или кредит) пустой, второй - балансовый, колич-во,сумма." Поэтому мне, например, тоже не очевидно, что это сложная проводка...
21 ildus
 
31.03.06
17:47
(20) это я указал в справочнике проводок хоз операций. а то что это действительно так проверял в отладчике.
22 ildus
 
31.03.06
17:58
(20) вот полный текст процедуры глЗаполнитьОперациюПроводками() в типовой конфигурации:

// Параметры:
//  Операция - операция
//  ТаблицаПроводок - "ТаблицаЗначений" - таблица проводок,
//                    подготовленная функцией глПолучитьТаблицуПроводок().
//
// Описание:
//  Процедура заполняет операцию проводками.
//
Процедура глЗаполнитьОперациюПроводками(Операция, ТаблицаПроводок) Экспорт
   
   СуммаОперации = 0;
   
   ТаблицаПроводок.ВыбратьСтроки();
   Пока ТаблицаПроводок.ПолучитьСтроку() = 1 Цикл
       
       Если (ТаблицаПроводок.СчетД.Выбран() = 0) И (ТаблицаПроводок.СчетК.Забалансовый = 0) Тогда
           Если Операция.СложнаяПроводка() = 0 Тогда
               Операция.НоваяПроводка();
           Иначе
               Операция.НоваяКорреспонденция();
           КонецЕсли;
           
       ИначеЕсли (ТаблицаПроводок.СчетК.Выбран() = 0) И (ТаблицаПроводок.СчетД.Забалансовый = 0) Тогда
           Если Операция.СложнаяПроводка() = 0 Тогда
               Операция.НоваяПроводка();
           Иначе
               Операция.НоваяКорреспонденция();
           КонецЕсли;
           
       Иначе
           Операция.НоваяПроводка();
       КонецЕсли;
       
       Операция.РазделительУчета   = Операция.Документ.ЮрЛицо;
       Операция.СодержаниеПроводки = ТаблицаПроводок.Содержание;
       
       Операция.Дебет.Счет         = ТаблицаПроводок.СчетД;
       Операция.Дебет.Субконто(1, ТаблицаПроводок.СубконтоД1);
       Операция.Дебет.Субконто(2, ТаблицаПроводок.СубконтоД2);
       Операция.Дебет.Субконто(3, ТаблицаПроводок.СубконтоД3);
       
       Операция.Кредит.Счет        = ТаблицаПроводок.СчетК;
       Операция.Кредит.Субконто(1, ТаблицаПроводок.СубконтоК1);
       Операция.Кредит.Субконто(2, ТаблицаПроводок.СубконтоК2);
       Операция.Кредит.Субконто(3, ТаблицаПроводок.СубконтоК3);
       
       Операция.Сумма      = ТаблицаПроводок.Сумма;
       Операция.ВалСумма   = ТаблицаПроводок.ВалСумма;
       Операция.Валюта     = ТаблицаПроводок.Валюта;
       Операция.Количество = ТаблицаПроводок.Количество;
       
       Если ТаблицаПроводок.ВклСуммаОперации = 1 Тогда
           СуммаОперации = СуммаОперации + ТаблицаПроводок.Сумма;
       КонецЕсли;
       
   КонецЦикла;
   
   Операция.СуммаОперации = СуммаОперации;
   
КонецПроцедуры // глЗаполнитьОперациюПроводками()
23 у лю 427
 
31.03.06
19:05
пля.... понаберут дятлов.... они потом весь лес издолбят...

Разреши для начала сложные проводки в конфе....

вот работающий пример



Процедура ОбработкаПроведения()

   Operation.NewEntry();
   
   Operation.Debit.Account    =  AccountByCode("33");              
   Operation.Debit.Проект    =  новый1; // реквизит формы документа
   Operation.Sum            = 100;
   Operation.Amount        = 33;
   
   Operation.NewCorrespondence();
   Operation.Credit.Account= AccountByCode("10.1");
   Operation.Credit.Проект    = новый1;  // реквизит формы документа
   Operation.Credit.СП        = новый2;  // реквизит формы документа
   Operation.Sum            = 60;
   Operation.Amount        = 10;

   Operation.NewCorrespondence();
   Operation.Credit.Account= AccountByCode("10.1");
   Operation.Credit.Проект    = новый1;    // реквизит формы документа
   Operation.Credit.СП        = новый3;    // реквизит формы документа
   Operation.Sum            = 40;
   Operation.Amount        = 15;

   Operation.Write();
   
КонецПроцедуры
24 ildus
 
31.03.06
19:25
(23) сам ты дятел! это я знаю что так работает. это если прямо в модуле проведения документа так писать годится. Мне же нужно доработать алгоритм проведения в глобальнике так, чтобы сложная проводка или не сложная автоматически формировалась в зависимости от того как она настроена в справочнике проводокХозОпераций. Т.е. если введена первая строка сложной проводки, до тех пор пока она не закроется вызывалась НоваяКорреспонденция() иначе НоваяПроводка(). см. глЗаполнитьОперациюПроводками() в типовой, почему она рабротает не так, как задумано, почему Операция.СложнаяПроводка() возвращает 0 ?
25 ildus
 
31.03.06
19:31
(23) сложные проводки разрешены
26 у лю 427
 
31.03.06
20:03
Дятел ты и есть дятел...

СложнаяПроводка() используется при переборе сформированных документом проводок.
В отчетах или После выбратьОперцииСПроводками...

Для определения, есть или нет вторая часть считанной проводки - у обычных проводок для бал счетов д.б. и кредит и дебет, у обычных по забалансу м.б. и кредит и дебет, а может быть только кредит или только дебет...
У сложных - у одной есть кредит и много корреспонденций с дебетом или наоборот
дебит и много корреспонденций с кредитом...

В модуле документа метод СложнаяПроводка() бессмысленен - ты сам должен строить свои действия по формированию сложной проводки...


P.S. не лезь ты в сложные проводки - часть типовых отчетов их не обрабатывает,
и при сбоях в базе ты получишь такой геморой... после ТиИ.... Мало не покажется...
27 ildus
 
31.03.06
20:28
(26) тогда какой дятел писал эту глЗаполнитьОперациюПроводками() в типовой конфигурации? почему там используется эта самая функция?
Попробовал кинуть функцию СложнаяПроводка() на форму Операции (в текстовый реквизит). - в интерактивном режиме работает правильно, т.е. возвращает 1 когда вводиш сложную проводку. почему? в чем косяк?
ну никак нельзя без эти проводок, ниче не поделаеш буду писать непосредственно в модуле проведения.
28 Бешеная Нога
 
31.03.06
20:28
Илдус - это имя?
29 ildus
 
31.03.06
20:32
(28) Ильдус - имя
30 Бешеная Нога
 
31.03.06
20:34
меня Ильдар зовут
31 Salvador Limones
 
31.03.06
20:37
(30) Привет, Ильдарка!
32 Бешеная Нога
 
31.03.06
20:37
вот гад одолел...
33 у лю 427
 
31.03.06
20:45
(27) среди писателей типовых дятлов хватает...
34 ildus
 
31.03.06
21:56
(33) убил бы этих дятлов!!