Программный код выполняет копирование Номенклатуры из одной папки в другую с сохранением Иерархии папки источника в папке приемник.
При копировании для новой номенклатуры добавляется единица измерения и переноситься штрих код из номенклатуры источника в номенклатуру приемник.
//написано для "обычное приложение"
Процедура КнопкаВыполнитьНажатие(Кнопка)
Если Не ЗначениеЗаполнено(ПапкаИсточник) Тогда // ПапкаИсточник это реквизит формы
Сообщить("Папка источник должна быть заполнена");
Возврат
КонецЕсли;
Если Не ЗначениеЗаполнено(ПапкаПриемник) Тогда //ПапкаПриемник это реквизит формы
Сообщить("Папка приемник должна быть заполнена");
Возврат
КонецЕсли;
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
|УПОРЯДОЧИТЬ ПО
| Номенклатура.Ссылка ИЕРАРХИЯ"
);
Запрос.УстановитьПараметр("Группа", ПапкаИсточник);
//Вызываем рекурсивную процедуру, параметр "ПапкаПриемник" - это "получатель", куда будет скопирована ветка
Копировать(ПапкаПриемник,Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией));
КонецПроцедуры
Процедура Копировать(Предок,Выборка) //Рекурсивная процедура для обхода всего дерева
Если Не Предок.ЭтоГруппа Тогда //Если перетащили не на группу, то кидаем всё дерево в корень
Предок=Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Пока Выборка.Следующий() Цикл //Обходим все элементы и просто копируем всё подряд
//Поскольку выборка добывает нам ссылки для изменения с объекта его необходимо получить
ТекСпр = Выборка.Ссылка.ПолучитьОбъект();
элементСправочника = ТекСпр.Скопировать();
элементСправочника.Родитель=Предок;
//комментарий автора взятый из сети
//
// ** Если мы хотим запомнить откуда была скопирована номенклатура - нужно **
// ** предварительно добавить реквизит ОбразецНоменклатуры в справочник Номенклатура **
// ** типа "СправочникСсылка.Номенклатура" а затем раскомментировать следующую строку **
//элементСправочника.ОбразецНоменклатуры=ТекСпр.Ссылка;
// При желании здесь можно создавать подчинённые справочники вроде "единицы измерения"
// и сюда записывать все необходимые ссылки
Если Не элементСправочника.ЭтоГруппа Тогда
Если НЕ ЗначениеЗаполнено(элементСправочника.БазоваяЕдиницаИзмерения) Тогда
элементСправочника.БазоваяЕдиницаИзмерения = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяЕдиницаПоКлассификатору");
КонецЕсли;
КонецЕсли;
элементСправочника.Записать();
Если Не элементСправочника.ЭтоГруппа Тогда
ПроверитьЕдиницуХраненияОстатков(элементСправочника.Ссылка);
ЗаменитьВладельцаШКИсточникаНаПриемник(ТекСпр.Ссылка, элементСправочника.Ссылка)
КонецЕсли;
Сообщить("Успешно обработано объект "+ элементСправочника.Ссылка);
Если ТекСпр.ЭтоГруппа Тогда //Когда встречаем группу, то заходим внутрь и повторяем действия
Копировать(элементСправочника.Ссылка,Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаменитьВладельцаШКИсточникаНаПриемник(спрИсточник, спрПриемник)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Штрихкод,
| Штрихкоды.Владелец,
| Штрихкоды.ТипШтрихкода,
| Штрихкоды.ЕдиницаИзмерения,
| Штрихкоды.ХарактеристикаНоменклатуры,
| Штрихкоды.СерияНоменклатуры,
| Штрихкоды.Качество,
| Штрихкоды.ПредставлениеШтрихкода
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", спрИсточник);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Попытка
НачатьТранзакцию();
//1. отвязываем ШК от Источника
нз = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей();
нз.Отбор.Штрихкод.Установить( ВыборкаДетальныеЗаписи.Штрихкод);
нз.Отбор.Владелец.Установить( ВыборкаДетальныеЗаписи.Владелец);
нз.Отбор.ТипШтрихкода.Установить( ВыборкаДетальныеЗаписи.ТипШтрихкода);
нз.Отбор.ЕдиницаИзмерения.Установить( ВыборкаДетальныеЗаписи.ЕдиницаИзмерения);
нз.Отбор.ХарактеристикаНоменклатуры.Установить( ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры);
нз.Отбор.СерияНоменклатуры.Установить( ВыборкаДетальныеЗаписи.СерияНоменклатуры);
нз.Отбор.Качество.Установить( ВыборкаДетальныеЗаписи.Качество);
нз.Прочитать();
нз.Очистить();
нз.Записать();
//2. привязываем ШК Приемнику
мз = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
мз.Штрихкод = ВыборкаДетальныеЗаписи.Штрихкод;
мз.Владелец = спрПриемник;
мз.ТипШтрихкода = ВыборкаДетальныеЗаписи.ТипШтрихкода;
мз.ЕдиницаИзмерения = ВыборкаДетальныеЗаписи.ЕдиницаИзмерения;
мз.ХарактеристикаНоменклатуры = ВыборкаДетальныеЗаписи.ХарактеристикаНоменклатуры;
мз.СерияНоменклатуры = ВыборкаДетальныеЗаписи.СерияНоменклатуры;
мз.Качество = ВыборкаДетальныеЗаписи.Качество;
мз.ПредставлениеШтрихкода = ВыборкаДетальныеЗаписи.ПредставлениеШтрихкода;
мз.Записать();
ЗафиксироватьТранзакцию()
Исключение
ОтменитьТранзакцию();
Сообщить(ОписаниеОшибки())
КонецПопытки;
КонецЦикла;
КонецПроцедуры
// Процедура записывает единицу хранения остатков номенклатуры.
//
Процедура ПроверитьЕдиницуХраненияОстатков(спрНоменклатура)
Если ЗначениеЗаполнено(спрНоменклатура.ЕдиницаХраненияОстатков) Тогда
Возврат;
КонецЕсли;
ВыборкаЕдиниц = Справочники.ЕдиницыИзмерения.Выбрать(, спрНоменклатура);
Если ВыборкаЕдиниц.Следующий() Тогда
//единица измерения найдена
Иначе
НайденнаяЕдиницаОбъект = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
//тут нужно дозаполнить новую единицу измерения
НайденнаяЕдиницаОбъект.Владелец = спрНоменклатура;
Попытка
НайденнаяЕдиницаОбъект.Записать();
спрНоменклатураО = спрНоменклатура.ПолучитьОбъект();
спрНоменклатураО.Записать()
Исключение
Сообщить("Не удалось записать единицу хранения остатков: " + ОписаниеОшибки(), СтатусСообщения.Важное)
КонецПопытки;
КонецЕсли;
КонецПроцедуры // ПроверитьЕдиницуХраненияОстатков()
Комментариев нет:
Отправить комментарий