Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Групповое создание документов на основании заказов

v7: Групповое создание документов на основании заказов
Я
   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)
...

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

Что-то меня тут смущает
   kissolo
 
2 - 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
если че, ложное закрытие формы спасёт, или обработка ожидания, или формековское генерация внешнего события
   Cthulhu
 
7 - 13.09.20 - 20:32
ну и, хм... Метаданные.ОбщийРеквизитДокумента(); незаслужено забыто...
короче - неаккуратный и невнимательно написанный говнокод
   kissolo
 
8 - 13.09.20 - 23:29
(3) я уже написал выше, переменная "контекстФормы1" в параметрах осталась от последнего варианта, когда я извращался по-разному, пытаясь заставить заработать обработку. Так-то она у меня локальная в пределах процедуры.

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

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

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

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

(12) Не покажете на примере, как ее можно использовать?
   GreyK
 
14 - 14.09.20 - 23:20
(13) Откуда вы запускаете процедуру СформироватьРасходныеНакладные()?
   kissolo
 
15 - 14.09.20 - 23:50
(14) из кнопки на форме.
   GreyK
 
16 - 14.09.20 - 23:51
(13) В 7ке есть примеры использования этой функции, достаточно поиском по конфигурации пройтись.    
Пример.
В форме документа:
//__________________________________________________________________

Процедура ПриИзмененииДаты()
    Если ДатаГод(СтараяДата) <> ДатаГод(ДатаДок) Тогда
        глУстановитьНомерДок(глВзятьКонтекст(Контекст));
    КонецЕсли;
КонецПроцедуры//ПриИзмененииДаты()

В глобальнике:
//_____________________________________________________________________________

Процедура глУстановитьНомерДок(Конт,Префикс="-") Экспорт 

    фЭтоАнгар=0;
    Если (Конт.вид()="Приход")или(Конт.Вид()="РасходнаяНакладная")или(Конт.Вид()="Счет")или(Конт.Вид()="СписаниеИзлишки") Тогда 
        Если Конт.Склад=Константа.СкладАнгар Тогда
            фЭтоАнгар=1;
        КонецЕсли;
    КонецЕсли;
    Если Конт.вид()="Перемещение" Тогда 
        Если (Конт.СкладИсточник=Константа.СкладАнгар)или(Конт.СкладПолучатель=Константа.СкладАнгар) Тогда
            фЭтоАнгар=1;
        КонецЕсли;
    КонецЕсли; 
    
    Если фЭтоАнгар=0 Тогда
        
        Если (Конт.вид()="жРасходнаяНакладная")или(Конт.Вид()="РасходнаяНакладная") Тогда
            
            мПерем=СокрЛП(Конт.РБ.префикс)+СокрЛП(Конт.Фирма.ПрефиксНомеровДокументов)+СокрЛП(Конт.ВидОплаты.Префикс);
            Конт.УстановитьНовыйНомер(""+мПерем+Префикс);
            
        ИначеЕсли (Конт.вид()="жСчет")или(Конт.вид()="ПлатежноеПоручение") Тогда
            
            мПерем=СокрЛП(Конт.Фирма.ПрефиксНомеровДокументовПП);    
            Конт.УстановитьНовыйНомер(""+мПерем+Префикс);
    
        ИначеЕсли (Конт.вид()="ПриходныйОрдер")или(Конт.вид()="РасходныйОрдер") Тогда
            
            мПерем=СокрЛП(Конт.Фирма.ПрефиксНомеровДокументов)+СокрЛП(Конт.Касса.Префикс);    
            Конт.УстановитьНовыйНомер(""+мПерем+Префикс);
        
        ИначеЕсли Конт.РБ.Выбран()=1 Тогда
            Конт.УстановитьНовыйНомер(""+СокрЛП(Конт.РБ.Префикс)+СокрЛП(Конт.Фирма.ПрефиксНомеровДокументов)+Префикс); 
    
        Иначе
            Сообщить("У Распр.базы "+ Конт.РБ + " не указан префикс!!!");
        КонецЕсли;
        
    КонецЕсли; 
    
КонецПроцедуры
   kissolo
 
17 - 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)
Обновление. Пропуск
   GreyK
 
18 - 15.09.20 - 00:15
(17) Не обращай внимания на спойлер, он не всегда работает правильно.
Что за таблица ТаблицаДокументыНаОтправку? Что в ней содержится?
   GreyK
 
19 - 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);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
   GreyK
 
20 - 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);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
   kissolo
 
21 - 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
и это будет, в разы быстрее по скорости работы
   kissolo
 
25 - 15.09.20 - 10:45
(20) Док - это заказ. на основании которого надо создать и заполнить расходную накладную (которая в переменной ДокНА находится). Реквизиты шапки и табличной части в документах не совпадают. просто скопировать реквизиты не получится. тем более в расходной накладной еще и пересчет табличной части идет.

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.