Версия для печати темы (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

smile.gif Что за документ и что в его строках?

Нпр, если творчески подойти к удалению подчиненных - можно и не такого добиться.

Автор: -=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

Три года работал???

smile.gif Может, неудачно усовершенствовали? В коде "две руки" просматриваются.

Зачем создавать док с тем же номером?
Не могу понять разницы между "стр=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) *
Три года работал???

smile.gif Может, неудачно усовершенствовали? В коде "две руки" просматриваются.

Зачем создавать док с тем же номером?
Не могу понять разницы между "стр=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

Попробуйте понаблюдать

Процедура ПриУдаленииСтроки()
ЗаписьЖурналаРегистрации("Пользователь руками полез",,"Удаление строк "  + ЛюбойРеквизитТЧ ,Объект,"");    
КонецПроцедуры


Я таким образом поймал кто удаляет БВ(через обработку внешнюю) и кричит что это программа виновата 32542390.gif

Автор: DAS_Alex 02.06.11, 15:50

Цитата(awp @ 02.06.11, 7:46) *
Попробуйте понаблюдать

Процедура ПриУдаленииСтроки()
ЗаписьЖурналаРегистрации("Пользователь руками полез",,"Удаление строк "  + ЛюбойРеквизитТЧ ,Объект,"");    
КонецПроцедуры


Я таким образом поймал кто удаляет БВ(через обработку внешнюю) и кричит что это программа виновата 32542390.gif


Попробую

Автор: 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