Показаны сообщения с ярлыком прямые запросы. Показать все сообщения
Показаны сообщения с ярлыком прямые запросы. Показать все сообщения

четверг, 9 июля 2015 г.

1С и 1С++: пометка на удаление документов определенного вида до определенной даты

Необходимо: Пометить 200 тыс. документов вида "кпкЗадание" на удаление. Документ не принадлежит ни к одной из компонент.

Решение:
Все документы 1С хранятся в таблице _1SJourn. Для пометки документа на удаление необходимо модифицировать следующие поля (очистить признак проведения и установить флаг пометки на удаление):

F=CLOSED                |Flag document is clo    |Y   |0     |0
F=ISMARK                |Doc is Marked for De    |L   |0     |0
  
CLOSED - Флаг проведения документа. Для каждого набора компонент свое значение (аналогично полю APPCODE). Значение последнего бита отвечает за флаг проведения документа. Тип - Число(1). 
ISMARK - Флаг пометки на удаление. 0 - не помечен, 1 - помечен. Тип - Число(1,0) (бинарное значение).
 
Источники:
http://www.skalnyy.com/1c-sql-bystroe-udalenie-dokumentov/ 
http://www.script-coding.com/Direct_queries.html#3.
http://www.script-coding.com/v77tables.html#1.2.4.

Текст модуля:

выбДата = Формат(ДобавитьМесяц(РабочаяДата(), -6), "ДГГГГММДД");
ТекстЗапроса = "
    |UPDATE
    |    _1sjourn
    |SET
    |    ismark = 1, closed = 0
    |WHERE
    |    (Date_Time_IDDOC<'"+выбДата+"')

    |AND
    |    IDDocDef=$ВидДокумента.кпкЗадание
    |";
Query = СоздатьОбъект("ODBCRecordSet");  
Возвр = Query.Выполнить(ТекстЗапроса);
Если Возвр = 0 Тогда
    глКомментарий(Query.GetLastError(),0,,"!");
КонецЕсли;
Query.Закрыть();

понедельник, 6 июля 2015 г.

1С++ и 1С 7.7: выборка документов за определенный период

В примере - выборка документов вида "Маршрут доставки" до определенной даты (6 мес.):


выбДата = Формат(ДобавитьМесяц(РабочаяДата(), -6), "ДГГГГММДД");

//
ТекстЗапроса = "
|SELECT
|    Док.IDDOC AS [МаршрутДоставки $Документ.МаршрутДоставки]
|FROM
|    $Документ.МаршрутДоставки AS Док (NOLOCK)
|INNER JOIN
|    _1SJourn AS Журнал ON (Док.IDDOC = Журнал.IDDOC)
|WHERE
|    Журнал.DATE_TIME_IDDOC < '" + выбДата + "'
|";
   
рс = СоздатьОбъект("ODBCRecordset");
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
   
Сообщить(тз.КоличествоСтрок());


P.S. Для таких простых прямых запросов выигрыша в скорости по сравнению со стандартными методами 1С практически нет.

* Полная документация по прямым запросам здесь: http://www.script-coding.com/Direct_queries.html

понедельник, 15 июня 2015 г.

Узнать размеры таблиц 1С в базе MS SQL

Дано: База 1С SQL, надо разобраться, отчего она растет, как на дрожжах.
Поскольку это 1С - имеются сотни таблиц, перебирать которые вручную никакого желания нет.
 
Решение 1.
http://blog.imageofyou.ru/2011/11/09/all-tables-size/ 
Понадобилось мне тут давеча оценить размер таблиц в базе данных одного из наших клиентов. Еще со времен SQL Server 2000 я знаю про процедуру sp_spaceused, но она хороша только для случая, когда нужен размер лишь одного объекта – конкретной таблицы или же всей БД целиком. А для того, чтобы посмотреть размер каждого объекта (например, для того, чтобы найти аномально большие таблицы) приходилось извращаться с курсором и сохранением результата выполнения процедуры во временной таблице. Не самый изящный способ.
С появлением в SQL Server 2005 data management views эту задачу стало возможно решить с помощью всего одного запроса (без курсоров, временных таблиц и прочей “экзотики”).

 
select  t.name as TableName, Min(t.create_date) as CreateDate, ds.name as FileGroupName, SUM(u.total_pages) * 8 / 1024 as SizeMB 
from sys.tables as t
inner join sys.partitions as p on t.object_id = p.object_id
inner join sys.allocation_units as u on p.partition_id = u.container_id
inner join sys.data_spaces as ds on u.data_space_id = ds.data_space_id
group by t.name, ds.name
order by SizeMB desc
 

Решение 2
http://mainview.ru/raznoe/sql-mysql/kak-najti-samye-bolshie-tablicy-v-baze-dannyx-ms-sql 

USE [DatabaseName]
GO
CREATE TABLE #temp (
table_name sysname ,
row_count INT,
reserved_size VARCHAR(50),
data_size VARCHAR(50),
index_size VARCHAR(50),
unused_size VARCHAR(50))
SET NOCOUNT ON
INSERT #temp
EXEC sp_msforeachtable 'sp_spaceused ''?'''
SELECT a.table_name,
a.row_count,
COUNT(*) AS col_count,
a.data_size
FROM #temp a
INNER JOIN information_schema.columns b
ON a.table_name collate database_default
= b.table_name collate database_default
GROUP BY a.table_name, a.row_count, a.data_size
ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC
DROP TABLE #temp
 
Альтернативные варианты: искать обработки с инфостарта, писать самому, получить демонстрационный доступ на сервисе gilev.ru

вторник, 24 марта 2015 г.

Фильтр в запросе по списку документов (прямые запросы)

спДок = СоздатьОбъект("СписокЗначений");
тз.Выгрузить(спДок,,,"Док");
спДок.ДобавитьЗначение(РН);

//
ТекстЗапроса = "
    |SELECT
    |    Рег.IDDoc as [Док $Документ],
    |    Рег.IDDocDef as Док_вид,
    |    $Рег.СуммаСНДС as [СуммаСНДС]
    |FROM
    |    $Регистр.ОборотыТМЦ as Рег
    |WHERE
    |    Рег.IDDoc IN (SELECT Val FROM #спДок)
";

рс.УложитьСписокОбъектов(спДок, "#спДок");
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
тз.ВыбратьСтроку();


* имя таблицы должно начинаться с символа «#». подробное описание в синтакс-помощнике и в примерах на скрипт-кодинге.
 

Запрос по документу c помощью 1С++ (прямой запрос)

рс = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
    |SELECT
    |    Рег.IDDoc as [Док $Документ],
    |    Рег.IDDocDef as Док_вид,
    |    $Рег.СуммаСНДС as [СуммаСНДС]
    |FROM
    |    $Регистр.ОборотыТМЦ as Рег
    |WHERE
    |    Рег.IDDoc = :ВыбДок
";

рс.УстановитьТекстовыйПараметр("ВыбДок", РН);   
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
Возврат тз.итог("СуммаСНДС");

Получить таблицу значений с подчиненными документами определенного вида


рс = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
    |SELECT
    |    Жур.IDDoc as [Док $Документ],
    |    Жур.IDDocDef as Док_вид
    |FROM
    |    _1SJourn as Жур
    |INNER JOIN
    |    _1SCRDOC as Отбор ON Отбор.ChildID=Жур.IDDoc AND Отбор.MDID=0 AND Отбор.ParentVal=:ВыбДок*
    |WHERE
    |    Жур.IDDocDef=$ВидДокумента.РасходнаяНакладнаяКор
 

    |    AND Жур.Closed & 1 = 1";
рс.УстановитьТекстовыйПараметр("ВыбДок", РН);   
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);



где РН - переменная с типом значения "Документ.РасходнаяНакладная",
а подчиненные документы требуются только с видом "РасходнаяНакладнаяКор"
и Жур.Closed & 1 = 1 - указание отбирать только проведенные документы (в таблице _1SJourn есть поле Closed, первый бит которого отвечает за проведенность документа)

понедельник, 2 февраля 2015 г.

Эффективное использование MSSQL в 1С при помощи внешней компоненты 1С++


Копия http://www.script-coding.com/Direct_queries.html на память


Перейти на главную страничку сайта (список статей, файлы для скачивания)
ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Эффективное использование MSSQL в 1С при помощи ВК 1С++
Автор статьи - Ситников Анатолий.
Оригинал стати расположен по адресу http://acsent.nm.ru/others.htm.

Данная статья предполагает наличие базовых знаний по TSQL у читателя.

Содержание:
Глава 1: Мой первый запрос
Глава 2: Условия в запросах
    Приведение параметров к типу колонки
    Отбор по пустому значению
    Отбор по списку или группе
Глава 3: Работа с документами
    Общие реквизиты
    Использование граф отбора
    Получение представлений в запросе
Глава 4: Работа с регистрами
    Получение документа из регистра
    Виртуальные таблицы
    Оптимизация регистров
Глава 5: Вывод остатков в форме списка
Глава 6: Некоторые методы ODBCRecordset
Глава 7: Контроль остатков и партионный учет
Глава 8: Периодические реквизиты
Глава 9: Получение итогов в запросе
Глава 10: Операции UPDATE и DELETE
Глава 11: Эмуляция OLAP кубов, как на T-SQL реализовать опции <Все> и <ВошедшиеВЗапрос>
Глава 12: Разные примеры использования прямых запросов