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

  • Материалы

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

  • Форум



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





    Разработка

    Всего: 14    пред. 1 2 след.

  • Преобразование из 36 системы счисления в 10 и обратно на T-SQL
  • При выполнении оператора SQL выдается ошибка Timeout expired
  • Как получить доступ к данным на других SQL серверах
  • Доступ к реквизиту в запросе по регистру через 3 (три) точки
  • Можно ли использовать "свои" триггеры в базе 1C?
  • Если с посмощью ADO читать данные в модуле проведения документа, возникает ошибка timeout expired. Как лечить?
  • Ошибка при выполнении отчетов Incorrect syntax near "ХХХХ"
  • Ошибка при проведении документов A floating point exception occured in the user process. Current transaction is canceled
  • При использовании ADO, если запрос возвращает числовое значение, выдается сообщение "Тип переменной не поддерживается"
  • При пересчете итогов возникает ошибка "SQL State 22003 Native 8115 arithmetic overflow error converting numeric to data type numeric"
  • Преобразование из 36 системы счисления в 10 и обратно на T-SQL
  • 36->10
    CREATE PROCEDURE [Convert36To10] @Res36 CHAR(9), @Deci INT OUTPUT AS
    SET NOCOUNT ON
    DECLARE @j INT
    DECLARE @Arr36 CHAR(36)
    SELECT @Arr36 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    SELECT @Deci = 0
    SELECT @j = 1
    while @j <= LEN(LTRIM(RTRIM(@Res36)))
    begin
    if @j <> 1
    SELECT @Deci = @Deci*36
    SELECT @Deci = @Deci + CHARINDEX(SUBSTRING(LTRIM(RTRIM(@Res36)), @j,1),@Arr36) -1
    SELECT @j = @j+1
    end
    

    10->36:

    CREATE PROCEDURE [Convert10To36] @Deci INT, @Res36 CHAR(9) OUTPUT AS
    SET NOCOUNT ON
    DECLARE @j INT
    DECLARE @Arr36 CHAR(36)
    SELECT @Arr36 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    SELECT @Res36 = ''
    SELECT @j = LOG(@Deci)/LOG(36) +1
    while @j>0
    begin
    SELECT @Res36 = LTRIM(RTRIM(@Res36)) + SUBSTRING(@Arr36, @Deci/POWER(36,@j-1) +1 ,1)
    SELECT @Deci = @Deci%POWER(36,@j-1)
    SELECT @j =@j-1
    end
    

    Для SQL Server 2000 данные процедуры можно оформить в виде UDF (пользовательские функции)


  • При выполнении оператора SQL выдается ошибка Timeout expired
  • Возможно данный оператор выполняется дольше выставленного таймаута, то есть времени по истечении которого оператор считается зависшим. Увеличить это время можно с помощью следующей конструкции Команда.CommandTimeOut=0, где Команда является объектом ADODB.Command

  • Как получить доступ к данным на других SQL серверах
  • Один из вариантов. В запросе в предложении FROM вместо database.owner.object_name нужно использовать linked_server.database.owner.object_name Для этого при помощи процедуры sp_addlinkedserver нужно прописать этот сервер на нашем SQL сервере.

  • Доступ к реквизиту в запросе по регистру через 3 (три) точки
  • Симптомы

    В запросе определяю переменные
    ...
    |Место = Регистр.Транзакции.Место;
    |Филиал = Регистр.Транзакции.Место.Филиал;
    ...
    На ВыполнитьЗапрос 1С вылетает (некорректный синтаксис в запросе). Если перем "Филиал" не определять, то все работает. Я в курсе, что есть проблема с уровнем вложенности переменной в запросе, но может это как можно обойти?

    Регистр.Транзакции — остатков. В тоже время есть регистр оборотный, там определение переменных с 3 точками проходит.

    Объяснение

    Во-первых, ошибка зависит только от релиза 1С. Это ясно видно в SQL Profiler. Я выяснил как обойти эту проблему.

    1. Если переменные с 3 точками явно в группировках запроса не участвуют, тогда их не нужно включать. У меня была ситуация — в универсальном отчете пользователю необходимо было определять все возможные группировки и получать нужные разрезы. Вот я и определял сразу все переменные, которые могли участвовать в запросе, а дальше шло наложение условий и группировок. На DBF это проходило, поэтому я и не загружался такой проблемой.

    2. Все же в запросе можно определять переменные с 3 точками, но в этом случае ОБЯЗАТЕЛЬНО по ним должна быть группировка (или условие). Причем таких переменных (с 3 точками) может быть несколько, но тогда по всем ним должны быть группировки. Не допускается ситуация, когда сначала идет группировка по переменной с 2 точками, а затем группировка по переменной с 3 точками — это также приводит к ошибке.

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


  • Можно ли использовать "свои" триггеры в базе 1C?
  • Да. В начале триггера обязательно должно быть set nocount on.

  • Если с посмощью ADO читать данные в модуле проведения документа, возникает ошибка timeout expired. Как лечить?
  • set transaction isolation level read uncommitted

  • Ошибка при выполнении отчетов Incorrect syntax near "ХХХХ"
  • Данная ошибка возникает при неправильной интерпретации запроса 1С в запрос на SQL Server. Возникает синтаксическая ошибка (дословный перевод). Таким образом ошибка в самой 1С, точнее в том релизе, который вы используете. Относительно стабильными релизами в этом отношении считаются 15, 18, 19, 20 (на март 2003). 16 и 17 релизы довольно часто грешат такими ошибками.

  • Ошибка при проведении документов A floating point exception occured in the user process. Current transaction is canceled
  • В одной из статей Microsoft Knowledge Base данная ошибка объясняется конвертацией значения 0/0 в вещественное (float) значение при передаче в качестве параметра хранимой процедуры. В этой же статье написано, что данная ошибка исправлена в SQL Server 7.0 Service Pack 4. В SQL Server 2000 данная ошибка возникает при конвертации значения в числовой (numeric) параметр. Почему это связано с проведением документов можно объяснить так: при проведении документа используются различные ХП для расчета итогов (как для БИ, так и для ОУ), поэтому появление такой ошибки вполне возможно.

    Лекарство Для SQL Server 2000 по моей информации (2 случая) помогает установка Service Pack 2.

    А вот еще на эту же тему


  • При использовании ADO, если запрос возвращает числовое значение, выдается сообщение "Тип переменной не поддерживается"
  • Дело в том, что 1С похоже воспринимается только строковые значение. Поэтому для SQL Server используйте функции convert или cast, а для DBF функцию STR.

  • При пересчете итогов возникает ошибка "SQL State 22003 Native 8115 arithmetic overflow error converting numeric to data type numeric"
  • Скорее всего у вас произошло переполнение бухгалтерских итогов. Случится это может по разным причинам. Например, если суммы по аналитике не списываются или если документ формирует проводки с большими суммами. Отследить это можно просто — выполнив запрос по таблице _1sentry с условием по реквизитам SUM_,AMOUNT,CUSUM, а также по таблице итогов _1sbkttl по реквизиту SD, OBDT(KT).

     наверх