Имя: Пароль:
1C
1С v8
Не переносятся все записи в регистр
0 anikulnikova
 
29.04.16
11:47
Здравствуйте, есть обработка, которая переносит по ком соединению записи из регл регистра сведений РаботникиОргнаизаций в упр регистр сведений Работники. И вроде все работает нормально, и записи создает, и в служебных сообщениях нет никаких ошибок, но почему-то не все записи переносятся, если визуально сравнить эти 2 регистра, то будет видно, что в упр регистре записей меньше. А В выборку попадают все. Подскажите, в чем может быть причина? База УПП 8.3 обычное приложение
Код процедуры, по нажатию которой происходит перенос:

Процедура  ЗагрузитьВсеНажатие(Элемент)
    
    Сообщить("Обработка запущена: "+ТекущаяДата()+", пожалуйста, дождитесь окончания. " );    
    
    База = Неопределено;
    Соединение = Неопределено;
    
    Если Не ПроверкаПодключения(База, Соединение) Тогда
        Возврат;
    КонецЕсли;
    
    Текст = "ВЫБРАТЬ
    |    РаботникиОрганизаций.Период КАК Период,
    |    РаботникиОрганизаций.Регистратор,
    |    РаботникиОрганизаций.Активность,
    |    РаботникиОрганизаций.Сотрудник КАК Сотрудник,
    |    РаботникиОрганизаций.ЗанимаемыхСтавок,
    |    РаботникиОрганизаций.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
    |    РаботникиОрганизаций.Должность КАК ДолжностьДляОрганизации,
    |    РаботникиОрганизаций.ГрафикРаботы,
    |    РаботникиОрганизаций.ПричинаИзмененияСостояния,
    |    Должности.Ссылка КАК ДолжностьДляРаботников,
    |    ВложенныйЗапрос.Подразделение КАК ПодразделениеДляРаботников,
    |    ФизическиеЛица.Ссылка КАК ФизЛицо,
    |    РаботникиОрганизаций.НомерСтроки
    |ИЗ
    |    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Должности
    |        ПО РаботникиОрганизаций.Должность.Код = Должности.Код
    |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
    |            СоответствиеПодразделенийИПодразделенийОрганизаций.Подразделение КАК Подразделение,
    |            СоответствиеПодразделенийИПодразделенийОрганизаций.ПодразделениеОрганизации КАК ПодразделениеОрганизации
    |        ИЗ
    |            РегистрСведений.СоответствиеПодразделенийИПодразделенийОрганизаций КАК СоответствиеПодразделенийИПодразделенийОрганизаций) КАК ВложенныйЗапрос
    |        ПО РаботникиОрганизаций.ПодразделениеОрганизации = ВложенныйЗапрос.ПодразделениеОрганизации
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица
    |        ПО РаботникиОрганизаций.Сотрудник.Физлицо = ФизическиеЛица.Ссылка
    |
    |УПОРЯДОЧИТЬ ПО
    |    Период,
    |    Сотрудник,
    |    ПодразделениеОрганизации";
    Запрос = ВнешняяИБ.NewObject("Запрос");
    Запрос.Текст = Текст;
    Рез = Запрос.Выполнить().Выбрать();
    Пока Рез.Следующий() Цикл
        стр = рез;                         
        Попытка
            Если Не ЗначениеЗаполнено(стр.ПодразделениеДляРаботников)  Тогда
                Сообщить("Не указано подразделение у " +  Символы.Таб + стр.ФизЛицо.Наименование +  Символы.Таб + " период " + стр.период, СтатусСообщения.ОченьВажное);
                Продолжить;
            КонецЕСЛИ;
        Исключение
        КонецПопытки;
        
        Попытка
            Если НЕ ЗначениеЗаполнено(стр.ДолжностьДляРаботников) Тогда
                Сообщить("Не указано должность  у " +  Символы.Таб + стр.ФизЛицо.Наименование + Символы.Таб +  " период " + стр.период, СтатусСообщения.ОченьВажное);
                Продолжить;
            КонецЕСЛИ;
        исключение
        КонецПопытки;
        НаборЗаписей = ВнешняяИБ.РегистрыСведений.Работники.СоздатьНаборЗаписей();         //Очищаем  
        НаборЗаписей.ОбменДанными.Загрузка = Истина;  //+++
        НаборЗаписей.Отбор.Регистратор.Установить(стр.Регистратор);
        НаборЗаписей.Записать();        
        
        НаборЗаписей = ВнешняяИБ.РегистрыСведений.Работники.СоздатьНаборЗаписей();
        НаборЗаписей.ОбменДанными.Загрузка = Истина; //+++
        НаборЗаписей.Отбор.Регистратор.Установить(стр.Регистратор);
        НоваяЗапись = НаборЗаписей.Добавить();
        
        НоваяЗапись.Период         = стр.Период;
        НоваяЗапись.Активность     = стр.Активность;
        НоваяЗапись.Регистратор = стр.Регистратор;
        НоваяЗапись.ФизЛицо     = стр.ФизЛицо;
        НоваяЗапись.Подразделение         = стр.ПодразделениеДляРаботников;
        НоваяЗапись.Должность             = стр.ДолжностьДляРаботников;
        
        НоваяЗапись.ЗанимаемыхСтавок     = стр.ЗанимаемыхСтавок;
        НоваяЗапись.ГрафикРаботы         = стр.ГрафикРаботы;
        НоваяЗапись.ПричинаИзмененияСостояния = стр.ПричинаИзмененияСостояния;
        
        Попытка
            НаборЗаписей.Записать(Истина);
            Сообщить("Обработан " +  Символы.Таб + стр.ФизЛицо.Наименование +  Символы.Таб + " за период " + стр.Период,СтатусСообщения.Информация);    
        Исключение
            Сообщить("Запись уже есть " + Символы.Таб +  ОписаниеОшибки(),СтатусСообщения.Внимание);
        КонецПопытки;        
    КонецЦИкла;     
    Сообщить("Обработка завершена:  "+ТекущаяДата());    
КонецПроцедуры
1 GROOVY
 
29.04.16
11:53
Так ты же набор записей в цикле пересоздаешь по регистратору. Вот у тебя только одна запись и переностится.
2 GROOVY
 
29.04.16
11:53
И, если не секрет, поясни, зачем упорядочивание в запросе?
3 GROOVY
 
29.04.16
11:54
Тут хорошо подойдет иерархическая выборка по регистратору.
4 anikulnikova
 
01.05.16
20:12
(1) видите ли, запись переносится не одна, т.е. по сотруднику примерно из 15 записей по регл регистру, переносится только 5 в упр регистр. (2) упорядочивание осталось после того, как я в консоль вытаскивала запрос ))) (3) можно по подробнее, не сталкивалась с иерархической выборкой.
5 RomanYS
 
01.05.16
21:03
(4) если в документе одна запись - она перенесется, если много - перенесётся только последняя. В кадровом учете обычно таких документов не много, поэтому много что перенеслось.

А зачем вообще делать через КОМ, если внешние данные нигде  не используются?

(3) наверное речь про "итоги по регистратор"
6 anikulnikova
 
04.05.16
06:37
(5) проверила я, если в документе много записей, то переносится не последняя, как Вы предположили, а переносится их несколько.
Используется ком, потому что была готовая обработка, ее надо было переделать.
Что за итоги по регистратор?  Вы про что?
7 hhhh
 
04.05.16
06:57
(6) по вашему коду:

       НаборЗаписей = ВнешняяИБ.РегистрыСведений.Работники.СоздатьНаборЗаписей();         //Очищаем  

        НаборЗаписей.ОбменДанными.Загрузка = Истина;  //+++

        НаборЗаписей.Отбор.Регистратор.Установить(стр.Регистратор);
        НаборЗаписей.Записать();    


очищаете набор записей.

       НаборЗаписей.Отбор.Регистратор.Установить(стр.Регистратор);
        НоваяЗапись = НаборЗаписей.Добавить();

...

       Попытка
            НаборЗаписей.Записать(Истина);


записываете туда одну запись. У вас в каждом регистраторе по одной записи.
8 1Сергей
 
04.05.16
07:02
Объясните мне сакральный смысл всего этого, пожалуйста.
Подключиться к внешней базе, сделать там запрос, записать в регистр сведений внешней же базы данные. Нельзя было это всё на той стороне проделать?
9 1Сергей
 
04.05.16
07:07
ну, и да. (7) + 1
По каждому регистратору остаётся только одна запись
10 Chameleon1980
 
04.05.16
08:07
(8) База может зовется "Центр управления полетами" :)
11 anikulnikova
 
04.05.16
09:02
(7) хорошо, а к тогда исправить? Чтоб все записи взять? (8) нельзя ))) так надо было начальству ? (10) ага, похоже название... ?
А если серьезно, как можно исправить?  И сделать по всем записям?
12 1Сергей
 
04.05.16
09:44
(11) как-то так:



    ТекущийРегистратор = Неопределено;

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

            НаборЗаписей.ОбменДанными.Загрузка = Истина;  //+++

            НаборЗаписей.Отбор.Регистратор.Установить(стр.Регистратор);
            НаборЗаписей.Записать();        
            
            НаборЗаписей = ВнешняяИБ.РегистрыСведений.Работники.СоздатьНаборЗаписей();
            НаборЗаписей.ОбменДанными.Загрузка = Истина;//+++

            НаборЗаписей.Отбор.Регистратор.Установить(стр.Регистратор);
            
            ТекущийРегистратор = стр.Регистратор;
            
        КонецЕсли;
        
        НоваяЗапись = НаборЗаписей.Добавить();
        
        НоваяЗапись.Период         = стр.Период;
        НоваяЗапись.Активность     = стр.Активность;
        НоваяЗапись.Регистратор = стр.Регистратор;
        НоваяЗапись.ФизЛицо     = стр.ФизЛицо;
        НоваяЗапись.Подразделение         = стр.ПодразделениеДляРаботников;
        НоваяЗапись.Должность             = стр.ДолжностьДляРаботников;
        
        НоваяЗапись.ЗанимаемыхСтавок     = стр.ЗанимаемыхСтавок;
        НоваяЗапись.ГрафикРаботы         = стр.ГрафикРаботы;
        НоваяЗапись.ПричинаИзмененияСостояния = стр.ПричинаИзмененияСостояния;
        
        Попытка
            НаборЗаписей.Записать(Истина);
            Сообщить("Обработан " +  Символы.Таб + стр.ФизЛицо.Наименование +  Символы.Таб + " за период " + стр.Период,СтатусСообщения.Информация);    
        Исключение
            Сообщить("Запись уже есть " + Символы.Таб +  ОписаниеОшибки(),СтатусСообщения.Внимание);
        КонецПопытки;        
    КонецЦИкла;    
    Сообщить("Обработка завершена:  "+ТекущаяДата());
13 anikulnikova
 
04.05.16
13:55
(12) спасибо, но безрезультатно. Записи переносятся так же. Не все. (((
14 hhhh
 
04.05.16
14:13
(13) вы один и тот же регистратор пишете несколько раз. Одно пишете, другое стираете. Это хоть поняли.
15 anikulnikova
 
04.05.16
14:47
(14) да да, это понятно. Но видимо все-равно что-то не так я делаю, а дойти до этого не могу... так как не все записи перенеслись.
16 hhhh
 
04.05.16
15:13
|УПОРЯДОЧИТЬ ПО
    |    Период,
    |    Сотрудник,
    |    ПодразделениеОрганизации
    |ИТОГИ ПО Регистратор ";
    Запрос = ВнешняяИБ.NewObject("Запрос");
    Запрос.Текст = Текст;
    Рез = Запрос.Выполнить().Выбрать(ОбходРезкльтатаЗапроса.ПоГруппировкам);
    Пока Рез.Следующий() Цикл
       НаборЗаписей = ВнешняяИБ.РегистрыСведений.Работники.СоздатьНаборЗаписей();         //Очищаем  

        НаборЗаписей.ОбменДанными.Загрузка = Истина;  //+++

        НаборЗаписей.Отбор.Регистратор.Установить(рез.Регистратор);
        НаборЗаписей.Записать();        
        
        НаборЗаписей = ВнешняяИБ.РегистрыСведений.Работники.СоздатьНаборЗаписей();
        НаборЗаписей.ОбменДанными.Загрузка = Истина;//+++

        НаборЗаписей.Отбор.Регистратор.Установить(рез.Регистратор);




       стр = Рез.Выбрать();
       Пока стр.Следующий() Цикл
                  НоваяЗапись = НаборЗаписей.Добавить();




      

как-то так
17 anikulnikova
 
05.05.16
08:09
(16) Если честно, то я немного не поняла, что Вы предлагаете сделать.
Поправьте, если я не так добавила Ваш код

Процедура  ЗагрузитьВсеНажатие(Элемент)
    
    Сообщить("Обработка запущена: "+ТекущаяДата()+", пожалуйста, дождитесь окончания. " );
    
    База = Неопределено;
    Соединение = Неопределено;
    
    Если Не ПроверкаПодключения(База, Соединение) Тогда
        Возврат;
    КонецЕсли;
    Запрос = ВнешняяИБ.NewObject("Запрос");
    
    Запрос.Текст = "ВЫБРАТЬ
                   |    РаботникиОрганизаций.Период КАК Период,
                   |    РаботникиОрганизаций.Регистратор,
                   |    РаботникиОрганизаций.Активность,
                   |    РаботникиОрганизаций.Сотрудник КАК Сотрудник,
                   |    РаботникиОрганизаций.ЗанимаемыхСтавок,
                   |    РаботникиОрганизаций.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
                   |    РаботникиОрганизаций.Должность КАК ДолжностьДляОрганизации,
                   |    РаботникиОрганизаций.ГрафикРаботы,
                   |    РаботникиОрганизаций.ПричинаИзмененияСостояния,
                   |    Должности.Ссылка КАК ДолжностьДляРаботников,
                   |    ВложенныйЗапрос.Подразделение КАК ПодразделениеДляРаботников,
                   |    ФизическиеЛица.Ссылка КАК ФизЛицо,
                   |    РаботникиОрганизаций.НомерСтроки
                   |ИЗ
                   |    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
                   |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Должности КАК Должности
                   |        ПО РаботникиОрганизаций.Должность.Код = Должности.Код
                   |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |            СоответствиеПодразделенийИПодразделенийОрганизаций.Подразделение КАК Подразделение,
                   |            СоответствиеПодразделенийИПодразделенийОрганизаций.ПодразделениеОрганизации КАК ПодразделениеОрганизации
                   |        ИЗ
                   |            РегистрСведений.СоответствиеПодразделенийИПодразделенийОрганизаций КАК СоответствиеПодразделенийИПодразделенийОрганизаций) КАК ВложенныйЗапрос
                   |        ПО РаботникиОрганизаций.ПодразделениеОрганизации = ВложенныйЗапрос.ПодразделениеОрганизации
                   |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица
                   |        ПО РаботникиОрганизаций.Сотрудник.Физлицо = ФизическиеЛица.Ссылка
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    Период,
                   |    Сотрудник,
                   |    ПодразделениеОрганизации
                   |ИТОГИ ПО Регистратор ";

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

            НаборЗаписей.ОбменДанными.Загрузка = Истина;  
            НаборЗаписей.Отбор.Регистратор.Установить(стр.Регистратор);
            НаборЗаписей.Записать();        
            
            НаборЗаписей = ВнешняяИБ.РегистрыСведений.Работники.СоздатьНаборЗаписей();
            НаборЗаписей.ОбменДанными.Загрузка = Истина;  
            НаборЗаписей.Отбор.Регистратор.Установить(стр.Регистратор);
                   
        Рез = стр.Выбрать();
        Пока Рез.Следующий() Цикл        
        
        НоваяЗапись = НаборЗаписей.Добавить();
        
        НоваяЗапись.Период         = стр.Период;
        НоваяЗапись.Активность     = стр.Активность;
        НоваяЗапись.Регистратор = стр.Регистратор;
        НоваяЗапись.ФизЛицо     = стр.ФизЛицо;
        НоваяЗапись.Подразделение         = стр.ПодразделениеДляРаботников;
        НоваяЗапись.Должность             = стр.ДолжностьДляРаботников;
        
        НоваяЗапись.ЗанимаемыхСтавок     = стр.ЗанимаемыхСтавок;
        НоваяЗапись.ГрафикРаботы         = стр.ГрафикРаботы;
        НоваяЗапись.ПричинаИзмененияСостояния = стр.ПричинаИзмененияСостояния;
        
        Попытка
            НаборЗаписей.Записать(Истина);
            Сообщить("Обработан " +  Символы.Таб + стр.ФизЛицо.Наименование +  Символы.Таб + " за период " + стр.Период,СтатусСообщения.Информация);    
        Исключение
            Сообщить("Запись уже есть " + Символы.Таб +  ОписаниеОшибки(),СтатусСообщения.Внимание);
        КонецПопытки;        
        КонецЦикла;
    КонецЦИкла;    
    Сообщить("Обработка завершена:  "+ТекущаяДата());
КонецПроцедуры
18 anikulnikova
 
08.05.16
22:17
(16) не могли бы Вы подсказать, на счет моего сообщения (17)
Спасибо
19 hhhh
 
09.05.16
00:23
(18) что-то непонятно вы пишете

        Рез = стр.Выбрать();
        Пока Рез.Следующий() Цикл        


значит у вас данные в переменной Рез. А вы почему-то Стр пишете

наверно должно быть

Рез.Период
Рез.Активность
Рез.ФизЛицо

и т.д.
20 zenik
 
09.05.16
01:19
Рез = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока Рез.Следующий() Цикл
        стр = рез;                          
...
        Рез = стр.Выбрать();
        Пока Рез.Следующий() Цикл        

И херим первую выборку на корню...
21 hhhh
 
09.05.16
01:25
(20) + а, ну да

Стр = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока Стр.Следующий() Цикл