Имя: Пароль:
1C
1C 7.7
v7: Заполнение списка значений в цикле
,
0 pessok
 
14.03.13
09:55
Коллеги, привет. С клюшками у меня бяда, последний раз в глаза их видел, как минимум, в том десятилетии... Итак, необходимо заполнить список значений при обходе бух.итогов. Что делаю:

Процедура Заполнить()
   
   КОбработке.УдалитьВсе();  //список значений, помещенный на форму
   СчетДТ = СчетПоКоду("78");
   
   ОтборСубк1=2;
   ОтборСубк2=2;
   ВыбВидСубконто1=ВидыСубконто.Контрагенты;
   ВыбВидСубконто2=ВидыСубконто.Договоры;
   Ит = СоздатьОбъект("БухгалтерскиеИтоги");
   Ит.ИспользоватьСубконто(ВыбВидСубконто1, ВыбКонтрагенты, ОтборСубк1);
   Ит.ИспользоватьСубконто(ВыбВидСубконто2, ВыбДоговоры, ОтборСубк2);
   Ит.ВыполнитьЗапрос(НачДата, КонДата, СчетДТ, ,,, "Проводка");    
   Ит.ВыбратьПериоды();
   Инд = 1;
   Пока Ит.ПолучитьПериод() = 1 Цикл
       
       Операция = Ит.Операция;
       
       Если ПолучитьПроцент(СокрЛП(Операция.СодержаниеПроводки)) = СокрЛП(НачальныйПроцент) Тогда //еще один фильтр, в функции ПолучитьПроцент() только разбор литерала
           
           ОтельВПроводке = СокрЛП(Операция.Документ.Комментарий);
           
           Если Отели.НайтиЗначение(ОтельВПроводке, , 1) = 1 Тогда //это ТЗ, помещенная на форму, в которую юзверь добавляет еще один фильтр
               
               Если КОбработке.Принадлежит(Операция) = 0 Тогда
                   
                   КОбработке.ДобавитьЗначение(Операция);
                   КОбработке.Пометка(Инд, 1);
                   Инд = Инд + 1;
                   
               КонецЕсли;
               
           КонецЕсли;
       Иначе
           Продолжить;
       КонецЕсли
   КонецЦикла
   
   
КонецПроцедуры


Казалось бы все просто (хотя, скорее всего, я не знаю каких то тонкостей клюшек), но не выходит каменный цветок.

В тестовом варианте в бух. итогах две строки в двух разных операциях, обе соответствуют условию
ПолучитьПроцент(СокрЛП(Операция.СодержаниеПроводки)) = СокрЛП(НачальныйПроцент)

Первая соответствует условию
Отели.НайтиЗначение(ОтельВПроводке, , 1) = 1
Вторая - нет.

Т.е. в список должна попадать только первая операция.

Что на выходе:

Первая итерация: все прелестно, в список попала нужная операция.
Вторая итерация: на строчке
Операция = Ит.Операция;
в списке _заменяется ссылка_ на операцию из второй итерации. В условие добавления отладка не входит, ничего в списке _кодом_ не изменяется.
Отсюда вопросы: почему меняется ссылка? чяднт?

З.Ы. представление не меняется.

Заранее спасибо ;)
1 zak555
 
14.03.13
09:58
> Если ПолучитьПроцент(СокрЛП(Операция.СодержаниеПроводки)) = СокрЛП(НачальныйПроцент)


что за быднло код ?
2 zak555
 
14.03.13
09:58
ты уверен, что нужно анализировать содержание проводки, а не счета Дт и Кт ?
3 pessok
 
14.03.13
10:00
(1) в содержании текст типа: 2653*14%=371*31.19 (грузица из внешней программы). Вот надо проверить вхождение процента, указанного пользователем с "14%"
(2) уверен
4 1Сергей
 
14.03.13
10:02
(3) для вхождения, как и в 8, используй Найти()
5 pessok
 
14.03.13
10:02
(4) да там и используется найти, в функции, я просто вынес код:

Функция ПолучитьПроцент(ОписаниеПроводки)

   Процент = Найти(ОписаниеПроводки, "%");
   ПраваяЧасть = Лев(ОписаниеПроводки, Процент-1);
   Звезда = Найти(ПраваяЧасть, "*");
   Результат = Сред(ПраваяЧасть, Звезда+1);
   Возврат Результат;
КонецФункции
6 pessok
 
14.03.13
10:03
ребята, хрен с ним, с быдлокодом :) почему ссылка в списке заменяется? :)
7 pessok
 
14.03.13
10:16
все воспроизводят, или все забили? :)
8 1Сергей
 
14.03.13
10:18
(7) забили. Отладчик в зубы и вперёд
9 ЧеловекДуши
 
14.03.13
10:19
(7) Быдло код, и всем побоку.

Используй лучше "Таблицу Значений" (ТЗ), оно работает быстрее.
Я про то, что поиск вхождения работает медленней, чем поиск значения в ТЗ.
10 ЧеловекДуши
 
14.03.13
10:21
+(7)>>> Операция

Ты хоть подумай своей головой, что ты туда пишешь и с чего ты решил, что оно там будет храниться?
...типо отмаз, что ты 8-шник, не канает, там тоже такой код ГУАНО... :)

Стоит воспользоваться советом в (8)...
11 НЕА123
 
14.03.13
10:21
(7)
она не заменяется.
семерку уж не помню.
типа так
КОбработке.ДобавитьЗначение(Операция.ПОлучитьДокумент());
ЗЫ
Есть ли типа ПолучитьОперацию - не знаю
12 Chum
 
14.03.13
10:21
нет под рукой 7-ки :-/

ИТ.Операция.Документ.ТекущийДокумент() ?
13 pessok
 
14.03.13
10:23
(8) я написал, что у меня в отладчике :)
(9) где там быдлокод? ткни пальцем
(10) я хз что такое ОПЕРАЦИЯ в клюшках, вот не помню, хоть убей :) есть документ операция, я думал, что это он, если ошибаюсь - ок, пусть гудет овнокодом :)
(11) , (12) спасибо, щас попробуем
14 ЧеловекДуши
 
14.03.13
10:23
(11) (12) Автор же не писал про документ, ему там надо видеть именно операцию. И желательно одной строкой :)
15 ЧеловекДуши
 
14.03.13
10:25
(13) Вот

Операция = Ит.Операция; //Это значение запроса, оно не хранится

Если КОбработке.Принадлежит(Операция) = 0 Тогда
     КОбработке.ДобавитьЗначение(Операция);

//Нет такого типа, как "Операция из запроса" :)
16 Chum
 
14.03.13
10:25
(14) операцию порождает документ. Это касается и объекта Операция, т.к. там "Документ.Операция".
17 ЧеловекДуши
 
14.03.13
10:26
(16) Документом может выступать любой документ с табличной частью, где каждая строка могла нарисовать операцию :)
18 ЧеловекДуши
 
14.03.13
10:27
+(16) >>>  там "Документ.Операция".

Ну, у меня телепат не столь обостренный :)
19 Chum
 
14.03.13
10:27
(15) >КОбработке.ДобавитьЗначение(Операция);

Вот такой код работать не будет никогда, т.к. в цикле меняется ссылка, а с учетом глючности в 7-ке самого объекта Операция, будут происходить вообще забавные вещи. Как-то собирал в ТЗ на форме операции, получаемые из цикла. Что творилось в колонке с операциями - это нужно было видеть. При использовании .ТекущийДокумент() все стало красиво.
20 Chum
 
14.03.13
10:29
(17) бред. любой документ может формировать проводки, если это определено в конфигураторе, т.е. установлена соответствующая галка в свойствах документа. Нет галки "проводить в бух" - нет проводок, т.е. нет объекта Операция. И ТЧ здесь вообще ни с какой стороны
21 pessok
 
14.03.13
10:30
да, спасибо, ребят. реально я запутался с понятиями самой операции и документа операция.
в (11) и (12) все верно

(15) спасибо, я понял уже :) пусть будет семерочный овнокод, если тебе от этого легче :)
22 ЧеловекДуши
 
14.03.13
10:31
(20) Бред, не бред, но Бух. справка царь в бухии.
А документы там все го лишь "Облегчение" труда буху :)
23 Chum
 
14.03.13
10:32
(22) видел контору, которая в парусе все ручными проводками делали
24 ЧеловекДуши
 
14.03.13
10:33
(21) Нет, я просто не могу тебе помочь, ибо я не в курсе, что ты хочешь подчеркнуть из операции.

Но операцию можно хранить в ТЗ в развернутом виде, т.е. в первой колонке Счет, потом Субконто(1) и т.д.
25 ЧеловекДуши
 
14.03.13
10:34
(23) Я только слышал, но не видел :)
По слухам они это делали так виртуозно, то все просто обычные "Быдло" бухи, которые привязываются не к проводкам, а к документам, могут идти лесом :)
26 Chum
 
14.03.13
10:40
(25) а еще видел полный учет (склад, CRM и т.д.) в excel с одновременным пренебрежительным отношением к 1С.
27 pessok
 
14.03.13
10:42
(24) да надо мне в документе Операция в строке (а ТЧ там нет), соответствующей условию, заменить сумму и содержание. Мб я изначально пошел не в ту сторону?
28 ЧеловекДуши
 
14.03.13
11:53
(27) Ну, народ тебе подсказал в (12).
Но в запросе нужно указать нужный параметр.

ВыполнитьЗапрос
Выборка итогов в различных разрезах.

Синтаксис:

ВыполнитьЗапрос(<НачалоПериода>, <КонецПериода>, <ФильтрПоСчетам>,

      <ФильтрПоКоррСчет>, <Валюта>, <ТипИтогов>, <Периодичность>, <ТипСуммы>)

Англоязычный синоним:

DoQuery

Параметры:

<НачалоПериода>
Необязательный параметр. Выражение типа дата, документ или позиция документа начала периода запроса. Если этот параметр не указан, будут вы­числяться начальные сальдо на момент, указан­ный в параметре <КонецПериода>

<КонецПериода>
Необязательный параметр. Выражение типа дата, документ или позиция документа конца периода запроса. Если этот параметр не указан, будут вычисляться начальные сальдо на момент, указанный в параметре  <НачалоПериода>.

<ФильтрПоСчетам>
Необязательный параметр. Счета, для которых будут отбираться итоги в запросе. Задается зна­чением типа «Счет» или объектом типа «Список-Значений», содержащим значения типа «Счет», либо строкой содержащей список кодов счетов, разделенных символом ", " или ";". Если параметр не указан, отбор будет выполняться по всем сче­там.

<ФильтрПоКоррСчет>
Необязательный параметр. Значение типа «Счет» — корреспондирующий счет, в корреспон­денции с которым будут отбираться итоги счета, указанного в параметре <ФильтрПоСчетам>. Задается значением типа «Счет» или объектом типа «СписокЗначений», содержащим значения типа «Счет», либо строкой содержащей список кодов счетов, разделенных символом "," или ";". Если параметр не указан, будут отбираться итоги в корреспонденции со всеми счетами.

<Валюта>
Необязательный параметр. Значение типа «Справочник.Валюты». Если параметр не указан итоги выдаются без учета валюты.

<ТипИтогов>
Необязательный параметр. Число — тип отбирае­мых итогов. Может принимать следующие значе­ния:

1 — остатки и обороты по счету в целом;

2 — обороты между счетами;

Первое и второе вместе.

По умолчанию — 1.

<Периодичность>
Необязательный параметр. Позволяет получить дополнительный разрез итогов по периодам. Чис­ло или символьная строка (См. ниже). По умол­чанию периодичность не задана.

<ТипСуммы>
Необязательный параметр. Число или строка — тип рассчитываемых итогов. Может принимать следующие значения (в скобках указаны строко­вые синонимы):

1 («С», «S») рассчитывать суммы;

2 («В», «С») рассчитывать валютные суммы;

4 («К», «А») рассчитывать количество.

Если требуется одновременно рассчитывать раз­ные суммы, значение параметра получается путем сложения допустимых значений, например: 5 (1+4) — рассчитывать суммы и количество. При указании параметра строкой в ней указываются все символы, которые обозначают типы сумм, которые нужно рассчитывать. По умолчанию рассчитываются все типы сумм.


Параметр <Периодичность> может принимать следующие значения (в скобках указаны строковые синонимы):

1 («Период», «Period»)
Промежуточные итоги не рассчиты­ваются;

2 («Операция», «Entry»)
Промежуточные итоги рассчитыва­ются по операциям;

3 («Проводка», «Operation»)
По проводкам;

4 («День», «Day»)
По дням;

5 («Неделя», «Week»)
По неделям;

6 («Декада», «Decade»)
По декадам;

7 («Месяц», «Month»)
По месяцам;

8 («Квартал», «Quorter»)
По кварталам

9 («Год», «Year»)
По годам.


Возвращаемое значение:

Число: 1 — запрос выполнен; 0 — запрос не выполнен.

Описание:

Метод ВыполнитьЗапрос выполняет отбор и расчет итогов за период, за­даваемый параметрами <НачалоПериода> и <КонецПериода>.

В зависимости от переданных параметров итоги могут быть подготовлены методом ВыполнитьЗапрос в различных разрезах. Кроме того, на результат запроса влияют дополнительные установки, которые выполняются вызовами специальных методов объекта «Бухгалтерские Итоги».

Параметр <Периодичность> позволяет получить итоги запроса в разрезе периодов.

Метод ВключатьСубсчета позволяет получить итоги в разрезе субсчетов.

Применение метода ИспользоватьСубконто (перед вызовом ВыполнитьЗапрос) позволяет сформировать запрос в разрезе субконто.

После выполнения запроса обход запросов в различных разрезах выполня­ется соответствующими методами объекта.

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

При использовании методов ВыполнитьЗапрос и Рассчитать возможно указание только одной границы интервала. В этом случае будут рассчитываться только остатки на эту границу.

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

Пример:

В монопольном режиме:

// модуль обработки

ИтРасчет.Актуальность(1);

  ...

  Док.ВыбратьДокументы();

  Пока Док.ПолучитьДокумент() = 1 Цикл

     ИтРасчет.Рассчитать(, Док.ТекущийДокумент());

     ...

     Док.Провести();

  КонецЦикла;

  ...

// модуль документа

...

ИтЗапрос.ВыполнитьЗапрос(, Док.ТекущийДокумент(), СчетПоКоду("41"));

...

в данном случае ИтЗапрос.ВыполнитьЗапрос(...) воспользуется ре­зультатами временного расчета ИтРасчет. Данная возможность может исполь­зоваться при групповом перепроведении документов.

Пример:

БухИтоги.ВыполнитьЗапрос(ДатаНач, ДатаКон, "60", , 3);
29 ЧеловекДуши
 
14.03.13
11:55
+ (28) Параметр ты уже указал, так что осталось только сделать как в (12)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn