Имя: Пароль:
1C
1С v8
Задача: создать N объектов в одной процедуре, записать их всех в другой
0 e2e4
 
02.07.15
11:08
от
Задача инвентаризации однотипных объектов - каков канонический подход?
ответвилась следующая задача: надо создать НЕ ЗАПИСЫВАЯ в одной процедуре (ОбработкаЗаполнения в модуле документа) N элементов справочника.
Потом (когда документ проводится) их, наконец, записать в справочник.

С первой частью удалось успешно справиться:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    //...что-то делаем; наконец, начинаем штамповать новые объекты:
    Для Счетчик = 1 По ЗаданноеКоличество Цикл

        //создаем, но пока не записываем новый элемент
        НовыйОбъект = Справочники.МойСправочник.СоздатьЭлемент();
        НовыйОбъектСсылка = Справочники.МойСправочник.ПолучитьСсылку(Новый УникальныйИдентификатор);
        НовыйОбъект.УстановитьСсылкуНового(НовыйОбъектСсылка);
        НовыйОбъект.УстановитьНовыйКод();

        //добавляем новую строку ТЧ - в ее первый реквизит надо ПОТОМ записать только что созданный элемент
        НоваяСтрока = МояТЧ.Добавить();
        НоваяСтрока.МойОбъект = НовыйИнвНомер.Ссылка; //этот реквизит имеет тип СправочникСсылка.МойСправочник
        НоваяСтрока.Реквизит1 = тратата;
        //...
        НоваяСтрока.РеквизитN = туруру;

    КонецЦикла;
    //...что-то еще, если надо
КонецПроцедуры

А вот второй пункт плана пока не очень...

Процедура ОбработкаПроведения(Отказ, Режим)

    Для Каждого МояСтрока Из МояТЧ Цикл
        
        //я хочу сейчас записать каждый элемент, созданный ранее
        //вариант 1. так не получится - метод Записать() недоступен:
        МояСтрока.МойОбъект.Записать();
        //вариант 2. тоже не получится - "Элемент не выбран" (логично):
        НовыйОбъект = МояСтрока.МойОбъект.ПолучитьОбъект();
        НовыйОбъект.Записать();

    КонецЦикла;

КонецПроцедуры

........какие будут идеи?...
1 mikecool
 
02.07.15
11:09
ты сам когда думать начнешь?
2 Лефмихалыч
 
02.07.15
11:09
я предлагаю позвать программиста
3 bolobol
 
02.07.15
11:10
В ТЧ объект не сохранить, там нет такого типа
4 Garykom
 
гуру
02.07.15
11:11
(2) +1
и никогда не пытаться "записать" сторонние объекты "при проведении"
5 e2e4
 
02.07.15
11:13
(4) дико плюсую, но если требования ТЗ дебильные, то я-то тут причем?
6 bolobol
 
02.07.15
11:13
А ссылка незаписанного объекта ссылается на несуществующий в базе объект, т.е. и получаете несуществующий.
7 bolobol
 
02.07.15
11:14
А раз уж на то пошло, хоть и пошло пошло, то создать ТЗ, синхронизированную с ТЧ, в одной из колонок ТЗ хранить сам объект.
8 e2e4
 
02.07.15
11:15
(6) вот, и я так и думаю...а что делать-то? помимо (2) (ха*3!)
9 Fish
 
02.07.15
11:15
(5) Объяснить это тому, кто составил такое ТЗ, и предложить нормальный вариант реализации.
10 e2e4
 
02.07.15
11:16
(7) то есть, объект все-таки записывать?))..тогда смысл...
11 bolobol
 
02.07.15
11:18
(10) Нет, в ТЗ можно хранить тип ***.Объект, а не только ссылки, как в ТЧ. Там и хранить до момента записи.
12 Garykom
 
гуру
02.07.15
11:18
создавать (и сразу записывать) объекты при вводе(добавлении) новой строки в ТЧ
13 bolobol
 
02.07.15
11:19
Так превьюшки перед загрузкой, например, данных из другой базы делаются - ТЗ на форму с незаписанными, но полностью заполненными объектами.
14 Garykom
 
гуру
02.07.15
11:19
(12) если эту строку ТЧ удалили или вообще док не стали записывать то просто пометить на удаление эти "созданные объекты"
15 e2e4
 
02.07.15
11:21
(12) (14) hello, cap!))
(11) покумекаем...спасибо!
16 Garykom
 
гуру
02.07.15
11:25
а потом кто нибудь добавит что при записи объектов делаются исправления в документах каких то... и если это будут по совпадению того же вида документы

то будет интересная цикла при проведении документов...
17 Лефмихалыч
 
02.07.15
11:26
При перепроведении что будет происходить? При изменении задним числом с перепроведением? При записи в режиме обмена данных? При восстановлении последовательности?

нельзя так делать. Потому, что последствия будут проблемой того, кто куйню сделал, а не того, кто куйню заказал
18 Лефмихалыч
 
02.07.15
11:29
19 Garykom
 
гуру
02.07.15
11:29
(18) как бы в (0) он так и написал
20 Garykom
 
гуру
02.07.15
11:30
но такое впечатление что ТС с программированием вообще и БД каким то образом знаком, но только в теории или с реальными БД совсем не работал, по разным прикладным прогам хз
21 Бубка Гоп
 
02.07.15
11:31
(0) Лучше повесь создание этих объектов на отдельную кнопочку, отдай это на откуп юзерам. Не надо к проведению цепляться.
22 e2e4
 
02.07.15
11:41
(21) приходила эта хорошая мысль, но отвалилась по той же простой причине - а если юзер передумает проводить док? загаживать БД...
(1)(2) вообще, умные люди советуют учиться каждый день. А то можно застыть в позе "а позовите-ка программиста [==меня]" надолго, и прохлопать собственную профдеградацию... (20) раскрою секрет - теоретически подкован намного лучше, чем практически знаком с 1С (особенно восьмеркой). К сожалению, среди "спецов 1С" очень часто встречается обратный перекос - гораздо труднее устранимый.
(сорри за ответную колкость;))
23 hhhh
 
02.07.15
11:46
(22) вроде наоборот, вы практик. Потому что в теории такого  как в (0) вообще не может быть.
24 e2e4
 
02.07.15
11:50
(23) в каждой новой для себя среде я первым делом стараюсь нащупать границы дозволенного))
25 e2e4
 
02.07.15
11:52
(23) но, да - в (22) я имел в виду теоретическую подкованность в "программировании вообще и БД", а вот теоретический базис 1С изучаю. Как раз нащупыванием границ))
26 Garykom
 
гуру
02.07.15
11:58
(22) загадить бд пустыми неиспольземыми нигде объектами нестрашно
явно никогда кучу дублей наколоченных юзверями не чистили
27 Бубка Гоп
 
02.07.15
12:00
(22) если боитесь загадить - можно написать регламентное. Раз в неделю будут удаляться объекты, созданные из непроведенных документов, например. Авторам будут прописываться розги прелюдно.
28 e2e4
 
02.07.15
12:38
(26) (27) даа....помню, в одном проекте (Perl+MySql) 2 миллиона пустых мусорных записей в справочнике)) - программист небольшую ошибочку сделал, вовремя не обнаружили:D
29 bolobol
 
02.07.15
13:10
(28) Да уж, два миллиона не обнаружить - это говорит об особой важности справочника)
30 Лефмихалыч
 
модератор
02.07.15
13:23
фалометрия детектед. У дельфина 50см - ни кто не выиграл
31 ILM
 
гуру
02.07.15
13:46
События и отложенные регламенты вам в помощь, хотя я против такой архитектуры.
32 e2e4
 
02.07.15
14:20
(30) согласен на ничью:D
(29) а тут, коллеги, вмешалась ее величество математика - в виде геометрической прогрессии. Этот справочник (как и куча других) тягался из центральной базы в региональные при каждой репликации. Из-за ошибки программиста он тягался и обратно в ЦБ (как обычные таблицы-факты), причем, по схеме репликации, каждой записи справочника присваивалась метка региональной БД. Поэтому ЦБ воспринимала эти записи как новые - и вставляла их себе в этот же справочник, снова помечая их своими. При следующей репликации ВСЕ записи эти записи опять отправлялись в регионы...И снова из каждой РБ возвращались и вставлялись в ЦБ! :D
При этом, каждый регион видел только записи с пометкой ЦБ - поэтому никто из пользователей ничего дурного не замечал. Разве что процедура репликации чуть затягивалась...
А когда я пришел в проект и стал расковыривать систему изнутри, мне часто приходилось проводить процедуру ПОЛНОЙ репликации - и она занимала от 20 минут до... в общем, смотря какой проц (его ресурсы сжирались на 100%, вентиляторы крутились как бешеные, обогреватель в квартире был не нужен!:))) Пока не расковырял, в чем дело.
33 ХардHard
 
02.07.15
14:23
(0) Было или нет . Транзакции предлагали?
34 Serg_1960
 
02.07.15
14:29
(33) Фи, тривиальное решение предлагать - себя не уважать.
35 ХардHard
 
02.07.15
14:30
(34) Хз , я такое обычно в них делаю. Простите убогого.)
36 e2e4
 
02.07.15
14:33
(33) О! нет еще (тут в основном пока piсями мерялись)
копну! спасибо)
37 Serg_1960
 
02.07.15
14:38
Ооо... вспомнил, я же делал подобную гадость для заказчика :)

Надо создавать новые объекты, заполнять их и, когда новый документ записывается в базу) - записывать в хранилище значений, а ссылки на хранилище - в ТЧ документа.

Когда документ проводится (а с момента записи до момента проведения много времени может пройти - вот зачем нужно хранилище) - доставать из хранилища и записывать в справочник.

Бред, конечно, однозначно, но за ваши деньги - любой каприз.
38 Lamer1C
 
02.07.15
15:06
(0) тему не читал - транзакции уже предлагали?
39 mTema32
 
02.07.15
15:08
(38) [:|||:] :)
40 dmpl
 
02.07.15
15:23
(0) Делай все в обработке, которая и заполненный документ создаст, и нужные объекты.
41 dmpl
 
02.07.15
15:32
На крайний случай можно поступить как 1С в РС СписанныеТовары в партионном учете: в обработке заполнения добавляешь строки в РС, какие объекты надо создать, после записи - создаешь нужные объекты и удаляешь строки из РС.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.