Имя: Пароль:
1C
1C 7.7
v7: 7.7 Не могу спозиционировать справочник на субконто
,
0 yra111
 
11.10.16
14:43
вот так вот нормально работает :    
    смп=создатьобъект("справочник.материалы");
    смп.выбратьэлементы();
    пока смп.получитьэлемент()=1 цикл
               смп.удалить(0);
           смп.записать();
    конеццикла;
Но если обхожу циклом не элементы справочника , а субконто, у которых тип такой же как у справочника, то не помечает на удаление нифига, хотя через сообщить() видно что я типа спозиционировался.Если через смп2.удалить() тоже нифига не удаляет. Вот код:


Процедура Формировать()
    счпров=0;
    Ит = СоздатьОбъект("БухгалтерскиеИтоги");    
    Ит.ИспользоватьСубконто("МестаХранения");
    Ит.ИспользоватьСубконто("Материалы");
    Ит.ВыполнитьЗапрос(Дата1, Дата1,"10.5") ;
    смп=создатьобъект("справочник.материалы");
    смп2=создатьобъект("справочник.материалы");
    смп.выбратьэлементы();

    Ит.ВыбратьСубконто(1);
    Пока Ит.ПолучитьСубконто(1)=1 цикл
        Ит.ВыбратьСубконто();
        Пока Ит.ПолучитьСубконто()=1 цикл
            смп.найтиэлемент(ит.субконто()); /// вот наверное гдето тут собака порылась
            смп2=смп.текущийэлемент();
            Ит.ВыбратьВалюты();
            Пока Ит.ПолучитьВалюту()=1 цикл
                если (Ит.Скд(3)-Ит.Скк(3)) = 0 тогда
                если сокрЛП(смп)<>"" тогда
                если смп.этогруппа()=0 тогда
                //    если  сокрЛП(смп2.родитель)="Б/У с использованием (10/6 счет)" тогда    иначе
            смп.найтиэлемент(ит.субконто());
            смп2=смп.текущийэлемент();
                        сообщить(ит.субконто());
            сообщить(смп);
            сообщить(смп.цена);
                   смп.удалить(0);
               смп.записать();
            //    конецесли;
                конецесли;
                конецесли;
            конецесли;
            КонецЦикла;
        КонецЦикла;              
    КонецЦикла;              
КонецПроцедуры

Подскажите пожалуйста где я накосячил, уже весь мозг сломал...
1 Ёпрст
 
11.10.16
14:52
после удалить(0),  записать() не надо
2 Builder
 
11.10.16
14:53
Код просто ппц...

смп.записать() - не надо записывать после удаления, оно уже того...

Сделай так
смп=создатьобъект("справочник");
Так можешь любой удалять.
3 пипец
 
11.10.16
15:06
перед выборкой сделай порядоккодов
ЗЫ и да щзаписывать после пометки удаления как то креативно
4 yra111
 
11.10.16
16:09
Не в записать() дело точно(может и лишнее,но не мешает). В 1м огрызке кода ведь работает!Да и если его убрать то лучше не становиться, я проверил.

Если не указывать тип справочника  (смп=создатьобъект("справочник");), то при нийтиэлемент(ит.субконто(2)) пишет не задан вид.

Порядоккодов() тоже не помог. Что еще можно попробовать?
Сейчс код вот так выглядит:
Процедура Формировать()
    Ит = СоздатьОбъект("БухгалтерскиеИтоги");    
    Ит.ИспользоватьСубконто("МестаХранения");
    Ит.ИспользоватьСубконто("Материалы");
    Ит.ВыполнитьЗапрос(Дата1, Дата1,"10.5") ;
    смп=создатьобъект("справочник.материалы");
    смп2=создатьобъект("справочник.материалы");
    смп.ПорядокКодов();
    смп.выбратьэлементы();
//    смп2.выбратьэлементы();
    Ит.ВыбратьСубконто(1);
    Пока Ит.ПолучитьСубконто(1)=1 цикл
        Ит.ВыбратьСубконто(2);
        Пока Ит.ПолучитьСубконто(2)=1 цикл
        смп.найтиэлемент(ит.субконто(2));
        смп2=смп.текущийэлемент();
            Ит.ВыбратьВалюты();
            Пока Ит.ПолучитьВалюту()=1 цикл
                если (Ит.Скд(3)-Ит.Скк(3)) = 0 тогда
                если сокрЛП(смп)<>"" тогда
                если смп.этогруппа()=0 тогда
            //    если  сокрЛП(смп2.родитель)="Б/У с использованием (10/6 счет)" тогда    иначе
            смп.найтиэлемент(ит.субконто(2));
            смп2=смп.текущийэлемент();
                        сообщить(ит.субконто(2));
            сообщить(смп);
            сообщить(смп.цена);
                        смп.удалить(0);
            //   смп.записать();
                конецесли;
                конецесли;
                конецесли;
//                конецесли;
            КонецЦикла;
        КонецЦикла;              
    КонецЦикла;              
КонецПроцедуры
5 Ёпрст
 
11.10.16
16:13
(0)

Если Смп.НайтиЭлемент(ит.субконто(2))=1 Тогда
   сообщить("метим на х");
    смп.удалить(0);
КонецЕсли;
6 yra111
 
11.10.16
16:42
(5) так я уже пробовал. толку никакого. В сообщить(смп) нормально сообщает название элемента, сообщить(смп.любойреквизит) тоже нормально реквизит сообщает, а вот удалить - фиг удаляет

Спасибо всем кто ответил. попробую вообще с другой стороны эту шнягу раскрутить.Перебор элементов, а потом бухит по элементу,должно сработвать.

ЗЫ записать() не мешает , потомучто удалить(0) - тоесть элемент остаёться. просто с крестиком
7 Ёпрст
 
11.10.16
17:02
(6) не надо делать двойную запись
8 Ёпрст
 
11.10.16
17:03
>>>а вот удалить - фиг удаляет

тебе насовсем надо ?
Тогда либо
удалить()
либо удалить(1)

ЗЫ: если че, удалить(0) - это пометка на удаление.

И выкиннь записать() из кода.
9 Dump
 
12.10.16
06:06
(0) Давай начнем сначала
СЛОВАМИ опиши - что и зачем надо сделать.
10 Токарь
 
12.10.16
06:29
Ит.ИспользоватьСубконто("МестаХранения");
    Ит.ИспользоватьСубконто("Материалы");
    Ит.ВыполнитьЗапрос(Дата1, Дата1,"10.5") ;
    смп=создатьобъект("справочник.материалы");
    смп2=создатьобъект("справочник.материалы");
==
"МестаХранения" и "материалы" -- это одно и тоже?
11 Токарь
 
12.10.16
06:30
смп.ПорядокКодов();
    смп.выбратьэлементы();
===
это что за фигня ещё здесь? закомментарить/удалить
12 KishMish
 
12.10.16
07:19
попробуй конретно указать

1. Вторая выборка субоконто. Нужно указывать
Ит.ВыбратьСубконто(2);
        Пока Ит.ПолучитьСубконто(2)=1 цикл
2. И указывать какое субконто ты буерешь первое или второе
ит.субконто(1) или ит.субконто(2) в зависимости
13 пипец
 
12.10.16
09:14
упал , отполз
(4) определитесь уже - или работаете с объектом справочник или с бухитогами
(11) прочитай (0) для начала ))
14 Fedor-1971
 
12.10.16
09:44
(0) помечай на удаление спозиционированный элемент справочника

смп2=смп.текущийэлемент();
                  сообщить(ит.субконто());
            сообщить(смп);
            сообщить(смп.цена);

!!!!    смп2.удалить(0); // тут засада
15 Lazy Stranger
 
12.10.16
09:53
можно вместо
смп.найтиэлемент(ит.субконто(2));
попробовать
смп.найтипокоду(ит.субконто(2).код);
16 yra111
 
15.10.16
04:22
(14) именно так и пробовал в том числе. нифига не пашет
(15) Там коды повторяються(((
(12)  Сначала я так и сделал, субконто(2)
Впрчем, на обьект позиционируеться и субконто() и субконто(2)одинаково.Проверяю,что  на обьект типа спозиционировалось вот так:  сообщить(смп.цена) нормально сообщает цену или еще какой реквизит.В от удалять - фиг(

Выкрутился путем пербора всех элементов справочника с отделным расчетом БИ  по каждому элементу. Тогда нормально удаляет.
Основная теорема систематики: Новые системы плодят новые проблемы.