Версия для печати темы (https://pro1c.org.ua/index.php?s=98f682b4ac10fc2d80e41d8f920cb3d3&showtopic=3698)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ В документе пропадают строки...
Автор: DAS_Alex 30.05.11, 7:30
Добрый день. База 1С 7.7.025 DBF/CDX. Сохраняю документ с определенным количеством строк при следующем открытии не хватает несколько строк. В процедурах ПриОткрытии() и ПриЗаписи() нет программного удаления. Я думаю, что потихоньку рушится база, что в таких случаях необходимо делать?
Автор: awp 30.05.11, 8:12
Цитата(DAS_Alex @ 30.05.11, 8:30)
Добрый день. База 1С 7.7.025 DBF/CDX. Сохраняю документ с определенным количеством строк при следующем открытии не хватает несколько строк. В процедурах ПриОткрытии() и ПриЗаписи() нет программного удаления. Я думаю, что потихоньку рушится база, что в таких случаях необходимо делать?
1. Резервная копия
2. Тестирование и исправление ИБ
Если при выполнении пункта 2 - много ошибок - то подымаем резервную копию - делаем выгрузку а потом загрузку ИБ и опять пункт 2.
Удачи.
Автор: DAS_Alex 30.05.11, 8:47
при выполнении пункта 2 много ошибок, но ошибок связанных с проблемным документом немного
Цитата(awp @ 30.05.11, 8:12)
1. Резервная копия
2. Тестирование и исправление ИБ
Если при выполнении пункта 2 - много ошибок - то подымаем резервную копию - делаем выгрузку а потом загрузку ИБ и опять пункт 2.
Удачи.
Зачем делать: - то подымаем резервную копию - делаем выгрузку а потом загрузку ИБ и опять пункт 2? Там те же ошибки..
Автор: g789 30.05.11, 9:10
Цитата(DAS_Alex @ 30.05.11, 9:47)
при выполнении пункта 2 много ошибок, но ошибок связанных с проблемным документом немного
Зачем делать: - то подымаем резервную копию - делаем выгрузку а потом загрузку ИБ и опять пункт 2? Там те же ошибки..
Выгрузка - Загрузка часто "лечит" dbf базы.
Сколько обычно строк в документе?
Посмотрите в модуле документа при проведении часто используют ВыгрузитьТабличнуюЧасть - Загрузить ТабличнуюЧасть.
Автор: DAS_Alex 30.05.11, 9:58
максимальное количество строк 100, документ не проводится..
Автор: Zaval 30.05.11, 10:39
Что за документ и что в его строках?
Нпр, если творчески подойти к удалению подчиненных - можно и не такого добиться.
Автор: -=VJ=- 30.05.11, 10:46
Цитата(DAS_Alex @ 30.05.11, 7:30)
В процедурах ПриОткрытии() и ПриЗаписи() нет программного удаления. Я думаю, что потихоньку рушится база, что в таких случаях необходимо делать?
Если бы рушилась база - Вы бы в неё вообще не вошли.
Проверяйте отладчиком. Во-первых удаление может быть где угодно, а не только в этих процедурах, во-вторых суть может быть не в удалении, а в несохранении - к примеру при несоблюдении каких-то параметров строка просто выбрасывается.
Автор: DAS_Alex 30.05.11, 11:43
Цитата(-=VJ=- @ 30.05.11, 10:46)
Если бы рушилась база - Вы бы в неё вообще не вошли.
Проверяйте отладчиком. Во-первых удаление может быть где угодно, а не только в этих процедурах, во-вторых суть может быть не в удалении, а в несохранении - к примеру при несоблюдении каких-то параметров строка просто выбрасывается.
Разработчик документа Я. Все, что там написано я знаю и ничего страшного не вижу. В работе он уже около трех лет. Почему я думаю на базу - каждый день база несколько раз завершается аварийно и индексируется...
Автор: Ardi 30.05.11, 11:59
Цитата(DAS_Alex @ 30.05.11, 12:43)
каждый день база несколько раз завершается аварийно
В терминал её.
Автор: DAS_Alex 30.05.11, 13:44
Проблема была замечена при вводе на основании. Этот док. вводится на основании самого себя. Создав и сохранив док, пользователь тут же вводит на основании точную копию созданного, т.е кол-во строк не трудно запомнить, ну допустим 10. В документе введенном на основании остается три строки, хотя описано, что перенести все 10. Если открыть документ основание то в нем также будет три строки из введенных 10.
У этого документа есть вспомогательный документ для второй табл. части. Контекст этого док-та передается в вспомог. документ и держится там до закрытия вспомогательного, может это как-то влияет......
... медленная скорость сети может влиять..
Автор: -=VJ=- 30.05.11, 13:49
Цитата(DAS_Alex @ 30.05.11, 13:44)
Проблема была замечена при вводе на основании.
Ну так бросьте листинг процедуры - пусть народ посмотрит, авось чего и найдем.
Автор: Ardi 30.05.11, 14:03
Цитата(DAS_Alex @ 30.05.11, 12:43) http://pro1c.org.ua/index.php?act=findpost&pid=24391
... медленная скорость сети может влиять..
В терминал её!!!!!!!!!!!!!!!!!!!!
----
Я думаю вообще могут пакеты по сети теряться в этом случае.
----
Проверить - не стоит ли разрешение для шары кешировать файлы. Или как оно там называется.
Автор: Zaval 30.05.11, 14:32
Цитата(DAS_Alex @ 30.05.11, 14:44)
Проблема была замечена при вводе на основании. Этот док. вводится на основании самого себя. Создав и сохранив док, пользователь тут же вводит на основании точную копию созданного, т.е кол-во строк не трудно запомнить, ну допустим 10. В документе введенном на основании остается три строки, хотя описано, что перенести все 10. Если открыть документ основание то в нем также будет три строки из введенных 10.
Проверка на Модифицированность дока-основания есть?
Новый вводится из формы основания или из журнала/обработки?
ЗЫ. Больше похоже на косяк в коде. Для других причин "слишком умно".
Автор: DAS_Alex 30.05.11, 14:37
Цитата(-=VJ=- @ 30.05.11, 13:49)
Ну так бросьте листинг процедуры - пусть народ посмотрит, авось чего и найдем.
Вот она:
Процедура ВводНаОсновании(ДокОснование)
спр=СоздатьОбъект("Справочник.альбом");
ДокументОснование=ДокОснование;
НомерДок=ДокОснование.НомерДок;
ДатаДок=ДокОснование.ДатаДок;
Деталь=ДокОснование.Деталь;
Деталь2=ДокОснование.Деталь2;
Деталь3=ДокОснование.Деталь3;
Изделие=ДокОснование.Изделие;
ДокОснование.ВыбратьСтроки();
Пока ДокОснование.ПолучитьСтроку()=1 Цикл
Если (Число(ДокОснование.Дата_к)<>0) и (ДокОснование.ПринятоКоличество<>0) Тогда
если ДокОснование.НомерСтроки=1 тогда
если ДокОснование.есть_зарплата=1 тогда
стр=2;
иначе
стр=ДокОснование.НомерСтроки;
конецесли;
иначе
стр=ДокОснование.НомерСтроки+1;
конецесли;
КонецЕсли;
КонецЦикла;
если стр=1 тогда // если марш-ку разрывают в начале
ДокОснование.ПолучитьСтрокуПоНомеру(стр);
Для а=стр по ДокОснование.КоличествоСтрок() Цикл
НоваяСтрока();
ДокОснование.ПолучитьСтрокуПоНомеру(а);
НомерОперации=ДокОснование.НомерОперации;
НаименованиеОперации=ДокОснование.НаименованиеОперации;
Цех=ДокОснование.цех;
Кдетали = ДокОснование.Кдетали;
//ном_детали = ДокОснование.ном_детали;
Замечание=ДокОснование.Замечание;
КонецЦикла;
Форма.Обновить();
иначе // если марш-ку разрывают в середине
ДокОснование.ПолучитьСтрокуПоНомеру(стр);
Для а=стр по ДокОснование.КоличествоСтрок() Цикл
НоваяСтрока();
ДокОснование.ПолучитьСтрокуПоНомеру(а);
НомерОперации=ДокОснование.НомерОперации;
НаименованиеОперации=ДокОснование.НаименованиеОперации;
Цех=ДокОснование.цех;
Кдетали = ДокОснование.Кдетали;
//ном_детали = ДокОснование.ном_детали;
Замечание=ДокОснование.Замечание;
КонецЦикла;
Форма.Обновить();
конецесли;
КонецПроцедуры
Вот она:
Процедура ВводНаОсновании(ДокОснование)
спр=СоздатьОбъект("Справочник.альбом");
ДокументОснование=ДокОснование;
НомерДок=ДокОснование.НомерДок;
ДатаДок=ДокОснование.ДатаДок;
Деталь=ДокОснование.Деталь;
Деталь2=ДокОснование.Деталь2;
Деталь3=ДокОснование.Деталь3;
Изделие=ДокОснование.Изделие;
ДокОснование.ВыбратьСтроки();
Пока ДокОснование.ПолучитьСтроку()=1 Цикл
Если (Число(ДокОснование.Дата_к)<>0) и (ДокОснование.ПринятоКоличество<>0) Тогда
если ДокОснование.НомерСтроки=1 тогда
если ДокОснование.есть_зарплата=1 тогда
стр=2;
иначе
стр=ДокОснование.НомерСтроки;
конецесли;
иначе
стр=ДокОснование.НомерСтроки+1;
конецесли;
КонецЕсли;
КонецЦикла;
если стр=1 тогда // если марш-ку разрывают в начале
ДокОснование.ПолучитьСтрокуПоНомеру(стр);
Для а=стр по ДокОснование.КоличествоСтрок() Цикл
НоваяСтрока();
ДокОснование.ПолучитьСтрокуПоНомеру(а);
НомерОперации=ДокОснование.НомерОперации;
НаименованиеОперации=ДокОснование.НаименованиеОперации;
Цех=ДокОснование.цех;
Кдетали = ДокОснование.Кдетали;
//ном_детали = ДокОснование.ном_детали;
Замечание=ДокОснование.Замечание;
КонецЦикла;
Форма.Обновить();
иначе // если марш-ку разрывают в середине
ДокОснование.ПолучитьСтрокуПоНомеру(стр);
Для а=стр по ДокОснование.КоличествоСтрок() Цикл
НоваяСтрока();
ДокОснование.ПолучитьСтрокуПоНомеру(а);
НомерОперации=ДокОснование.НомерОперации;
НаименованиеОперации=ДокОснование.НаименованиеОперации;
Цех=ДокОснование.цех;
Кдетали = ДокОснование.Кдетали;
//ном_детали = ДокОснование.ном_детали;
Замечание=ДокОснование.Замечание;
КонецЦикла;
Форма.Обновить();
конецесли;
КонецПроцедуры
Но Я больше склоняюсь к сети, она у нас проблемная..
Автор: -=VJ=- 30.05.11, 15:12
Цитата(DAS_Alex @ 30.05.11, 14:37)
Вот она:
Поправьте задвоение.
Я правильно понял: если не делать ввод на основании, а сразу после сохранения открыть документ - строк десять, а если после этого сделать ввод на основании - их в обеих документах становится три?
Автор: Pepe 30.05.11, 15:12
Цитата(DAS_Alex @ 30.05.11, 15:37)
Но Я больше склоняюсь к сети, она у нас проблемная..
Если вы грешите на сеть, почему бы не проверить работу вашего документа без сети, на локальной машине?
Автор: DAS_Alex 30.05.11, 15:21
Цитата(-=VJ=- @ 30.05.11, 15:12)
Поправьте задвоение.
Я правильно понял: если не делать ввод на основании, а сразу после сохранения открыть документ - строк десять, а если после этого сделать ввод на основании - их в обеих документах становится три?
Не всегда, а в каких-то необъяснимых случаях. Почему я и склоняюсь к проблемам с сетью. Можно десяток создать и ввести на основании - все нормально, а на 11-й раз пропадет.
Автор: Zaval 30.05.11, 15:21
Три года работал???
Может, неудачно усовершенствовали? В коде "две руки" просматриваются.
Зачем создавать док с тем же номером?
Не могу понять разницы между "стр=1" и "иначе".
Автор: DAS_Alex 30.05.11, 15:22
Цитата(Pepe @ 30.05.11, 15:12)
Если вы грешите на сеть, почему бы не проверить работу вашего документа без сети, на локальной машине?
На локальной все нормально..
Автор: Ardi 30.05.11, 15:31
7.7 дбф не устойчива к потерям пакетов данных. Вообще.
Автор: DAS_Alex 30.05.11, 15:40
Цитата(Zaval @ 30.05.11, 15:21)
Три года работал???
Может, неудачно усовершенствовали? В коде "две руки" просматриваются.
Зачем создавать док с тем же номером?
Не могу понять разницы между "стр=1" и "иначе".
Я говорил, что в программе проблемы не вижу. Теперь и Вам видно, что этот код не может удалять строки.
У меня два варианта:
1. Первый и самый важный это плохая скорость сети.
2. Проблемы ссылочной целостности - сама 1С не может восстановить строки из дбф.
Автор: vadim007 30.05.11, 16:28
Зачем так сложно - копировать строки документа в цикле. Я так понял - нужно создать точную копию исходного документа? Используйте ВыгрузитьТабличнуюЧасть(..), ЗагрузитьТабличнуюЧасть(..).
PS: Использование ДокОснование.ПолучитьСтрокуПоНомеру(стр); в начале циклов Для а=стр по ДокОснование.КоличествоСтрок() Цикл лишено смысла. Условие внутри цикла Пока ДокОснование.ПолучитьСтроку()=1 Цикл не совсем прозрачное для стороннего взгляда, нужно пройтись отладчиком на реальных данных. Лучше ставьте отладочные сообщения в этом цикле, и помотрите, сколько на самом деле копируется строк в новый документ. Но все эти "выкрутасы" с циклами не совсем понятны, если цель - ввести точно такой-же документ на основании.
Автор: Zaval 30.05.11, 17:20
Цитата(DAS_Alex @ 30.05.11, 16:40)
Я говорил, что в программе проблемы не вижу. Теперь и Вам видно, что этот код не может удалять строки.
Но проблема-то есть.
И разница между доками и операциями над ними есть только внутри 1с. Сети пофиг, что именно терять.
Еще раз спрошу: как выполняется ввод на основании? Из какой формы и какими средствами?
Автор: DAS_Alex 30.05.11, 17:54
Цитата(vadim007 @ 30.05.11, 16:28) http://pro1c.org.ua/index.php?act=findpost&pid=24417
Но проблема-то есть.
И разница между доками и операциями над ними есть только внутри 1с. Сети пофиг, что именно терять.
Еще раз спрошу: как выполняется ввод на основании? Из какой формы и какими средствами?
В журнале выделяю документ и через правую кнопку мыши ввести на основании
Автор: vadim007 31.05.11, 5:37
Цитата(DAS_Alex @ 30.05.11, 18:54)
Табличная часть не всегда одинакова. Бывает точная копия, бывает со второй строки, бывает половина.
Получается, вы сами ответили на свой вопрос.
Автор: DAS_Alex 31.05.11, 7:24
Цитата(vadim007 @ 31.05.11, 5:37)
Получается, вы сами ответили на свой вопрос.
получается ответ на вопрос - бывают различные ситуации переноса табличной части и я этого не понимаю, и сижу морочу голову людям...
Автор: Zaval 31.05.11, 9:34
Новому доку присваивается Номер = Номеру Основания. Это зачем?
Ищите, нет ли в системе хитрой общей процедуры, подравнивающей Основание по Подчиненному - для связки Счет - РН иногда такое делают, чтобы получить пакет доков, выправив только один.
Автор: DAS_Alex 31.05.11, 11:13
Цитата(Zaval @ 31.05.11, 9:34)
Новому доку присваивается Номер = Номеру Основания. Это зачем?
Номер нового документа состоит из номера основания и отличительной буквы: новыйномер=старномер+например буква А и т.д. Так нужно производству.
Так отслеживается цепочка до конца изготовления продукции.
Все равно не вижу проблемы в коде. Раньше было все нормально, а тут вдруг раз и ко стал корявым..
Автор: dmiter 01.06.11, 8:24
Если (Число(ДокОснование.Дата_к)<>0) и (ДокОснование.ПринятоКоличество<>0) Тогда
если данное условие выполняется на 6-й строке то в новом документе введенном на основании будет на 6 строк меньше...?
Автор: 5_kopeek 01.06.11, 9:51
Цитата(Zaval @ 30.05.11, 15:21)
Не могу понять разницы между "стр=1" и "иначе".
Аналогично.
И еще вопрос. Переменной стр еще где-нибудь присваивается значение или она где-то еще определяется? Если данное условие
Если (Число(ДокОснование.Дата_к)<>0) и (ДокОснование.ПринятоКоличество<>0) Тогда
не выполняется, переменная стр остается неопределенной.
Но даже это не должно удалять строки из документа основания, если нет еще каких-либо процедур, принимающих участие в процессе.
Если раньше работало нормально и вдруг перестало, а при тестировании базы обнаружены ошибки, необходимо, как минимум, убрать ошибки. Удалить все индексы, выгрузить базу и загрузить в саму себя. Если получится, ошибки должны устраниться. А тогда уже анализировать работу ввода на основании.
Не исключайте вариант, что и раньше бывали удаления строк, просто их не замечали. Вы сами своими руками делали подобный ввод на основании, при котором пропадали строки, или опираетесь на слова пользователей?
Автор: DAS_Alex 01.06.11, 15:37
Цитата(dmiter @ 01.06.11, 8:24) http://pro1c.org.ua/index.php?act=findpost&pid=24518
Вы сами своими руками делали подобный ввод на основании, при котором пропадали строки, или опираетесь на слова пользователей?
Сам видел только результат: открытый документ, введенный на основании, с оставшимися строками.
Автор: 5_kopeek 01.06.11, 22:59
Цитата(DAS_Alex @ 01.06.11, 15:37)
Сам видел только результат: открытый документ, введенный на основании, с оставшимися строками.
В таком случае нет никакой гарантии, что это не дело рук самих пользователей. Лучше лично убедиться в наличии описанной проблемы, а потом уже голову ломать. Совет из личного опыта.
Автор: awp 02.06.11, 7:46
Попробуйте понаблюдать
Процедура ПриУдаленииСтроки()
ЗаписьЖурналаРегистрации("Пользователь руками полез",,"Удаление строк " + ЛюбойРеквизитТЧ ,Объект,"");
КонецПроцедуры
Я таким образом поймал кто удаляет БВ(через обработку внешнюю) и кричит что это программа виновата
Автор: DAS_Alex 02.06.11, 15:50
Цитата(awp @ 02.06.11, 7:46)
Попробуйте понаблюдать
Процедура ПриУдаленииСтроки()
ЗаписьЖурналаРегистрации("Пользователь руками полез",,"Удаление строк " + ЛюбойРеквизитТЧ ,Объект,"");
КонецПроцедуры
Я таким образом поймал кто удаляет БВ(через обработку внешнюю) и кричит что это программа виновата
Попробую
Автор: DAS_Alex 07.06.11, 10:28
Новая ситуация. Пользователь открыл документ в котором были строки, документ открылся с пустой многострочной частью. Нажав на кнопку "Закрыть" - документ не изменялся - 1С попросила сохранить документ. Пользователь не согласился и при следующем открытии многострочная часть документа была с строками.
Автор: Valerka 07.06.11, 11:46
А внешних компонент никаких не подвязано к базе?
Автор: 5_kopeek 07.06.11, 11:49
Цитата(DAS_Alex @ 07.06.11, 10:28)
Новая ситуация. Пользователь открыл документ в котором были строки, документ открылся с пустой многострочной частью. Нажав на кнопку "Закрыть" - документ не изменялся - 1С попросила сохранить документ. Пользователь не согласился и при следующем открытии многострочная часть документа была с строками.
DAS_Alex, исправляйте базу.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua