Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Ermak27
4 / 4 / 0
Регистрация: 16.01.2013
Сообщений: 1,199
1

Работа с регистром

08.10.2015, 17:21. Просмотров 1050. Ответов 14
Метки нет (Все метки)

Встала такая задача при каждом изменении реквизита Статус и сохранении документа нужно создавать новый Регистр сведений. Вот я сделал процедуру

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Процедура СтатусПриИзменении(Элемент)
    Движение = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьНаборЗаписей();
    Движение.Отбор.Регистратор.Установить(Ссылка);
    Движение.Прочитать();
    НоваяЗапись = Движение.Добавить();
    НоваяЗапись.Период = ТекущаяДата();
    НоваяЗапись.ДатаЗаявки = Дата;
    НоваяЗапись.ДатаСтатуса = ТекущаяДата();
    НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
    НоваяЗапись.ТипЗаявки = ТипЗаявки;
    НоваяЗапись.Причина = Причина;
    НоваяЗапись.Статус = Статус;
    НоваяЗапись.Заявка = Ссылка;
    Движение.Записать();
КонецПроцедуры
Но почему то он переписывает существующую запись, как исправить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2015, 17:21
Ответы с готовыми решениями:

Работа с регистром сведений
И снова доброго времени суток! Всплыл такой вопрос... Есть документ...

Косяк с регистром
Добрый день, есть документ с ТЧ, и на форме поле - оплатить долг. При движении...

Работа с периодическим Регистром Сведений подчиненным регистратору
Я хочу добавить записи в регистр сведений подчинённый регистратору. Прочитал,...

Проблемы с регистром Книга продаж
Здравствуйте, не раз уже встречаюсь с такой проблемой в ПУБ 7.70.301, в...

Помогите разобраться с регистром накопления
Здравствуйте, У меня проблема заключается в том что в 1С версии 8.0 по...

14
Xomych
665 / 588 / 89
Регистрация: 01.11.2012
Сообщений: 2,080
08.10.2015, 20:22 2
Синтаксис:

Записать(<Замещать>)
Параметры:

<Замещать> (необязательный)

Тип: Булево.
Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям.
Значение по умолчанию: Истина.
0
Ermak27
4 / 4 / 0
Регистрация: 16.01.2013
Сообщений: 1,199
09.10.2015, 09:03  [ТС] 3
Xomych, что то я не понял. Сделал Движение.Записать(Ложь); и добавил в Процедура ПриЗаписи(Отказ) выдает ошибку что запись с такими полями уже существует и не сохраняет
0
SHIFT_969
Злой самаритянин
178 / 179 / 94
Регистрация: 24.04.2014
Сообщений: 686
Завершенные тесты: 1
09.10.2015, 10:34 4
http://v8.1c.ru/overview/InformationReg.htm

Уникальность записей

Система обеспечивает контроль уникальности записей, хранящихся в регистре сведений. Таким образом, в регистре сведений не может находиться двух одинаковых записей. Одинаковыми считаются записи, у которых совпадает ключ записи. Ключ записи формируется системой автоматически, на основании значений, содержащихся в полях записи, и зависит от вида регистра сведений.

В общем случае в формировании ключа записи будут участвовать значения регистратора, периода и значения измерений. Таким образом, например, в непериодическом регистре сведений ЦеныКомпании с независимым режимом записи не может существовать двух записей о розничной цене конфет ассорти. Точно так же, как в периодическом регистре сведений ЦеныКомпании, подчиненном регистратору, не может существовать двух записей о розничной цене конфет ассорти, внесенных одной и той же датой, одним и тем же документом ИзменениеЦенКомпании.
Если он у тебя в пределах даты, то 2 одинаковые записи за дату быть не могут.
0
Ermak27
4 / 4 / 0
Регистрация: 16.01.2013
Сообщений: 1,199
12.10.2015, 10:59  [ТС] 5
Выдает ошибку

{Документ.ЗаявкаЕдиноеОкно.Форма.ФормаДокумента.Форма(23)}: Ошибка при вызове метода контекста (Записать)

Движение.Записать(Ложь);

по причине:

Запись с такими ключевыми полями существует! : СтатусЗаявокЕдиноеОкно: 12.10.2015 0:00:00, Заявка единое окно 000000003 от 12.10.2015 0:00:00, 12.10.2015 0:00:00, Заявка единое окно 000000003 от 12.10.2015 0:00:00, 102 100 012, Ремонт плиты, фыфафа, 12.10.2015 0:00:00 (Регистр сведений: Статус заявок единое окно; Номер строки: 3)
0
Volexovich
199 / 175 / 29
Регистрация: 24.10.2011
Сообщений: 696
12.10.2015, 15:15 6
Что значит создать новый регистр сведений?
Может добавить запись или изменить имеющуюся?

Все понял, тебе надо добавлять запись на каждое новое событие, делай так:

1C
1
2
3
4
5
6
7
8
9
10
11
12
Процедура СтатусПриИзменении(Элемент)
    НоваяЗапись = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьМенеджерЗаписи();
    НоваяЗапись.Период = ТекущаяДата();
    НоваяЗапись.ДатаЗаявки = Дата;
    НоваяЗапись.ДатаСтатуса = ТекущаяДата();
    НоваяЗапись.ЛицевойСчет = ЛицевойСчет;
    НоваяЗапись.ТипЗаявки = ТипЗаявки;
    НоваяЗапись.Причина = Причина;
    НоваяЗапись.Статус = Статус;
    НоваяЗапись.Заявка = Ссылка;
    НоваяЗапись.Записать();
КонецПроцедуры
1
Ermak27
4 / 4 / 0
Регистрация: 16.01.2013
Сообщений: 1,199
12.10.2015, 15:30  [ТС] 7
Volexovich, выдает ошибку

{Документ.ЗаявкаЕдиноеОкно.Форма.ФормаДокумента.Форма(98)}: Ошибка при вызове метода контекста (СоздатьМенеджерЗаписи)
НоваяЗапись = РегистрыСведений.СтатусЗаявокЕдиноеОкно.СоздатьМенеджерЗаписи();
по причине:
Менеджер записи не может быть использован для регистра с режимом записи "Подчинение регистратору"
0
Dethmontt
Модератор
Эксперт 1С
2643 / 2436 / 415
Регистрация: 10.03.2011
Сообщений: 8,699
Записей в блоге: 1
Завершенные тесты: 1
13.10.2015, 00:22 8
Ermak27, какая периодичность установлена у регистра?

Добавлено через 1 минуту
Ermak27, установи "в пределах секунды" и повтори свой код из первого поста с
Движение.Записать(ЛОЖЬ);
0
Volexovich
199 / 175 / 29
Регистрация: 24.10.2011
Сообщений: 696
13.10.2015, 12:28 9
Какие измерения/реквизиты заданы ведущими в регистре?
0
Ermak27
4 / 4 / 0
Регистрация: 16.01.2013
Сообщений: 1,199
13.10.2015, 13:02  [ТС] 10
Dethmontt, Все сделал как написали, выдает ошибку

{Документ.ЗаявкаЕдиноеОкно.Форма.ФормаДокумента.Форма(23)}: Ошибка при вызове метода контекста (Записать)

Движение.Записать(Ложь);

по причине:

Запись с такими ключевыми полями существует! : СтатусЗаявокЕдиноеОкно: 12.10.2015 0:00:00, Заявка единое окно 000000003 от 12.10.2015 0:00:00, 12.10.2015 0:00:00, Заявка единое окно 000000003 от 12.10.2015 0:00:00, 102 100 012, Ремонт плиты, фыфафа, 12.10.2015 0:00:00 (Регистр сведений: Статус заявок единое окно; Номер строки: 3)
0
Ermak27
4 / 4 / 0
Регистрация: 16.01.2013
Сообщений: 1,199
13.10.2015, 13:02  [ТС] 11
Volexovich, Прикрепил
0
Изображения
 
Volexovich
199 / 175 / 29
Регистрация: 24.10.2011
Сообщений: 696
13.10.2015, 13:41 12
По измерению правой кнопкой, свойства.
Ведущее - у кого стоит?
0
Ermak27
4 / 4 / 0
Регистрация: 16.01.2013
Сообщений: 1,199
13.10.2015, 16:19  [ТС] 13
Volexovich, не у кого ведущий не стоит
0
Volexovich
199 / 175 / 29
Регистрация: 24.10.2011
Сообщений: 696
15.10.2015, 12:58 14
Периодичность регистра какая?
0
sigmov
577 / 364 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
Завершенные тесты: 2
15.10.2015, 20:16 15
1. Переодичность судя по всему "в течении дня" - это значит что за 1 день нельзя изменить более чем 1 раз
2. Если у вас подчиненный регистратору регистр - то при отмене проведения - записи будут удалены
3. Задача "Сохранять при любом изменении" алогична - пока кнопочка "Сохранить" у документа не нажата - любые изменение суть "черновик". Логгировать их нету смысла

Мной задача решалась так:
Регистр сведений - без регистратора, не периодический
Измерения - все которые нужны + ПорядковыйНомер (Число(15)) - будет отвечать за номер измерения записи
ПриЗаписи документа - получаем крайнее значение реквизита из регистра, если оно не соответсвует текущему - создаем и сохраняем в регистр новую запись под следующим порядковым номером

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Процедура ПриЗаписи(Отказ)
    Попытка
        
        // Создаем структуру заполнения
        ЗначенияИзмерений = Новый Структура("Документ", ЭтотОбъект.Ссылка); // Сюда все измерения и их значения, кроме "ПорядковыйНомер"
        
        // Создаем менеджер записи и заполняем его измерения
        НоваяЗапись = РегистрыСведений.ЛогИзмененийРеквизита.СоздатьМенеджерЗаписи();
        ЗаполнитьЗначенияСвойств(НоваяЗапись, ЗначенияИзмерений);
        
        // Заполняем ресурс
        НоваяЗапись.Ресурс = ЭтотОбъект.ЛоггируемыйРеквизит;
        
        // Блокируем по всем измерениям кроме "ПорядковыйНомер", чтобы избежать конфликта нумерации
        Блокировка = Новый БлокировкаДанных;
        ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЛогИзмененийРеквизита");
        ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        Для Каждого ЭлементОтбора Из ЗначенияИзмерений Цикл
            ЭлементБлокировки.УстановитьЗначение(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);   
        КонецЦикла; 
        Блокировка.Заблокировать();
        
        // Запрашиваем номер крайней записи + 1 и значение ее ресурса
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |   ЛогИзмененийРеквизита.ПорядковыйНомер + 1 КАК ПорядковыйНомер,
            |   ЛогИзмененийРеквизита.Ресурс
            |ИЗ
            |   РегистрСведений.ЛогИзмененийРеквизита КАК ЛогИзмененийРеквизита
            |ГДЕ
            |   ЛогИзмененийРеквизита.Документ = &Документ
            |
            |УПОРЯДОЧИТЬ ПО
            |   ПорядковыйНомер УБЫВ";
        
        Запрос.УстановитьПараметр("Документ", ЭтотОбъект.Ссылка);
        РезультатЗапроса = Запрос.Выполнить();
        
        Курсор = РезультатЗапроса.Выбрать();
        Если Курсор.Следующий() Тогда
            Если (Курсор.Ресурс <> НоваяЗапись.Ресурс) Тогда // Проверяем что значение было все-таки изменено
                ЗаполнитьЗначенияСвойств(НоваяЗапись, Курсор, "ПорядковыйНомер"); // Заполняем следующий порядковый номер
                НоваяЗапись.Записать(Ложь);
            КонецЕсли; 
        Иначе
            НоваяЗапись.Записать(Ложь); // Записываем как "свежую"
        КонецЕсли;
        
    Исключение
        Отказ = Истина;
        Сообщить(ОписаниеОшибки());
    КонецПопытки; 
КонецПроцедуры
Тестовая база:
LogChangeField.zip
0
15.10.2015, 20:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2015, 20:16

Как работать из Delphi с регистром 1С через OLE
Помогите разобраться с таким делом: Нужно считать из 1С 8 данные по...

Вывод символов с нижним регистром и верхним регистром
Стоит задача, водится строка, при выводе должно быть две строки, одна выводит...

Проблема с регистром
Здравствуйте. Имеется текстовый столбец где значения хранятся большими...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru