|
Начинающим
| Опубликована: 28.07.2001, отредактирована: 26.03.2003 |
Автор:
toypaul
|
Почему в dbf работает, а в SQL нет
По мотивам форума Территория 1С
Не для всех багов были найдены подходящие решения. Поэтому если вы знаете как побороть один из нижеописанных багов
и ваше решение будет опубликовано на пользу всем. Могу также отметить, что на текущий момент наиболее действенным решением многих багов является замена релиза на 15, а также использование SQL Server 7.0 SP3.
З.Ы. И еще,— пусть сюда почаще заходят сотрудники 1С ;) — оставляют свои ответы, комментарии.
1) Ситуация
При переходе с dbf в SQL запрос не хочет выбирать Контрагента,Товар по условию. Текст запроса: ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбконПериода по ВыбКонПериода;
|Сотрудник = Регистр.Сотрудник.сотрудник;
|Товар = Регистр.Сотрудник.Товар;
|Склад = Регистр.Сотрудник.Склад;
|Место = Регистр.Сотрудник.Место;
|Себестоимость = Регистр.Сотрудник.стоимость;
|ОстатокТовара = Регистр.Сотрудник.ОстатокТовара;
|ТекущийДокумент = Регистр.Сотрудник.ТекущийДокумент;
|Валст = Регистр.Сотрудник.Валстоимость;
|Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
|Функция СебестоимостьСумма = коност(Себестоимость);
|Функция ВалСумма = коност(Валст);
|" ;
ТекстЗапроса = ТекстЗапроса +"Группировка Сотрудник без групп;";
ТекстЗапроса = ТекстЗапроса +"Группировка товар без групп;";
Если ск=1 Тогда ТекстЗапроса = ТекстЗапроса +"Группировка Склад;"; КонецЕсли;
Если м=1 Тогда ТекстЗапроса = ТекстЗапроса +"Группировка Место;"; КонецЕсли;
Если сотрудник1.выбран()=1 Тогда
ТекстЗапроса = ТекстЗапроса+"Условие(Сотрудник= сотрудник1);";
строка1=строка1+"По Сотруднику "+сотрудник1;
КонецЕсли;
Если выбсклад.выбран()=1 Тогда
ТекстЗапроса = ТекстЗапроса+"Условие(Склад = ВыбСклад);";
строка1=строка1+" По складу "+Выбсклад; Иначе строка1=строка1+" ПО всем складам";
КонецЕсли;
Если выбтовар.выбран()=1 Тогда
ТекстЗапроса = ТекстЗапроса+"Условие(Товар = ВыбТовар); ";
строка1=строка1+" ПО Товару "+Выбтовар;
КонецЕсли;
Если ПустаяСтрока(выбместо)=0 Тогда
ТекстЗапроса = ТекстЗапроса+"Условие(Место = выбМесто);"
КонецЕсли;
Сотрудник Измерение неопределенного типа
Релиз 17 , ОДБС 3.510.3711 Выдает пустой запрос. В dbf все работает.
Как я понял дело в измерении неопределенного типа. Если поставить условие по этому измерению всегда выдает 0, в dbf работает, кто-нибуть встречал ????
Возможные решения
Не помню точно. У меня, по-моему, вплоть до 14 или 15 релиза подобные запросы вызывали "вылет" предприятия. На 14(15) работало. Так что могу лишь посоветовать проверить на этих релизах.
ставь 15 релиз 1С для SQL — все будет ОК. Гарантирую.
Замена релиза это не интересно, пришлось в обходах группировки проверять.
2) Ситуация
При групповом проведении документов при попытке записать операцию (проводки) по второму документу (по первому такого же типа все проходит)1C 7.7.017 вылетает с ошибкой SQL:
SQL State: 23000 Native: 2601 Message:[Microsoft][SQL ODBC Server Driver][SQL Server]Cannot insert duplicate key row in object '_1SOPER' with unique index 'DOCID'.
В чем может быть дело? В DBF все ОК.
Возможные решения
Посмотри, нет ли висящих проводок без даты и привязки к операциии.
Замечания (Василий Рыжий) Точно не помню, с чем связана (помоему две строки длинее 256 символом) но ситуация исправляется SP3 для SQL 7.0 и последним драйвером MDAC.
Обяснение
Сообщение переводится следующим образом: "Невозможно вставить строку с повторяющимся ключом в объект ... с уникальным индексом...". В этом случае объект это таблица операций, индекс постороен по уникальному идентификатору документа. При попытке вставки новой операции в таблицу операций допустим с с идентификатором документа 1 SQL Server обнаруживает ,что в таблице запись с таким кодом уже есть и выдает ошибку. Такая запись является "зависшей", то есть она должна была быть удалена при удалении или отмене проведения документа. Почему такое случилось другой вопрос. Решение состоит в том чтобы найти эту запись и удалить ее. Как это сделать смотрите статью HOWTO в разделе Первые шаги.
З.Ы.
Кстати первый документ проводится нормально потому что у него нет "зависших" операций.
3) Ситуация
1. SQL база. Карточка счета 51, дата с ____ по ____ (например 02.06 по 09.06) вид субконто — банковские счета, субконто — основной. Кажет какое-то красное сальдо на начало. Смещаю диапазон на с 01.06 по 09.06 — никаких подозрительных оборотов не вижу. 2. Пересчитал итоги (за все периоды) — не помогло. 3. Выгрузил данные, загрузил локально под dbf. В dbf-ной базе глюка такого не увидел. 4. Эти же данные запуливаю в другую базу под SQL — опять все нормально. 5. Эту же выгрузку загружаю в исходную SQL-ную базу — глюк остался на месте. 6. Протер монитор тряпочкой — тоже не помогло :о( Было бы в dbf такое, грохнул бы файло с итогами, пересчитал бы все с самого начала и голова не боли. Как с SQL-ной базой быть в такой ситуации? (все доступы не у меня, а у сиса, который далековато сейчас).
ПО: 1С 7.70.015 и SQL 7.0 (по-моему) под win2k.
Возможные решения
Используй запросы. У меня такое было в доке банковкая выписка при нажатии на показать остатки.
Грохай все записи файлов с итогами, никакие особые права доступа тебе не понадобятся
сколько знаю, можно убить бух.остатки truncate table _1sbkttl truncate table _1sbkttlc И вновь пересчитать. Но поможет ли?
Ковырялся, ковырялся и выяснил, что этот глюк отсутствует во всех типах баз от dbf до SQL 7.0 включительно... А на SQL 2000 никак не лечится :о( Собираюсь вот даже монитор тряпочкой протереть. Вдруг поможет? В тестах на всех базах использовал одну и туже выгрузку данных и итоги по нескольку раз пересчитывал, и чистую базу создавал, в нее загружал данные... Даже поставил на свою машину родного клиента от 2000 sql я... Не помогает
Замечания (Василий Рыжий) Ошибка может быть связана с некоректной обработкой сложных проводок. Пересчетами / Переиндексацией не лечится. Эта ситуация исправляется в 18-ом релизе (не меньше!).
4) Ситуация
Народ, столкнулся с тем, что под SQL 1С не подгребает данные в отчет, если указана для отбора группа справочника. Выгружаю в dbf - все нормально (отбор по группе работает). На ИТС пишут: "...Однако, не следует группы справочников в качестве значений субконто". Все это понятно, но тогда почему dbf работает. Всем спасибо, кто поделится мнением/советом.
Возможные решения
Т.е. ты пишешь Ит.ИспользоватьСубконто(ВидСубконто, Группа, 2)? Попробуй Ит.ИспользоватьСубконто(ВидСубконто, Группа, 1) это работает без проблем, выборку можно и не обходить, а время запроса практически не увеличивается
5) Ситуация
При вроведении документа 1С (17 релиз) выдает ошибку :
SQL state: 42000 Native: 16917 Message: [Microsoft][ODBC SQL Server Driver][Sql Server]Cursor is not open
Как действовать в такой ситуации ?
Замечания (Василий Рыжий)
Эта проблема лечиться новым MDAC, Но(!) Важно знать, что всем релизам 1С есть максимальный номер версии MDAC. Список можно взять у франчей
Возможные решения
Поставить 15 релиз и не мучаться. Что 16, что 17 — под SQL одни проблемы.
6) Ситуация
Великий all Если возможно ты встречал в работе с 1с следующую проблему: при переходе с dbf на sql в некоторых отчетах (конф.Производство) sql начинает выдавать error типа
Line2:Incorrect syntax near 'ra3887'
и т.д и т.п
Возможные решения
Ошибка означает, что SQL-запрос, сформированный 1С составлен неверно (Incorrect syntax). Решение может заключаться либо в написании текста запроса так, чтобы 1С смогла сформировать верный SQL-запрос, либо в смене релиза (в этом случае, если запрос будет работать, обязательно проверьте работу других запросов). А еще неплохо было бы послать текст запроса на hotline 1С (вместе с конфигурацией), чтобы баг был исправлен в следующем релизе.
7) Ситуация
Перешли на SQL. Теперь в доке "Выписка банка" при нажатии кнопки "Показать остатки" выдается какое-то левьё. Если смотреть стандартные отчеты, то по счетам все нормально, все остатки выдаются правильно. Косяк только в этом документе. Если сделать выгрузку, а потом загрузить под ДБФ, все работает нормально. Как с такой хренью бороться? Релиз предприятия 15, конфы 301(это Комплексная).
Возможные решения
1) Э... Народ... Это старая песня. В 7.7 под SQL не работает метод РассчитатьИтоги(,,) Надобно через запрос энто дело переписывать. Это было обнаружено на первых же релизах 7.7. Ее правят-правят и никак не поправят. Вроде, если период месяц или день то уже правильно работает. За 10 релизов подправили... К сотому обещали исправить остальное.
2) Автор Delan Мы работали на 18 релизе SQL. Все было хорошо, но не работал очень нужный отчет. Перешли на 15 релиз-все заработало, но в "Выписке из банка" точно такая же лабудень. Все решилось снятием галочки "Только обороты" в плане счетов на 51 счете во втором субконто "ДвиженияДенежныхСредств. Как я думаю, 15 релиз неправильно обрабатывает обороты.
8) Ситуация
После перехода на SQL версию не работает отчет.
База работала на 10 релизе, переход на 15 релиз SQL. Переброс в SQL прошел без запинки. Вот только самописный отчет эффективности товара не работает (отаток на начало, приход, продажи по отделам, остаток на конец, прибыль). Входные данные для отчета: Список складов, товар (либо группа), период Отчет выдает пустые поля продаж при задание списка складов (раньше все работало). А если не задаем склады (по всем складам) то отчет выдается корректный.
ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |Товар = Регистр.ОстаткиТоваров.Товар, Регистр.ОборотРеализации.Товар; |Склад = Регистр.ОстаткиТоваров.Склад; |ФУ = Регистр.ОстаткиТоваров.ФлагУчета; |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара; |БазоваяСтоимость = Регистр.ОстаткиТоваров.БазоваяСтоимость; |Количество = Регистр.ОборотРеализации.Количество; |Стоимость = Регистр.ОборотРеализации.Стоимость; |Себестоимость = Регистр.ОборотРеализации.Себестоимость; |ВидРеализации = Регистр.ОборотРеализации.ВидРеализации; |Функция ОстатокТовараНачОст = НачОст(ОстатокТовара); |Функция БазоваяСтоимостьНачОст = НачОст(БазоваяСтоимость); |Функция ОстатокТовараПриход = Приход(ОстатокТовара) когда (ФУ=02); |Функция БазоваяСтоимостьПриход = Приход(БазоваяСтоимость) когда (ФУ=02); |Функция КоличествоРеализованоРНК = Сумма(Количество) когда(ВидРеализации = Перечисление.ВидыПокупателей.Оптовик); |Функция СтоимостьРеализованоРНК = Сумма(Стоимость) когда(ВидРеализации = Перечисление.ВидыПокупателей.Оптовик); |Функция КоличествоРеализованоРНР = Сумма(Количество) когда(ВидРеализации = Перечисление.ВидыПокупателей.ТорговыйПредставитель); |Функция СтоимостьРеализованоРНР = Сумма(Стоимость) когда(ВидРеализации = Перечисление.ВидыПокупателей.ТорговыйПредставитель); |Функция КоличествоРеализованоРНO = Сумма(Количество) когда(ВидРеализации = Перечисление.ВидыПокупателей.ТорговыйПредставительОпт); |Функция СтоимостьРеализованоРНO = Сумма(Стоимость) когда(ВидРеализации = Перечисление.ВидыПокупателей.ТорговыйПредставительОпт); |Функция СтоимостьРеализовано = Сумма(Стоимость); |Функция СебеСтоимостьРеализованоРНК = Сумма(Себестоимость) когда(ВидРеализации = Перечисление.ВидыПокупателей.Оптовик); |Функция СебеСтоимостьРеализованоРНР = Сумма(Себестоимость) когда(ВидРеализации = Перечисление.ВидыПокупателей.ТорговыйПредставитель); |Функция СебеСтоимостьРеализованоРНО = Сумма(Себестоимость) когда(ВидРеализации = Перечисление.ВидыПокупателей.ТорговыйПредставительОпт); |Функция ОстатокТовараКонОст = КонОст(ОстатокТовара); |Функция БазоваяСтоимостьКонОст = КонОст(БазоваяСтоимость); |Функция РасходСебестоимость = Расход(БазоваяСтоимость) когда(ФУ=02); |Группировка Товар; |Условие (Склад в СписокСкладов); |"//}}ЗАПРОС;
Возможные решения
Здесь мы наблюдаем скорее не глюк SQL версии, а "неожиданную" (или как они там по другому называются) возможность dbf версии. Дело в том, что, наверное, в регистре ОборотРеализации также должно быть измерение Склад и в запросе нужно было бы написать:
Склад = Регистр.ОстаткиТоваров.Склад,Регистр.ОборотРеализации.Склад;
Если же такого измерения нет, то нужно писать два отдельных запроса.
Пока хватит — продолжение, как это не печально, следует:
наверх
|