Чем заменить простой пребор проводок?
18.02.2010
17:12
#1
"Подскажите, как быстрее отобрать и исключить из цикла документы, в которых был зачтен аванс?
Док = СоздатьОбъект("Документ.ПоступлениеТоваров");
Док.ВыбратьПоЗначению(,ДатаДок,"Договор",Субконто2);
Пока Док.ПолучитьДокумент()=1 Цикл
ТекДок = Док.ТекущийДокумент();
****
ТекДок.Операция.ВыбратьПроводки();
Пока ТекДок.Операция.ПолучитьПроводку()=1 Цикл
Если (ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.6")) И
(ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.7")) И
(СокрЛП(ТекДок.Операция.Содержание) = "Зачтен аванс") Тогда
Прервать;
КонецЕсли;
КонецЦикла;
***
КонецЦикла;
"
Док = СоздатьОбъект("Документ.ПоступлениеТоваров");
Док.ВыбратьПоЗначению(,ДатаДок,"Договор",Субконто2);
Пока Док.ПолучитьДокумент()=1 Цикл
ТекДок = Док.ТекущийДокумент();
****
ТекДок.Операция.ВыбратьПроводки();
Пока ТекДок.Операция.ПолучитьПроводку()=1 Цикл
Если (ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.6")) И
(ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.7")) И
(СокрЛП(ТекДок.Операция.Содержание) = "Зачтен аванс") Тогда
Прервать;
КонецЕсли;
КонецЦикла;
***
КонецЦикла;
"
18.02.2010
17:27
#2
> Подскажите, как быстрее отобрать и исключить из цикла документы, в которых был зачтен аванс?
>
подробнее задачу : для чего всё это !?
>
подробнее задачу : для чего всё это !?
19.02.2010
15:14
#7
"Во первых, в приведенном алгоритме ошибка. Такое условие:
Если (ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.6")) И (ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.7"))
не будет выполнено никогда. Счет дебета не может одновременно быть равен и 60.6 и 60.7.
Во вторых, я не знаю что это за счета, но предполагаю, что это какой то аналог 60.1 и 60.2, которые используются в типовой конфигурации. Поэтому, для определенности пусть:
60.6 - долги перед поставщиком
60.7 - авансы, выплаченные поставщику
Предложенный вами алгоритм можно чуть оптимизировать, избавив систему от необходимости при каждом проходе производить поиск по плану счетов счетов с нужными кодами, кроме того, система 1С (7.7, по крайней мере)при проверке комбинированного условия вычисляет все его составляющие. То есть, при каждой операции сравнения у вас проверяется и (ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.6"))
и
(ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.7"))
и
(СокрЛП(ТекДок.Операция.Содержание) = "Зачтен аванс")
одновременно каждый раз вне зависимости от того были ли успешны проверки первых условий.
Кроме того, в вашем алгоритме не проверяется наличие операции для анализируемого документа, а ее может и не быть если документ не проведен и в конфигураторе указано, что операцию нужно порождать только при проведении.
В связи со сказанным, модифицируем ваш алгоритм и получаем вот что:
Сч60_6=СчетПоКоду("60.6");
Сч60_7=СчетПоКоду("60.7");
СодержаниеДляПроверки="Зачтен аванс";
Опер=СоздатьОбъект("Операция");
Док = СоздатьОбъект("Документ.ПоступлениеТоваров");
Док.ВыбратьПоЗначению(,ДатаДок,"Договор",Субконто2);
Пока Док.ПолучитьДокумент()=1 Цикл
ВДокументеЕстьЗачетАванса=0;
Если Опер.НайтиОперацию(Док.ТекущийДокумент())=1 Тогда
Опер.ВыбратьПроводки();
Пока Опер.ПолучитьПроводку()=1 Цикл
Если Опер.Дебет.Счет=Сч60_6 Тогда
Если Опер.Кредит.Счет=Сч60_7 Тогда
Если СокрЛП(Опер.Содержание)=СодержаниеДляПроверки Тогда
ВДокументеЕстьЗачетАванса=1;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ВДокументеЕстьЗачетАванса=1 Тогда
...
Иначе
...
КонецЕсли;
КонецЦикла;"
Если (ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.6")) И (ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.7"))
не будет выполнено никогда. Счет дебета не может одновременно быть равен и 60.6 и 60.7.
Во вторых, я не знаю что это за счета, но предполагаю, что это какой то аналог 60.1 и 60.2, которые используются в типовой конфигурации. Поэтому, для определенности пусть:
60.6 - долги перед поставщиком
60.7 - авансы, выплаченные поставщику
Предложенный вами алгоритм можно чуть оптимизировать, избавив систему от необходимости при каждом проходе производить поиск по плану счетов счетов с нужными кодами, кроме того, система 1С (7.7, по крайней мере)при проверке комбинированного условия вычисляет все его составляющие. То есть, при каждой операции сравнения у вас проверяется и (ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.6"))
и
(ТекДок.Операция.Дебет.Счет = СчетПоКоду("60.7"))
и
(СокрЛП(ТекДок.Операция.Содержание) = "Зачтен аванс")
одновременно каждый раз вне зависимости от того были ли успешны проверки первых условий.
Кроме того, в вашем алгоритме не проверяется наличие операции для анализируемого документа, а ее может и не быть если документ не проведен и в конфигураторе указано, что операцию нужно порождать только при проведении.
В связи со сказанным, модифицируем ваш алгоритм и получаем вот что:
Сч60_6=СчетПоКоду("60.6");
Сч60_7=СчетПоКоду("60.7");
СодержаниеДляПроверки="Зачтен аванс";
Опер=СоздатьОбъект("Операция");
Док = СоздатьОбъект("Документ.ПоступлениеТоваров");
Док.ВыбратьПоЗначению(,ДатаДок,"Договор",Субконто2);
Пока Док.ПолучитьДокумент()=1 Цикл
ВДокументеЕстьЗачетАванса=0;
Если Опер.НайтиОперацию(Док.ТекущийДокумент())=1 Тогда
Опер.ВыбратьПроводки();
Пока Опер.ПолучитьПроводку()=1 Цикл
Если Опер.Дебет.Счет=Сч60_6 Тогда
Если Опер.Кредит.Счет=Сч60_7 Тогда
Если СокрЛП(Опер.Содержание)=СодержаниеДляПроверки Тогда
ВДокументеЕстьЗачетАванса=1;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ВДокументеЕстьЗачетАванса=1 Тогда
...
Иначе
...
КонецЕсли;
КонецЦикла;"
Конвертация данных с диска ИТС - слияние двух одинаковых ЗИК 7.7Как почистить журнал расчета зарплаты
Читают тему
(гостей: 1)