как записать элемент справочника в группу при копировании
|
28.03.2018 10:30
Игнатьев Андрей
|
Группы копируются, а как записать элементы в эти группы?
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Номенклатура.Ссылка,
| Номенклатура.Родитель,
| Номенклатура.ЭтоГруппа,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Фамилия,
| Номенклатура.Имя,
| Номенклатура.ДатаРождения
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| |УПОРЯДОЧИТЬ ПО
| Наименование ИЕРАРХИЯ
|АВТОУПОРЯДОЧИВАНИЕ";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
НоваяГруппа = Справочники.ФизЛица.СоздатьГруппу();
НоваяГруппа.Наименование = Выборка.Наименование;
НоваяГруппа.Записать();
Иначе
НовыйЭлемент = Справочники.ФизЛица.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовыйЭлемент,Выборка);
НовыйЭлемент.Записать();
КонецЕсли;
КонецЦикла;
|
Re: как записать элемент справочника в группу при копировании
|
29.03.2018 09:54
Давыдов Денис
|
чтобы в результате запроса группы шли перед элементами можно воспользоватья упорядочиванием Упорядочить по Номенклатура.ЭтоГруппа Иерархия. а при обходе хранить последнюю созданную группу и записывать ее в реквизит Родитель создаваемых элементов. Как-то учесть элементы без групп.
|
Re: как записать элемент справочника в группу при копировании
|
29.03.2018 10:04
Игнатьев Андрей
|
Денис, ма можно побольше конкретики? Мы с вами предыдущем моем сообщении общались, я даже базу скидывал.
|
Re: как записать элемент справочника в группу при копировании
|
29.03.2018 10:50
Давыдов Денис
|
|
Re: как записать элемент справочника в группу при копировании
|
05.04.2018 08:16
Игнатьев Андрей
|
Денис здравствуйте. Не могли бы вы прокомментировать. Копирует все без дублей. Но если в первый справочник записать новую группу, то все копирует, а если новый элемент, то выдает ошибку {Обработка.Копировать.Форма.Форма.Форма(45)}: Значение не является значением объектного типа (Ссылка) ТРодитель = НоваяГруппа.Ссылка;
&НаСервере Процедура КопироватьНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка, | Номенклатура.Родитель, | Номенклатура.ЭтоГруппа, | Номенклатура.Наименование КАК Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура1 КАК Номенклатура1 | ПО Номенклатура.Наименование = Номенклатура1.Наименование |ГДЕ | Номенклатура1.Наименование ЕСТЬ NULL | |УПОРЯДОЧИТЬ ПО | Наименование ИЕРАРХИЯ |АВТОУПОРЯДОЧИВАНИЕ"; РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда НоваяГруппа = Справочники.Номенклатура1.СоздатьГруппу(); НоваяГруппа.Наименование = Выборка.Наименование; НоваяГруппа.Записать(); иначе НовыйЭлемент = Справочники.Номенклатура1.СоздатьЭлемент(); ТРодитель = НоваяГруппа.Ссылка; ЗаполнитьЗначенияСвойств(НовыйЭлемент,Выборка); Если ЗначениеЗаполнено(Выборка.Родитель) Тогда НовыйЭлемент.Родитель = ТРодитель; Иначе НовыйЭлемент.Родитель.Пустая(); КонецЕсли; НовыйЭлемент.Записать(); КонецЕсли;
КонецЦикла; КонецПроцедуры
|
Re: как записать элемент справочника в группу при копировании
|
05.04.2018 08:22
Давыдов Денис
|
в картинке, которую я прикреплял 29 марта и дальше где-то я пояснял, что не надо удалять эту строку, где создается переменная тРодитель и почему. когда я потом писал код с рекурсией, там это предусмотрено другим образом
|
Re: как записать элемент справочника в группу при копировании
|
05.04.2018 08:56
Игнатьев Андрей
|
а как можно очистить справочник перед записью?
|
Re: как записать элемент справочника в группу при копировании
|
05.04.2018 08:58
Давыдов Денис
|
|
Re: как записать элемент справочника в группу при копировании
|
05.04.2018 09:23
Игнатьев Андрей
|
перед копированием новый справочник полностью очищается и записывается снова.
|
Re: как записать элемент справочника в группу при копировании
|
05.04.2018 09:29
Давыдов Денис
|
нельзя просто так взять и удалить все элементы в справочнике)
вдруг они используются в других объектах уже? тогда появятся битые ссылки и т.п. нужно контроль ссылочной целостности выполнять. зачем так жестко-то?
так-то пожалуйста. запросом выбрать все из справочника и в цикле ПолучитьОбъект(), Удалить()
но лучше уж пометку удаления просто ставить. а удалять уже через Стандартные - Удаление помеченных объектов.
может по смыслу задачи нужно увидеть, что нужный элемент уже есть и заново его не нужно создавать?
ну да, вот вижу "Ксати как избавиться от дублей при повторном нажатии кглпки?"
в этом же суть?
нужно соединять в запросе
к таблице из старого справочника соединить таблицу из нового. и если уж там null, то можно создавать, а если присоединился элемент из нового справочника, значит он там уже есть и не нужно
условие соединения только определить. можно в какой-то реквизит нового справочника (если есть возможность эти реквизиты создавать) записывать код из старого и по этим значениям. а может и просто условиться, что коды один в один переносим, тогда и новый реквизит не нужно создавать, а в новый код записывать код из старого справочника.
тогда условием соединения будет старыйсправочник.код = новыйсправочник.код
|
Re: как записать элемент справочника в группу при копировании
|
05.04.2018 10:22
Игнатьев Андрей
|
С дублями проблему решил. По поводу удаления согласен.
|
Re: как записать элемент справочника в группу при копировании
|
30.03.2018 10:39
Игнатьев Андрей
|
Денис спасибо за подсказку. Элементы стали попадать в группы, но если элемент вне группы, то он попадает в последнюю группу.
(Извините, что "насел" на Вас, но не к кому обратиться. мне 48 лет, решил заняться 1с. Год назад прошел курсы, сдал на профессионала, сидел на форуме чистова, в интернете, читал Радченко, сдал на специалиста по платформе. На работу не берут - нужен опыт ( а где его взять?), прошусь к 1Сникам - стажером(не берут, так как у вас слишком большой опыт работы. Честно скажу, что это задание мне дали как тест в одной из контор. Я уже весь интернет облазил, а с какого конца подойти не знаю. Я уже просто для себя хочу понять принцип. Вы уж не бросайте "старика"))). и как избавиться от дублей))?
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | Номенклатура.Ссылка, | Номенклатура.Родитель, | Номенклатура.ЭтоГруппа КАК ЭтоГруппа, | Номенклатура.Наименование КАК Наименование, | Номенклатура.Фамилия, | Номенклатура.Имя, | Номенклатура.ДатаРождения |ИЗ | Справочник.Номенклатура КАК Номенклатура |АВТОУПОРЯДОЧИВАНИЕ"; РезультатЗапроса = Запрос.Выполнить(); //ТРодитель = Справочники.ФизЛица.ПустаяСсылка(); // Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда НоваяГруппа = Справочники.ФизЛица.СоздатьГруппу(); НоваяГруппа.Наименование = Выборка.Наименование; НоваяГруппа.Записать(); иначе НовыйЭлемент = Справочники.ФизЛица.СоздатьЭлемент(); ТРодитель = НоваяГруппа.Ссылка; ЗаполнитьЗначенияСвойств(НовыйЭлемент,Выборка); НовыйЭлемент.Родитель = ТРодитель;
//НовыйЭлемент.Родитель = ?(Выборка.этоГруппа = Истина,ТРодитель,Неопределено);
НовыйЭлемент.Записать(); КонецЕсли; КонецЦикла;
|
Re: как записать элемент справочника в группу при копировании
|
30.03.2018 12:04
Анатолий
|
В простом случае:
Если ЗначениеЗаполнено(Выборка.Родитель) Тогда
НовыйЭлемент.Родитель = ТРодитель;
КонецЕсли;
В более сложном, например, справочник номенклутра, может иметь навороченную ирерахию, и сложно гадать, как там призойдет упорядочивание в запросе
Поэтому, лучше, в запросе использовать итоги, чтобы гарантировано сначала обойти родителя , а потом элементы.
Либо, бы сначала обходить все группы и создавать такие же группы в целевом справочнике и где-то хранить
пары СсылкаНаРодителяВИсходномСправочнке - СсылкаНаРодителяВЦелевомСправочнике (для начала, хотя бы в таблице значений, хотя есть и другие варианты)
А уже потом заполнять элементы.
|
Re: как записать элемент справочника в группу при копировании
|
30.03.2018 15:31
Давыдов Денис
|
согласен с предыдущим оратором
&НаСервере
Процедура Команда1НаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Банки.Ссылка КАК Ссылка,
| Банки.Родитель КАК Родитель,
| Банки.ЭтоГруппа КАК ЭтоГруппа
|ИЗ
| Справочник.Банки КАК Банки
|ИТОГИ ПО
| Ссылка ИЕРАРХИЯ";
РезультатДерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Для Каждого тСтрока Из РезультатДерево.Строки Цикл
ОбработатьСтрокуВыборки(тСтрока,Справочники.Банки.ПустаяСсылка())
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ОбработатьСтрокуВыборки(СтрокаВыборки, Родитель)
Если СтрокаВыборки.Родитель<>Неопределено И СтрокаВыборки.Родитель.Ссылка = СтрокаВыборки.Ссылка Тогда
Возврат;
КонецЕсли;
Если СтрокаВыборки.ЭтоГруппа Тогда
//СоздатьНовуюГруппу
НоваяГруппа = Справочники.Банки2.СоздатьГруппу();
ЗаполнитьЗначенияСвойств(НоваяГруппа,СтрокаВыборки);
НоваяГруппа.Родитель = Родитель;
НоваяГруппа.Записать();
тСтроки = СтрокаВыборки.Строки;
Для Каждого тСтрока ИЗ тСтроки Цикл
ОбработатьСтрокуВыборки(тСтрока,НоваяГруппа);
КонецЦикла;
Иначе
//Создать элемент
НовыйЭлемент = Справочники.Банки2.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовыйЭлемент,СтрокаВыборки);
НовыйЭлемент.Родитель = Родитель;
НовыйЭлемент.Записать();
КонецЕсли;
КонецПроцедуры
я вот набросал пример выгрузкой результата запроса в дерево и обхода дерева с помощью рекурсивной функции.
п.с. я удручем наличием сертификата специалист, если честно. не верю
|
Re: как записать элемент справочника в группу при копировании
|
30.03.2018 16:41
Анатолий
|
м-да, рекурсия....
Не надо искать сложностей, там где их нет :)
|
Re: как записать элемент справочника в группу при копировании
|
30.03.2018 16:44
Давыдов Денис
|
а как? мы же не знаем насколько глубокая вложенность. или тупо три раза выбрать?
|
Re: как записать элемент справочника в группу при копировании
|
30.03.2018 21:13
Анатолий
|
Спорить здесь не буду.
В 99 процетнтов случаев рекусию можно заменить циклом
Тут в первом приближенни можно использовать
ИТОГИ ПО | Ссылка.Родитель"
+ Первая выборка
ОбходРезультатаЗпроса.ПоГруппировкам
Вторая - по элементам.
Таким образом в первой выборке всегда присутсвуют родителм
ну, или с какими-то нюансами.
Не хочу дальше спорить,
тем более у автора топика есть все сертификаты :)
|
Re: как записать элемент справочника в группу при копировании
|
01.04.2018 10:19
Игнатьев Андрей
|
Друзья спасибо за помошь и дискуссию!
У меня оказался "простой случай", все сработало по условию "ЗначениеЗаполнено".
По поводу сертификатов, то это легко проверить. 1с пока не уличен в продаже сертификатов в метро.
Своими сертификатами я не кичусь, но горжусь. Этим я показал, что мозги еще не высохли и не пропиты, и доказал, что могу достичь цели.
Но теория без практики - это просто теория. Даже у вас несколько путей решения этой задачи.
(У меня была подруга. Подходит и просит меня научить кататься на машине. Я спрашиваю:"У тебя права есть?"
- Да,уже 2 года. я глворю:"Видишь, тебе государство говорит, садись и едь". Короче стал учить и тоже был удручен.
Каждое занятие заканчивалось слезами и криками, что как только научишь, то можешь катиться на все 4 стороны.
Через 2 недели пришлось ей ездить самой. Через 2 месяца, когда я говорил "Куда прешь?", она отвечала *Не нравиться - иди пешком*.)
Тоже самое и с ин.языком. Пока не будешь общаться не заговоришь.
Поэтому я не пока не отчаиваюсь.
Можно искать как ежик в тумане, а можно доехать на лошадке.
Так что надеюсь на вашу помошь))).
Ксати как избавиться от дублей при повторном нажатии кглпки?
|
Re: как записать элемент справочника в группу при копировании
|
01.04.2018 21:23
Анатолий
|
>Ксати как избавиться от дублей при повторном нажатии кглпки?
У Вас где-то в задаче это определено:
Вам запрещают считать (сколько раз нажата кнопка)?
Вам запрещают сначала все удалить, а потом уже заполнить?
Вам запрещают проверить наличие элемента?
|
Re: как записать элемент справочника в группу при копировании
|
02.04.2018 12:57
Игнатьев Андрей
|
ВыборкаН = Справочники.ФизЛица.Выбрать(); Пока ВыборкаН.Следующий() Цикл Об = ВыборкаН.ПолучитьОбъект(); Об.Удалить(); КонецЦикла;
не работает
|