Имя: Пароль:
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) Я тоже извиняюсь. Утро не задалось и понеслось.
Но не вижу смысла в том чтобы говорить пол..это никак не должно влиять ведь)

Переделаю под ваше предложение, потом отпишусь
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс