Полная копия элемента справочника не своими руками

27.04.16

Разработка - Универсальные функции

Копируем элемент справочника, элементы подчиненных справочников и записи регистров сведений, относящиеся к элементу. Одним движением.

Все выросло из чисто прикладной задачи - ускорить и упростить копирование элементов сложных справочников.

При копировании Номенклатуры нужно было воспроизвести единицы измерения, свойства, штрихкоды и т.д. Так как данные, относящиеся к предмету, раскиданы по подчиненным справочникам и регистрам сведений, пользователи весьма удивлялись, почему по кнопочке "создать элемент копированием" у них на форме копии заполненными оказывалась едва ли треть от привычных им сведений.

Чтобы не утомлять их объяснениями, почему в 1С все так сделано. я сел и написал функцию, которая скопирует практически все, что имеет отношение к объекту. Кроме, конечно, регистров накопления и расчета, а также регистров сведений, связанных с регистраторами.

На этом описательную часть считаю законченой. Собственно сама функция:

//Возвращает ссылку на копию элемента справочника
//При этом копируются элементы подчиненных справочников
//и записи независимых регистров сведений
//у которых владелец и ведущее измерение представлены ссылкой на возвращаемую копию.
//АРГУМЕНТЫ:
//    Ссылка (СправочникСсылка) - Ссылка на копируемый элемент
//    ИсключаяРеквизиты (Строка) - Список имен реквизитов, значения которых копировать не нужно.
//    стрНовыеРеквизиты (Структура) - Структура реквизитов и значений для их присвоения копии
Функция СоздатьПолнуюКопиюЭлементаСправочника(Ссылка, ИсключаяРеквизиты = "", стрНовыеРеквизиты = "") Экспорт
	
	НачатьТранзакцию();
	
	//Если нет владельцев тогда не присваиваем этот реквизит при копировании
	Если ссылка.Метаданные().Владельцы.Количество() = 0 и Найти(ИсключаяРеквизиты , "Владелец") = 0 Тогда
		ИсключаяРеквизиты = ИсключаяРеквизиты + ",Владелец";
	КонецЕсли;
	
	//Если не иерархический, но забыли исключить родителя
	Если НЕ ссылка.Метаданные().Иерархический и Найти(ИсключаяРеквизиты , "Родитель") = 0 Тогда
		ИсключаяРеквизиты = ИсключаяРеквизиты + ",Родитель";
	КонецЕсли;	
	
	//Если забыли исключить реквизиты доступные только для групп добавим в исключения и их
	Для Каждого Реквизит Из ссылка.Метаданные().Реквизиты Цикл
		Если Реквизит.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы И Найти(ИсключаяРеквизиты , Реквизит.Имя) = 0 Тогда
			ИсключаяРеквизиты = ИсключаяРеквизиты + "," + Реквизит.Имя;	
		КонецЕсли;
	КонецЦикла;
	
	//Формируем список подчиненных справочников и массив их типов
	спПодчиненныхСправочников = Новый Массив;
	мТиповПодчиненныхСправочников = Новый Массив;
	Для Каждого Спр Из Метаданные.Справочники Цикл
		Если Спр.Владельцы.Содержит(ссылка.Метаданные()) Тогда
			спПодчиненныхСправочников.Добавить(Спр.Имя);
			мТиповПодчиненныхСправочников.Добавить(Тип("СправочникСсылка." + Спр.Имя));
		КонецЕсли;
	КонецЦикла;
	
	//Регистры сведений. Только там где наш элемент копирования может быть ведущим измерением. Запоминаем названия регистров и имена измерений.
	спРегистровСведений = Новый Соответствие;
	Для Каждого Рег Из МЕтаданные.РегистрыСведений Цикл		
		Для Каждого Измерение Из Рег.Измерения Цикл
			Если Измерение.Тип.СодержитТип(Тип("СправочникСсылка." + Ссылка.Метаданные().Имя)) И Измерение.Ведущее Тогда
				спРегистровСведений.Вставить(Рег.Имя, Рег.Измерения.Индекс(Измерение)); Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	//Копируем необычно, чтобы легко исключить требуемые реквизиты 
	КопияСсылки = Справочники[ссылка.Метаданные().Имя].СоздатьЭлемент();
	НовыйКод = КопияСсылки.Код;
	ЗаполнитьЗначенияСвойств(КопияСсылки, Ссылка,,ИсключаяРеквизиты);
	КопияСсылки.Код = НовыйКод;
	
	//Если нужно присвоим нужные значения нужным реквизитам копии.
	Если ТипЗнч(стрНовыеРеквизиты) = Тип("Структура") Тогда
		ЗаполнитьЗначенияСвойств(КопияСсылки,стрНовыеРеквизиты);	
	КонецЕсли;

	//Очищаем значения подчиненных справочников ибо они не могут принадлежать новому владельцу (копии старого)
	Для Каждого Реквизит Из КопияСсылки.Метаданные().Реквизиты Цикл
		Если Не мТиповПодчиненныхСправочников.Найти(ТипЗнч(КопияСсылки[Реквизит.Имя])) = Неопределено Тогда
			КопияСсылки[Реквизит.Имя] = Неопределено;	
		КонецЕсли;
	КонецЦикла;
	
	//Теперь запишется:)
	КопияСсылки.Записать();
	
	//ТЗ. Сложим сюда старые значения подчиненных справочников и соответствующие им новые, для нашей копии
	тСинхронизацииРеквизитов = Новый ТаблицаЗначений;
	тСинхронизацииРеквизитов.Колонки.Добавить("СтароеЗначение");
	тСинхронизацииРеквизитов.Колонки.Добавить("НовоеЗначение");
	
	//А теперь создадим новые подчиненные элементы копированием и сопоставим их имеющимся у объекта копирования
	Для Каждого ПодчиненныйСправочник Из спПодчиненныхСправочников Цикл
		ВыборкаИзПодчиненногоСправочника = Справочники[ПодчиненныйСправочник].Выбрать(,Ссылка);
		Пока ВыборкаИзПодчиненногоСправочника.Следующий() Цикл
			ЗаписьСинхронизации = тСинхронизацииРеквизитов.Добавить();
			НовыйПодчиненныйЭлемент = ВыборкаИзПодчиненногоСправочника.Ссылка.Скопировать();
			НовыйПодчиненныйЭлемент.Владелец = КопияСсылки.Ссылка;
			НовыйПодчиненныйЭлемент.Записать();
			ЗаписьСинхронизации.СтароеЗначение = ВыборкаИзПодчиненногоСправочника.Ссылка;
			ЗаписьСинхронизации.НовоеЗначение  = НовыйПодчиненныйЭлемент.Ссылка;
		КонецЦикла;
	КонецЦикла;
	
	//Присвоим копии элемента копии значений подчиненных справочников 
	Для Каждого Реквизит Из Ссылка.Метаданные().Реквизиты Цикл
		Если Не мТиповПодчиненныхСправочников.Найти(ТипЗнч(КопияСсылки[Реквизит.Имя])) = Неопределено Тогда
			НайденныйРеквизитСоответствия = тСинхронизацииРеквизитов.Найти(Ссылка[Реквизит.Имя],"СтароеЗначение");
			Если НЕ НайденныйРеквизитСоответствия = Неопределено 
				И Найти(ИсключаяРеквизиты, Реквизит.Имя) = 0 Тогда
				КопияСсылки[Реквизит.Имя] = НайденныйРеквизитСоответствия.НовоеЗначение;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	//Снова запишемся перед записью регистров 
    КопияСсылки.Записать();
	
	//Регистры сведений, содержащие измерением копируемый элемент
	Для Каждого Регистр Из спРегистровСведений Цикл
		РегистрМетаданные = Метаданные.РегистрыСведений.Найти(Регистр.Ключ);
		ИмяИзмерения = РегистрМетаданные.Измерения.Получить(Регистр.Значение).Имя;
		//Только независимые, ибо копировать еще и регистраторы это уже слишком!
		Если РегистрМетаданные.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда
			
			Если РегистрМетаданные.ПериодичностьРегистраСведений  = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
				РегистрВыборка = РегистрыСведений[Регистр.Ключ].Выбрать(Новый Структура(ИмяИзмерения, Ссылка));//Непериодические
			Иначе
				РегистрВыборка = РегистрыСведений[Регистр.Ключ].Выбрать(,,Новый Структура(ИмяИзмерения, Ссылка));//Периодические
			КонецЕсли;
			
			НаборЗаписей = РегистрыСведений[Регистр.Ключ].СоздатьНаборЗаписей();
			НаборЗаписей.Отбор[ИмяИзмерения].Установить(КопияСсылки.Ссылка);
			
			Пока РегистрВыборка.Следующий() Цикл
				//Если в выборке есть записи с копируемым элементом скопируем ее для его копии
				НоваяЗапись = НаборЗаписей.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяЗапись, РегистрВыборка,,ИмяИзмерения);
				НоваяЗапись[ИмяИзмерения] = КопияСсылки.Ссылка; //А сюда подставим копию.
			КонецЦикла;
			
			Если НаборЗаписей.Количество()>0 Тогда
				НаборЗаписей.Записать();
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ЗафиксироватьТранзакцию();
	
	Возврат КопияСсылки.Ссылка;
	
КонецФункции

Вступайте в нашу телеграмм-группу Инфостарт

скопировать копия копия элемента скопировать подчиненные полностью скопировать скопировать все

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4694    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    8738    DeerCven    15    

63

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    56953    dimanich70    85    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8005    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    71553    atdonya    31    

73

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    10011    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ZLENKO 398 27.04.16 16:00 Сейчас в теме
Автору риспект и уважуха! Полезная вещь!
Andrey_Timofeev; nvl; user908312; chrnv; json; +5 Ответить
2. CaSH_2004 375 28.04.16 23:21 Сейчас в теме
(0) Странно, но я такой потребности за более чем 10 лет работы приходящим программистом не слышал. Более того в нормальных конторах просили затирать многие поля при копировании, а в некоторых даже в принципе запрещать что либо копировать! Т.к. заведение нового объекта копированием основная причина дублей и неправильных данных - ведь один раз неправильно заведенные данные потом копируются в неограниченном количестве. Такое удобство как копирование разрешается только для грамотного пользователя (у нас администратора базы) т.к. только он знает где и что потом нужно исправить, поэтому и нет удивления почему не все данные копируются.
Полагаю либо пользователи неграмотные либо автор либо очень специфичная вещь - очень часто после таких "оптимизаторов" приходишь в фирму и спрашиваешь -"а почему у вас вот это так заполняют, а это иначе?", и слышишь в ответ - "ну я не знаю", "так было", "так нам настроили".
С другой стороны это наш хлеб что кто-то допускает ошибки - после того как база вся переписана, забита хламом так что никто ничего не понимает, приходишь и люди на все согласны чтобы навели им порядок. Поэтому трудитесь дальше в том же духе если есть желание.
Но в общем для админов это наверное хорошая вещь если в нее добавить возможность чтобы при копировании вываливался список чего собственно будет создано чтобы можно было отметить галочками что требуется копировать - типа дерева значения. Да и за универсальность + бы поставил, но не проверив код воздержусь, а проверять как я говорю без интерактива создавая кучу хлама не имеет смысла.
user2107213; user661255_lexxkrt; r2d255; Vasvas05; monkbest; Ta_Da; +6 2 Ответить
3. dddxddd 29.04.16 08:52 Сейчас в теме
(2) CaSH_2004, Раз вы работаете "приходящим" (без обид, ничего личного) программистом, значит Ваши клиенты сравнительно не большие предприятия, где копирование действительно больше вред чем польза.
В больших предприятиях, где различные части справочников заполняются разными специалистами (отвечающими за правильность своего набора реквизитов) иной раз и нельзя быстро создать новую запись иначе чем копированием. Поэтому говорить, что решение такое решение несет вред, это все равно, что ударив микроскопом по пальцам в попытке забить им гвоздь, заявить, что микроскопы несут вред и посему бесполезны. :-)
Andrey_Timofeev; +1 Ответить
14. CaSH_2004 375 05.05.16 19:39 Сейчас в теме
(3) dddxddd, если заполняют разные специалисты то как один специалист может создать ее копированием? И для чего спрашивается если опять таки оно должно заполнятся разными специалистами? Уважаемый - вы противоречите сами себе.
(10) gigabyte_artur, в смысле дали? А мы типа просили? Еще раз повторюсь - более чем за 10 лет обслуживания несколько сотен разных клиентов разных сфер и размеров от 1 до 30 пользователей 1С я не разу не встречал такой потребности как и сам ее не испытывал, зато знаю чем заканчивается обычное копирование, а вы ратуете за групповое копирование обычным пользователем!.
Я не говорю что инструмент плох. Но давать его пользователю - крайне опасно, и нормальны программист/администратор не стал бы этого делать если только он хоть как то следит за базой. Никто не застрахован от ошибок - а вот результаты их придется устранять админу, а не пользователю. Так что и сам бы использовал такой инструмент только с указанными ранее интерактивными отметками что нужно копировать, а что нет. А получить "кота в мешке" на выходе - боже упаси.

15. ZLENKO 398 30.05.16 12:45 Сейчас в теме
(14) CaSH_2004, "более чем за 10 лет обслуживания несколько сотен разных клиентов разных сфер и размеров от 1 до 30 пользователей 1С я не разу не встречал такой потребности как и сам ее не испытывал"

Это не означает что такой потребности нет :-) Но соглашусь, что нужно такое достаточно редко.

"Но давать его пользователю - крайне опасно, и нормальны программист/администратор не стал бы этого делать если только он хоть как то следит за базой."

Все мужчины потенциально опасны, т.к. у них есть то чем они отличаются от женщин и этим они могут изнасиловать кого нибудь. Логика примерно такая же :-)
4. ixijixi 2148 29.04.16 09:13 Сейчас в теме
(2) CaSH_2004, присоединяюсь на счет интерактива. Вот это была бы весчь!
5. dusha0020 1125 29.04.16 09:15 Сейчас в теме
(2) CaSH_2004, (3) dddxddd, Интересная дискуссия получилась. И интересные мнения. Понятно, что раз я автор, то придерживаюсь точки зрения пользы от разработки, но...
Жизнь вообще не так однозначна как нам хотелось бы и в этом я сильно согласен с dddxddd. Видел я случаи захламленных баз и даже писал и использовал чужие удалялки дублей, но видел и другие ситуации, когда чтобы создать ту же номенклатуру с обложкой другого цвета приходилось тратить минут 10 времени. А таких позиций нужно создать 200 штук за 2 дня, чтобы поставить быстро на приход.
Инструмент не бывает хорош или плох в принципе - он бывает правильно или неправильно применен. Поэтому с кинутым тапком не согласен:)
Мах; О.Ж; InJey; Andrey_Timofeev; user908312; mickey.1cx; Ta_Da; +7 Ответить
7. dour-dead 272 29.04.16 11:01 Сейчас в теме
(2) CaSH_2004,

Но в общем для админов это наверное хорошая вещь если в нее добавить возможность чтобы при копировании вываливался список чего собственно будет создано чтобы можно было отметить галочками что требуется копировать - типа дерева значения.


давным давно просили для 7/7 такое

http://infostart.ru/public/66284/
10. gigabyte_artur 04.05.16 11:35 Сейчас в теме
(2) CaSH_2004, господа, Вам дали инструмент. Ещё и бесплатно. Пользоваться им или нет - дело Ваше. Зачем же сразу столько высокомерия?

Я бы в такой ситуации написал для номенклатуры/контрагента/договора/%%ReferenceName%% свою функцию копирования, которая ведёт себя, как я задумал. Возможно, взяв за основу разработку автора.
6. DJDUH 17 29.04.16 10:25 Сейчас в теме
А более хитрым способом
ОбъектМетаданных.Скопировать()
- не?!)
8. Brawler 466 30.04.16 17:31 Сейчас в теме
(6) DJDUH, я думаю вы не поняли, что именно копируется в описанном способе автора.
Там помимо самого элемента справочника копируется и разная связанная информация.
Ну простой пример, сведения регистра сведений счета учета номенклатуры, если говорить о БУХии 2.0, 3.0 и баз пораньше.
По крайней мере так я понял.
Код не изучал опубликованный тут.
Andrey_Timofeev; +1 Ответить
9. vec435 17 04.05.16 09:26 Сейчас в теме
хорошо бы еще в XML - в различные базы закинуть постобработкой
11. ikekoval 124 04.05.16 22:33 Сейчас в теме
Было приятно почитать. Спасибо автору за решение!
12. alex_sayan 69 05.05.16 12:53 Сейчас в теме
Режет глаза многократное использование
Ссылка.Метаданные()

надо было однократно поместить метаданные элемента в переменную, и работать с переменной, а не получать метаданные многократно.
Yashazz; корум; wowik; amon_ra; dusha0020; +5 Ответить
13. dusha0020 1125 05.05.16 13:23 Сейчас в теме
(12) puzakov, Конструктивная критика. Благодарю!
alex_sayan; +1 Ответить
16. monkbest 114 31.05.16 07:39 Сейчас в теме
Критика в комментах думаю уместна, т.к. много кто зайдет сюда, увидит, обрадуется и потащит процедуру к себе не подумав. А ведь действительно:
1. В УТ 10 при копировании штрихкод не копируется. А надо? Зачем две номенклатуры с одинаковым штрих кодом?
2. В Бух 2.0 счета учета не копируются. А надо? Если бухгалтер уверен, что там все однотипно, так может счета повесить на папку?
Собственно авторы типовой конфы, они ведь Вам не только структуру данных дают, но и методику работы.
корум; +1 Ответить
17. chrnv 04.10.17 02:01 Сейчас в теме
У меня твоей процедурой элемент справочника не копируется. Сваливается с ошибкой аля "Значение реквизита "код" не заполнено". Чуть-чуть "допилил".
А так, обработка полезная!

//Теперь запишется:)
Если не ЗначениеЗаполнено(КопияСсылки.Код) тогда
	КопияСсылки.УстановитьНовыйКод();
КонецЕсли;
КопияСсылки.Записать();
18. mikv 21.11.18 18:28 Сейчас в теме
Ребята я знаю что глупый вопрос, но немогу понять как применить и куда вставить эту функцию. Извините я только начинаю учится
19. eromashova 29.01.19 20:51 Сейчас в теме
Огромное спасибо автору.!!!
Применила в задаче создания новых номенклатур копированием имеющихся в определенной группе с изменением двух реквизитов-свойств. Руками довольно большое количество позиций создавать было бы утомительно... )
Спасибо!
20. serpent 70 23.05.19 13:33 Сейчас в теме
КАК заготовка хорошо. Пришлось доработать.
При копировании "Контрагента" Столкнулся с Подчиненным справочником Договора. Он оказался с ИЕРАРХИЕЙ.
Каталоги загружались а сами Элементы нет т.к. при копировании Элемента Спр. Договоры копировался и родитель от другого контрагента. Сильно заморачиваться не стал.

//А теперь создадим новые подчиненные элементы копированием и сопоставим их имеющимся у объекта копирования
    Для Каждого ПодчиненныйСправочник Из спПодчиненныхСправочников Цикл
        ВыборкаИзПодчиненногоСправочника = Справочники[ПодчиненныйСправочник].Выбрать(,Ссылка);
        Пока ВыборкаИзПодчиненногоСправочника.Следующий() Цикл
            ЗаписьСинхронизации = тСинхронизацииРеквизитов.Добавить();
			
			НовыйПодчиненныйЭлемент = ВыборкаИзПодчиненногоСправочника.Ссылка.Скопировать();
            НовыйПодчиненныйЭлемент.Владелец = КопияСсылки.Ссылка;//КопияСсылки.Ссылка
			Если ТипЗнч(НовыйПодчиненныйЭлемент.Ссылка) = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда
				Если НовыйПодчиненныйЭлемент.ЭтоГруппа=Ложь Тогда
					//Обнуляем Родителя в Справочнике "Договоры", дальше руками.
					НовыйПодчиненныйЭлемент.Родитель = "";
				КонецЕсли;
			КонецЕсли;
			
			НовыйПодчиненныйЭлемент.Записать();
			
			ЗаписьСинхронизации.СтароеЗначение = ВыборкаИзПодчиненногоСправочника.Ссылка;
            ЗаписьСинхронизации.НовоеЗначение  = НовыйПодчиненныйЭлемент.Ссылка;
        КонецЦикла;
    КонецЦикла;
Показать
27. odn 01.03.22 15:32 Сейчас в теме
(20)
Действительно, функция не работает если имеется подчиненный справочник с иерархией, так как родитель копируется из элемента копирования.
21. DEG156 28 15.11.19 15:06 Сейчас в теме
Спасибо. Но сейчас у справочников есть табличные части и в данном коде они не прописаны и соответственно не копируются...
22. dusha0020 1125 16.11.19 13:00 Сейчас в теме
(21) Действительно метод ЗаполнитьЗначенияСвойств, применяемый для переноса реквизитов не заполняет табличные части приемника.
Но можете дополнить функцию чем-то типа:
Для Каждого ТЧ из Ссылка.Метаданные().ТабличныеЧасти Цикл КопияСсылки[ТЧ.Имя].Загрузить(Ссылка[ТЧ.Имя].Выгрузить()) КонецЦикла


Если надо добавьте проверку по имени табличной части перед переносом на отсутствие в списке исключаемых реквизитов.
Код открыт, так что конструктивные правки приветствуются:)
23. DEG156 28 18.11.19 09:04 Сейчас в теме
Добавил перед записью


Для Каждого ТаблЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл
		Для каждого СтрокаТЗ Из Ссылка[ТаблЧасть.Имя] Цикл 
			ЗаполнитьЗначенияСвойств(КопияСсылки[ТаблЧасть.Имя].Добавить(), СтрокаТЗ) 
		КонецЦикла;	
	КонецЦикла;
24. nvl 129 18.09.20 13:06 Сейчас в теме
Спасибо! Сильно пригодилось! Необходимо было одно из свойств затолкать в название, тем самым размножив справочник номенклатура, скопировав остальные реквизиты со свойствами. Таблицу значений я сделала со столбцами номенклатура, свойство, а дальше эта функция сильно помогла.
Andrey_Timofeev; +1 Ответить
25. Andrey_Timofeev 14 01.04.21 09:50 Сейчас в теме
Хорошая функция. Документы так тоже можно копировать. На днях нужно было что-то в этом духе, примерно как у (24), реализовал пока несколько проще. Забираю себе, как отличный пример работы с метаданными. Автору низкий поклон.
26. user1621493 01.07.21 15:15 Сейчас в теме
Огромное спасибо! Применила для создания новых элементов справочников Номенклатура, в случае приходования Оборудования.
28. smax 16.07.22 17:45 Сейчас в теме
(20) на примере статейБюджетов доработал создание подчиненных с учетом иерархии

 //А теперь создадим новые подчиненные элементы копированием и сопоставим их имеющимся у объекта копирования
    Для Каждого ПодчиненныйСправочник Из спПодчиненныхСправочников Цикл
        ВыборкаИзПодчиненногоСправочника = Справочники[ПодчиненныйСправочник].ВыбратьИерархически(,Ссылка);
        Пока ВыборкаИзПодчиненногоСправочника.Следующий() Цикл
            ЗаписьСинхронизации = тСинхронизацииРеквизитов.Добавить();
            
            НовыйПодчиненныйЭлемент = ВыборкаИзПодчиненногоСправочника.Ссылка.Скопировать();
            НовыйПодчиненныйЭлемент.Владелец = КопияСсылки.Ссылка;//КопияСсылки.Ссылка
            Если ТипЗнч(НовыйПодчиненныйЭлемент.Ссылка) = Тип("СправочникСсылка.СтатьиБюджета") Тогда
				Если не НовыйПодчиненныйЭлемент.Родитель.ПУстая() Тогда
					
					стрНовыйРодитель = тСинхронизацииРеквизитов.Найти(НовыйПодчиненныйЭлемент.Родитель,"СтароеЗначение");
					Если стрНовыйРодитель<>Неопределено Тогда
						НовыйПодчиненныйЭлемент.Родитель =  стрНовыйРодитель.НовоеЗначение;
					КонецЕслИ;	
                КонецЕсли;
            КонецЕсли;
            
            НовыйПодчиненныйЭлемент.Записать();
            
            ЗаписьСинхронизации.СтароеЗначение = ВыборкаИзПодчиненногоСправочника.Ссылка;
            ЗаписьСинхронизации.НовоеЗначение  = НовыйПодчиненныйЭлемент.Ссылка;
        КонецЦикла;
КонецЦикла;
Показать
29. Aleksey3A 4 23.05.23 17:06 Сейчас в теме
Спасибо огромное автору!
Для отправки сообщения требуется регистрация/авторизация