Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Ошибка при записи в регистр сведений.

Ошибка при записи в регистр сведений.
Я
   Ly_Alena
 
12.02.19 - 09:29
Добрый день!
Регистр сведений - периодический неподчиненный.

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

            //НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаЗаписейРегистра.Сотрудник);

            
            Запрос = Новый Запрос;
            Запрос.Текст = 
                "ВЫБРАТЬ
                |    ТрудовыеОтпускаОрганизацийРаботникиОрганизации.Сотрудник
                |ИЗ
                |    Документ.ТрудовыеОтпускаОрганизаций.РаботникиОрганизации КАК ТрудовыеОтпускаОрганизацийРаботникиОрганизации
                |ГДЕ
                |    ТрудовыеОтпускаОрганизацийРаботникиОрганизации.Ссылка = &Ссылка";
            
            Запрос.УстановитьПараметр("Ссылка", Ссылка);
            
            РезультатЗапроса = Запрос.Выполнить();
            
            ВыборкаИзДокумента = РезультатЗапроса.Выбрать();
            
            Пока ВыборкаИзДокумента.Следующий() Цикл
                НаборЗаписей.Отбор.Документ.Установить(ВыборкаЗаписейРегистра.Документ);
                НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаЗаписейРегистра.Сотрудник);
                КоличествоПриказов             = КоличествоПриказов + 1;
                
                НоваяЗапись = НаборЗаписей.Добавить(); 
                        
                НоваяЗапись.Период             = Дата;    
                НоваяЗапись.НомерПорядковый = ВыборкаЗаписейРегистра.НомерПорядковый + КоличествоПриказов;
                НоваяЗапись.БукваНомера     = ВыборкаЗаписейРегистра.БукваНомера;
                НоваяЗапись.Документ         = Ссылка;
                НоваяЗапись.Сотрудник         = ВыборкаИзДокумента.Сотрудник;
                НоваяЗапись.Автор            = ЭтотОбъект.Автор;
                НоваяЗапись.Отредактировано = Справочники.Пользователи.ПустаяСсылка();
                НаборЗаписей.Записать();
            
            КонецЦикла;
            
        КонецЦикла;

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
Компьютер — устройство разработанное для ускорения и автоматизации человеческих ошибок.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует