приветствую! случайно обнаружил в базе неск.документов, в ТЧ которых строки с ОДИНАКОВЫМ номером... например идет нумерация: 1,2,3,4,5....52,52,....55,55, т.е. встречаются ПАРЫ (троек не находил), когда разные по содержанию строки идут с одним номером. На базе стоит МОД, в остальном достаточно стандартная ТиС. Может кто сталкивался?
По теме из базы знаний
- Обработка и Конфигурация для выборки номеров сотовых телефонов из различных текстовых файлов, а также из контактной информации контрагентов.
- Генератор номеров для PSI WMS
- Работа с кодами - числами, датами, кодами справочников, номерами документов, идентификаторами в 1С и в других базах данных
- UmBu Умная сверка
- Загрузка из Excel в документ (Заказ поставщику)
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(15) у меня просто такая же петрушка. Я сам запихнул временный расчет регистров в форму, для красивого вывода остатков ТМЦ. И после этого начал наступать на описанные Вами грабли. Только Вы скорее всего не заметили, что кроме задвоения нумерации, есть еще глюк с сортировкой строк.
Насчет переиндексации БД - это устранение следствий, а не причины.
Чтобы устранить причину, нужно исправить (или удалить нафиг) код временного расчета регистров.
если выложите кусок кода из модуля формы, где происходит временный расчет регистров, я Вам объясню конкретно на примере, почему так происходит.
Насчет переиндексации БД - это устранение следствий, а не причины.
Чтобы устранить причину, нужно исправить (или удалить нафиг) код временного расчета регистров.
если выложите кусок кода из модуля формы, где происходит временный расчет регистров, я Вам объясню конкретно на примере, почему так происходит.
Лучше от этого избавляться. В ТиС механизм формирования проводок и некоторые отчеты завязаны на номер строки документа. Если номер не уникален, возможно некорректное формирование проводок и ошибки в, например, "Отчете по продажам".
Про причины появления ничего сказать не могу. Возможно виноват МОД, но с ним не сталкивался.
Для начала посмотри, стоит ли в конфигурации на проблемных документах галочка "Автоматическая нумерация строк".
Про причины появления ничего сказать не могу. Возможно виноват МОД, но с ним не сталкивался.
Для начала посмотри, стоит ли в конфигурации на проблемных документах галочка "Автоматическая нумерация строк".
Соглашусь. Если база dbf, первым делом желательно попробовать следующее - удалить все индексные файлы, после этого зайти в базу монопольно. Индексы восстановятся, и после этого проверить нумерацию строк. При битых индексах ещё и не такие чудеса бывают :)
да код вобщемто стандартный...:
ОбщРег = СоздатьОбъект("Регистры");
РегОтданные = ОбщРег.ПартииОтданные;
// установим фильтры на измерения
РегОтданные.УстановитьЗначениеФильтра("Фирма", Фирма, 1);
РегОтданные.УстановитьЗначениеФильтра("Договор", Договор, 1);
// если нужно, то выполним временный расчет регистра
Если Выбран() = 0 Тогда
// Новый документ
Если ДатаДок < ПолучитьДатуТА() Тогда
// выписываемый задним числом
РегОтданные.ВременныйРасчет();
ОбщРег.РассчитатьРегистрыПо(ДатаДок);
КонецЕсли;
Иначе
// Сохраненный документ.
Если СравнитьТА() < 1 Тогда
//Позиция не больше ТА.
РегОтданные.ВременныйРасчет();
ОбщРег.РассчитатьРегистрыНа(ТекущийДокумент());
КонецЕсли;
КонецЕсли;
ни дальше работаю с итогоми регистра...
ОбщРег = СоздатьОбъект("Регистры");
РегОтданные = ОбщРег.ПартииОтданные;
// установим фильтры на измерения
РегОтданные.УстановитьЗначениеФильтра("Фирма", Фирма, 1);
РегОтданные.УстановитьЗначениеФильтра("Договор", Договор, 1);
// если нужно, то выполним временный расчет регистра
Если Выбран() = 0 Тогда
// Новый документ
Если ДатаДок < ПолучитьДатуТА() Тогда
// выписываемый задним числом
РегОтданные.ВременныйРасчет();
ОбщРег.РассчитатьРегистрыПо(ДатаДок);
КонецЕсли;
Иначе
// Сохраненный документ.
Если СравнитьТА() < 1 Тогда
//Позиция не больше ТА.
РегОтданные.ВременныйРасчет();
ОбщРег.РассчитатьРегистрыНа(ТекущийДокумент());
КонецЕсли;
КонецЕсли;
ни дальше работаю с итогоми регистра...
(17) осмелюсь предположить, что Ваш документ относится к оперативному учету, и двигает регистры.
В модуле формы дока, есть модульные переменные "ОбщРег", "РегОтданные"
У меня пресчет регистров схож с Вашим (только я апеллирую к регистру ОстаткиТМЦ). У меня пресчет регистров оформлен отдельной процедурой и запускается в предопределенной процедуре ПриОткрытии(), а также в процедуре ПриИзмененииДаты(). Смею предположить, что у Вас, что-то подобное.
Давайте поразмыслим, какие состояния пройдет этот документ, прежде чем будет записан в базу и закрыт.
Т.е. открыта форма нового документа -> ПриОткрытии() -> ПересчетРегистров()
Добавляем штук 50 номенклатурных позиций и просто записываем документ.
Дальше, предположим, мы получаем задание выписать еще один такой же "быстрый" документ, на 1-2 строки. Мы не закрывая форму предыдущего записанного документа, создаем новый док, набиваем эти 2 номенклатурные позиции, проводим, распечатываем и закрываем второй док.
Что мы имеем - наш первый записанный док оказывается отодвинут за ТА.
Мы, не задумываясь над этим, переключаемся на первый док и продолжаем с ним работать дальше. Н-р добавляем еще несколько номенклатурных позиций, сортируем (обязательно!!!), проводим, внимательно просматриваем табличную часть ища глюки описанные Вами в (1), удостоверившись, что глюков нет, со спокойной совестью распечатываем и закрываем документ. Отдаем бумажные накладные на склад, и с чувством хорошо проделанной работы наслаждаемся кофе.
Но через несколько секунд/минут/часов, наш кайф обрывает возмущенный кладовщик, обзывая нас всякими нехорошими словами. В его накладной-простыне на > 50 наименований, последние отсортированы, так, как будто Вы специально корпели над тем, чтобы усложнить его и без того тяжелую (его имхо) жизнь.
Вы в недоумении берете бумажную накладную. Глядя на отсортированные абы-как данные, Вы вспоминаете, что четко проверили форму документа перед распечаткой и все было отсортировано нормально.
Момент истины: Вы открываете этот электронный документ и наблюдаете в ТЧ туже картину, что и в бумажной накладной. Помимо сбившейся сортировки, идет задвоение нумерации строк.
Резюме: тяжело сказать, почему это происходит (нужно наверно копаться в кишках одноэсины). Но если мы проводим ЗАПИСАННЫЙ документ (записанный до ТА и датированный рабочим днем) - срабатывает:
Если ( Проведен() = 0 ) Тогда
ПроводитьПослеТА(1,1);
КонецЕсли;
И именно в этот момент (при перемещении документа по шкале ТА) происходит все Выше описанное.
При этом ВАЖНО: изменения уже зафиксированы в БД, но форма не обновилась и нам визуально глюк не виден.
зы: уфф, запарился писать
В модуле формы дока, есть модульные переменные "ОбщРег", "РегОтданные"
У меня пресчет регистров схож с Вашим (только я апеллирую к регистру ОстаткиТМЦ). У меня пресчет регистров оформлен отдельной процедурой и запускается в предопределенной процедуре ПриОткрытии(), а также в процедуре ПриИзмененииДаты(). Смею предположить, что у Вас, что-то подобное.
Давайте поразмыслим, какие состояния пройдет этот документ, прежде чем будет записан в базу и закрыт.
Т.е. открыта форма нового документа -> ПриОткрытии() -> ПересчетРегистров()
Добавляем штук 50 номенклатурных позиций и просто записываем документ.
Дальше, предположим, мы получаем задание выписать еще один такой же "быстрый" документ, на 1-2 строки. Мы не закрывая форму предыдущего записанного документа, создаем новый док, набиваем эти 2 номенклатурные позиции, проводим, распечатываем и закрываем второй док.
Что мы имеем - наш первый записанный док оказывается отодвинут за ТА.
Мы, не задумываясь над этим, переключаемся на первый док и продолжаем с ним работать дальше. Н-р добавляем еще несколько номенклатурных позиций, сортируем (обязательно!!!), проводим, внимательно просматриваем табличную часть ища глюки описанные Вами в (1), удостоверившись, что глюков нет, со спокойной совестью распечатываем и закрываем документ. Отдаем бумажные накладные на склад, и с чувством хорошо проделанной работы наслаждаемся кофе.
Но через несколько секунд/минут/часов, наш кайф обрывает возмущенный кладовщик, обзывая нас всякими нехорошими словами. В его накладной-простыне на > 50 наименований, последние отсортированы, так, как будто Вы специально корпели над тем, чтобы усложнить его и без того тяжелую (его имхо) жизнь.
Вы в недоумении берете бумажную накладную. Глядя на отсортированные абы-как данные, Вы вспоминаете, что четко проверили форму документа перед распечаткой и все было отсортировано нормально.
Момент истины: Вы открываете этот электронный документ и наблюдаете в ТЧ туже картину, что и в бумажной накладной. Помимо сбившейся сортировки, идет задвоение нумерации строк.
Резюме: тяжело сказать, почему это происходит (нужно наверно копаться в кишках одноэсины). Но если мы проводим ЗАПИСАННЫЙ документ (записанный до ТА и датированный рабочим днем) - срабатывает:
Если ( Проведен() = 0 ) Тогда
ПроводитьПослеТА(1,1);
КонецЕсли;
И именно в этот момент (при перемещении документа по шкале ТА) происходит все Выше описанное.
При этом ВАЖНО: изменения уже зафиксированы в БД, но форма не обновилась и нам визуально глюк не виден.
зы: уфф, запарился писать
прошу прощения что отвлекся от собственного вопроса.
считаю ситуацию, описанную в (17) как минимум "странной",
в целом считаю что коллега в (20) 100% прав, я бы и вопрос не стал задавать если бы не одно НО: работаю с десятками в принципе однотипных баз ДВФ, на которых постоянно ломаются индексы в процессе текущей работы, но описанный в (1) глюк встречается только в одной, причем только в одном виде документов и уже не первый раз. Причем в этой "проблемной" базе, частота поломки индексов как раз самая низкая...
Собственно думал, что есть еще какой-то нюанс...
считаю ситуацию, описанную в (17) как минимум "странной",
в целом считаю что коллега в (20) 100% прав, я бы и вопрос не стал задавать если бы не одно НО: работаю с десятками в принципе однотипных баз ДВФ, на которых постоянно ломаются индексы в процессе текущей работы, но описанный в (1) глюк встречается только в одной, причем только в одном виде документов и уже не первый раз. Причем в этой "проблемной" базе, частота поломки индексов как раз самая низкая...
Собственно думал, что есть еще какой-то нюанс...
(28)
если конфигурации этих баз идентичны, то просто пользователи других баз не обращают внимания на этот глюк.
Только кладовщики, у которых накладная на сотни позиций, и в которой печенюшки абы-как перемешаны с мороженой рыбой и колбасой могут быть недовольны. А если в накладной десяток позиций, то можно и забить. Тем более, что глюк моделируется не так часто: у нас, когда был еще в доке, приведенный в (31) код, где-то 1 раз на 200 доков. Это те случаи, на которые обращали внимание.
глюк встречается только в одной, причем только в одном виде документов и уже не первый раз
если конфигурации этих баз идентичны, то просто пользователи других баз не обращают внимания на этот глюк.
Только кладовщики, у которых накладная на сотни позиций, и в которой печенюшки абы-как перемешаны с мороженой рыбой и колбасой могут быть недовольны. А если в накладной десяток позиций, то можно и забить. Тем более, что глюк моделируется не так часто: у нас, когда был еще в доке, приведенный в (31) код, где-то 1 раз на 200 доков. Это те случаи, на которые обращали внимание.
И какое всё это отношение имеет к проблеме автора ?!
У которого тупо из-за битых индексов слетела нумерация в строках документа. Которая, как бэ ни на что не влияет.. вообще.
Ну разве что, тИи может не пройти или, в некоторых конфах есть привязка к нумеру строки документа в проводках.
(для ТиС это не актуально)
У которого тупо из-за битых индексов слетела нумерация в строках документа. Которая, как бэ ни на что не влияет.. вообще.
Ну разве что, тИи может не пройти или, в некоторых конфах есть привязка к нумеру строки документа в проводках.
(для ТиС это не актуально)
(22)
Торговля+Склад, ред. 9.39. Документ - Реализация.
Текстовые реквизиты на форме смотреть на скриншоте.
Код модуля формы документа:
Перем мОстаткиТоваров, мОбщийРег; // для получения остатков
//******************************************************************************
Процедура ПересчетРегистров()
мОбщийРег = СоздатьОбъект("Регистры");
мОстаткиТоваров = мОбщийРег.ОстаткиТМЦ;
Если Выбран() = 0 Тогда
// Новый документ
Если ДатаДок < ПолучитьДатуТА() Тогда
// выписываемый задним числом
мОстаткиТоваров.ВременныйРасчет();
мОбщийРег.РассчитатьРегистрыПо(ДатаДок);
КонецЕсли;
ИначеЕсли ДатаДок < ТекущийДокумент().ДатаДок Тогда
// Поменяли дату документа.
Если ДатаДок < ПолучитьДатуТА() Тогда
// выписываемый задним числом
мОстаткиТоваров.ВременныйРасчет();
мОбщийРег.РассчитатьРегистрыПо(ДатаДок);
КонецЕсли;
ИначеЕсли СравнитьТА() < 1 Тогда
//Позиция не больше ТА.
мОстаткиТоваров.ВременныйРасчет();
мОбщийРег.РассчитатьРегистрыНа(ТекущийДокумент());
КонецЕсли;
КонецПроцедуры // ПересчетРегистров()
//******************************************************************************
Функция ОстатокПоСкладу(пОстТоваров)
_Результат = "";
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Возврат _Результат;
КонецЕсли;
_ОстатокТовараСкл = пОстТоваров.СводныйОстаток(Фирма, Номенклатура, Склад, , "Количество");
Если Коэффициент <> 1 Тогда // пересчитаем остаток в единицы документа
_ОстатокТовараСкл = ?(Коэффициент = 0, 0, _ОстатокТовараСкл / Коэффициент);
КонецЕсли;
Если _ОстатокТовараСкл < 0 Тогда
Форма.ТекстОстНаСкладе.Цвет(255);
Иначе
Форма.ТекстОстНаСкладе.Цвет(0,0,128);
КонецЕсли;
_Результат = СокрЛП(Формат(_ОстатокТовараСкл,"Ч-17.3")) + " " + Единица;
Возврат _Результат;
КонецФункции // ОстатокПоСкладу()
//******************************************************************************
Функция ОстатокПоФирме(пОстТоваров)
_Результат="";
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Возврат _Результат;
КонецЕсли;
_ОстатокТовараФир = пОстТоваров.СводныйОстаток(Фирма, Номенклатура, , , "Количество");
Если Коэффициент <> 1 Тогда // пересчитаем остаток в единицы документа
_ОстатокТовараФир = ?(Коэффициент = 0, 0, _ОстатокТовараФир / Коэффициент);
КонецЕсли;
Если _ОстатокТовараФир < 0 Тогда
Форма.ТекстОстНаФирме.Цвет(255);
Иначе
Форма.ТекстОстНаФирме.Цвет(0,0,128);
КонецЕсли;
_Результат = СокрЛП(Формат(_ОстатокТовараФир,"Ч-17.3")) + " " + Единица;
Возврат _Результат;
КонецФункции // ОстатокПоФирме()
//******************************************************************************
Процедура ПриОткрытии()
........
ПересчетРегистров();
КонецПроцедуры // ПриОткрытии()
Торговля+Склад, ред. 9.39. Документ - Реализация.
Текстовые реквизиты на форме смотреть на скриншоте.
Код модуля формы документа:
Перем мОстаткиТоваров, мОбщийРег; // для получения остатков
//******************************************************************************
Процедура ПересчетРегистров()
мОбщийРег = СоздатьОбъект("Регистры");
мОстаткиТоваров = мОбщийРег.ОстаткиТМЦ;
Если Выбран() = 0 Тогда
// Новый документ
Если ДатаДок < ПолучитьДатуТА() Тогда
// выписываемый задним числом
мОстаткиТоваров.ВременныйРасчет();
мОбщийРег.РассчитатьРегистрыПо(ДатаДок);
КонецЕсли;
ИначеЕсли ДатаДок < ТекущийДокумент().ДатаДок Тогда
// Поменяли дату документа.
Если ДатаДок < ПолучитьДатуТА() Тогда
// выписываемый задним числом
мОстаткиТоваров.ВременныйРасчет();
мОбщийРег.РассчитатьРегистрыПо(ДатаДок);
КонецЕсли;
ИначеЕсли СравнитьТА() < 1 Тогда
//Позиция не больше ТА.
мОстаткиТоваров.ВременныйРасчет();
мОбщийРег.РассчитатьРегистрыНа(ТекущийДокумент());
КонецЕсли;
КонецПроцедуры // ПересчетРегистров()
//******************************************************************************
Функция ОстатокПоСкладу(пОстТоваров)
_Результат = "";
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Возврат _Результат;
КонецЕсли;
_ОстатокТовараСкл = пОстТоваров.СводныйОстаток(Фирма, Номенклатура, Склад, , "Количество");
Если Коэффициент <> 1 Тогда // пересчитаем остаток в единицы документа
_ОстатокТовараСкл = ?(Коэффициент = 0, 0, _ОстатокТовараСкл / Коэффициент);
КонецЕсли;
Если _ОстатокТовараСкл < 0 Тогда
Форма.ТекстОстНаСкладе.Цвет(255);
Иначе
Форма.ТекстОстНаСкладе.Цвет(0,0,128);
КонецЕсли;
_Результат = СокрЛП(Формат(_ОстатокТовараСкл,"Ч-17.3")) + " " + Единица;
Возврат _Результат;
КонецФункции // ОстатокПоСкладу()
//******************************************************************************
Функция ОстатокПоФирме(пОстТоваров)
_Результат="";
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Возврат _Результат;
КонецЕсли;
_ОстатокТовараФир = пОстТоваров.СводныйОстаток(Фирма, Номенклатура, , , "Количество");
Если Коэффициент <> 1 Тогда // пересчитаем остаток в единицы документа
_ОстатокТовараФир = ?(Коэффициент = 0, 0, _ОстатокТовараФир / Коэффициент);
КонецЕсли;
Если _ОстатокТовараФир < 0 Тогда
Форма.ТекстОстНаФирме.Цвет(255);
Иначе
Форма.ТекстОстНаФирме.Цвет(0,0,128);
КонецЕсли;
_Результат = СокрЛП(Формат(_ОстатокТовараФир,"Ч-17.3")) + " " + Единица;
Возврат _Результат;
КонецФункции // ОстатокПоФирме()
//******************************************************************************
Процедура ПриОткрытии()
........
ПересчетРегистров();
КонецПроцедуры // ПриОткрытии()
Прикрепленные файлы:
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот