Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: В документе пропадают строки...
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
DAS_Alex
Добрый день. База 1С 7.7.025 DBF/CDX. Сохраняю документ с определенным количеством строк при следующем открытии не хватает несколько строк. В процедурах ПриОткрытии() и ПриЗаписи() нет программного удаления. Я думаю, что потихоньку рушится база, что в таких случаях необходимо делать?
awp
Цитата(DAS_Alex @ 30.05.11, 8:30) необходимо зарегистрироваться для просмотра ссылки
Добрый день. База 1С 7.7.025 DBF/CDX. Сохраняю документ с определенным количеством строк при следующем открытии не хватает несколько строк. В процедурах ПриОткрытии() и ПриЗаписи() нет программного удаления. Я думаю, что потихоньку рушится база, что в таких случаях необходимо делать?


1. Резервная копия
2. Тестирование и исправление ИБ

Если при выполнении пункта 2 - много ошибок - то подымаем резервную копию - делаем выгрузку а потом загрузку ИБ и опять пункт 2.
Удачи.
DAS_Alex
при выполнении пункта 2 много ошибок, но ошибок связанных с проблемным документом немного

Цитата(awp @ 30.05.11, 8:12) необходимо зарегистрироваться для просмотра ссылки
1. Резервная копия
2. Тестирование и исправление ИБ

Если при выполнении пункта 2 - много ошибок - то подымаем резервную копию - делаем выгрузку а потом загрузку ИБ и опять пункт 2.
Удачи.


Зачем делать: - то подымаем резервную копию - делаем выгрузку а потом загрузку ИБ и опять пункт 2? Там те же ошибки..
g789
Цитата(DAS_Alex @ 30.05.11, 9:47) необходимо зарегистрироваться для просмотра ссылки
при выполнении пункта 2 много ошибок, но ошибок связанных с проблемным документом немного
Зачем делать: - то подымаем резервную копию - делаем выгрузку а потом загрузку ИБ и опять пункт 2? Там те же ошибки..

Выгрузка - Загрузка часто "лечит" dbf базы.
Сколько обычно строк в документе?
Посмотрите в модуле документа при проведении часто используют ВыгрузитьТабличнуюЧасть - Загрузить ТабличнуюЧасть.
DAS_Alex
максимальное количество строк 100, документ не проводится..
Zaval
smile.gif Что за документ и что в его строках?

Нпр, если творчески подойти к удалению подчиненных - можно и не такого добиться.
-=VJ=-
Цитата(DAS_Alex @ 30.05.11, 7:30) необходимо зарегистрироваться для просмотра ссылки
В процедурах ПриОткрытии() и ПриЗаписи() нет программного удаления. Я думаю, что потихоньку рушится база, что в таких случаях необходимо делать?


Если бы рушилась база - Вы бы в неё вообще не вошли.
Проверяйте отладчиком. Во-первых удаление может быть где угодно, а не только в этих процедурах, во-вторых суть может быть не в удалении, а в несохранении - к примеру при несоблюдении каких-то параметров строка просто выбрасывается.
DAS_Alex
Цитата(-=VJ=- @ 30.05.11, 10:46) необходимо зарегистрироваться для просмотра ссылки
Если бы рушилась база - Вы бы в неё вообще не вошли.
Проверяйте отладчиком. Во-первых удаление может быть где угодно, а не только в этих процедурах, во-вторых суть может быть не в удалении, а в несохранении - к примеру при несоблюдении каких-то параметров строка просто выбрасывается.


Разработчик документа Я. Все, что там написано я знаю и ничего страшного не вижу. В работе он уже около трех лет. Почему я думаю на базу - каждый день база несколько раз завершается аварийно и индексируется...
Ardi
Цитата(DAS_Alex @ 30.05.11, 12:43) необходимо зарегистрироваться для просмотра ссылки
каждый день база несколько раз завершается аварийно

В терминал её.
DAS_Alex
Проблема была замечена при вводе на основании. Этот док. вводится на основании самого себя. Создав и сохранив док, пользователь тут же вводит на основании точную копию созданного, т.е кол-во строк не трудно запомнить, ну допустим 10. В документе введенном на основании остается три строки, хотя описано, что перенести все 10. Если открыть документ основание то в нем также будет три строки из введенных 10.

У этого документа есть вспомогательный документ для второй табл. части. Контекст этого док-та передается в вспомог. документ и держится там до закрытия вспомогательного, может это как-то влияет......

... медленная скорость сети может влиять..
-=VJ=-
Цитата(DAS_Alex @ 30.05.11, 13:44) необходимо зарегистрироваться для просмотра ссылки
Проблема была замечена при вводе на основании.


Ну так бросьте листинг процедуры - пусть народ посмотрит, авось чего и найдем.
Ardi
Цитата(DAS_Alex @ 30.05.11, 12:43) необходимо зарегистрироваться для просмотра ссылки
каждый день база несколько раз завершается аварийно


Цитата(DAS_Alex @ 30.05.11, 12:43) необходимо зарегистрироваться для просмотра ссылки
... медленная скорость сети может влиять..

В терминал её!!!!!!!!!!!!!!!!!!!!
----
Я думаю вообще могут пакеты по сети теряться в этом случае.
----
Проверить - не стоит ли разрешение для шары кешировать файлы. Или как оно там называется.
Zaval
Цитата(DAS_Alex @ 30.05.11, 14:44) необходимо зарегистрироваться для просмотра ссылки
Проблема была замечена при вводе на основании. Этот док. вводится на основании самого себя. Создав и сохранив док, пользователь тут же вводит на основании точную копию созданного, т.е кол-во строк не трудно запомнить, ну допустим 10. В документе введенном на основании остается три строки, хотя описано, что перенести все 10. Если открыть документ основание то в нем также будет три строки из введенных 10.


Проверка на Модифицированность дока-основания есть?
Новый вводится из формы основания или из журнала/обработки?

ЗЫ. Больше похоже на косяк в коде. Для других причин "слишком умно".
DAS_Alex
Цитата(-=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=-
Цитата(DAS_Alex @ 30.05.11, 14:37) необходимо зарегистрироваться для просмотра ссылки
Вот она:


Поправьте задвоение.

Я правильно понял: если не делать ввод на основании, а сразу после сохранения открыть документ - строк десять, а если после этого сделать ввод на основании - их в обеих документах становится три?
Pepe
Цитата(DAS_Alex @ 30.05.11, 15:37) необходимо зарегистрироваться для просмотра ссылки
Но Я больше склоняюсь к сети, она у нас проблемная..

Если вы грешите на сеть, почему бы не проверить работу вашего документа без сети, на локальной машине?
DAS_Alex
Цитата(-=VJ=- @ 30.05.11, 15:12) необходимо зарегистрироваться для просмотра ссылки
Поправьте задвоение.

Я правильно понял: если не делать ввод на основании, а сразу после сохранения открыть документ - строк десять, а если после этого сделать ввод на основании - их в обеих документах становится три?


Не всегда, а в каких-то необъяснимых случаях. Почему я и склоняюсь к проблемам с сетью. Можно десяток создать и ввести на основании - все нормально, а на 11-й раз пропадет.
Zaval
Три года работал???

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

Зачем создавать док с тем же номером?
Не могу понять разницы между "стр=1" и "иначе".
DAS_Alex
Цитата(Pepe @ 30.05.11, 15:12) необходимо зарегистрироваться для просмотра ссылки
Если вы грешите на сеть, почему бы не проверить работу вашего документа без сети, на локальной машине?


На локальной все нормально..
Ardi
7.7 дбф не устойчива к потерям пакетов данных. Вообще.
DAS_Alex
Цитата(Zaval @ 30.05.11, 15:21) необходимо зарегистрироваться для просмотра ссылки
Три года работал???

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

Зачем создавать док с тем же номером?
Не могу понять разницы между "стр=1" и "иначе".


Я говорил, что в программе проблемы не вижу. Теперь и Вам видно, что этот код не может удалять строки.
У меня два варианта:

1. Первый и самый важный это плохая скорость сети.
2. Проблемы ссылочной целостности - сама 1С не может восстановить строки из дбф.
vadim007
Зачем так сложно - копировать строки документа в цикле. Я так понял - нужно создать точную копию исходного документа? Используйте ВыгрузитьТабличнуюЧасть(..), ЗагрузитьТабличнуюЧасть(..).
PS: Использование ДокОснование.ПолучитьСтрокуПоНомеру(стр); в начале циклов Для а=стр по ДокОснование.КоличествоСтрок() Цикл лишено смысла. Условие внутри цикла Пока ДокОснование.ПолучитьСтроку()=1 Цикл не совсем прозрачное для стороннего взгляда, нужно пройтись отладчиком на реальных данных. Лучше ставьте отладочные сообщения в этом цикле, и помотрите, сколько на самом деле копируется строк в новый документ. Но все эти "выкрутасы" с циклами не совсем понятны, если цель - ввести точно такой-же документ на основании.
Zaval
Цитата(DAS_Alex @ 30.05.11, 16:40) необходимо зарегистрироваться для просмотра ссылки
Я говорил, что в программе проблемы не вижу. Теперь и Вам видно, что этот код не может удалять строки.


Но проблема-то есть.
И разница между доками и операциями над ними есть только внутри 1с. Сети пофиг, что именно терять.
Еще раз спрошу: как выполняется ввод на основании? Из какой формы и какими средствами?
DAS_Alex
Цитата(vadim007 @ 30.05.11, 16:28) необходимо зарегистрироваться для просмотра ссылки
Но все эти "выкрутасы" с циклами не совсем понятны, если цель - ввести точно такой-же документ на основании.


Табличная часть не всегда одинакова. Бывает точная копия, бывает со второй строки, бывает половина.

Цитата(Zaval @ 30.05.11, 17:20) необходимо зарегистрироваться для просмотра ссылки
Но проблема-то есть.
И разница между доками и операциями над ними есть только внутри 1с. Сети пофиг, что именно терять.
Еще раз спрошу: как выполняется ввод на основании? Из какой формы и какими средствами?


В журнале выделяю документ и через правую кнопку мыши ввести на основании
vadim007
Цитата(DAS_Alex @ 30.05.11, 18:54) необходимо зарегистрироваться для просмотра ссылки
Табличная часть не всегда одинакова. Бывает точная копия, бывает со второй строки, бывает половина.

Получается, вы сами ответили на свой вопрос.
DAS_Alex
Цитата(vadim007 @ 31.05.11, 5:37) необходимо зарегистрироваться для просмотра ссылки
Получается, вы сами ответили на свой вопрос.


получается ответ на вопрос - бывают различные ситуации переноса табличной части и я этого не понимаю, и сижу морочу голову людям...
Zaval
Новому доку присваивается Номер = Номеру Основания. Это зачем?
Ищите, нет ли в системе хитрой общей процедуры, подравнивающей Основание по Подчиненному - для связки Счет - РН иногда такое делают, чтобы получить пакет доков, выправив только один.
DAS_Alex
Цитата(Zaval @ 31.05.11, 9:34) необходимо зарегистрироваться для просмотра ссылки
Новому доку присваивается Номер = Номеру Основания. Это зачем?


Номер нового документа состоит из номера основания и отличительной буквы: новыйномер=старномер+например буква А и т.д. Так нужно производству.
Так отслеживается цепочка до конца изготовления продукции.

Все равно не вижу проблемы в коде. Раньше было все нормально, а тут вдруг раз и ко стал корявым..
dmiter
Если (Число(ДокОснование.Дата_к)<>0) и (ДокОснование.ПринятоКоличество<>0) Тогда


если данное условие выполняется на 6-й строке то в новом документе введенном на основании будет на 6 строк меньше...?
5_kopeek
Цитата(Zaval @ 30.05.11, 15:21) необходимо зарегистрироваться для просмотра ссылки
Не могу понять разницы между "стр=1" и "иначе".

Аналогично.
И еще вопрос. Переменной стр еще где-нибудь присваивается значение или она где-то еще определяется? Если данное условие
Если (Число(ДокОснование.Дата_к)<>0) и (ДокОснование.ПринятоКоличество<>0) Тогда

не выполняется, переменная стр остается неопределенной.
Но даже это не должно удалять строки из документа основания, если нет еще каких-либо процедур, принимающих участие в процессе.
Если раньше работало нормально и вдруг перестало, а при тестировании базы обнаружены ошибки, необходимо, как минимум, убрать ошибки. Удалить все индексы, выгрузить базу и загрузить в саму себя. Если получится, ошибки должны устраниться. А тогда уже анализировать работу ввода на основании.
Не исключайте вариант, что и раньше бывали удаления строк, просто их не замечали. Вы сами своими руками делали подобный ввод на основании, при котором пропадали строки, или опираетесь на слова пользователей?
DAS_Alex
Цитата(dmiter @ 01.06.11, 8:24) необходимо зарегистрироваться для просмотра ссылки
Если (Число(ДокОснование.Дата_к)<>0) и (ДокОснование.ПринятоКоличество<>0) Тогда


если данное условие выполняется на 6-й строке то в новом документе введенном на основании будет на 6 строк меньше...?


так надо, в программе описано все правильно

Цитата(5_kopeek @ 01.06.11, 9:51) необходимо зарегистрироваться для просмотра ссылки
Вы сами своими руками делали подобный ввод на основании, при котором пропадали строки, или опираетесь на слова пользователей?


Сам видел только результат: открытый документ, введенный на основании, с оставшимися строками.
5_kopeek
Цитата(DAS_Alex @ 01.06.11, 15:37) необходимо зарегистрироваться для просмотра ссылки
Сам видел только результат: открытый документ, введенный на основании, с оставшимися строками.

В таком случае нет никакой гарантии, что это не дело рук самих пользователей. Лучше лично убедиться в наличии описанной проблемы, а потом уже голову ломать. Совет из личного опыта.
awp
Попробуйте понаблюдать

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


Я таким образом поймал кто удаляет БВ(через обработку внешнюю) и кричит что это программа виновата 32542390.gif
DAS_Alex
Цитата(awp @ 02.06.11, 7:46) необходимо зарегистрироваться для просмотра ссылки
Попробуйте понаблюдать

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


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


Попробую
DAS_Alex
Новая ситуация. Пользователь открыл документ в котором были строки, документ открылся с пустой многострочной частью. Нажав на кнопку "Закрыть" - документ не изменялся - 1С попросила сохранить документ. Пользователь не согласился и при следующем открытии многострочная часть документа была с строками.
Valerka
А внешних компонент никаких не подвязано к базе?
5_kopeek
Цитата(DAS_Alex @ 07.06.11, 10:28) необходимо зарегистрироваться для просмотра ссылки
Новая ситуация. Пользователь открыл документ в котором были строки, документ открылся с пустой многострочной частью. Нажав на кнопку "Закрыть" - документ не изменялся - 1С попросила сохранить документ. Пользователь не согласился и при следующем открытии многострочная часть документа была с строками.

DAS_Alex, исправляйте базу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.