Имя: Пароль:
1C
1С v8
Копирование значение табличной части для созданного документа
0 Александр89
 
01.08.18
11:19
Добрый день!
Не подскажите как скопировать значение табличной части для вновь созданного документа (при условии что для него уже скопированы формулы) ))
1 Александр89
 
01.08.18
11:21
&НаКлиенте
Процедура Копировать(Команда)
      
    Если Не ПроверитьЗаполнение() Тогда
        Возврат;
    КонецЕсли;
    
    КопияСсылка = КопироватьРедакция(Объект.Редакция, Объект.Подразделение, Объект.ПериодПланирования, Объект.Статус, Объект.СценарийПланирования  );        
    ОткрытьФорму("Документ.УниверсальнаяФормаОтчетности.ФормаОбъекта", Новый Структура("Ключ", КопияСсылка));
    
    Закрыть();
    
КонецПроцедуры


&НаСервереБезКонтекста
Функция КопироватьРедакция(Редакция, Подразделение, ПериодПланирования, Статус, СценарийПланирования )
    
    Копия = Редакция.Скопировать();
    Копия.Наименование = Копия.Наименование + " (Копирование)";
    Копия.Записать();
    //Происходит копирование редакции, установленной в текущем документе.При этом наименование редакции формируется как имеющееся наименование с добавлением  « (Копирование)»;
    
    Набор = РегистрыСведений.ФормулыШаблонов.СоздатьНаборЗаписей();
    Набор.Отбор.Редакция.Установить(Редакция);
    Набор.Прочитать();
    
    НаборЗаписи = РегистрыСведений.ФормулыШаблонов.СоздатьНаборЗаписей();
    НаборЗаписи.Отбор.Редакция.Установить(Копия.ссылка);
                      
    Для Каждого Стр Из Набор Цикл
        Если Копия.Пустая ()
            Тогда
            НоваяСтрока = НаборЗаписи.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
            НоваяСтрока.Редакция = Копия.Ссылка;    
        КонецЕсли;                                      
    КонецЦикла;
    
    НаборЗаписи.Записать();
    
    Набор = РегистрыСведений.ПсевдонимыФормулШаблонов.СоздатьНаборЗаписей();
    Набор.Отбор.Редакция.Установить(Копия.ссылка);
    
    НаборЗаписи = РегистрыСведений.ПсевдонимыФормулШаблонов.СоздатьНаборЗаписей();
    НаборЗаписи.Отбор.Редакция.Установить(Копия.ссылка);
    
    Для Каждого Стр Из Набор Цикл
        Если  Копия.Пустая ()
            Тогда
            НоваяСтрока = НаборЗаписи.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
            НоваяСтрока.Редакция = Копия.Ссылка;    
        КонецЕсли;                                      
    КонецЦикла;
    
    НаборЗаписи.Записать();
    
    Набор = РегистрыСведений.ОформлениеЯчеек.СоздатьНаборЗаписей();
    Набор.Отбор.Редакция.Установить(Копия.ссылка);
    
    НаборЗаписи = РегистрыСведений.ОформлениеЯчеек.СоздатьНаборЗаписей();
    НаборЗаписи.Отбор.Редакция.Установить(Копия.ссылка);
    
    Для Каждого Стр Из Набор Цикл
        Если  Копия.Пустая ()
            Тогда
            НоваяСтрока = НаборЗаписи.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
            НоваяСтрока.Редакция = Копия.Ссылка;    
        КонецЕсли;                                          
    КонецЦикла;
    НаборЗаписи.Записать();    
    //Для вновь созданной редакции копируются только формулы, использующие данные текущего документа;
             
        
        
    НовДок = Документы.УниверсальнаяФормаОтчетности.СоздатьДокумент();
    НовДок.Дата = ТекущаяДата();
    НовДок.Подразделение = Подразделение;
    НовДок.ПериодПланирования = ПериодПланирования;
    НовДок.Редакция = Копия.Ссылка;
    НовДок.Статус = Статус;    
    
          
    //НовДок.СценарийПланирования = СценарийПланирования;
    НовДок.Записать(РежимЗаписиДокумента.Запись);
    
    //Происходит открытие формы нового документа «Универсальная форма отчетности», при этом создаваемый документ должен быть заполнен аналогично текущему документу
    //за исключением редакции: для нового документа устанавливается созданная в первом пункте редакция.
    
    Возврат НовДок.Ссылка;
КонецФункции
2 aleks_default
 
01.08.18
11:30
Во первых ты вначале создаешь и записываешь Копию редакции, т.е. ссылка на нее уже не будет пустой. Тогда нахрена в цикле ты это условие ставищь
Если Копия.Пустая ()
            Тогда ?
3 Александр89
 
01.08.18
11:36
(2)
Так если пустая тогда и.т.д, а как еще?)
(бывают случаи когда редакция пустая)
4 aleks_default
 
01.08.18
11:37
А для того чтобы заполнить ТЧ нового документа из тек документа, ты должен в этой процедуре как-то получить ТЧ текущего документа. Т.е. сначала передать в эту процедуру либо ссылку на тек. документ, чтобы потом запросом к базе данных поучить его ТЧ, либо преобразованную в массив строк его таб. часть.
5 Александр89
 
01.08.18
11:41
Получается сделать запрос с ссылкой на данный документ, верно?
6 aleks_default
 
01.08.18
11:43
(3)так ты же проверяешь не на пустую редакцию а на пустую копию(записанную!). Почитай в общем про метод Пустая().
7 aleks_default
 
01.08.18
11:47
(5)Верно. На документ, с которого нужно сделать копию и ссылка(или таб часть) которого должна быть переданна в процедуру КопироватьРедакция
8 Александр89
 
01.08.18
11:51
Запрос = Новый Запрос;
     Запрос.Текст = "ВЫБРАТЬ
                    |    УниверсальнаяФормаОтчетности.Ссылка КАК Ссылка
                    |ИЗ
                    |    Документ.УниверсальнаяФормаОтчетности КАК УниверсальнаяФормаОтчетности";
          ОтборПоказателей = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

Получается будет еще цикл для строк и колонок, а я думал что это нужно будет писать как так типа НовДОк.Табличнаячасть = ОтборПоказателей.Содержание (хотя не уверен)
9 aleks_default
 
01.08.18
12:11
(8)Вобщем,понятно все с вами. Учите матчасть.

Сначала добавь еще один параметр в процедуру
КопияСсылка = КопироватьРедакция(Объект.Редакция, Объект.Подразделение, Объект.ПериодПланирования, Объект.Статус, Объект.СценарийПланирования ,Объект.Ссылка);  

Потом в ней
после вот этой строки //НовДок.СценарийПланирования = СценарийПланирования;
пишешь
Для каждого СтрТекДок из СсылкаНаПереданныйДокумент.НазваниеТабЧасти цикл
НоваяСтрока = НовДок.Добавить();
ЗаполнитьЗначенияСвойств(СтртекДок,НоваяСтрока);
КонецЦикла;
10 aleks_default
 
01.08.18
12:12
вернее не так
НоваяСтрока = НовДок.Добавить();

а так
НоваяСтрока = НовДок.НазваниеТабЧасти.Добавить();
11 Александр89
 
01.08.18
12:16
(9) Я только начал изучать 1С )), читаю Радченко, смотрю курсы Чистова, спасибо попробую)) (извиняюсь что чайник в 1С )
12 Александр89
 
01.08.18
14:49
(10)  Сделал так, работает, спасибо.
&НаКлиенте
Процедура Копировать(Команда)
      
    Если Не ПроверитьЗаполнение() Тогда
        Возврат;
    КонецЕсли;
    
    КопияСсылка = КопироватьРедакция(Объект.Редакция, Объект.Подразделение, Объект.ПериодПланирования, Объект.Статус, Объект.СценарийПланирования, Объект.Ссылка  );        
    ОткрытьФорму("Документ.УниверсальнаяФормаОтчетности.ФормаОбъекта", Новый Структура("Ключ", КопияСсылка));
    
    Закрыть();
    
КонецПроцедуры


&НаСервереБезКонтекста
Функция КопироватьРедакция(Редакция, Подразделение, ПериодПланирования, Статус, СценарийПланирования, Ссылка )
    
     Запрос = Новый Запрос;
     Запрос.Текст = "ВЫБРАТЬ
                    |    УниверсальнаяФормаОтчетности.Ссылка КАК Ссылка
                    |ИЗ
                    |    Документ.УниверсальнаяФормаОтчетности КАК УниверсальнаяФормаОтчетности";
          ОтборПоказателей = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
    
    Копия = Редакция.Скопировать();
    Копия.Наименование = Копия.Наименование + " (Копирование)";
    Копия.Записать();
    //Происходит копирование редакции, установленной в текущем документе.При этом наименование редакции формируется как имеющееся наименование с добавлением  « (Копирование)»;
    
    Набор = РегистрыСведений.ФормулыШаблонов.СоздатьНаборЗаписей();
    Набор.Отбор.Редакция.Установить(Редакция);
    Набор.Прочитать();
    
    НаборЗаписи = РегистрыСведений.ФормулыШаблонов.СоздатьНаборЗаписей();
    НаборЗаписи.Отбор.Редакция.Установить(Копия.ссылка);
                      
    Для Каждого Стр Из Набор Цикл
    //    Если Копия.Пустая ()
    //        Тогда
    //        НоваяСтрока = НаборЗаписи.Добавить();
    //        ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
    //        НоваяСтрока.Редакция = Копия.Ссылка;    
    //    КонецЕсли;                                      
    КонецЦикла;
    
    НаборЗаписи.Записать();
    
    Набор = РегистрыСведений.ПсевдонимыФормулШаблонов.СоздатьНаборЗаписей();
    Набор.Отбор.Редакция.Установить(Копия.ссылка);
    
    НаборЗаписи = РегистрыСведений.ПсевдонимыФормулШаблонов.СоздатьНаборЗаписей();
    НаборЗаписи.Отбор.Редакция.Установить(Копия.ссылка);
    
    Для Каждого Стр Из Набор Цикл
    //    Если  Копия.Пустая ()
    //        Тогда
    //        НоваяСтрока = НаборЗаписи.Добавить();
    //        ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
    //        НоваяСтрока.Редакция = Копия.Ссылка;    
    //    КонецЕсли;                                      
    КонецЦикла;
    
    НаборЗаписи.Записать();
    
    Набор = РегистрыСведений.ОформлениеЯчеек.СоздатьНаборЗаписей();
    Набор.Отбор.Редакция.Установить(Копия.ссылка);
    
    НаборЗаписи = РегистрыСведений.ОформлениеЯчеек.СоздатьНаборЗаписей();
    НаборЗаписи.Отбор.Редакция.Установить(Копия.ссылка);
    
    Для Каждого Стр Из Набор Цикл
    //    Если  Копия.Пустая ()
    //        Тогда
    //        НоваяСтрока = НаборЗаписи.Добавить();
    //        ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
    //        НоваяСтрока.Редакция = Копия.Ссылка;    
    //    КонецЕсли;                                          
    КонецЦикла;
    НаборЗаписи.Записать();    
    //Для вновь созданной редакции копируются только формулы, использующие данные текущего документа;
             
        
        
    НовДок = Документы.УниверсальнаяФормаОтчетности.СоздатьДокумент();
    НовДок.Дата = ТекущаяДата();
    НовДок.Подразделение = Подразделение;
    НовДок.ПериодПланирования = ПериодПланирования;
    НовДок.Редакция = Копия.Ссылка;
    НовДок.Статус = Статус;    
    
    
    
    Для каждого СтрНовДок из Ссылка.Содержание цикл
        НоваяСтрока = НовДок.Содержание.Добавить();
        НоваяСтрока.Показатель = СтрНовДок.Показатель;
        НоваяСтрока.Колонка = СтрНовДок.Колонка;
        НоваяСтрока.ЗначениеЯчейки = СтрНовДок.ЗначениеЯчейки;
    КонецЦикла;

    НовДок.Записать(РежимЗаписиДокумента.Запись);
    
    //Происходит открытие формы нового документа «Универсальная форма отчетности», при этом создаваемый документ должен быть заполнен аналогично текущему документу
    //за исключением редакции: для нового документа устанавливается созданная в первом пункте редакция.
    
    Возврат НовДок.Ссылка;
13 aleks_default
 
01.08.18
14:55
КопироватьРедакция(Редакция, Подразделение, ПериодПланирования, Статус, СценарийПланирования, Ссылка )

Слово "Ссылка" используется во многих контекстах как зарезервированное системой, поэтому не рекомендуется называть так свою внутрипроцедурную переменную. Не привыкай к этому. Лучше назвать как-нибудь с претензией на уникальность, типа: докСсылка, мСсылка, СсылкаНаДокумент и т.п.
14 Александр89
 
01.08.18
14:59
Спасибо ))
Ошибка? Это не ошибка, это системная функция.