Задал мне бух. вопрос: а как бы при создании копии строки ТМЦ "Продукция" (для создания новой очень похожей Продукции), копировался и ее состав?
Есть ли такая возможность, коллеги?
Є, див. процедуру ВводНового(<ПризнКопирования>,<ОбъектКопирования>), правда, прийдеться спочатку записати елемент ТМЦ, а потім створити підлеглий елемент до нього у дов. СоставПродукции.
Вариант1: Написать обработку, вызов её поместить в кнопку на форме списка справочника ТМЦ (напр."Копировать")
По клику передать в обработку все данные по текущему элементу справочника ТМЦ (те которые надо повторить) и соответствующий состав.
В обработке прописать создание нового элемента справочника ТМЦ, заполнение его реквизитов, запись
И создание элементов подчиненного справочника - СоставПродукции.
В форме обработки можно это все предоставить для редактирования.
Вариант2: функцию этой кнопки разместить непосредственно в модуле формы списка справочника ТМЦ
Пользуйтесь Ctrl+F1
Процедура ВводНового(<?>,)
Синтаксис:
ВводНового(<ПризнКопирования>,<ОбъектКопирования>)
Назначение:
Предопределенная процедура при интерактивном вводе нового элемента справочника.
Параметры:
<ПризнКопирования> - признак того, что объект введен копированием. Число: 1 - объект введен копированием, 0 - просто новый объект. Данный признак может быть использован для анализа необходимости инициализации реквизитов нового объекта.
<ОбъектКопирования> - объект, который был скопирован.
Замечание:
Данная процедура может располагаться только в программных модулях форм справочника.
2 параметра
http://pro1c.org.ua/redirect.php?http://screencast.com/t/jWnsi3Mw8X0
Процедура ВводНового(ПризнакКопирования,кТМЦ)
Если ПризнакКопирования = 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);
возврат;
...
ну и вы задали вопрос сам незнаю ответа сча в справочниках искать буду че найду отпишусь
За помощь спасибо, но...
Как на меня так ваши предложения больно усложнены, я этого не люблю (из многолетнего опыта разработки
с 1975г).
Я ночью придумад, как сделать проще. Я разнес эти действия в две процедуры:
ВводНового() - фиксирую факт наличия в "Состав прод" подчиенных эл-тов у копируемого эл-та
кТМЦ_.
А в процедуре ПриЗаписи() реализую перезапись "Состава прод".
И интерактив остается, и не ругается и все работает.
Дело в том что конструкция
Попытка
ТМЦ1.Записать();
Исключение
КонецПопытки;
не работает, Записать() очень непростая команда, если вы находитесь в интерактивном вводе.
Ниже полность две процедуры и мои вставки // Гр_
// ===============================
Перем кТМЦ_,ФлСостава;
// Гр_
.....
// ===============================
Процедура ВводНового(ПризнакКопирования,кТМЦ)
ФлСостава = 0;
Если ПризнакКопирования = 1 Тогда
// Гр___________________________________________________________________________
Если (кТМЦ.ВидТМЦ = Перечисление.ВидыТМЦ.Продукция) Или (кТМЦ.ВидТМЦ = Перечисление.ВидыТМЦ.Полуфабрикат) Тогда
СпрС = СоздатьОбъект("Справочник.СоставПродукции");
СпрС.ИспользоватьВладельца(кТМЦ);
Если СпрС.ВыбратьЭлементы() = 1 Тогда
ФлСостава =1;
кТМЦ_ = кТМЦ;
КонецЕсли;
КонецЕсли;
// Гр__________________________________________
Возврат;
КонецЕсли;
Валюта_Прод = глВосстановитьЗначение(,"ОсновнаяВалюта");
Валюта_Прих = глВосстановитьЗначение(,"ОсновнаяВалюта");
ВидТМЦ = Перечисление.ВидыТМЦ.Товар;
ИзмВид();
СтавкаНДС = глВосстановитьЗначение(,"БазНДС");
БазЕдиница = глВосстановитьЗначение(,"БазЕдиница");
ИспользоватьДату('01.01.1980');
ВидДеятельности = глВосстановитьЗначение(,"БазВидДеятельности");
КонецПроцедуры
// ===============================
Процедура ПриЗаписи()
Перем Партия;
глСохранитьЗначение(Контекст,"СчетЗатрат",СчетЗатрат);
Если глЗаписьПериодическихРеквизитов(Контекст) = 0 Тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
Если Выбран() = 0 Тогда
Записать(); // этот метод не возвращает 0 в случае неудачи и не "ловится" Попыткой
Попытка
глПолучитьПартиюПоУмолчанию(Партия, ТекущийЭлемент());
Исключение
// будем считать, что ошибка была еще в Записать()
// например, "код не уникален"
СтатусВозврата(0); // иначе получим сообщение об ошибке 2 раза
КонецПопытки;
// Гр___________________________________________________________________________
Если ФлСостава = 1 Тогда // при копировании элемента ТМЦ есть записи в подчиненном Спр."Состав продукции"
ТЭ =ТекущийЭлемент();
СпрТ = СоздатьОбъект("Справочник.СоставПродукции");
СпрТ.ИспользоватьВладельца(ТЭ);
СпрТ.ИспользоватьРодителя("");
СпрС = СоздатьОбъект("Справочник.СоставПродукции");
// переписываем все элементы "Состава продукции" из исходного ТМЦ в результирующий
СпрС.ИспользоватьВладельца(кТМЦ_);
СпрС.ВыбратьЭлементы();
Пока СпрС.ПолучитьЭлемент() = 1 Цикл
СпрТ.Новый();
СпрТ.Владелец = ТЭ;
СпрТ.Наименование = СпрС.Наименование;
СпрТ.Затрата = СпрС.Затрата;
СпрТ.Кво = СпрС.Кво;
СпрТ.Записать();
КонецЦикла;
КонецЕсли;
// Гр___________________________________________________________________________
КонецЕсли;
КонецПроцедуры
Bob210250, красивое решение.
Вы знаете ,полезла в свой справочник ТМЦ там подобным образом моими коллегами-предшествинниками бала реализована запись дополнительной единицы измерения именно в процедуре ПриЗаписи(). И сбоев у нас не наблюдалось
А смысл тогда этого всего? Вы просили я так понял копирование состава по F9.
Тот код который я дал, делает именно это без каких то других дополнительных действий со стороны пользователя.
Впрочем Ваше право...
bob210250, сделайте НОВУЮ кнопку "Скопировать", при нажатии на которую будете делать всё, что надо. А человеку просто объяснить, что если хочешь так - жми эту кнопку.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua