Задал мне бух. вопрос: а как бы при создании копии строки ТМЦ "Продукция" (для создания новой очень похожей Продукции), копировался и ее состав?
Есть ли такая возможность, коллеги?
Процедура ВводНового(ПризнакКопирования,кТМЦ)
Если ПризнакКопирования = 1 Тогда
// Гр___________________________________________________________________________
Если (кТМЦ.ВидТМЦ = Перечисление.ВидыТМЦ.Продукция) Или (кТМЦ.ВидТМЦ = Перечисление.ВидыТМЦ.Полуфабрикат) Тогда
Записать(); // здесь выдает ошибку
СпрТ = СоздатьОбъект("Справочник.СоставПродукции");
СпрТ.ИспользоватьВладельца(ТекущийЭлемент());
СпрС = СоздатьОбъект("Справочник.СоставПродукции");
СпрС.ИспользоватьВладельца(кТМЦ);
СпрС.ВключатьПодчиненные(1);
СпрС.ВыбратьЭлементы();
Пока СпрС.ПолучитьЭлемент(1) = 1 Цикл
СпрТ.ИспользоватьРодителя("");
СпрТ.Новый();
СпрТ.Владелец = ТекущийЭлемент();
СпрТ.Затрата = СпрС.Затрата;
СпрТ.Кво = СпрС.Кво;
СпрТ.Записать();
КонецЦикла;
КонецЕсли;
// Гр__________________________________________
Возврат;
КонецЕсли;
Валюта_Прод = глВосстановитьЗначение(,"ОсновнаяВалюта");
Валюта_Прих = глВосстановитьЗначение(,"ОсновнаяВалюта");
ВидТМЦ = Перечисление.ВидыТМЦ.Товар;
ИзмВид();
СтавкаНДС = глВосстановитьЗначение(,"БазНДС");
БазЕдиница = глВосстановитьЗначение(,"БазЕдиница");
ИспользоватьДату('01.01.1980');
ВидДеятельности = глВосстановитьЗначение(,"БазВидДеятельности");
КонецПроцедуры
//////////////////////////////////////////////////////
//Создать свою процедуру для читаемости
Если ВидТМЦ=Перечисление.ВидыТМЦ.Продукция Тогда
//Написать вопросы. О том что будет скопирован и записан и ТМЦ и Состав
// и всякое бла-бла
Спр = СоздатьОбъект("Справочник.СоставПродукции");
нСпр = СоздатьОбъект("Справочник.СоставПродукции");
ТМЦ1 = СоздатьОбъект("Справочник.ТМЦ");
ТМЦ1.ИспользоватьДату(ТекущаяДата()); // тут меня смущает
ТМЦ2 = СоздатьОбъект("Справочник.ТМЦ");
Если ТМЦ2.НайтиЭлемент(Объект)=1 Тогда
Обт = ТМЦ2.ТекущийЭлемент();
КонецЕсли;
ТМЦ1.Новый();
ТМЦ1.Наименование = Обт.Наименование; //тут что то было вроде наподобие общих реквизитов вроде.
ТМЦ1.Родитель = Обт.Родитель;
//Это вынести в отдельную процедуру
МетаД=Метаданные.Справочник("ТМЦ");
Для а=1 По МетаД.Реквизит() Цикл
Если Метаданные.Справочник("ТМЦ").Реквизит(МетаД.Реквизит(а).Идентификатор).Выбран()=1 Тогда
ТМЦ1.УстановитьАтрибут(МетаД.Реквизит(а).Идентификатор,Обт.ПолучитьАтрибут(МетаД.Реквизит(а).Идентификатор));
КонецЕсли;
КонецЦикла;
Попытка
ТМЦ1.Записать();
Исключение
КонецПопытки;
Спр.ИспользоватьВладельца(Обт);
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
нСпр.Новый();
нСпр.Владелец = ТМЦ1.ТекущийЭлемент();
нСпр.УстановитьНовыйКод();
//Это вынести в отдельную процедуру
МетаД=Метаданные.Справочник("СоставПродукции");
Для а=1 По МетаД.Реквизит() Цикл
Если Метаданные.Справочник("СоставПродукции").Реквизит(МетаД.Реквизит(а).Идентификатор).Выбран()=1 Тогда
нСпр.УстановитьАтрибут(МетаД.Реквизит(а).Идентификатор,Спр.ПолучитьАтрибут(МетаД.Реквизит(а).Идентификатор));
КонецЕсли;
КонецЦикла;
Попытка
нСпр.Записать();
Исключение
КонецПопытки;
КонецЦикла;
ОткрытьФорму(ТМЦ1.ТекущийЭлемент());
СтатусВозврата(0);
Возврат;
КонецЕсли;
//////////////////////////////////////////////////////
Возврат;
КонецЕсли;
Процедура ВводНового(ПризнакКопирования,кТМЦ)
Если (ПризнакКопирования = 1) и (кТМЦ.ЭтоГруппа()=0) Тогда
//тут відкриваємо обробку (в фоновому режимі*) і передаємо туди кТМЦ
статусВозврата(0);
возврат;
конецесли;
...
Процедура ПриОткрытии()
//аналізуємо переданий параметр у обробку і якщо він елемент ТМЦ, тоді
//виконуємо вищеописаний код (можна помістити в іншу процедуру і її тут викликати), далі
статусВозврата(0);
возврат;
...
// ===============================
Перем кТМЦ_,ФлСостава;
// Гр_
.....
// ===============================
Процедура ВводНового(ПризнакКопирования,кТМЦ)
ФлСостава = 0;
Если ПризнакКопирования = 1 Тогда
// Гр___________________________________________________________________________
Если (кТМЦ.ВидТМЦ = Перечисление.ВидыТМЦ.Продукция) Или (кТМЦ.ВидТМЦ = Перечисление.ВидыТМЦ.Полуфабрикат) Тогда
СпрС = СоздатьОбъект("Справочник.СоставПродукции");
СпрС.ИспользоватьВладельца(кТМЦ);
Если СпрС.ВыбратьЭлементы() = 1 Тогда
ФлСостава =1;
кТМЦ_ = кТМЦ;
КонецЕсли;
КонецЕсли;
// Гр__________________________________________
Возврат;
КонецЕсли;
Валюта_Прод = глВосстановитьЗначение(,"ОсновнаяВалюта");
Валюта_Прих = глВосстановитьЗначение(,"ОсновнаяВалюта");
ВидТМЦ = Перечисление.ВидыТМЦ.Товар;
ИзмВид();
СтавкаНДС = глВосстановитьЗначение(,"БазНДС");
БазЕдиница = глВосстановитьЗначение(,"БазЕдиница");
ИспользоватьДату('01.01.1980');
ВидДеятельности = глВосстановитьЗначение(,"БазВидДеятельности");
КонецПроцедуры
// ===============================
Процедура ПриЗаписи()
Перем Партия;
глСохранитьЗначение(Контекст,"СчетЗатрат",СчетЗатрат);
Если глЗаписьПериодическихРеквизитов(Контекст) = 0 Тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
Если Выбран() = 0 Тогда
Записать(); // этот метод не возвращает 0 в случае неудачи и не "ловится" Попыткой
Попытка
глПолучитьПартиюПоУмолчанию(Партия, ТекущийЭлемент());
Исключение
// будем считать, что ошибка была еще в Записать()
// например, "код не уникален"
СтатусВозврата(0); // иначе получим сообщение об ошибке 2 раза
КонецПопытки;
// Гр___________________________________________________________________________
Если ФлСостава = 1 Тогда // при копировании элемента ТМЦ есть записи в подчиненном Спр."Состав продукции"
ТЭ =ТекущийЭлемент();
СпрТ = СоздатьОбъект("Справочник.СоставПродукции");
СпрТ.ИспользоватьВладельца(ТЭ);
СпрТ.ИспользоватьРодителя("");
СпрС = СоздатьОбъект("Справочник.СоставПродукции");
// переписываем все элементы "Состава продукции" из исходного ТМЦ в результирующий
СпрС.ИспользоватьВладельца(кТМЦ_);
СпрС.ВыбратьЭлементы();
Пока СпрС.ПолучитьЭлемент() = 1 Цикл
СпрТ.Новый();
СпрТ.Владелец = ТЭ;
СпрТ.Наименование = СпрС.Наименование;
СпрТ.Затрата = СпрС.Затрата;
СпрТ.Кво = СпрС.Кво;
СпрТ.Записать();
КонецЦикла;
КонецЕсли;
// Гр___________________________________________________________________________
КонецЕсли;
КонецПроцедуры