Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Справочники ТМЦ-Состав продукции, как скопировать в паре
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
bob210250
Задал мне бух. вопрос: а как бы при создании копии строки ТМЦ "Продукция" (для создания новой очень похожей Продукции), копировался и ее состав?
Есть ли такая возможность, коллеги?
mister-x
Є, див. процедуру ВводНового(<ПризнКопирования>,<ОбъектКопирования>), правда, прийдеться спочатку записати елемент ТМЦ, а потім створити підлеглий елемент до нього у дов. СоставПродукции.
nysysimara
Вариант1: Написать обработку, вызов её поместить в кнопку на форме списка справочника ТМЦ (напр."Копировать")
По клику передать в обработку все данные по текущему элементу справочника ТМЦ (те которые надо повторить) и соответствующий состав.
В обработке прописать создание нового элемента справочника ТМЦ, заполнение его реквизитов, запись
И создание элементов подчиненного справочника - СоставПродукции.
В форме обработки можно это все предоставить для редактирования.

Вариант2: функцию этой кнопки разместить непосредственно в модуле формы списка справочника ТМЦ


Цитата(mister-x @ 26.09.11, 12:43) необходимо зарегистрироваться для просмотра ссылки
Є, див. процедуру ВводНового(<ПризнКопирования>,<ОбъектКопирования>), правда, прийдеться спочтаку записати елемент ТМЦ, а потім створити підлеглий елемент до нього у дов. СоставПродукции.


похоже свои пробелы в знаниях я восполняю изобретаниями велосипеда
bob210250
Цитата(mister-x @ 26.09.11, 12:43) необходимо зарегистрироваться для просмотра ссылки
Є, див. процедуру ВводНового(<ПризнКопирования>,<ОбъектКопирования>), правда, прийдеться спочатку записати елемент ТМЦ, а потім створити підлеглий елемент до нього у дов. СоставПродукции.


Де така процедура ВводНового(<ПризнКопирования>,<ОбъектКопирования>), є тільки з 1 параметром?
MATEVI
Пользуйтесь Ctrl+F1

Процедура ВводНового(<?>,)
Синтаксис:
ВводНового(<ПризнКопирования>,<ОбъектКопирования>)
Назначение:
Предопределенная процедура при интерактивном вводе нового элемента справочника.
Параметры:
<ПризнКопирования> - признак того, что объект введен копированием. Число: 1 - объект введен копированием, 0 - просто новый объект. Данный признак может быть использован для анализа необходимости инициализации реквизитов нового объекта.
<ОбъектКопирования> - объект, который был скопирован.
Замечание:
Данная процедура может располагаться только в программных модулях форм справочника.
Ardi
2 параметра
необходимо зарегистрироваться для просмотра ссылки
bob210250
Цитата(MATEVI @ 26.09.11, 13:35) необходимо зарегистрироваться для просмотра ссылки
Пользуйтесь Ctrl+F1

Процедура ВводНового(<?>,)
Синтаксис:
ВводНового(<ПризнКопирования>,<ОбъектКопирования>)
Назначение:
Предопределенная процедура при интерактивном вводе нового элемента справочника.
Параметры:
<ПризнКопирования> - признак того, что объект введен копированием. Число: 1 - объект введен копированием, 0 - просто новый объект. Данный признак может быть использован для анализа необходимости инициализации реквизитов нового объекта.
<ОбъектКопирования> - объект, который был скопирован.
Замечание:
Данная процедура может располагаться только в программных модулях форм справочника.


Ой, простите, Вы правы! За лето проведенное на даче ( без 1С), немного поглупел. Глянул в модул и решил, что я не знаю такой процедуры.
Короче спасибо! Надо писать блок копирования "Состава.." иначе существующими методами никак.... Не такая и простая эта задачка...
mister-x
Цитата
Не такая и простая эта задачка...
кому як, мені - пальці трошки розім*яти (думати там тяжко не потрібно) smile.gif
MATEVI
Цитата(bob210250 @ 26.09.11, 14:17) необходимо зарегистрироваться для просмотра ссылки
Не такая и простая эта задачка...

Могу еще посоветовать глянуть как создается партия в глПолучитьПартию
bob210250
Цитата(mister-x @ 26.09.11, 14:30) необходимо зарегистрироваться для просмотра ссылки
кому як, мені - пальці трошки розім*яти (думати там тяжко не потрібно) smile.gif

А у мене не виходить.
И записать нужно ТМЦ и переписать Подчиненные Состава. Записать() в далоге нельзя и тупик пока.....

Цитата(MATEVI @ 26.09.11, 14:45) необходимо зарегистрироваться для просмотра ссылки
Могу еще посоветовать глянуть как создается партия в глПолучитьПартию

Хороший пример, но одно существенное НО:
Текущий ТМЦ уже записан.
В моей ситуации текущий элемент ТМЦ надо записать (а в диалоге не дает), а потом ему подчинить ряд элементов "Состава прод..".
Подскажите, как это увязать, плз.


Я вот наваял быстренько блочек, а нет не получается:

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


*фоновий режим - в самій обробці:
Процедура ПриОткрытии()
//аналізуємо переданий параметр у обробку і якщо він елемент ТМЦ, тоді
//виконуємо вищеописаний код (можна помістити в іншу процедуру і її тут викликати), далі
статусВозврата(0);
возврат;
...
Winstyle
ну и вы задали вопрос сам незнаю ответа сча в справочниках искать буду че найду отпишусь
bob210250
За помощь спасибо, но...
Как на меня так ваши предложения больно усложнены, я этого не люблю (из многолетнего опыта разработки
с 1975г).
Я ночью придумад, как сделать проще. Я разнес эти действия в две процедуры:
ВводНового() - фиксирую факт наличия в "Состав прод" подчиенных эл-тов у копируемого эл-та
кТМЦ_.
А в процедуре ПриЗаписи() реализую перезапись "Состава прод".
И интерактив остается, и не ругается и все работает.
Дело в том что конструкция

Попытка
ТМЦ1.Записать();
Исключение
КонецПопытки;

не работает, Записать() очень непростая команда, если вы находитесь в интерактивном вводе.

Ниже полность две процедуры и мои вставки // Гр_


// =============================== 
Перем  кТМЦ_,ФлСостава;
// Гр_
.....

// ===============================
Процедура ВводНового(ПризнакКопирования,кТМЦ)  
    ФлСостава = 0;
    Если ПризнакКопирования = 1 Тогда  
        // Гр___________________________________________________________________________
        Если (кТМЦ.ВидТМЦ = Перечисление.ВидыТМЦ.Продукция) Или (кТМЦ.ВидТМЦ = Перечисление.ВидыТМЦ.Полуфабрикат) Тогда
            СпрС = СоздатьОбъект("Справочник.СоставПродукции");
            СпрС.ИспользоватьВладельца(кТМЦ);
            Если СпрС.ВыбратьЭлементы() = 1 Тогда
                ФлСостава =1;  
                кТМЦ_ = кТМЦ;
            КонецЕсли;
        КонецЕсли;  
        // Гр__________________________________________
        Возврат;
    КонецЕсли;
    Валюта_Прод = глВосстановитьЗначение(,"ОсновнаяВалюта");
    Валюта_Прих = глВосстановитьЗначение(,"ОсновнаяВалюта");
    ВидТМЦ = Перечисление.ВидыТМЦ.Товар;
    ИзмВид();
    СтавкаНДС = глВосстановитьЗначение(,"БазНДС");
    БазЕдиница = глВосстановитьЗначение(,"БазЕдиница");
    ИспользоватьДату('01.01.1980');
    ВидДеятельности = глВосстановитьЗначение(,"БазВидДеятельности");
КонецПроцедуры

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


Я наверное не очень точно описал задачу:
Бухгалтер в интерактивном режиме выбирает элемент в Справочнике ТМЦ и делает "Копировать строку"
(стандартная функция 1С), чтобы создать новый элемент очень похожый (обувь разных размеров). И хочется чтобы и состав копировался. Условие простое как лом...
MATEVI
А смысл тогда этого всего? Вы просили я так понял копирование состава по F9.
Тот код который я дал, делает именно это без каких то других дополнительных действий со стороны пользователя.
Впрочем Ваше право...
bob210250
Цитата(MATEVI @ 27.09.11, 12:46) необходимо зарегистрироваться для просмотра ссылки
А смысл тогда этого всего? Вы просили я так понял копирование состава по F9.
Тот код который я дал, делает именно это без каких то других дополнительных действий со стороны пользователя.
Впрочем Ваше право...


Вот именно "Копировать строку (F9)" ТМЦ, что бы чуть изменить название ТМЦ и потом чуть состав.
И не набирать все опять ручками. Я что то не так объяснил? Извините, никого обидеть не хотел!
MATEVI
Цитата(bob210250 @ 27.09.11, 12:55) необходимо зарегистрироваться для просмотра ссылки
Вот именно "Копировать строку (F9)" ТМЦ, что бы чуть изменить название ТМЦ и потом чуть состав.
И не набирать все опять ручками. Я что то не так объяснил? Извините, никого обидеть не хотел!

Та никто не обижается. Тот кусок который я дал, решает задачу? Я проверял на типовой демо 288 на костюмах и платьях smile.gif
Копирует и создает со всеми внутренностями smile.gif
Vofka
bob210250, сделайте НОВУЮ кнопку "Скопировать", при нажатии на которую будете делать всё, что надо. А человеку просто объяснить, что если хочешь так - жми эту кнопку.
bob210250
Цитата(Vofka @ 27.09.11, 13:12) необходимо зарегистрироваться для просмотра ссылки
bob210250, сделайте НОВУЮ кнопку "Скопировать", при нажатии на которую будете делать всё, что надо. А человеку просто объяснить, что если хочешь так - жми эту кнопку.


Спасибо всем за участие и ценые советы.
Все они полезные и правильные, но мое решение ВПОЛНЕ устраивает бух., потому на нем и остановился!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.