Имя: Пароль:
1C
1С v8
Ошибка при записи в регистр сведений.
0 Ly_Alena
 
12.02.19
09:29
Добрый день!
Регистр сведений - периодический неподчиненный.

НаборЗаписей = РегистрыСведений.РегистрацияКадровыхДокументов.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
        НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаЗаписейРегистра.Сотрудник);
        
        Для Каждого НоваяЗапись Из НаборЗаписей Цикл
                НоваяЗапись = НаборЗаписей.Добавить();
                    
                НоваяЗапись.Период             = Дата;    
                НоваяЗапись.НомерПорядковый = НаборЗаписей.НомерПорядковый + КоличествоПриказов;
                НоваяЗапись.БукваНомера     = НаборЗаписей.БукваНомера;
                НоваяЗапись.Документ         = Ссылка;
                НоваяЗапись.Сотрудник         = НаборЗаписей.Сотрудник;
                НоваяЗапись.Автор            = ЭтотОбъект.Автор;
                НоваяЗапись.Отредактировано = Справочники.Пользователи.ПустаяСсылка();
                
                КоличествоПриказов             = КоличествоПриказов + 1;
            КонецЦикла

НаборЗаписей.Записать();

При отладке ошибка:
НаборЗаписей.Отбор.Документ.Установить    {(1)}: Поле объекта не обнаружено (Установить)
1 Ly_Alena
 
12.02.19
09:30
Мне нужно чтобы номера по новой не присваивались, если такие записи уже есть.
2 Радим1987
 
12.02.19
09:36
Документ измрение?
3 Ly_Alena
 
12.02.19
09:37
Пардон!
НоваяЗапись = НаборЗаписей.Добавить();
                    
                НоваяЗапись.Период             = Дата;    
                НоваяЗапись.НомерПорядковый = ВыборкаЗаписейРегистра.НомерПорядковый + КоличествоПриказов;
                НоваяЗапись.БукваНомера     = ВыборкаЗаписейРегистра.БукваНомера;
                НоваяЗапись.Документ         = Ссылка;
                НоваяЗапись.Сотрудник         = ВыборкаЗаписейРегистра.Сотрудник;
                НоваяЗапись.Автор            = ЭтотОбъект.Автор;
                НоваяЗапись.Отредактировано = Справочники.Пользователи.ПустаяСсылка();
                
                КоличествоПриказов             = КоличествоПриказов + 1;
4 Ly_Alena
 
12.02.19
09:37
(2) Документ и Сотрудник - измерение
5 Радим1987
 
12.02.19
09:40
НаборЗаписей.Прочитать();
6 Ly_Alena
 
12.02.19
09:42
(5) Пробовала - не работает.
7 Ly_Alena
 
12.02.19
09:42
НаборЗаписей.Прочитать    {(1)}: Поле объекта не обнаружено (Прочитать)
8 Радим1987
 
12.02.19
09:44


    СтруктураОтвет = Новый Структура("Результат, ОписаниеОшибки");

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

        НаборЗаписей.Прочитать();
        Если НаборЗаписей.Количество() > 0 Тогда
            Запись = НаборЗаписей[0];            
        Иначе
            Запись = НаборЗаписей.Добавить();            
        КонецЕсли;

        ЗаполнитьЗначенияСвойств(Запись, СтруктураИзмерений);    
        Запись.ОбъектСсылка = ОбъектСсылка;
                
        НаборЗаписей.Записать();  
        СтруктураОтвет.Вставить("Результат", Истина);

    Исключение        
        СтруктураОтвет.Вставить("Результат", Ложь);
        СтруктураОтвет.Вставить("ОписаниеОшибки", ОписаниеОшибки());

    КонецПопытки;
    
    Возврат СтруктураОтвет;

9 Ly_Alena
 
12.02.19
09:50
(8) не работает прочитать и установить
10 Ly_Alena
 
12.02.19
09:52
(8) (9) Я много перерыла примеров, прежде чем написать. Какой-то тупняк.
11 Numerus Mikhail
 
12.02.19
09:52
(9) Значит что-то обманываете
Возможно забыли обновить базу?
Ну и для начала сделай

Сообщить(ТипЗнч(НаборЗаписей));
12 hhhh
 
12.02.19
09:53
(9) НаборЗаписей2 = РегистрыСведений.РегистрацияКадровыхДокументов.СоздатьНаборЗаписей();
НаборЗаписей2.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
13 Ly_Alena
 
12.02.19
09:55
(11) Регистр сведений набор записей: Регистрация кадровых документов
14 Ly_Alena
 
12.02.19
09:56
(12) не поняла - смысл только в НаборЗаписей2?
15 Радим1987
 
12.02.19
10:01
Конфигураторе установлен режим записи "Подчинение регистратору", отбор возможен только по регистратору, для периодических регистров сведений отбор возможен по периоду и значениям измерений, для непериодических - только по значению измерений.
16 Радим1987
 
12.02.19
10:02
НаборЗаписей.Отбор.Период.Установить(КакойтоПериод);
17 Радим1987
 
12.02.19
10:03
Попробуй установить по периоду
18 Ly_Alena
 
12.02.19
10:16
(15) (16) (17)
Проблема была в цикле:
Пока ВыборкаЗаписейРегистра.Следующий() Цикл
            Сообщить(ВыборкаЗаписейРегистра.Документ);
            Сообщить(ВыборкаЗаписейРегистра.Сотрудник);
            НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
            НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаЗаписейРегистра.Сотрудник);
        
            НоваяЗапись = НаборЗаписей.Добавить();
                        
            НоваяЗапись.Период             = Дата;    
            НоваяЗапись.НомерПорядковый = ВыборкаЗаписейРегистра.НомерПорядковый + КоличествоПриказов;
            НоваяЗапись.БукваНомера     = ВыборкаЗаписейРегистра.БукваНомера;
            НоваяЗапись.Документ         = Ссылка;
            НоваяЗапись.Сотрудник         = ВыборкаЗаписейРегистра.Сотрудник;
            НоваяЗапись.Автор            = ЭтотОбъект.Автор;
            НоваяЗапись.Отредактировано = Справочники.Пользователи.ПустаяСсылка();
                    
            КоличествоПриказов             = КоличествоПриказов + 1;
        КонецЦикла;

Но сейчас вылетает ошибка
{Документ.ТрудовыеОтпускаОрганизаций.МодульОбъекта(1880)}: Ошибка при вызове метода контекста (Записать)
    НаборЗаписей.Записать();
по причине:
Запись не верна! Значение поля не соответствует установленному отбору:
19 Ly_Alena
 
12.02.19
10:17
Хоть при перепроведении того же документа, хоть при проведении другого
20 hhhh
 
12.02.19
10:22
НаборЗаписей.Отбор.Документ.Установить(Ссылка);
21 Numerus Mikhail
 
12.02.19
10:25
(19) Покажи код, который в данный момент у тебя написан
начиная от создания набора записей, заканчивая записью.
22 Ly_Alena
 
12.02.19
10:31
Функция ПроверитьЗаписиРегистраРегистрацияКадровыхДокументов()
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РегистрацияКадровыхДокументов.НомерПорядковый,
        |    РегистрацияКадровыхДокументов.БукваНомера,
        |    РегистрацияКадровыхДокументов.Документ,
        |    РегистрацияКадровыхДокументов.Сотрудник
        |ИЗ
        |    РегистрСведений.РегистрацияКадровыхДокументов.СрезПоследних КАК РегистрацияКадровыхДокументов";
    
        
    Возврат Запрос.Выполнить();
    
КонецФункции


Процедура ПрисвоитьПорядковыйНомер()
    
    ВыборкаЗаписейРегистра = ПроверитьЗаписиРегистраРегистрацияКадровыхДокументов().Выбрать();
    
    НаборЗаписей = РегистрыСведений.РегистрацияКадровыхДокументов.СоздатьНаборЗаписей();
    
    КоличествоПриказов = 0;
    
    Если ВыборкаЗаписейРегистра.Количество() > 0 Тогда
        
        Пока ВыборкаЗаписейРегистра.Следующий() Цикл
            НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
            НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаЗаписейРегистра.Сотрудник);
        
            НоваяЗапись = НаборЗаписей.Добавить();
                        
            НоваяЗапись.Период             = Дата;    
            НоваяЗапись.НомерПорядковый = ВыборкаЗаписейРегистра.НомерПорядковый + КоличествоПриказов;
            НоваяЗапись.БукваНомера     = ВыборкаЗаписейРегистра.БукваНомера;
            НоваяЗапись.Документ         = Ссылка;
            НоваяЗапись.Сотрудник         = ВыборкаЗаписейРегистра.Сотрудник;
            НоваяЗапись.Автор            = ЭтотОбъект.Автор;
            НоваяЗапись.Отредактировано = Справочники.Пользователи.ПустаяСсылка();
                    
            КоличествоПриказов             = КоличествоПриказов + 1;
        КонецЦикла;
КонецЕсли;
НаборЗаписей.Записать();
КонецПроцедры
23 RomanYS
 
12.02.19
10:34
(22) НаборЗаписей.Записать(); надо в цикле делать по каждому отбору
24 Ly_Alena
 
12.02.19
10:36
Кажется я поняла - я записываю то что в регистре... Даже если там этих записей нет.
(23) пробовала
25 RomanYS
 
12.02.19
10:38
(24) Нет, тебе только кажется, что поняла)
26 Ly_Alena
 
12.02.19
10:40
Пока ВыборкаЗаписейРегистра.Следующий() Цикл
            
            НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
            НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаЗаписейРегистра.Сотрудник);
            
            Запрос = Новый Запрос;
            Запрос.Текст =
                "ВЫБРАТЬ
                |    ТрудовыеОтпускаОрганизацийРаботникиОрганизации.Сотрудник
                |ИЗ
                |    Документ.ТрудовыеОтпускаОрганизаций.РаботникиОрганизации КАК ТрудовыеОтпускаОрганизацийРаботникиОрганизации
                |ГДЕ
                |    ТрудовыеОтпускаОрганизацийРаботникиОрганизации.Ссылка = &Ссылка";
            
            Запрос.УстановитьПараметр("Ссылка", Ссылка);
            
            РезультатЗапроса = Запрос.Выполнить();
            
            ВыборкаИзДокумента = РезультатЗапроса.Выбрать();
            
            Пока ВыборкаИзДокумента.Следующий() Цикл
                КоличествоПриказов             = КоличествоПриказов + 1;
                
                НоваяЗапись = НаборЗаписей.Добавить();
                        
                НоваяЗапись.Период             = Дата;    
                НоваяЗапись.НомерПорядковый = ВыборкаЗаписейРегистра.НомерПорядковый + КоличествоПриказов;
                НоваяЗапись.БукваНомера     = ВыборкаЗаписейРегистра.БукваНомера;
                НоваяЗапись.Документ         = Ссылка;
                НоваяЗапись.Сотрудник         = ВыборкаИзДокумента.Сотрудник;
                НоваяЗапись.Автор            = ЭтотОбъект.Автор;
                НоваяЗапись.Отредактировано = Справочники.Пользователи.ПустаяСсылка();
                            
            КонецЦикла;
            
        КонецЦикла;
27 Ly_Alena
 
12.02.19
10:41
Я тупая. Не понимаю - отбор работает. Почему если проводить другой документ - ошибка не соответствует отбору. Разве не должен записать, если не соответствует?
28 Ly_Alena
 
12.02.19
10:44
(27) Ничего не записывает:
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ТрудовыеОтпускаОрганизаций.МодульОбъекта(1858)}: Ошибка при вызове метода контекста (Записать)

по причине:
Запись не верна! Значение поля не соответствует установленному отбору
29 RomanYS
 
12.02.19
10:45
(27)
>>Разве не должен записать, если не соответствует?
Не должно. Должны быть одинаковые значения:            НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
НоваяЗапись.Документ         = Ссылка;

И записывать надо при каждом отборе, набор при этом очищается.
30 RomanYS
 
12.02.19
10:47
Это самописный регистр?
31 RomanYS
 
12.02.19
10:49
Откуда вообще при проведении берется ВыборкаЗаписейРегистра.Документ. Вы хотите перезаписывать записи по другим документам?
32 Ly_Alena
 
12.02.19
11:33
(30) Регистр самописный.
(31) Из Функция ПроверитьЗаписиРегистраРегистрацияКадровыхДокументов()

Есть группа документов, по которым мне нужна сквозная нумерация. Стандартный нумератор не пойдет.

Мне нужно чтобы если документ перепроводился - то новый номер ему не присваивался, если не менялся сотрудник.
33 Ly_Alena
 
12.02.19
11:36
(32) А тем что проводятся впервые - номер присваивался по порядку
34 Ёпрст
 
12.02.19
11:40
(32) че там непонятного ? Вы отбор делаете по одному документу, а запись пытаетесь делать по другому документу.
1с-ина вас посылает лесом.
Вам нужно отбор устанавливать в цикле создания записей, а не ДО
35 RomanYS
 
12.02.19
11:43
(32) не хочется вникать в реализацию всего этого, но
-зачем снимать весь срез и обходить его?
-зачем регистр периодический?
-НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ) точно не нужно, если не собираешься перезаписывать другие документы
36 Ly_Alena
 
12.02.19
11:48
(35) срез снимаю весь - чтобы получить данные для отбора (сотрудник)
регистр - периодический, непериодический не принципиально
я собираюсь перезаписывать и другие документы тоже.
37 Ly_Alena
 
12.02.19
11:49
(35) Если я Вас правильно поняла:
Пока ВыборкаЗаписейРегистра.Следующий() Цикл
            
            //НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
            //НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаЗаписейРегистра.Сотрудник);
            
            Запрос = Новый Запрос;
            Запрос.Текст =
                "ВЫБРАТЬ
                |    ТрудовыеОтпускаОрганизацийРаботникиОрганизации.Сотрудник
                |ИЗ
                |    Документ.ТрудовыеОтпускаОрганизаций.РаботникиОрганизации КАК ТрудовыеОтпускаОрганизацийРаботникиОрганизации
                |ГДЕ
                |    ТрудовыеОтпускаОрганизацийРаботникиОрганизации.Ссылка = &Ссылка";
            
            Запрос.УстановитьПараметр("Ссылка", Ссылка);
            
            РезультатЗапроса = Запрос.Выполнить();
            
            ВыборкаИзДокумента = РезультатЗапроса.Выбрать();
            
            Пока ВыборкаИзДокумента.Следующий() Цикл
                НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
                НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаЗаписейРегистра.Сотрудник);
                КоличествоПриказов             = КоличествоПриказов + 1;
                
                НоваяЗапись = НаборЗаписей.Добавить();
                        
                НоваяЗапись.Период             = Дата;    
                НоваяЗапись.НомерПорядковый = ВыборкаЗаписейРегистра.НомерПорядковый + КоличествоПриказов;
                НоваяЗапись.БукваНомера     = ВыборкаЗаписейРегистра.БукваНомера;
                НоваяЗапись.Документ         = Ссылка;
                НоваяЗапись.Сотрудник         = ВыборкаИзДокумента.Сотрудник;
                НоваяЗапись.Автор            = ЭтотОбъект.Автор;
                НоваяЗапись.Отредактировано = Справочники.Пользователи.ПустаяСсылка();
                НаборЗаписей.Записать();
            
            КонецЦикла;
            
        КонецЦикла;

Так тоже не работает.
38 Ly_Alena
 
12.02.19
11:51
(35) в одном документе может быть больше одного сотрудника. Если отбор только по документу - то нумерация вся меняется хоть и в нужном диапозоне. Например провели документ, а потом заметили что перепутали сотрудника. Этому сотруднику нужно оставить номер, но переписать имя, все остальное не трогать.
39 Ёпрст
 
12.02.19
12:06
(37)


    Пока ВыборкаИзДокумента.Следующий() Цикл
   НаборЗаписей = РегистрыСведений.РегистрацияКадровыхДокументов.СоздатьНаборЗаписей();
                НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
                НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаЗаписейРегистра.Сотрудник);
                КоличествоПриказов             = КоличествоПриказов + 1;
                
40 RomanYS
 
12.02.19
12:06
(37) абстрагируясь от задачи в НаборЗаписей.Отбор.Документ и НоваяЗапись.Документ должно быть одно значение
41 Ly_Alena
 
12.02.19
12:21
(40) Например, один документ - два сотрудника - при первом проведении в регистре появляются две записи на каждого сотрудника. При втором - отбором сначала проверяет первую запись, потом вторую - разве не так?
42 RomanYS
 
12.02.19
12:28
(41) Ничего не понял. Был документ1, сейчас проводится документ2. Твой код пытается в отбор по документ1(ВыборкаЗаписейРегистра.Документ) сделать запись с документ2(=Ссылка). Система не дает.

Похоже твои представления о работе регистров не соответствуют действительности.
43 Ly_Alena
 
12.02.19
12:36
(42) Я думаю Вы правы. Моё представление было следующим - отбор проверяет если записи в регистре документа, который я провожу, если есть перезаписать, если нет записать присвоив новые номера.