Имя: Пароль:
1C
1C 7.7
v7: Групповое создание документов на основании заказов
0 kissolo
 
13.09.20
19:28
Бухгалтерия 7.7
Надо создать на основании выбранных заказов документы вида "расходная накладная".
Заказы выведены в тз ТаблицаДокументыНаОтправку на форме обработки, пользователь отмечает нужные документы и запускает формирование накладных.
Не могу понять, изза чего происходит такой глюк - все документы создаются на основании первого выбранного заказа, ощущение, что КонтекстФормы1 не обнуляется (это я даже вижу в отладчике - то обнуляется, то нет..). Образец кода группового формирования документов взят с ИС.
Вот сам код:

Процедура СформироватьНакладную(Док,КонтекстФормы1)
Перем КонтекстФормы1;
    Сообщить(""+Док.ТекущийДокумент()+". грп="+док.Заказчик);
    //создаю на основании документа ДОК расходную накладную, пишу ее в переменную КонтекстФормы1, не записываю
    ОткрытьФорму("Документ.РасходнаяНакладная",КонтекстФормы1,Док);
    
    // копирую реквизиты заполненного на основании ДОКа документа расх.накладной в ДокНа, который и записываю
    ДокНа = СоздатьОбъект("Документ.РасходнаяНакладная");
    ДокНа.Новый();

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


Процедура СформироватьРасходныеНакладные()

    ТаблицаДокументыНаОтправку.ВыбратьСтроки();

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

    ОбновитьСписокДокументов();

КонецПроцедуры
1 ДенисЧ
 
13.09.20
19:30
Процедура СформироватьНакладную(Док,КонтекстФормы1)
...

СформироватьНакладную(Док);

Что-то меня тут смущает
2 kissolo
 
13.09.20
19:36
(1) Прошу прощения, это я уже пробовал контекстФормы1 передавать как переменную, каждый раз заново инициализируя.
Конечно
Процедура СформироватьНакладную(Док)
3 Ёпрст
 
13.09.20
20:19
(0)
Процедура СформироватьНакладную(Док,КонтекстФормы1)
Перем КонтекстФормы1;

зачет ага
4 Ёпрст
 
13.09.20
20:23
ну и в твоём коде, форма открытого дока будет закрыта после окончания цикла
5 Ёпрст
 
13.09.20
20:24
и..делать это через открытие формы, моветон. Это всё от лени, лени прописывать код в обработке.
6 Ёпрст
 
13.09.20
20:25
если че, ложное закрытие формы спасёт, или обработка ожидания, или формековское генерация внешнего события
7 Cthulhu
 
13.09.20
20:32
ну и, хм... Метаданные.ОбщийРеквизитДокумента(); незаслужено забыто...
короче - неаккуратный и невнимательно написанный говнокод
8 kissolo
 
13.09.20
23:29
(3) я уже написал выше, переменная "контекстФормы1" в параметрах осталась от последнего варианта, когда я извращался по-разному, пытаясь заставить заработать обработку. Так-то она у меня локальная в пределах процедуры.

(4) Почему она не закрывается при завершении процедуры формирования конкретного документа? КонтекстФормы1 - это же локальная переменная! Тем более, что там принудительная команда стоит. Как мне закрывать форму при завершении процедуры "СформироватьНакладную"?

(5) скажите, как это сделать оптимальнее? Повторять процедуры заполнения шапки и табличной части в обработке не хочется. Мало ли что мы в дальнейшем поменяем в коде документа, вдруг забудем внести эти изменения в обработку?
Предыдущим вариантом было - вынесение процедур заполнения документа из модуля формы в глобальный модуль, чтобы там их запускать и при обычном вводе на основании (или при простом вводе документа), и при создании документов в обработке.
Мне этот вариант, найденный в интернете и переработанный под себя, показался правильнее - я не трогаю основной код документа, и при этом все заполняется так, как мне надо.

(7) Из общих реквизитов документа в конфигурации есть только комменты. Которые при вводе на основании не заполняются. Смысл их переносить?
9 kissolo
 
13.09.20
23:37
(6) Почитал про ложное закрытие формы.
Спасибо, попробую.
10 GreyK
 
14.09.20
01:42
(0) А зачем тебе нужно контекст формы открывать?
11 Duke1C
 
14.09.20
10:17
(10) +1. Создавай сразу, без открытия формы. Только не мешало бы проверочку организовать, на предмет того, что накладная уже создавалась на основании конкретного заказа. А то юзеры наформируют тебе...
12 GreyK
 
14.09.20
12:45
+(10) Для взятия контекста документа в 7ке есть специальная функция вроде ГлВзятьКнотекст().
13 kissolo
 
14.09.20
23:09
(10), (11) если я правильно понял вопрос, вы предлагаете сразу открывать форму нового расходного ордера, заполнять его на основании заказа, записывать его и проводить?
Такой вариант не работает. Если я  в процедуре ВводНаОсновании() пытаюсь записать документ - программа ругается.

(11) В исходном моем коде такая проверка (на существующие расх. накладные) есть.

(12) Не покажете на примере, как ее можно использовать?
14 GreyK
 
14.09.20
23:20
(13) Откуда вы запускаете процедуру СформироватьРасходныеНакладные()?
15 kissolo
 
14.09.20
23:50
(14) из кнопки на форме.
16 GreyK
 
14.09.20
23:51
(13) В 7ке есть примеры использования этой функции, достаточно поиском по конфигурации пройтись.    
Пример.
В форме документа:
//__________________________________________________________________
Процедура ПриИзмененииДаты()
    Если ДатаГод(СтараяДата) <> ДатаГод(ДатаДок) Тогда
        глУстановитьНомерДок(глВзятьКонтекст(Контекст));
    КонецЕсли;
КонецПроцедуры //ПриИзмененииДаты()
В глобальнике:
//_____________________________________________________________________________
Процедура глУстановитьНомерДок(Конт,Префикс="-") Экспорт

    фЭтоАнгар=0;
    Если (Конт.вид()="Приход")или(Конт.Вид()="РасходнаяНакладная")или(Конт.Вид()="Счет")или(Конт.Вид()="СписаниеИзлишки") Тогда
        Если Конт.Склад=Константа.СкладАнгар Тогда
            фЭтоАнгар=1;
        КонецЕсли;
    КонецЕсли;
    Если Конт.вид()="Перемещение" Тогда
        Если (Конт.СкладИсточник=Константа.СкладАнгар)или(Конт.СкладПолучатель=Константа.СкладАнгар) Тогда
            фЭтоАнгар=1;
        КонецЕсли;
    КонецЕсли;
    
    Если фЭтоАнгар=0 Тогда
        
        Если (Конт.вид()="жРасходнаяНакладная")или(Конт.Вид()="РасходнаяНакладная") Тогда
            
            мПерем=СокрЛП(Конт.РБ.префикс)+СокрЛП(Конт.Фирма.ПрефиксНомеровДокументов)+СокрЛП(Конт.ВидОплаты.Префикс);
            Конт.УстановитьНовыйНомер(""+мПерем+Префикс);
            
        ИначеЕсли (Конт.вид()="жСчет")или(Конт.вид()="ПлатежноеПоручение") Тогда
            
            мПерем=СокрЛП(Конт.Фирма.ПрефиксНомеровДокументовПП);    
            Конт.УстановитьНовыйНомер(""+мПерем+Префикс);
    
        ИначеЕсли (Конт.вид()="ПриходныйОрдер")или(Конт.вид()="РасходныйОрдер") Тогда
            
            мПерем=СокрЛП(Конт.Фирма.ПрефиксНомеровДокументов)+СокрЛП(Конт.Касса.Префикс);    
            Конт.УстановитьНовыйНомер(""+мПерем+Префикс);
        
        ИначеЕсли Конт.РБ.Выбран()=1 Тогда
            Конт.УстановитьНовыйНомер(""+СокрЛП(Конт.РБ.Префикс)+СокрЛП(Конт.Фирма.ПрефиксНомеровДокументов)+Префикс);
    
        Иначе
            Сообщить("У Распр.базы "+ Конт.РБ + " не указан префикс!!!");
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры
17 kissolo
 
15.09.20
00:00
(16) офф. Подскажите, как прятать код в спойлер?

Чего сейчас удалось добиться. Документы создаются по всем заказам, но для первого заказа почему-то создаются 2 документа (пошагово посмотрел - контекст не закрывается по какой-то причине).
Примечание к коду - на форме есть объект "Текст", который вызывает процедуру "обновление".
При нажатии на кнопку [Сформировать накладные] сначала инициализируется переменная "флПервыйЗапуск=1;" Потом запускается процедура "СформироватьРасходныеНакладные()"
Сам код (убрал лишние процедуры, не относящиеся к проблеме):

Перем КонтекстФормы,Док;
Перем Работаем;
Перем флПервыйЗапуск;

Процедура СформироватьНакладную(КонтекстФормы)
    // копирую реквизиты заполненного на основании ДОКа документа расх.накладной в ДокНа
    ДокНа = СоздатьОбъект("Документ.РасходнаяНакладная");
    ДокНа.Новый();

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


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


Функция Обновление()
    Если ТипЗначенияСтр(КонтекстФормы) = "ГрупповойКонтекст" Тогда
        Сообщить("Обновление. Закрываю КонтекстФормы="+КонтекстФормы+". грп="+КонтекстФормы.Грузополучатель+" "+КонтекстФормы.Грузополучатель1);
        КонтекстФормы.Форма.Закрыть(0);
        Работаем = 1;
        Форма.Закрыть(0);
    Иначе
        Сообщить("Обновление. Пропуск");
    КонецЕсли;
КонецФункции            


Процедура ПриЗакрытии()
    Если Работаем = 1 Тогда
        Сообщить("ПриЗакрытии. Работаем=1");
        Работаем = 0;
        СтатусВозврата(0);
        СформироватьРасходныеНакладные();
    КонецЕсли;
КонецПроцедуры


На всякий случай привожу полученные сообщения:
флПервыйЗапуск=0. Строка в тз=1
Заказ 5259 (18.08.20). грп=Барышня
Сформирована расх. накладная Отгрузка товаров, продукции 00005249 (18.08.20)(Заказ 5259 (18.08.20)). грп=Барышня Барышня
Обновление. Закрываю КонтекстФормы=ГрупповойКонтекст. грп=Барышня
ПриЗакрытии. Работаем=1
флПервыйЗапуск=0. Строка в тз=2
Заказ 5260 (18.08.20). грп=Триптих
Сформирована расх. накладная Отгрузка товаров, продукции 00005250 (18.08.20)(Заказ 5259 (18.08.20)). грп=Барышня Барышня
Обновление. Закрываю КонтекстФормы=ГрупповойКонтекст. грп=Барышня
ПриЗакрытии. Работаем=1
флПервыйЗапуск=0. Строка в тз=2
Заказ 5260 (18.08.20). грп=Триптих
Сформирована расх. накладная Отгрузка товаров, продукции 00005252 (18.08.20)(Заказ 5260 (18.08.20)). грп=Триптих Триптих
Обновление. Закрываю КонтекстФормы=ГрупповойКонтекст. грп=Триптих
ПриЗакрытии. Работаем=1
флПервыйЗапуск=0. Строка в тз=2
Для заказа    5260 от 18.08.20 уже есть реализация Отгрузка товаров, продукции 00005252 (18.08.20)
флПервыйЗапуск=0. Строка в тз=3
Заказ 5261 (18.08.20). грп=Мальта
Сформирована расх. накладная Отгрузка товаров, продукции 00005254 (18.08.20)(Заказ 5261 (18.08.20)). грп=Мальта Мальта
Обновление. Закрываю КонтекстФормы=ГрупповойКонтекст. грп=Мальта
ПриЗакрытии. Работаем=1
флПервыйЗапуск=0. Строка в тз=2
Для заказа    5260 от 18.08.20 уже есть реализация Отгрузка товаров, продукции 00005252 (18.08.20)
флПервыйЗапуск=0. Строка в тз=3
Для заказа    5261 от 18.08.20 уже есть реализация Отгрузка товаров, продукции 00005254 (18.08.20)
флПервыйЗапуск=0. Строка в тз=4
Заказ 5262 (18.08.20). грп=Саймон
Сформирована расх. накладная Отгрузка товаров, продукции 00005256 (18.08.20)(Заказ 5262 (18.08.20)). грп=Саймон Саймон
Обновление. Закрываю КонтекстФормы=ГрупповойКонтекст. грп=Саймон
ПриЗакрытии. Работаем=1
флПервыйЗапуск=0. Строка в тз=2
Для заказа    5260 от 18.08.20 уже есть реализация Отгрузка товаров, продукции 00005252 (18.08.20)
флПервыйЗапуск=0. Строка в тз=3
Для заказа    5261 от 18.08.20 уже есть реализация Отгрузка товаров, продукции 00005254 (18.08.20)
флПервыйЗапуск=0. Строка в тз=4
Для заказа    5262 от 18.08.20 уже есть реализация Отгрузка товаров, продукции 00005256 (18.08.20)
Обновление. Пропуск
18 GreyK
 
15.09.20
00:15
(17) Не обращай внимания на спойлер, он не всегда работает правильно.
Что за таблица ТаблицаДокументыНаОтправку? Что в ней содержится?
19 GreyK
 
15.09.20
00:37
(17) Может так надо:

Процедура Сформировать()
    Если ТаблицаДокументыНаОтправку.КоличествоСтрок() > 0 Тогда
        ТаблицаДокументыНаОтправку.ВыбратьСтроки();
        Пока ТаблицаДокументыНаОтправку.ПолучитьСтроку()=1 Цикл
            Если СокрЛП(ТаблицаДокументыНаОтправку._ФлагВыбора) = "" Тогда
                Продолжить;
            КонецЕсли;
            Док = ТаблицаДокументыНаОтправку._ТекущийДокумент;    // Заказ
            флУжеЕстьРН = 0;
            Док1 = СоздатьОбъект("Документ");
            Док1.ВыбратьПОдчиненныеДокументы(,,Док);
            Пока Док1.ПолучитьДокумент() = 1 Цикл
                Если (Док1.Вид() = "РасходнаяНакладная") и (Док1.ПометкаУдаления() = 0) Тогда
                    Мессага = "Для заказа " + ТаблицаДокументыНаОтправку.Номер + " от " + ТаблицаДокументыНаОтправку.Дата + " уже есть реализация " + Док1;
                    Сообщить(Мессага);
                    флУжеЕстьРН = 1;
                КонецЕсли;
            КонецЦикла;
            Если флУжеЕстьРН=0 Тогда
                ДокНа = СоздатьОбъект("Документ.РасходнаяНакладная");
                ДокНа.Новый();
                ЧЧ = 0;ММ = 0;СС = 0;
                Док.ПолучитьВремя(ЧЧ,ММ,СС);
                ДокНа.УстановитьВремя(ЧЧ,ММ,СС+1);
                КонтекстФормы.УстановитьВремя(ЧЧ,ММ,СС+1);
                
                ДокНа.ДатаДок = Док.ДатаДок;
                ДокНа.УстановитьНовыйНомер();
                КолРек = Метаданные.Документ("РасходнаяНакладная").РеквизитШапки();
                Для Сч = 1 По КолРек Цикл
                    Рек = Метаданные.Документ("РасходнаяНакладная").РеквизитШапки(Сч);
                    ДокНа.УстановитьАтрибут(Рек,КонтекстФормы.ПолучитьАтрибут(Рек));
                КонецЦикла;
                КолРек = Метаданные.ОбщийРеквизитДокумента();
                Для Сч = 1 По КолРек Цикл
                    Рек = Метаданные.ОбщийРеквизитДокумента(Сч);
                    ДокНа.УстановитьАтрибут(Рек,КонтекстФормы.ПолучитьАтрибут(Рек));
                КонецЦикла;
                
                Таб = СоздатьОбъект("ТаблицаЗначений");
                КонтекстФормы.ВыгрузитьТабличнуюЧасть(Таб);
                ДокНа.ЗагрузитьТабличнуюЧасть(Таб);
                
                ДокНа.Записать();
                ДокНа.Провести();
                Сообщить("Сформирована расх. накладная "+ДокНа+"("+ДокНа.ДокОснование+")"+". грп="+ДокНа.Грузополучатель+" "+ДокНа.Грузополучатель1);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
20 GreyK
 
15.09.20
01:09
+(19) Что намудрилось с копированием
//*******************************************
Процедура Сформировать()
    Если ТаблицаДокументыНаОтправку.КоличествоСтрок() > 0 Тогда
        ТаблицаДокументыНаОтправку.ВыбратьСтроки();
        Пока ТаблицаДокументыНаОтправку.ПолучитьСтроку()=1 Цикл
            Если СокрЛП(ТаблицаДокументыНаОтправку._ФлагВыбора) = "" Тогда
                Продолжить;
            КонецЕсли;
            Док = ТаблицаДокументыНаОтправку._ТекущийДокумент;    // Заказ
            флУжеЕстьРН = 0;
            Док1 = СоздатьОбъект("Документ");
            Док1.ВыбратьПОдчиненныеДокументы(,,Док);
            Пока Док1.ПолучитьДокумент() = 1 Цикл
                Если (Док1.Вид() = "РасходнаяНакладная") и (Док1.ПометкаУдаления() = 0) Тогда
                    Мессага = "Для заказа " + ТаблицаДокументыНаОтправку.Номер + " от " + ТаблицаДокументыНаОтправку.Дата + " уже есть реализация " + Док1;
                    Сообщить(Мессага);
                    флУжеЕстьРН = 1;
                КонецЕсли;
            КонецЦикла;
            Если флУжеЕстьРН=0 Тогда
                ДокНа = СоздатьОбъект("Документ.РасходнаяНакладная");
                ДокНа.Новый();
                ЧЧ = 0;ММ = 0;СС = 0;
                Док.ПолучитьВремя(ЧЧ,ММ,СС);
                ДокНа.УстановитьВремя(ЧЧ,ММ,СС+1);
                
                ДокНа.ДатаДок = Док.ДатаДок;
                ДокНа.УстановитьНовыйНомер();
                КолРек = Метаданные.Документ("РасходнаяНакладная").РеквизитШапки();
                Для Сч = 1 По КолРек Цикл
                    Рек = Метаданные.Документ("РасходнаяНакладная").РеквизитШапки(Сч);
                    ДокНа.УстановитьАтрибут(Рек,Док.ПолучитьАтрибут(Рек));
                КонецЦикла;
                КолРек = Метаданные.ОбщийРеквизитДокумента();
                Для Сч = 1 По КолРек Цикл
                    Рек = Метаданные.ОбщийРеквизитДокумента(Сч);
                    ДокНа.УстановитьАтрибут(Рек,Док.ПолучитьАтрибут(Рек));
                КонецЦикла;
                Таб = СоздатьОбъект("ТаблицаЗначений");
                Док.ВыгрузитьТабличнуюЧасть(Таб);
                ДокНа.ЗагрузитьТабличнуюЧасть(Таб);
                ДокНа.Записать();
                ДокНа.Провести();
                Сообщить("Сформирована расх. накладная "+ДокНа+"("+ДокНа.ДокОснование+")"+". грп="+ДокНа.Грузополучатель+" "+ДокНа.Грузополучатель1);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
21 kissolo
 
15.09.20
10:33
(18) таблица значений на экранной форме. Туда записываются заказы, которые есть в базе за указанный период. и пользователь флажки проставляет - какие заказы надо обработать - создать расходные накладные по ним.
22 Ёпрст
 
15.09.20
10:34
(21) дык перепиши полностью код фрагстера с нимфостарта
23 Ёпрст
 
15.09.20
10:35
так то идея, так себе..мелькание окошка открытия-закрытия формы..+ можно нарваться на ошибки с предупреждением\вопросом.. не, проще всё в самом коде слепить, чем форму открывать и с неё реквизиты считывать
24 Ёпрст
 
15.09.20
10:35
и это будет, в разы быстрее по скорости работы
25 kissolo
 
15.09.20
10:45
(20) Док - это заказ. на основании которого надо создать и заполнить расходную накладную (которая в переменной ДокНА находится). Реквизиты шапки и табличной части в документах не совпадают. просто скопировать реквизиты не получится. тем более в расходной накладной еще и пересчет табличной части идет.

(22) полностью не получится - у него выборка документов в коде - всех подряд. а у меня на откуп пользователю. что он отметил - по тем и формирую. Но имхо это некритично. в остальном - код взят оттуда. и не работает корректно.

(23) зато формирование табличной части и пересчет ее - все в одном месте. и код самой конфигурации не трогается. Но если не поучится - так и вернусь к исходномуварианту - вынес все процедуры заполнения дока и пересчета в гл. модуль, чтобы запускать и из дока, и из обработки.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.