Имя: Пароль:
1C
1С v8
Как проверить существование записи в регистр сведений?
0 kuromanlich
 
08.10.11
16:44
т.е. есть запись. мы ее перезаписываем. перезаписываем не программно, а мануально, из собственной формы регистра сведений. как програмно определить есть ли такая запись в программе, или же эту запись в данный момент добавили?
1 Luhtas
 
08.10.11
16:47
(0) Запрос с условием по этой записи к регистру сведений не?
2 Один С
 
08.10.11
16:49
если такая запись в регистре есть, то регистра поругается на то, что такая запись уже есть..
3 kuromanlich
 
08.10.11
16:54
(2) согласен. но как понять что запись перезаписывают или добавили новую?
4 kuromanlich
 
08.10.11
16:55
(1) весь сыр бор в том, что при перезаписи данных нет.
5 kuromanlich
 
08.10.11
17:27
апа
6 Jaffar
 
08.10.11
17:36
(3) очевидно - перед записью ее там поискать.
7 kuromanlich
 
08.10.11
17:38
(6) гы гы ) вот тут и проблема... пока он перед записью запрос у меня пустым выходит...
8 Explorer1c
 
08.10.11
17:42
(6)Странная-проблемма-зачем-это-ваабще-нужно?Заполнисначаларегистр-программно-а-потом-открой-доступ-пользователям
9 kuromanlich
 
08.10.11
17:43
(8) описываю маразм: добавлять можно, изменять уже добавленное нельзя. вот и пытаюсь реализовать.
10 Explorer1c
 
08.10.11
17:48
(9)Запрос-по-регистру-если-есть-запись-тогда-выходим-из-процедуры.Выполняем-в-одной-транзакции,т.е-блокируем-таблицу-на-время-записи
11 Jaffar
 
08.10.11
17:55
(7) чем не критерий? пустой запрос - добавление, не пустой - редактирование.
12 Necessitudo
 
08.10.11
18:35
(10) плюс 1
13 Explorer1c
 
08.10.11
19:00
(12)Всмысле?
14 Renat11111
 
08.10.11
20:48
чем не подходит?

РегистрСведенийМенеджерЗаписи.<Имя регистра сведений>.Выбран (InformationRegisterRecordManager.<Имя регистра сведений>.Selected)
РегистрСведенийМенеджерЗаписи.<Имя регистра сведений> (InformationRegisterRecordManager.<Имя регистра сведений>)
Выбран (Selected)
Синтаксис:
Выбран()
Возвращаемое значение:
Тип: Булево. Истина - набор не изменялся; Ложь - изменялся, в частности, если набор не считывался и не записывался, а также, если записывался с добавлением записей.
Описание:
Определяет, считана запись или нет.
Примечание:
При изменении отбора считается, что набор перестает быть считанным.
Пример:
Если Не Курс.Выбран() Тогда
   Предупреждение("Курс не считан");
КонецЕсли;
15 Renat11111
 
08.10.11
20:49
+(14) это сп между прочим
16 hhhh
 
08.10.11
21:04
(7) это самый главный секрет 1С. А не заметил, что перед записью 2 раза вызывается?
17 kuromanlich
 
09.10.11
09:50
(16) заметил )
18 kuromanlich
 
09.10.11
11:33
(15) это не подходит для случая когда событие генерирует сам рег сведений. т.е. если скажем я буду пытаться применить это в модуле объекта рег.свед в процедуре "призаписи" или "передзаписью" то не я ставлю "отбор" и "прочитываю", это делает сама программа. соответственно нет возможности использовать этот операнд.
19 kuromanlich
 
10.10.11
16:04
up
20 ptiz
 
10.10.11
16:07
ТабличноеПоле (TableBox)
ПриНачалеРедактирования (OnStartEdit)
Синтаксис:
ПриНачалеРедактирования(<Новая строка>, <Копирование>)
Параметры:
<Новая строка>
Тип: Булево. Признак редактирования новой строки. Имеет значение Истина, если строка была добавлена или скопирована.
<Копирование>
Тип: Булево. Если данный параметр имеет значение Истина, то выполняется копирование строки.
Описание:
Возникает при начале редактирования старой или добавленной строки табличного поля. В процедуре - обработчике события нельзя отказаться от редактирования, но могут быть выполнены действия, необходимые при вводе новой строки, например, установка начальных значений.
21 ptiz
 
10.10.11
16:09
Хотя нет, там отказаться нельзя.
Но можно тут:
ПередОкончаниемРедактирования
22 kuromanlich
 
10.10.11
16:09
(20) уже пробывал. Но это есть не универсально. нельзя таким способом с помощью скажем подписки на события сделать для всех регистров. интересует как это сделать в "призаписи" "пеердзаписью" "проверказаполнения"
23 ptiz
 
10.10.11
16:19
Посмотрел сейчас, при перезаписи из формы "вручную" обработчики срабатывают дважды:
1 раз - удаление старого набора (в обработчике ПередЗаписью записи еще есть, ПриЗаписи - нет)
2 раз - запись нового ((в обработчике ПередЗаписью записей нет, ПриЗаписи - есть)

Нам достаточно того, что при первом срабатывании, смотрим ПередЗаписью - если запись была, значит её изменяют или удаляют, ставим Отказ.
24 kuromanlich
 
10.10.11
16:22
(23) тут и проблема. если есть время попробуй сделать. у меня запрос пустоту выдает ри перезуписи существующего.
25 ptiz
 
10.10.11
16:23
Давно уж сделал, почему и написал

Процедура ПодпискаНаСобытие1ПередЗаписью(Источник, Отказ, Замещение, ТолькоЗапись, ЗаписьФактическогоПериодаДействия, ЗаписьПерерасчетов) Экспорт
   
   Набор = РегистрыСведений.РС1.СоздатьНаборЗаписей();
   Набор.Отбор.Период.Установить(Источник.Отбор.Период.Значение);
   Набор.Отбор.Работа.Установить(Источник.Отбор.Работа.Значение);
   
   Набор.Прочитать();
   
   Сообщить("Количество записей Перед записью = " + Набор.Количество());
   
   Если Набор.Количество() > 0 Тогда
       Отказ = Истина;
   КонецЕсли;
   
КонецПроцедуры
26 kuromanlich
 
10.10.11
16:26
(25) хм... странно что запрос у меня пустым выходит, а то что ты показываешь нет... но с другой стороны механизмы извлечения данных могут быть разными у 1С для запроса и для чтения набора... будем пробывать. в моем случае еще правда отбор нужно заполнить весь и для всех...
27 kuromanlich
 
10.10.11
16:26
(27) спасибо за помощь )
28 ptiz
 
10.10.11
16:42
(26) Механизмы абсолютно одинаковые. Скорее всего, что-то другое передаешь в отбор.
29 kuromanlich
 
10.10.11
18:31
вот код


Процедура ДополнительныйКонтрольДоступаРегистрыСведенийПриЗаписи(Источник, Отказ, Замещение) Экспорт
   ТЗРС=Источник.Выгрузить();
   НЗРС=РегистрыСведений.Заметки.СоздатьНаборЗаписей();
   
   Для Каждого стр Из источник Цикл
       Для Каждого ИмяКолонки Из ТЗРС.Колонки Цикл
           Попытка
               НЗРС.Отбор[ИмяКолонки.имя].Использование=Истина;
               НЗРС.Отбор[ИмяКолонки.имя].Значение=стр[ИмяКолонки.имя];
           Исключение
           КонецПопытки;
           
       КонецЦикла;
       НЗРС.Прочитать();
       сообщить("ПриЗаписи "+НЗРС.Количество());
   КонецЦикла;
КонецПроцедуры

Процедура ПодпискаНаСобытие1ПередЗаписью(Источник, Отказ, Замещение) Экспорт
   ТЗРС=Источник.Выгрузить();
   НЗРС=РегистрыСведений.Заметки.СоздатьНаборЗаписей();
   
   Для Каждого стр Из источник Цикл
       Для Каждого ИмяКолонки Из ТЗРС.Колонки Цикл
           Попытка
               НЗРС.Отбор[ИмяКолонки.имя].Использование=Истина;
               НЗРС.Отбор[ИмяКолонки.имя].Значение=стр[ИмяКолонки.имя];
           Исключение
           КонецПопытки;
           
       КонецЦикла;
       НЗРС.Прочитать();
       сообщить("ПередЗаписью "+НЗРС.Количество());
   КонецЦикла;
КонецПроцедуры
30 kuromanlich
 
10.10.11
18:32
(29) если запись мы перезаписываем выдает:
ПередЗаписью 0
ПриЗаписи 1

если добавляем то:
ПередЗаписью 0
ПриЗаписи 1
31 kuromanlich
 
10.10.11
18:34
(29)и(30) т.о. то что у тебя в (25) работает конечно, но с помощью него нельзя определить когда новую запись заносят, а когда старую редактируют
32 kuromanlich
 
10.10.11
18:39
и еще. заметил следующее: хотя перед записью и запрос и чтение набора выдают пустой результат, под другим сеансом если в этот же момент запросом получать то же самое оно получается (операйия проводится с помощью точки останова).
33 kuromanlich
 
10.10.11
18:49
ура!
нашел!
ОбработкаПроверкиЗаполнения выолняется перед тем как 1С перезаписывает набор, т.о. получается, что если это новое, то записей действительно нет, а если есть, то они (записи набора) еще "не считаны" и соответственно все еще существуют.

всем спасибо.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший