|
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); //Таб.Показать("Сформировать", ""); КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |