Имя: Пароль:
1C
1C 7.7
v7: БП 4.5 Дублирование элементов справочника "Договоры"
0 YurAnt
 
04.12.13
10:49
Доброго времени суток, господа-форумчане. Проблема вот такая:
давным давно в далекой далекой галактике, когда меня еще не было на данном предприятии была написана выгрузка документов из XML (это отдельная история) т.е. находим док в ХМЛе - создаем его в 1Ске.
В этом же документе (не спрашивайте в каком - еще сам не отследил, внеш обработок там тысячи...) есть поле Договор - и вот с ним то и проблема.
Тот чудотворец, что писал обработку не предусмотрел проверку на уже существующие договоры... т.е. создаем док - и в нем смотрим если такой договор есть - указываем его, если нет - создаем новый.

а предусмотреть следовало... поскольку сейчас оно всплыло. Вот как-то так.
http://savepic.su/3897070.png

"Первое - (ну кроме того, что отследить откуда оно создается)
надо все это поудалять, а ссылки переписать на свои"
Однако хрен.

Спр = СоздатьОбъект("Справочник.Договоры");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
    Сообщить(Спр.ТекущийЭлемент());
КонецЦикла;

Не буду выбирать, говорит... нет там элементов.
Т.е. есть подозрения близкие к уверенности что овер1000 договоров с кодом 000001 обрабатываются некорректно...

Как вот перебрать такое ? Ибо хочется перебрать, получить ссылки, переписать их своЕЙ одной ссылкой на один единственный "Основной договор" созданный руками.

вот...
Благодарен за любые советы, с ув. YurAnt.
1 ДенисЧ
 
04.12.13
10:52
ВыбратьЭлементы(0)

Или владельца указать....
2 YurAnt
 
04.12.13
10:54
благодарю, помогло
3 Chum
 
04.12.13
10:55
(0) Спр. Договора (ну да, идиотское название) подчинен спр. Контрагенты, следовательно, нужно применять ИспользоватьВладельца() для отбора по контрагенту.

ВыбратьЭлементы(0) - это выборка всех договоров без учета владельца
4 Chum
 
04.12.13
10:56
Спр = СоздатьОбъект("Справочник.Договоры");
Спр.ИспользоватьВладельца(л_ТекущийКонтрагент);
Если Спр.ВыбратьЭлементы() > 0 Тогда
Сообщить("Есть договоры");
Иначе
Сообщить("Нет договоров");
КонецЕсли;
5 YurAnt
 
05.12.13
13:27
вот такой вот код получился... по тыку Сформировать() я получаю договор и перебираю все некорректные дабы заменить нормальной ссылкой...
Однако то ли я что-то не учел, то ли выборка очень велика, но 1Ска виснет... а ждать более 20 минут у меня терпения не хватало...
Оцените, нет ли ошибок?

Процедура Сформировать()

КонтрагСп=СоздатьОбъект("Справочник.Контрагенты");
Если КонтрагСп.НайтиПоКоду("00000450")=1 Тогда
    л_ТекущийКонтрагент = КонтрагСп.ТекущийЭлемент();
Иначе
    Предупреждение("Элемент с заданным наименованием не найден");
КонецЕсли;
    
ДоговорыСп = СоздатьОбъект("Справочник.Договоры");
ДоговорыСп.ИспользоватьВладельца(л_ТекущийКонтрагент);
Если ДоговорыСп.ВыбратьЭлементы() > 0 Тогда
    ОсновнойДоговорРусскихТр = ДоговорыСп.ТекущийЭлемент();
Иначе
    Сообщить("Нет договоров");
КонецЕсли;    
    
    
    
    
Ссылки = СоздатьОбъект("ТаблицаЗначений");
Спр = СоздатьОбъект("Справочник.Договоры");
Спр.ВыбратьЭлементы(0);
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        //Сообщить(Спр.ТекущийЭлемент());
        НайтиСсылки(Спр.ТекущийЭлемент(), Ссылки);
        Ссылки.ВыбратьСтроки();
        Пока Ссылки.ПолучитьСтроку()=1 Цикл
            Сообщить(Ссылки.Ссылка);
            Если Ссылки.Объект.Наименование = "Основной договор" Тогда
                Сообщить(Ссылки.Ссылка.Договор);
                Сообщить(ОсновнойДоговорРусскихТр);
                Ссылки.Ссылка.Договор = ОсновнойДоговорРусскихТр;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;        
КонецПроцедуры

С ув. YurAnt.
6 VladZ
 
05.12.13
13:31
(5) Накидай сначала словесный алгоритм. Потом будет проще "положить" на язык программирования.

к примеру:
1. Ищем нужного контрагента по коду.
2. Если контрагент не найден - говорим об этом пользователю и ВЫХОДИМ ИЗ ПРОЦЕДУРЫ!!!

и т.д.
7 пипец
 
05.12.13
13:41
вообще все перезаписи делать лучше через СЗ/ТЗ
ну накрайняк через выборку с не основным представлением , чтобы не сбивалось
ЗЫ опять же Владелец - это реквизит ... а основной договор в справочнике контрагента НЕ означает что у договора будет владелец тот же контрагент
8 YurAnt
 
05.12.13
14:37
Итак, госопда, почти взлетело...

Ссылки = СоздатьОбъект("ТаблицаЗначений");
Спр = СоздатьОбъект("Справочник.Договоры");
Спр.ВыбратьЭлементы(0);
    Пока (Спр.ПолучитьЭлемент() = 1) Цикл
            Если Спр.Наименование = "Основной договор" Тогда
                НайтиСсылки(Спр.ТекущийЭлемент(), Ссылки);
                Для Стр = 1 по Ссылки.КоличествоСтрок()-1 Цикл  
                    Ссылки.ПолучитьСтрокуПоНомеру(Стр);
                    Ссылки.Ссылка.Договор = ОсновнойДоговорРусскихТр;
                    //Ссылки.Ссылка.Записать();
                    //Ссылки.Ссылка.Провести();
                    Сообщить(Ссылки);
                КонецЦикла;
            КонецЕсли;
    КонецЦикла;    
КонецПроцедуры

Одно лишь но тут имеется...
//Ссылки.Ссылка.Записать();
//Ссылки.Ссылка.Провести();
перебираются ведь не только документы но и проводки...
сталкивался ли кто с написанием универсального механизма изменения и (!!!) СОХРАНЕНИЯ этого изменения в объектах изменяемого типа ?

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

ибо выдает :

Ссылки.Ссылка.Записать();
{C:\DOCUMENTS AND SETTINGS\YURANT\РАБОЧИЙ СТОЛ\ПЕРЕБОР_ДОГОВОРОВ.ERT(28)}: Не выбран документ!

полагаю происходит это в момент перебора проводок.
9 YurAnt
 
05.12.13
14:39
т.е. как единым механизмом сохранять изменения в объектах полученных через НайтиСсылки(Спр.ТекущийЭлемент(), Ссылки); ???
10 пипец
 
05.12.13
14:56
(8) васьмерашники такие васьмерашники ;))
//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Контрагент = Справочник.Контрагенты.ТекущийЭлемент;
    |ОсновнойДоговор = Справочник.Контрагенты.ОсновнойДоговор;
    |Группировка Контрагент без групп;
    |Условие(ОсновнойДоговор.Выбран()=0);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    
    ТЗЗ=Создатьобъект("ТаблицаЗначений");
    Спр=Создатьобъект("Справочник.Контрагенты");
    СпрД=Создатьобъект("Справочник.Договоры");
    
    
    Запрос.Выгрузить(ТЗЗ,0,0);
    
    
    ТЗЗ.Выбратьстроки();
    
    
    Пока ТЗЗ.Получитьстроку()>0 Цикл
        
        Спрд.ИспользоватьВладельца(ТЗЗ.Контрагент);
        
        Спрд.ВыбратьЭлементы();
        
        Пока Спрд.ПолучитьЭлемент()>0 Цикл
            
            
            тут условие и присваение
            
             Спр.НайтиЭлемент(ТЗЗ.Контрагент);
            
             Спр.ОсновнойДоговор=СпрД.ТекущийЭлемент()
            
        
        
        
        
        
    КонецЦикла;    .

    // Подготовка к заполнению выходных форм данными запроса
    //Таб = СоздатьОбъект("Таблица");
    //Таб.ИсходнаяТаблица("Сформировать");
    //// Заполнение полей "Заголовок"
    //Таб.ВывестиСекцию("Заголовок");
    //Состояние("Заполнение выходной таблицы...");
    //Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    //Пока Запрос.Группировка(1) = 1 Цикл
    //    // Заполнение полей Контрагент
    //    Таб.ВывестиСекцию("Контрагент");
    //КонецЦикла;
    //// Вывод заполненной формы
    //Таб.ТолькоПросмотр(1);
    //Таб.Показать("Сформировать", "");
КонецПроцедуры
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн