Оптимизация конфигураций на платформе 1C SQL
На главную
Обратная связь
Карта сайта
Оптимизация конфигураций на платформе 1C SQL
ГлавнаяМатериалыСтатьиНачинающим
  • Деятельность

  • Материалы

  •      › Скачать
         › Статьи
         › FAQ
         › Новости
  • Контакты

  • Форум



  • e-mail:
    icq: 169296011
    © 2003-2010 Шемякин Павел





    Начинающим

    Опубликована: 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 версии. Дело в том, что, наверное, в регистре ОборотРеализации также должно быть измерение Склад и в запросе нужно было бы написать:

    Склад = Регистр.ОстаткиТоваров.Склад,Регистр.ОборотРеализации.Склад;

    Если же такого измерения нет, то нужно писать два отдельных запроса.

    Пока хватит — продолжение, как это не печально, следует:

     наверх