|
Пропадают записи из регистра сведений | ☑ | ||
---|---|---|---|---|
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) Я тоже извиняюсь. Утро не задалось и понеслось.
Но не вижу смысла в том чтобы говорить пол..это никак не должно влиять ведь) Переделаю под ваше предложение, потом отпишусь |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |