Имя: Пароль:
1C
 
Не понятно как записывается набор записей
,
0 Ayvengo
 
05.07.11
16:27
Простейшая процедура
//СсылкаНаОбъект - СправочникСсылка.Контрагенты или СправочникСсылка.ДоговорыКонтрагентов
//Свойство = ПланВидовХарактеристикСсылка.СвойстваОбъектов
Срабатывает данный механизм при записи объекта - в моем случае при записи нового контрагента (то, что это новый контрагент узнаю из доп свойств, который добавляются перед записью объекта), можно конечно поизвращаться через получить ссылку нового, но мне нехочется :)
   Свойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("000001");
   НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
   НаборЗаписей.Отбор.Объект.Установить(Источник.Ссылка);
   НаборЗаписей.Отбор.Свойство.Установить(Свойство );
   НаборЗаписей.Прочитать();
   Если НаборЗаписей.Количество() = 0 Тогда
       СтрокаНабора        = НаборЗаписей.Добавить();
       СтрокаНабора.Значение    = "Здесь значение свойства!!!";
       СтрокаНабора.Объект    = источник.ссылка;
       СтрокаНабора.Свойство    = Свойство;
       НаборЗаписей.Записать();
   КонецЕсли;
Что я наблюдают:

Свойство для контрагента не устанавливается, а в договоре устанавливается (т.к. при записи контрагента создается договора и записывается) ... Простите, но ЧТО КУРИТЬ?
1 Amiralnar
 
05.07.11
16:28
Простите, но ЧТО КУРИЛИ?
2 Ayvengo
 
05.07.11
16:28
Набор записей - отборы и всякая ерунда, в принципе смысла не имеет, т.к. объект новый. но не обращайте на это внимания :)
3 Ayvengo
 
05.07.11
16:29
(1) вот и я не понимаю...
4 Amiralnar
 
05.07.11
16:31
Во-первых, я не знаю, где конкретно этот код, но удостоверьтесь, что ссылка не пустая.
Во вторых, я использую менеджер записи. Просто по смыслу - одна запись. И проще в работе.
5 Ayvengo
 
05.07.11
16:31
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
   МенеджерЗаписи.Значение    =  "Здесь значение свойства!!!";
   МенеджерЗаписи.Объект        = СсылкаНаОбъект;
   МенеджерЗаписи.Свойство    = Свойство;
   МенеджерЗаписи.Записать();
С этим такая же беда :(
6 Amiralnar
 
05.07.11
16:33
Во-первых, проверьте, что ссылка не пустая.
ПолучитьСсылкуНового() - скорее всего вернет правильную ссылку, которая ляжет в измерение.
7 Ayvengo
 
05.07.11
16:33
(4) код в подписке на событие ПриЗаписи справочника. Если отдельно код использовать, то все работает ...
8 НЕА123
 
05.07.11
16:33
(5)
СсылкаНаОбъект - это кто?
9 Ayvengo
 
05.07.11
16:34
СсылкаНаОбъект - Источник.Ссылка
10 vmv
 
05.07.11
16:34
много сумбура, увы

мож в артисты еще не поздно пойти, подумай
11 Ayvengo
 
05.07.11
16:35
(10) в артисты не возьмут, много сумбура ;)
12 hhhh
 
05.07.11
16:35
(9) а что такое "источник"?
13 le_
 
05.07.11
16:35
ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("000001");
Для контрагентов и договоров одно и то же? И в назначениях ничего не указано?
14 Amiralnar
 
05.07.11
16:36
(12) Б--ть, что же такое Источник в подписке?
15 vmv
 
05.07.11
16:36
локализуй, выдели проблему, выбрось шушару и спроси еще раз
16 Amiralnar
 
05.07.11
16:38
(13) Назначение для отбора служит, по моему. Программно возьмется записать даже с чужим назначением в свойстве.
Правда не покажет в списке =)
17 Ayvengo
 
05.07.11
16:40
:facepalm:
Подписка на событие использует обработчик в котором есть параметр "Источник" в моем случае - это СправочникОбъект.Контрагенты или СправочникОбъект.ДоговорыКонтрагентов
Событие срабатывает "ПриЗаписи" Объекта, ну что тут не понятного?
18 hhhh
 
05.07.11
16:43
(17) что непонятно, смотри (13).
19 Ayvengo
 
05.07.11
16:45
(18) (13) Свойство ищется по коду - в чем проблема? ПВХ.СвойстваОбъектов - код устанавливается уникальным на все ПВХ ...
20 MNS_Ротерта
 
05.07.11
16:46
(0) Какая ошибка то выскакивает. Засунь твое чудо в попытку и выведи сообщение об ошибке. Я даже не пойму в чем ошибка у тебя и ты похоже тоже. Тут все гаданием уже устали заниматься. Используй СоздатьНаборЗаписейа не СоздатьМенеджерЗаписи даже для одной строки. Раньше СоздатьНаборЗаписей работал на 50% быстрее хоть для одной хоть для миллиона записей. Мозможно что то изменили в платформе. Замерь производительность и сделай так как работает быстрее. Вполне возможно что у тебя либо пустой источник либо тип не тот что надо. Либо у тебя 2 строки с идентичными измерениями пытаются записать. Убери НаборЗаписей.Прочитать();
21 Ayvengo
 
05.07.11
16:47
(20) нет никакой ошибки... просто у контрагентов не записывается свойство, а в договоре для этого контрагента записывается... срабатывает эта подписка дважды. Может я какую-то мелочь упустил ..
22 Ayvengo
 
05.07.11
16:47
+(19) - Назначение - Справочники.
23 Amiralnar
 
05.07.11
16:48
Отладчик в зубы.
24 le_
 
05.07.11
16:50
(22) Предлагаю эксперимент - измени назначение элемента с кодом "000001" на "Справочник "Контрагенты"" и попробуй записать набор и для контрагентов и для договоров.
25 Ayvengo
 
05.07.11
16:56
(24) у меня так и работает, я первоначально пробовал записывать через набор .. та же самая фигня ...
Такое при записи договора
МенеджерЗаписи              РегистрСведенийМенеджерЗаписи.ЗначенияСвойствОбъектов    РегистрСведенийМенеджерЗаписи.ЗначенияСвойствОбъектов
Активность              Истина    Булево
Значение              "=0004253"    Строка
НомерСтроки              0    Число
Объект                      Основной договор    СправочникСсылка.ДоговорыКонтрагентов
Период                      01.01.0001 0:00:00    Дата
Регистратор          Неопределено
Свойство              Код из 1С 7.7    ПланВидовХарактеристикСсылка.СвойстваОбъектов
  ВерсияДанных              "AAAAAAACWI0="    Строка
  Код                      "00000000002"    Строка
  НазначениеСвойства      Справочник "Договоры контрагентов"    ПланВидовХарактеристикСсылка.НазначенияСвойствКатегорийОбъектов
  Наименование              "Код из 1С 7.7"    Строка
  ПометкаУдаления      Ложь    Булево
  Предопределенный      Ложь    Булево
  Родитель                   ПланВидовХарактеристикСсылка.СвойстваОбъектов
  Ссылка              Код из 1С 7.7    ПланВидовХарактеристикСсылка.СвойстваОбъектов
  ТипЗначения              Строка    ОписаниеТипов
  ЭтоГруппа              Ложь    Булево

А так при записи контрагента

МенеджерЗаписи        РегистрСведенийМенеджерЗаписи.ЗначенияСвойствОбъектов    РегистрСведенийМенеджерЗаписи.ЗначенияСвойствОбъектов
Активность        Истина    Булево
Значение        "=0003156"    Строка
НомерСтроки        0    Число
Объект            1234123    СправочникСсылка.Контрагенты
Период            01.01.0001 0:00:00    Дата
Регистратор        Неопределено
Свойство        Код из 1С 7.7    ПланВидовХарактеристикСсылка.СвойстваОбъектов
  ВерсияДанных        "AAAAAAACWIw="    Строка
  Код            "00000000003"    Строка
  НазначениеСвойства    Справочник "Контрагенты"    ПланВидовХарактеристикСсылка.НазначенияСвойствКатегорийОбъектов
  Наименование        "Код из 1С 7.7"    Строка
  ПометкаУдаления        Ложь    Булево
  Предопределенный    Ложь    Булево
  Родитель        ПланВидовХарактеристикСсылка.СвойстваОбъектов
  Ссылка            Код из 1С 7.7    ПланВидовХарактеристикСсылка.СвойстваОбъектов
  ТипЗначения        Строка    ОписаниеТипов
  ЭтоГруппа        Ложь    Булево
26 Ayvengo
 
05.07.11
16:57
Оу, ну и хренотенькая получилась :D
27 Ayvengo
 
05.07.11
17:11
Мда... какая-то непонятная вещь происходит :(
28 vmv
 
05.07.11
17:12
(27) еще можно подать документы в щуку в этом году
29 Ayvengo
 
05.07.11
17:15
(28)да хоть в окуня ... это не поможет
30 Bober
 
05.07.11
17:17
(0)
два варианта:
  - значение уже в регистре по этому объекту с этим свойством, поэтому по твоему условию запись в РС не добавляется.
  - значение записывается, но в пользовательской интерфейсе не отображается, так как свойство не привязано к этому типу объекта.
31 Ayvengo
 
05.07.11
17:19
(30) - первое отпадает, ибо записи замещаются
второе тоже отпадает, потому что через консоль запросов гляжу ;)
32 Bober
 
05.07.11
17:23
первое не отпадает, так как есть условие
НаборЗаписей.Прочитать();
   Если НаборЗаписей.Количество() = 0 Тогда

т.е. если уже есть запись с ключами объект-свойство, то ничего не замещается.
33 Ayvengo
 
05.07.11
17:24
(32) отпадает, отпадает :) Объект-то новый ;)
34 Bober
 
05.07.11
17:26
(33) Новый - еще не записанный на момент записи набора записей в РС?
35 Ayvengo
 
05.07.11
17:27
Даже если так делать, перед записью, такая же фигня происходит


       Источник.УстановитьСсылкуНового(Справочники[ИмяСправочника].ПолучитьСсылку(Новый УникальныйИдентификатор));
       СсылкаНаОбъект = Источник.ПолучитьСсылкуНового();
       МенеджерЗаписи                = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
       МенеджерЗаписи.Значение    = КодДля1С77;
       МенеджерЗаписи.Объект        = СсылкаНаОбъект;
       МенеджерЗаписи.Свойство    = Свойство;
       МенеджерЗаписи.Записать(ИСТИНА);
36 Ayvengo
 
05.07.11
17:28
(35) фигня такого рода: у справочника контрагенты свойство не задается, а у справочника договор задается...
37 Ayvengo
 
05.07.11
17:29
Куда бы капнуть то =\
38 Ayvengo
 
05.07.11
17:29
в рюмку 100г и домой :D
39 Ayvengo
 
05.07.11
17:36
(34) Новый - это значит, что перед записью ЭтоНовый() = Истина.
40 Ayvengo
 
05.07.11
17:41
А самое плачевное, что даже если объект не новый, просто перезаписываю.. все-равно свойство не добавляется =\
41 Ayvengo
 
05.07.11
17:49
Это ппц... попробовал следующее:
В обработчике при записи (с номенклатурой уже) такой код:

       Свойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("00000000004");
       МенеджерЗаписи                = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
       МенеджерЗаписи.Значение    = "=" + Прав(Источник.Код,7);
       МенеджерЗаписи.Объект        = Источник.Ссылка;
       МенеджерЗаписи.Свойство    = Свойство;
       МенеджерЗаписи.Период        = ТекущаяДата();
       МенеджерЗаписи.Активность    = Истина;
       МенеджерЗаписи.Записать();

В обработке, где я выбираю нужный мне элемент справочника:
СсылкаНаОбъект - выбранный элемент справочника.
   
Свойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("00000000004");
   МенеджерЗаписи                = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
   МенеджерЗаписи.Значение    = "=" + Прав(СсылкаНаОбъект.Код,7);
   МенеджерЗаписи.Объект        = СсылкаНаОбъект;
   МенеджерЗаписи.Свойство    = Свойство;
   МенеджерЗаписи.Период        = ТекущаяДата();
   МенеджерЗаписи.Активность    = Истина;
   МенеджерЗаписи.Записать();
42 Ayvengo
 
05.07.11
17:50
И что вы думаете? При срабатывании при записи ничего не добавляется в регистр, а обработкой все отлично добавляется... может где-то что-то с сервером связано? может что-то на сервере не выполняется =\
43 Bober
 
05.07.11
17:51
(41) (42) пошел в разнос
44 Ayvengo
 
05.07.11
17:51
Кудаж копать то :\
45 Bober
 
05.07.11
17:52
код написанный в (0) -рабочий
46 Ayvengo
 
05.07.11
17:53
(45) вот и я там ошибок не вижу ... но у меня работает как-то не понятно :(
47 Bober
 
05.07.11
17:54
(44) нужно поставить точку остановки в отладчике в модуле набора записей и посмотреть, что перед записью. поставить точку остановки при записи и посмотреть, что в наборе после записи
48 Bober
 
05.07.11
17:54
посмотреть, появляется-ли запись в журнале регистрации
49 Ayvengo
 
05.07.11
17:57
(48) появляется запись в журнале регистраций, но данные пустые :(
50 Ayvengo
 
05.07.11
18:02
(47) жесть какая-то .. 3 раза объект записывается о_О на втором записи пустые уже по этому регистру сведений... мдааааа....
51 Ayvengo
 
05.07.11
18:06
Почему пустые .. нипанятна...
52 Bober
 
05.07.11
18:23
(51) посмотри в стек вызывов
53 Шапокляк
 
05.07.11
18:35
(50) Значит в какой-то момент подписка отработала на новом, не имеющем ссылки объекте. В регистре сведений установился отбор по пустому объекту и в результате все записи регистра сведений потерлись.
54 Bww_
 
05.07.11
18:45
Проблема в том, что запись в подписке не попадает в транзакцию записи контрагента и как следствие - у тебя все правильно - и все записывается, но идет откат.
Умные товарищи, здесь на сайте, наверное знают решение.
Я пока плюнул, хотя в ближайшее время аналогичные очень нужны...
55 Ayvengo
 
06.07.11
10:53
(54) Но это странно, т.к. транзакция одна, по крайней мере так пишет журнал =\
Эх ... буду продолжать поиски решения проблемы ... =/
56 Ayvengo
 
06.07.11
12:03
Отрыл я эту злосчастную процедуру... ох ... какие же 1С молодцы ....

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


Эта процедура в договоре используется так:
Свойства - это обработка записи значений свойств

Свойства.ЗаписатьЗначенияСвойств();

а в контрагенте

   Если Свойства.ЗначенияСвойствМодифицированы() Тогда
       Свойства.ЗаписатьЗначенияСвойств();
       ОбновитьСвойства();
   КонецЕсли;

я плакал ...
57 Ayvengo
 
06.07.11
12:07
В номенклатуре, кстати, по другому условия стоят .. везде по своему в общем ...
58 Ayvengo
 
06.07.11
12:22
А самая няшка кроется в процедуре ПрочитатьТаблицуСвойствИЗначений() этой обработке "ЗначенияСвойствОбъекта" ...
59 Ayvengo
 
06.07.11
12:33
Даа! И еще очень нравится однообразные названия этой обработки в формах ... в номенклатуре одно, в контрагентах другое ... ааа.. нелюбофь к 1совцам.. точно..
60 Ayvengo
 
06.07.11
13:03
С такой подпиской все работает замечательно :) Может кому пригодится
       #Если Клиент Тогда
           Форма        = Источник.ПолучитьФорму();
           Обработка = Неопределено;
           ИмяОбработкиСвойств = "";
           Если ИмяСправочника = "Номенклатура" и Не Источник.ЭтоГруппа Тогда
               ИмяОбработкиСвойств = "ОбработкаОбъектЗначенияСвойств";
           ИначеЕсли ИмяСправочника = "Контрагенты" и Не Источник.ЭтоГруппа Тогда
               ИмяОбработкиСвойств = "Свойства";
           ИначеЕсли ИмяСправочника = "ДоговорыКонтрагентов" и Не Источник.ЭтоГруппа Тогда
               ИмяОбработкиСвойств = "Свойства";
           ИначеЕсли ИмяСправочника = "Склады" и Не Источник.ЭтоГруппа Тогда
               ИмяОбработкиСвойств = "Свойства";
           КонецЕсли;
           Если Не ПустаяСтрока(ИмяОбработкиСвойств) Тогда
               Выполнить("Обработка    = Форма."+ИмяОбработкиСвойств);
               Обработка.НазначениеСвойств        = Свойство.НазначениеСвойства;
               Обработка.ОбъектОтбораНазначений    = Свойство.НазначениеСвойства;
               Обработка.ОбъектОтбораЗначений        = Источник.Ссылка;
               СтрСвойств                            = Обработка.СвойстваИЗначения.Добавить();
               СтрСвойств.Значение                = КодДля1С77;
               СтрСвойств.Свойство                = Свойство;
               СтрСвойств.ПометкаУдаления            = Ложь;
               Обработка.ЗаписатьЗначенияСвойств();
           Иначе
               МенеджерЗаписи                    = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
               МенеджерЗаписи.Значение        = КодДля1С77;
               МенеджерЗаписи.Объект            = Источник.Ссылка;
               МенеджерЗаписи.Свойство        = Свойство;
               МенеджерЗаписи.Период            = ТекущаяДата();
               МенеджерЗаписи.Активность        = Истина;
               МенеджерЗаписи.Записать();
           КонецЕсли;
       #КонецЕсли
       #Если Сервер Тогда
           МенеджерЗаписи                    = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
           МенеджерЗаписи.Значение        = КодДля1С77;
           МенеджерЗаписи.Объект            = Источник.Ссылка;
           МенеджерЗаписи.Свойство        = Свойство;
           МенеджерЗаписи.Период            = ТекущаяДата();
           МенеджерЗаписи.Активность        = Истина;
           МенеджерЗаписи.Записать();
       #КонецЕсли
КонецЕсли;
61 Amiralnar
 
06.07.11
13:35
Стало быть отладку наконец запустили?
62 Ayvengo
 
06.07.11
14:36
(61) вчера в эту процедуру не попадал, сегодня в другом месте решил точки останова поставить, и мифическим образом чудо свершилось ;) Все-таки на свежую голову лучше работается :D
63 Amiralnar
 
06.07.11
16:06
Тогда вам будет интересно:
У модуля регистра есть процедура ПриЗаписи.
В этой процедуре можно поставить точку останова.
При срабатывает точки можно увидеть:
Отбор, и содержимое набора записей;
Стек вызовов.
Эти данные позволяют очень быстро ответить на вопросы:
Что, откуда и куда.
Кто, зачем  почему.
64 Ayvengo
 
07.07.11
16:33
(63) спасибо, я как раз и создал такую процедуру и уже от туда проследил что да как происходит ;)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.