Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=4846)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Справочники ТМЦ-Состав продукции, как скопировать в паре

Автор: bob210250 26.09.11, 11:25

Задал мне бух. вопрос: а как бы при создании копии строки ТМЦ "Продукция" (для создания новой очень похожей Продукции), копировался и ее состав?
Есть ли такая возможность, коллеги?

Автор: mister-x 26.09.11, 11:43

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

Автор: nysysimara 26.09.11, 11:52

Вариант1: Написать обработку, вызов её поместить в кнопку на форме списка справочника ТМЦ (напр."Копировать")
По клику передать в обработку все данные по текущему элементу справочника ТМЦ (те которые надо повторить) и соответствующий состав.
В обработке прописать создание нового элемента справочника ТМЦ, заполнение его реквизитов, запись
И создание элементов подчиненного справочника - СоставПродукции.
В форме обработки можно это все предоставить для редактирования.

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


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


похоже свои пробелы в знаниях я восполняю изобретаниями велосипеда

Автор: bob210250 26.09.11, 11:59

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


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

Автор: MATEVI 26.09.11, 12:35

Пользуйтесь Ctrl+F1

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

Автор: Ardi 26.09.11, 12:37

2 параметра
http://pro1c.org.ua/redirect.php?http://screencast.com/t/jWnsi3Mw8X0

Автор: bob210250 26.09.11, 13:17

Цитата(MATEVI @ 26.09.11, 13:35) *
Пользуйтесь Ctrl+F1

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


Ой, простите, Вы правы! За лето проведенное на даче ( без 1С), немного поглупел. Глянул в модул и решил, что я не знаю такой процедуры.
Короче спасибо! Надо писать блок копирования "Состава.." иначе существующими методами никак.... Не такая и простая эта задачка...

Автор: mister-x 26.09.11, 13:30

Цитата
Не такая и простая эта задачка...
кому як, мені - пальці трошки розім*яти (думати там тяжко не потрібно) smile.gif

Автор: MATEVI 26.09.11, 13:45

Цитата(bob210250 @ 26.09.11, 14:17) *
Не такая и простая эта задачка...

Могу еще посоветовать глянуть как создается партия в глПолучитьПартию

Автор: bob210250 26.09.11, 17:07

Цитата(mister-x @ 26.09.11, 14:30) http://pro1c.org.ua/index.php?act=findpost&pid=32690
Могу еще посоветовать глянуть как создается партия в глПолучитьПартию

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


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

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

Автор: MATEVI 26.09.11, 18:54

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

Автор: mister-x 27.09.11, 9:40

я так розумію, вищенаписаний код повинен йти в обробці, тоді в формі елементу ТМЦ:

Процедура ВводНового(ПризнакКопирования,кТМЦ)
    Если (ПризнакКопирования = 1) и (кТМЦ.ЭтоГруппа()=0) Тогда
//тут відкриваємо обробку (в фоновому режимі*) і передаємо туди кТМЦ
статусВозврата(0);
возврат;
конецесли;
...


*фоновий режим - в самій обробці:
Процедура ПриОткрытии()
//аналізуємо переданий параметр у обробку і якщо він елемент ТМЦ, тоді
//виконуємо вищеописаний код (можна помістити в іншу процедуру і її тут викликати), далі
статусВозврата(0);
возврат;
...

Автор: Winstyle 27.09.11, 11:09

ну и вы задали вопрос сам незнаю ответа сча в справочниках искать буду че найду отпишусь

Автор: bob210250 27.09.11, 11:18

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

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

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

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


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

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

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

Автор: mister-x 27.09.11, 11:24

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

Автор: nysysimara 27.09.11, 11:35

Bob210250, красивое решение.
Вы знаете ,полезла в свой справочник ТМЦ там подобным образом моими коллегами-предшествинниками бала реализована запись дополнительной единицы измерения именно в процедуре ПриЗаписи(). И сбоев у нас не наблюдалось

Автор: bob210250 27.09.11, 11:36

Цитата(mister-x @ 27.09.11, 12:24) *
ви прочитали мої думки, але краще запись "Состава" робити ПриЗакрытии(), а то в ПриЗаписи(), елемент ТМЦ може бути ще не записаний (а так і є Если Выбран() = 0 Тогда), на кнопці ОК помістити - Записать, Закрыть; тю та воно там вже є


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

Автор: MATEVI 27.09.11, 11:46

А смысл тогда этого всего? Вы просили я так понял копирование состава по F9.
Тот код который я дал, делает именно это без каких то других дополнительных действий со стороны пользователя.
Впрочем Ваше право...

Автор: bob210250 27.09.11, 11:55

Цитата(MATEVI @ 27.09.11, 12:46) *
А смысл тогда этого всего? Вы просили я так понял копирование состава по F9.
Тот код который я дал, делает именно это без каких то других дополнительных действий со стороны пользователя.
Впрочем Ваше право...


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

Автор: MATEVI 27.09.11, 12:08

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

Та никто не обижается. Тот кусок который я дал, решает задачу? Я проверял на типовой демо 288 на костюмах и платьях smile.gif
Копирует и создает со всеми внутренностями smile.gif

Автор: Vofka 27.09.11, 12:12

bob210250, сделайте НОВУЮ кнопку "Скопировать", при нажатии на которую будете делать всё, что надо. А человеку просто объяснить, что если хочешь так - жми эту кнопку.

Автор: bob210250 01.10.11, 9:03

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


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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua