Имя: Пароль:
1C
1C 7.7
v7: Как вывести на экран ещё незаписанный док ?
0 AL CAPONE
 
24.02.12
10:29
Имеем:

Док = СоздатьОбъект("Документ.АктСписания");
Док.Новый();
Док.ДатаДок       = ДатаДок;
Док.МОЛ           = Ответственный;
....................
Док.НоваяСтрока();
....................
ОткрытьФорму(Док.ТекущийДокумент());

Процедура ОткрытьФорму() ничего не делает, т.к. документ ещё не был записан. Записывать Док тоже нельзя, ибо только после его программного заполнения и вывода на экран сам пользователь по заполненной таблице должен решить, нужен ли ему именно этот док. И если нужен, то Провести его, если нет - Закрыть - Сохранить (Нет), чтобы он даже не болтался в журнале документов.

Как можно выкрутиться ?
1 ДенисЧ
 
24.02.12
10:30
Сначала открывай, потом через контекст заполняй
2 viktor_vv
 
24.02.12
10:32
Тока через контекст с

Док.НоваяСтрока()

косяк выйдет.
3 AL CAPONE
 
24.02.12
10:32
1
т.е.

ОткрытьФорму("Документ.АктСписания",Контекст);
Контекст.ДатаДок = ...
и т.д. ?
4 AL CAPONE
 
24.02.12
10:34
А если сделать через Вопрос() ?

Типа Записать Док, а потом вывести Вопрос() юзеру Сохранить док ?
И если Нет, то Док.Удалить(1)
5 ДенисЧ
 
24.02.12
10:34
(3) угу.
(2) Этот косяк запросто обходится.
6 AL CAPONE
 
24.02.12
10:34
(5)
а как именно обходится ?
7 ДенисЧ
 
24.02.12
10:35
ЗагрузитьВнешнююКомпоненту("formex.dll");
8 AL CAPONE
 
24.02.12
10:40
7
Формекс есть. Значит Док.НоваяСтрока() отработает как нужно ?
9 viktor_vv
 
24.02.12
10:42
(8) Да. Только вот здесь еще.
Конт = "";
ОткрытьФорму("Документ.АктСписания",Конт);

Конт.ДатаДок = ...
10 Азат
 
24.02.12
10:42
(4) а не думал, что может не удалиться или еще что-нить такое? тупа конфликт блокировок... и будет у тебя юзер сидеть и ок тыкать
11 AL CAPONE
 
24.02.12
10:44
(10)

а в чём там проблема будет, если аккуратно

Док.Форма.Закрыть(0)
Док.Удалить(1)
12 AL CAPONE
 
24.02.12
10:44
(9)
а что с ДатаДок ?
13 viktor_vv
 
24.02.12
10:46
(12) Да не с ДатаДок, а с Контекст. В твоем варианте ты туда передаешь контекст твоей текущей формы, матюкнется.
14 aka AMIGO
 
24.02.12
10:51
В документе типа ЗаявкаПокупателя есть кнопка "Создать док.Реализция".
В Модуле формы:

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

// в доке РеализацияРозница

Процедура ПриОткрытии()    
                           
   Парам = Форма.Параметр;
   
   Если ТипЗначенияСтр(Парам)="СписокЗначений" Тогда
       Если Парам.Получить("Команда") = "ИзЗаказаЗЧ" Тогда
           ДокОснование = Парам.Получить("Основание");
           Фирма = ДокОснование.Фирма;
           //заполняем поля и ТЧ
       КонецЕсли;
   КонецЕсли;
   //...
   //всё остальное
   //...
КонецПроцедуры
15 AL CAPONE
 
24.02.12
10:56
Хм, попробовал

Конт = "";
ОткрытьФорму("Документ.АктСписания",Конт);
Конт.ДатаДок       = КонМесяца(ДатаДок);
.................
Конт.НоваяСтрока();
.................

В результате на экране открыт док, вся шапка заполнена корректно, а табличная часть пустая ...
16 ДенисЧ
 
24.02.12
10:57
компоненту загрузил?
17 AL CAPONE
 
24.02.12
10:58
(16)
да. Но что странно при ручном выборе хотя бы одного элемента Шапки, табличная часть проявляется сама собой о_О
18 aka AMIGO
 
24.02.12
10:59
(15)
Конт создай как СписокЗначений
в Конт запихивай ТЧ в виде ТЗ
в "Документ.АктСписания" в ПриОткрытии извлекай ТЗ
19 aka AMIGO
 
24.02.12
11:00
+18 а вообще - как хочешь..
20 ДенисЧ
 
24.02.12
11:00
(17) Конт.Форма.Обновить() ?
21 AL CAPONE
 
24.02.12
11:05
(20)
О, так работает )
Только ещё 1 глючок. Если нужно открывать следующий док с другот табличной частью, то следующая команда

ОткрытьФорму("Документ.АктСписания",Конт);

что-то уже не отрабатывает
22 AL CAPONE
 
24.02.12
11:08
(18)
благодарю за подсказку, но думаю через Контекст всё же пропроще это выглядит
23 ДенисЧ
 
24.02.12
11:10
(21) Не может быть 2 незаписанных открытых документа одного вида одновременно.
И вообще, конт = ""; всегда ставь перед открытием
24 Torquader
 
24.02.12
11:11
Танцы с бубнами и контекстами имеют смысл только в том случае, если вы хотите из внешней обработки создавать документ в конфигурации, изменять которую нет желания.
Если же изменение допустимо, то лучше всего сделать заполнение при открытии через переданный параметр.
Также нужно понимать такую особенность платформы - если вы пытаетесь создать два документа одинакового вида, то при повторном открытии система покажет вам предыдущий, который ещё не был сохранён, так как она считает его новым.
Эту функцию можно попытаться обойти, если после типа документа поставить #, не уверен, что отработает корректно, но должна.

И не стоит забывать, что если вы создали и не сохранили документы с номерами, скажем 11 и 12, а потом 11 не сохранили, то в системе просто не будет одиннадцатого документа.
25 AL CAPONE
 
24.02.12
11:12
(23)
конт = "" всегда стоит перед открытием следующего, но открытие нескольких всё же необходимо, от этого никуда не деться. И что, тут без вариантов ?
26 ДенисЧ
 
24.02.12
11:13
(25) Да. Особенность платформы.
27 Torquader
 
24.02.12
11:14
(25) Если открывать сразу несколько, то можно из функции ПриОткрытии одного документа открыть другой - форма ещё не открыта и будет заготовлено создание формы другого и так далее.
Но, как оказалось, система вообще не может открыть более 128 форм одновременно - каких бы мы не открывали.
28 AL CAPONE
 
24.02.12
11:15
(24)
# ничего не даёт, всё равно вся ТЧ бомбится в первый открытый нами док ((
29 AL CAPONE
 
24.02.12
11:17
(27)
т.е. способ в (14) прокатит и для нескольких открываемых Доков ?
30 Torquader
 
24.02.12
11:21
(29) Если в параметр передать список значений, где каждая строка описывает один открываемый документ, то в процедуре при открытии нужно просто первую строку отработать и удалить, а если что-то осталось, то выполнить открытие ещё раз, передав остатки - система всё правильно отработает - формы появятся на экране после окончания работы кода.
31 AL CAPONE
 
24.02.12
11:23
(30)
в смысле "каждая строка описывает 1 док" ?

Я так понял там каждая строка описывает 1 реквизит.
32 viktor_vv
 
24.02.12
11:24
(31) Ну так значениями списка значений могут быть другие списки значений.
33 Torquader
 
24.02.12
11:29
(32) И таблицы, так как строки документа в списке не очень красиво смотрятся.
34 AL CAPONE
 
24.02.12
12:07
Не подскажете ещё, как можно динамически в программе создавать
Список1, Список2, Список3 ... СписокN для добавления их потом в результирующий список параметров для передачи ?
35 viktor_vv
 
24.02.12
12:22
ЛспРезультирующий = СоздатьОбъект("СписокЗначений");
// Список1
лспТекущий = СоздатьОбъект("СписокЗначений") ;

// Заполняем Текущий.

ЛспРезультирующий.ДобавитьЗначение(лспТекущий) ;

// Список2
лспТекущий = СоздатьОбъект("СписокЗначений") ;

// Заполняем Текущий.

ЛспРезультирующий.ДобавитьЗначение(лспТекущий) ;
36 AL CAPONE
 
24.02.12
12:25
(35)
Так а при пересоздании "лспТекущий" в "ЛспРезультирующий" он разве не будет обнулён ?
37 viktor_vv
 
24.02.12
12:30
(36) Нет. Будет создан новый экземпляр. Это если бы ты вместо СоздатьОбъект в последующих, сделал лспТекущий.УдалитьВсе() то тогда обновился бы.
38 smaharbA
 
24.02.12
12:32
НачатьТранзакцию();
Док.Записать();
ОткрытьФорму(Док.ТекущийДокумент(),конт);
ОтменитьТранзакцию();
39 AL CAPONE
 
24.02.12
12:34
(38)
после этого в случае если документ будет нужен, его не даст сохранить вроде
40 smaharbA
 
24.02.12
12:38
да
41 AL CAPONE
 
24.02.12
12:40
(40)
в смысле "да", не даст сохранить
или "да", сохранит ? )))
42 smaharbA
 
24.02.12
13:04
не сохранит )) но условию сабжа (38) соответствует
43 dk
 
24.02.12
13:09
плюсом еще и блокировку получим по документам
44 AL CAPONE
 
24.02.12
13:11
(42)
не совсем )
в сабже "И если нужен, то Провести его" ))
45 AL CAPONE
 
24.02.12
13:12
Пока пробую способом в (14) через передачу параметров списком значений.
46 AL CAPONE
 
24.02.12
13:44
(35)
Мда :(
В результирующем списке всё таки оказываются списки, идентичные последнему созданному "лспТекущий".
СоздатьОбъект не помогает, и в результирующем заменяются и прошлые сохранённые списки.
47 AL CAPONE
 
24.02.12
14:00
Может быть можно как-то создавать программно объекты Список1, Список2 и т.д., чтобы они не пересекались ?
48 viktor_vv
 
24.02.12
14:08
(46) Че-то ты там не то пишешь. Специально проверил, все нормально там.

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

Ввыодит
1
2
49 AL CAPONE
 
24.02.12
15:03
Вот мой код:

ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Счёт","Счет");
ТЗ.НоваяКолонка("Материал","Справочник.Материалы");
ТЗ.НоваяКолонка("Количество","Число",10,3);
   
ВыбратьСтроки();
   Пока ПолучитьСтроку() = 1 Цикл
       ТЗ.НоваяСтрока();
       ТЗ.Счёт       = Материал.СубСчет10;
       ТЗ.Материал   = Материал;
       ТЗ.Количество = Количество;
   КонецЦикла;
   
ТЗ.Сортировать("+1,+2");

ТекСчёт = ТЗ.ПолучитьЗначение(1,"Счёт");
   
СписокПараметров = СоздатьОбъект("СписокЗначений");
ДопТЗ = СоздатьОбъект("ТаблицаЗначений");
ДопТЗ.НоваяКолонка("Материал","Справочник.Материалы");
ДопТЗ.НоваяКолонка("Количество","Число",10,3);
   
ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       Если ТЗ.Счёт <> ТекСчёт  Тогда
           Список = СоздатьОбъект("СписокЗначений");
           Список.Установить("ТЧ",ДопТЗ);
           Список.Установить("ТекДок",ТекущийДокумент());
           
           ДопТЗ.УдалитьСтроки();
           ТекСчёт = ТЗ.Счёт;
       КонецЕсли;
           
       ДопТЗ.НоваяСтрока();
       ДопТЗ.Материал   = ТЗ.Материал;
       ДопТЗ.Количество = ТЗ.Количество;
           
       Если ТЗ.НомерСтроки = ТЗ.КоличествоСтрок() Тогда
           Список = СоздатьОбъект("СписокЗначений");
           Список.Установить("ТЧ",ДопТЗ);
           Список.Установить("ТекДок",ТекущийДокумент());
       КонецЕсли;
   КонецЦикла;
ОткрытьФорму("Документ.АктСписания",СписокПараметров);

Тестирую на документе на 32 строки, 31 строка на счёте 10.1 и 1 строка на 10.9. В результате в СпискеПараметров 2 элемента, но в обоих элементах при получении оказывается "ТЧ" со счётом 10.9 и 1 строкой.

Получаю так:

ТекСписок     = СписокПараметров.ПолучитьЗначение(1);
...........................
СписокПараметров.УдалитьЗначение(1);
Если СписокПараметров.РазмерСписка() <> 0 Тогда
   ОткрытьФорму("Документ.АктСписания",СписокПараметров);
КонецЕсли;
50 AL CAPONE
 
24.02.12
15:06
Ой, сорри, такой вложенный цикл:

ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       Если ТЗ.Счёт <> ТекСчёт  Тогда
           Список = СоздатьОбъект("СписокЗначений");
           Список.Установить("ТЧ",ДопТЗ);
           Список.Установить("ТекДок",ТекущийДокумент());
           СписокПараметров.ДобавитьЗначение(Список);
           
           ДопТЗ.УдалитьСтроки();
           ТекСчёт = ТЗ.Счёт;
       КонецЕсли;
           
       ДопТЗ.НоваяСтрока();
       ДопТЗ.Материал   = ТЗ.Материал;
       ДопТЗ.Количество = ТЗ.Количество;
           
       Если ТЗ.НомерСтроки = ТЗ.КоличествоСтрок() Тогда
           Список = СоздатьОбъект("СписокЗначений");
           Список.Установить("ТЧ",ДопТЗ);
           Список.Установить("ТекДок",ТекущийДокумент());
           СписокПараметров.ДобавитьЗначение(Список);
       КонецЕсли;
   КонецЦикла;
ОткрытьФорму("Документ.АктСписания",СписокПараметров);
51 viktor_vv
 
24.02.12
15:09
Для ТЗ такая же песня.

СписокПараметров = СоздатьОбъект("СписокЗначений");

   
ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       Если ТЗ.Счёт <> ТекСчёт  Тогда
           Список = СоздатьОбъект("СписокЗначений");
           Список.Установить("ТЧ",ДопТЗ);
           Список.Установить("ТекДок",ТекущийДокумент());
           
          ДопТЗ = СоздатьОбъект("ТаблицаЗначений");
          ДопТЗ.НоваяКолонка("Материал","Справочник.Материалы");
          ДопТЗ.НоваяКолонка("Количество","Число",10,3);
           ТекСчёт = ТЗ.Счёт;
       КонецЕсли;
           
       ДопТЗ.НоваяСтрока();
       ДопТЗ.Материал   = ТЗ.Материал;
       ДопТЗ.Количество = ТЗ.Количество;
52 AL CAPONE
 
24.02.12
15:15
(51)
смысл ?

ДопТЗ.НоваяСтрока();
ДопТЗ.Материал   = ТЗ.Материал;
ДопТЗ.Количество = ТЗ.Количество;

выполняется для каждой строки ТЗ без исключения и так
53 AL CAPONE
 
24.02.12
15:15
(52)
упс, не то подумал, туплю
54 AL CAPONE
 
24.02.12
15:16
ДопТЗ.УдалитьСтроки(); же стоит
55 viktor_vv
 
24.02.12
15:18
Я ж тебе еще раньше написал для списка значений разницу между удалением строк у одного и того же объекта и созданием нового экземпляра объекта. В данном случае объект - это ТЗ.
56 AL CAPONE
 
24.02.12
15:18
Тем более я проверял отладчиком:
в первом случае в ДопТЗ пишется 31 строка по счёту 10.1
во втором - 1 строка по 10.9

но как только происходит СписокПараметров.ДобавитьЗначение(Список);
меняются и прошлые сохранённые списки (
57 viktor_vv
 
24.02.12
15:20
(56) Ты сделай как в (51). Вместо УдалитьСтроки() сделай СоздатьОбъект().
58 AL CAPONE
 
24.02.12
15:20
(55)
ППЦ, проверил ваш вариант, и действительно работает, ничего не могу понять (((

Отладчик показывал верное заполнение ДопТЗ (((
59 AL CAPONE
 
24.02.12
15:23
Походу всё же туплю Я: сохраняется по ДопТЗ всё же правильно, но при сохранении ДопТЗ по 10.9 изменяется и ДопТЗ по 10.1. Вы оказались абсолютно правы.
60 Злопчинский
 
25.02.12
02:19
Демо открывалки нескольких форм новых документов одного вида
.
http://infostart.ru/public/15819/
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс