Имя: Пароль:
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) спасибо, я как раз и создал такую процедуру и уже от туда проследил что да как происходит ;)