Имя: Пароль:
1C
1С v8
Пропадают записи из регистра сведений
0 Riko669
 
29.11.16
12:24
День добрый. Пропадают записи с регистра сведений при проведении документа, т.е. провожу первую запись,все есть, провожу вторую, данные от первого проведения исчезают и т.д. в такой последовательности. В чем дело?
РС непериодический, подчинен регистратору. Код расположен в модуле объекта.

Запрос = Новый Запрос;
    Запрос.Текст  = "ВЫБРАТЬ
    |ПроверкаРабочегоМеста.Регистратор КАК ПакетРасписаний,    
    |ПроверкаРабочегоМеста.Кабинет,
    |ПроверкаРабочегоМеста.Кресло,
    |ПроверкаРабочегоМеста.ВремяНачала,
    |ПроверкаРабочегоМеста.ВремяОкончания
    |ИЗ
    |РегистрСведений.ПроверкаРабочегоМеста КАК ПроверкаРабочегоМеста";
    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();    
    
    Для Каждого ТекСтрокаТабПриемов ИЗ ТабПриемов Цикл
        Пока  Выборка.Следующий() Цикл
            НаборЗаписей=РегистрыСведений.ПроверкаРабочегоМеста.СоздатьНаборЗаписей();
            НаборЗаписей.Отбор.Регистратор.Установить(Выборка.ПакетРасписаний);
            НаборЗаписей.Прочитать();
            
            Для каждого Набор Из НаборЗаписей Цикл
                
                 Набор.Кресло=Справочники.Кресло.ПустаяСсылка();
                Набор.Кабинет=Справочники.Кабинеты.ПустаяСсылка();
                Набор.ВремяНачала=Дата(1,1,1);
                Набор.ВремяОкончания=Дата(1,1,1);
                                                        
            КонецЦикла;
                   НаборЗаписей.Записать();
                
        КонецЦикла;
            
            Если (Выборка.Кресло=ТекСтрокаТабПриемов.НомерКресла И
                Выборка.Кабинет=ТекСтрокаТабПриемов.Кабинет) И
                (Выборка.ВремяНачала<ТекСтрокаТабПриемов.Время1 И
                Выборка.ВремяОкончания<ТекСтрокатабПриемов.Время2) ИЛИ
                (Выборка.ВремяНачала>ТекСтрокаТабПриемов.Время2    И
                Выборка.ВремяОкончания>ТекСтрокатабПриемов.Время2)
                 Тогда
                 Отказ = Истина;
            Сообщить("кресло №"+Строка(ТекСтрокаТабПриемов.НомерКресла)+" в "
            +Строка(ТекСтрокаТабПриемов.Кабинет)+" ,в период с"+Строка(ТекСтрокаТабПриемов.Время1)+" по "
            +Строка(ТекСтрокатабПриемов.Время2)+" занято");
                 Возврат;
             КонецЕсли;
                    
    КонецЦикла;
1 Wirtuozzz
 
29.11.16
12:26
Чудес не бывает, либо кривой код где то, либо аппаратная ошибка.
2 Riko669
 
29.11.16
12:29
Да, в том то и дело, что не бывает.
3 Wirtuozzz
 
29.11.16
12:31
поэтому ошибка в коде. Вы по всем измерениям правильно отбор заполняете?
4 Riko669
 
29.11.16
12:33
Все должно быть норм, т.к. ранее такого ереси не было
5 Wirtuozzz
 
29.11.16
12:36
Ладно, предлагаю традиционные советы: почистить КЕШ, установить последнюю платформу.
6 Riko669
 
29.11.16
12:37
Платформа 8.3.8 стоит.
Попробую на счет КЕШ-а
7 HardBall
 
29.11.16
12:43
(0) В коде какая-то {censored}та.
8 azernot
 
29.11.16
12:43
(0) Что это за код? И что по мнению автора он должен делать? Для всего регистра "ПроверкаРабочегоМеста" устанавливать пустой кабинет, пустое кресло и пустые даты?
9 Альбатрос
 
29.11.16
12:45
(8) +1
10 Lexey_
 
29.11.16
12:49
выборка не сбрасывается после первой строки
11 Lexey_
 
29.11.16
12:49
+(10) после первой строки ТабПриемов
12 Мимохожий Однако
 
29.11.16
12:51
Попробуй использовать вместо набора записей менеджер записи.
13 Забияка
 
29.11.16
12:52
(0)Переделай примерно на такое:
БлаБлаБла = Выборка.ПакетРасписаний;
НаборЗаписей.Отбор.Регистратор.Установить(БлаБлаБла);
14 IlyaSR
 
29.11.16
12:59
Пока  Выборка.Следующий() Цикл
пробегает всю выборку и заполняет для первого ТекСтрокаТабПриемов

дальше бежать некуда => все пустые
15 IlyaSR
 
29.11.16
13:04
+(14) определись в какой момент тебе нужно начать чтение выборки заново  и поставь Выборка.Сбросить()
16 Riko669
 
29.11.16
13:15
Хорошо, спасибо
17 Riko669
 
29.11.16
17:34
Для Каждого ТекСтрокаТабПриемов ИЗ ТабПриемов Цикл
        
        Пока  Выборка.Следующий() Цикл
            НаборЗаписей=РегистрыСведений.ПроверкаРабочегоМеста.СоздатьНаборЗаписей();
            НаборЗаписей.Отбор.Регистратор.Установить(Выборка.ПакетРасписаний);
            НаборЗаписей.Прочитать();
            
            Для каждого Набор Из НаборЗаписей Цикл
                
                 Набор.Кресло=Справочники.Кресло.ПустаяСсылка();
                Набор.Кабинет=Справочники.Кабинеты.ПустаяСсылка();
                Набор.ВремяНачала=Дата(1,1,1);
                Набор.ВремяОкончания=Дата(1,1,1);
                                                        
            КонецЦикла;
                   НаборЗаписей.Записать();
                
                Если Выборка.Кресло=ТекСтрокаТабПриемов.НомерКресла И
                    Выборка.Кабинет=ТекСтрокаТабПриемов.Кабинет
                    Тогда
                    Отказ = Истина;
                    Сообщить("кресло №"+Строка(ТекСтрокаТабПриемов.НомерКресла)+" в "
                    +Строка(ТекСтрокаТабПриемов.Кабинет)+" ,в период с"+Строка(ТекСтрокаТабПриемов.Время1)+" по "
                    +Строка(ТекСтрокатабПриемов.Время2)+" занято");
                    Возврат;
                КонецЕсли;
        КонецЦикла;
                 Выборка.Сбросить();
    КонецЦикла;


Все равно тоже самое выходит. Запись стирается
18 azernot
 
29.11.16
18:00
(17) Что ты хочешь сделать? Это совершенно дурацкий код. И после добавления сброса выборки он менее дурацким не стал.
19 Мимохожий Однако
 
29.11.16
18:55
(17) Берешь выборку из регистра и в него же пишешь. Бессмыслица. В крайнем случае выгрузи в таблицу значений, преобразуй её и загрузки в регистр заново. Но для чего этот код? Я не понял.
20 azernot
 
29.11.16
22:22
(19) Он обнуляет все записи регистра (записывает с пустыми значениями).  Зачем? Почему? Непонятно.
При этом проверяется, не упоминалось ли кресло и кабинет из ТабПриемов в регистре.. до первого совпадения. И если упоминалось, то .. всё. Сообщение и выход. Дальше ничего никуда не чистится, проведение не отменяется. Короче, бред какой-то.
21 Zhuravlik
 
29.11.16
22:28
(0) У какого-нибудь измерения из обнуляемых стоит галка "Ведущее"?
22 RomanYS
 
29.11.16
23:35
(0) ...ля, нет слов, одни эмоции:
- зачем двойной цикл?
- в обработке проведения правильно писать подчиненный РС через Движения, а не через СоздатьНаборЗаписей()
- Набор.Прочитать()...Набор.Записать() в цикле - у тебя есть понимание, что набор пишется целиком по регистратору? А у тебя запишется только поледня порция.
23 Riko669
 
30.11.16
09:35
(18) Спасибо, я в курсе! Но вот только для того кто только начал работать и разбирать 1с - это нормально! Неужели по вашему мнению все начинали без глупых ошибок? Конечно, да, о чем это я?
24 Riko669
 
30.11.16
09:37
(19)Ранее была тема "Прочитать регистр сведений" так это оно и есть
25 Riko669
 
30.11.16
09:38
(20) Бред бредом, а пытаться, пробовать сделать как-то нужно же
26 Riko669
 
30.11.16
09:39
(21) Нет, галка "Ведущее" не стоит
27 h-sp
 
30.11.16
09:41
(25) но вы уже поняли, что

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

стирает всё предыдущее и пишет свое. Зачем вы десять раз записываете? Пишите один раз, в самом конце.
28 Riko669
 
30.11.16
09:42
(22) Записей в документе может быть как одна, так и много, и делалось это с целью перебора и проверки всех записей. Хотя хз, может и действительно не нужен двойной цикл.

Хорошо, переделаю под обработку проведения. (Учту)

Видимо нет
29 Riko669
 
30.11.16
09:42
(27) в самом конце?
30 Riko669
 
30.11.16
10:12
(27) Спасибо, Ваш совет помог, записи есть, все норм.
Тема закрыта
31 azernot
 
30.11.16
10:35
(25) Для начала нужно понять, что же ты хочешь сделать. Судя по тому, что ты ни разу не ответил на вопрос "Что ты хочешь сделать?" - ты этого не понимаешь.

Код твой не рабочий в принципе. Я не знаю, что там у тебя "норм", что тебе помогло. Скорее всего, тебе это просто показалось. От того, что набор записей в этом коде записывается только один раз в конце, меняется только то, что теперь затираются не все записи регистра, а только некая последняя, которую вернёт запрос. В каком порядке их возвращает запрос? Да фиг знает.
Если цель была именно в том, чтобы обнулить кресло, кабинет и время в случайной записи регистра - то цель достигнута.
32 Riko669
 
30.11.16
11:18
(31) прочитать регистр сведений и проверить занятт кресло в кабинете или нет

Когда кажется, креститься нужно, а мне как-то вообще не кажется, что у меня ничего совсем не работает
33 h-sp
 
30.11.16
11:22
(32) а зачем вы проверяете? Ведь у вас везде

Набор.Кресло=Справочники.Кресло.ПустаяСсылка();

везде пусто. Можно и без этой проверки спокойно сказать, что все кресла свободны.
34 azernot
 
30.11.16
12:13
(32)
> мне как-то вообще не кажется, что у меня ничего совсем не работает

Значит тот код, который ты показываешь в (0) - отключен и не работает. А работает какой-то другой код, который написал кто-то другой, кто разбирается в вопросе.

>прочитать регистр сведений и проверить занят кресло в кабинете или нет
Сейчас читается весь регистр (за все времена, раньше-позже документа, неважно). Перебираются вообще все записи регистра, причём для каждой строки таблицы ТабПриемов, проверяется только соответсвтвие кресла и кабинета, без даты. Т.е. если в регистре когда-либо, хоть 15 лет назад встречалось это кресло с этом кабинетом - выйдет сообщение о "занятости" с отменой проведения. Разве в этом цель?

Для чего в такой задаче нужен код  очищающий кресла и кабинеты во всех записях регистра? Т.е. типа если не для первой строки совпадений по креслу и кабинету нет - то и весь регистр будет очищен. Точнее даже не очищен, а кресла, кабинеты и время обнулены. В чём смысл обнуления значений без удаления самих записей? Только в некомпетентности автора, иного смысла просто не существует.

Если ты действительно хочешь решить задачу, и хочешь чтобы форумчане тебе помогли - первое что нужно, это признание неработоспособности кода. Далее, описание, того что же хочешь получить на выходе и что имеешь на входе. Далее следуй советам, не игнорируй вопросы.


Теперь по существу. Процедуру проведения твоего документа можно разбить на два этапа:
1. Проверка "занятости" (возможности проведения)
2. Собственно само проведение.

1. Правильным подходом будет единый запрос соединяющий табличную часть документа с записями регистра таким образом, чтобы результатом запросы были только пересекающиеся записи (т.е. строки результата запроса - это "занятые" кресла в кабинете в нужное время.

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

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

2. Вторым этапом уже обход табличной части и формирование записей в регистр. Причём если регистр подчинён данному регистратору, то нет смысла в использовании набора записей или менеджера записи. Есть специальная коллекция движений:

    //2. Формирование записей (регистрация занятости кресел в кабинете)
    Если Не Отказ Тогда
        Для Каждого ТекСтрокаТабПриемов ИЗ ТабПриемов Цикл
            Движение             = Движения.ПроверкаРабочегоМеста.Добавить();
            Движение.Кабинет     = ТекСтрокаТабПриемов.Кабинет;
            Движение.Кресло     = ТекСтрокаТабПриемов.НомерКресла;
            Движение.ВремяНачала     = ТекСтрокаТабПриемов.ВремяНачала;
            Движение.ВремяНачала     = ТекСтрокаТабПриемов.ВремяОкончания;
        КонецЦикла;
    КонецЕсли;
35 azernot
 
30.11.16
12:29
Упс.. заглянул в карточку. Пол - Женский.

Предупреждать надо.
Был не прав, вспылил. Но теперь считаю своё предложение безобразной ошибкой, раскаиваюсь, прошу дать возможность загладить, искупить.
Всё, ушёл
36 Riko669
 
30.11.16
14:24
(35) Я тоже извиняюсь. Утро не задалось и понеслось.
Но не вижу смысла в том чтобы говорить пол..это никак не должно влиять ведь)

Переделаю под ваше предложение, потом отпишусь
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn