Данная обработка средствами ADO (точнее ADOx) подключается напрямую к базе данных MSSQL с возможностью отбора по индексированным полям.
Считает количество документов по заданным отборам, сравнивает с количеством документов полученных средствами 1С и при совпадении количества позволяет средствами MSSQL распровести документы и пометить их на удаление.
Работа с MSSQL реализована с помощью стандартного драйвера "SQL Server" и не требует приобретения драйверов..
Передача отборов происходит по ADO через параметры, поэтому обработка также может заинтересовать разработчиков как рабочий пример работы по ADO.
Краткая инструкция по работе:
!!!Перед манипуляцией с БД сделайте резервную копию!!!
1. На странице "Отбор документов" с помощью доступных элементов делаем отбор документов
2. Считаем количество документов средствами 1С
3. На странице "Действия с SQL" после занесения данных для подключения к БД проверяем соединение с помощью кнопки "Тестовое соединение с БД"
4. Устанавливаем галочку "Подключиться к БД" и нажимаем кнопку "Получить кол-во документов из БД напрямую"
(если галочка не будет установлена, то на страница "Отбор документов", "Журналы документов", "Регистры" вместо выполнения будут сохранены непосредственно запросы
5. Нажимаем кнопку "Получить кол-во документов из БД напрямую" (при установленной галочке "Подключиться к БД" вернет кол-во документов на страницы "Отбор документов", "Журналы документов", "Регистры"
6. Если кол-во документов полученное напрямую из SQL совпало с кол-вом документов полученных средствами 1С, то нажимаем кнопку "Распровести и пометить на удаление (итоговое действие) В режиме с подключением к БД проверка автоматическая Для контроля корректности пометки удаления перезапишите один из документов помеченных на удаление.
7. Пересчитываем итоги в конфигураторе Администрирование->Тестирование и исправление оставляем галочку "Пересчет итогов" и проверяем, что переключатель стоит на "Тестирование и исправление".
Рекомендуется проверить обработку на тестовой базе.
P.S. Гарантий нет. Всё делаете на свой страх и риск.
Отработка тестировалась на 1С:Предприятие 8.3 (8.3.16.1063). В результате запуска обработки около 2 млн документов распровелись, пометились на удаление и с 6 млн. движений удалились за 8 минут. Расчетное время аналогичных действия средствами 1С - 174 дня (8 документов в минуту)
Алгоритм работы:
- При открытии собираются 3 таблицы: Документы, Журналы, Регистры
- Для каждого ДокументМетаданные из Метаданные.Документы цикл
…
-
- Для каждого журналМетаданные из Метаданные.ЖурналыДокументов цикл
Если НЕ журналМетаданные.РегистрируемыеДокументы.Содержит(ДокументМетаданные) Тогда
Продолжить;
КонецЕсли;
…
-
- Для каждого РегистрМетаданные из ДокументМетаданные.Движения цикл
- Если Метаданные.РегистрыНакопления.Содержит(РегистрМетаданные) Тогда
- Для каждого РегистрМетаданные из ДокументМетаданные.Движения цикл
…
-
-
- ИначеЕсли Метаданные.РегистрыСведений.Содержит(РегистрМетаданные) Тогда
-
…
-
-
- ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(РегистрМетаданные) Тогда
-
- Подстчет средствами 1С осуществляется одним динамическими запросом по документам и несколькими динамическими запросами по регистрам (наличие нескольких динамических запросов обусловлено, во-первых, ограничением кол-ва параметров 999 и, во-вторых, обрезанием слишком длинного текста запроса).
- Документы (пример запроса)
ВЫБРАТЬ
ТИПЗНАЧЕНИЯ(ПоступлениеТоваровУслуг.Ссылка) КАК ТипДокумента,
КОЛИЧЕСТВО(ПоступлениеТоваровУслуг.Ссылка) КАК Количество
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ ПоступлениеТоваровУслуг.Дата <=&ДатаОкончания И ПоступлениеТоваровУслуг.Организация=&Параметр1
СГРУППИРОВАТЬ ПО
ТИПЗНАЧЕНИЯ(ПоступлениеТоваровУслуг.Ссылка)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТИПЗНАЧЕНИЯ(ПриходныйКассовыйОрдер.Ссылка),
КОЛИЧЕСТВО(ПриходныйКассовыйОрдер.Ссылка)
ИЗ
Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
ГДЕ ПриходныйКассовыйОрдер.Дата <=&ДатаОкончания И ПриходныйКассовыйОрдер.Организация=&Параметр2
СГРУППИРОВАТЬ ПО
ТИПЗНАЧЕНИЯ(ПриходныйКассовыйОрдер.Ссылка)
-
- Журналы информация берется из запроса по документам
- Регистры (Пример запроса)
ВЫБРАТЬ
КОЛИЧЕСТВО(Регистр.Регистратор) КАК Количество,
"ПоступлениеТоваровУслуг" КАК ТипДокумента,
"ТС_ВзаиморасчетыПоПоставкамКомитентов" КАК НаименованиеРегистра
ИЗ
РегистрНакопления.ТС_ВзаиморасчетыПоПоставкамКомитентов КАК Регистр
ГДЕ
Выразить(Регистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг)<>НЕОПРЕДЕЛЕНО
И Регистр.Активность = ИСТИНА
И Выразить(Регистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Дата <= &ДатаОкончания
И Выразить(Регистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Организация = &Парам1
Объединить все
ВЫБРАТЬ
КОЛИЧЕСТВО(Регистр.Регистратор),
"ПоступлениеТоваровУслуг",
"ПараметрыАмортизацииОСБухгалтерскийУчет"
ИЗ
РегистрСведений.ПараметрыАмортизацииОСБухгалтерскийУчет КАК Регистр
ГДЕ
Выразить(Регистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг)<>НЕОПРЕДЕЛЕНО
И Регистр.Активность = ИСТИНА
И Выразить(Регистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Дата <= &ДатаОкончания
И Выразить(Регистр.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Организация = &Парам2
- Подсчет средствами MSSQL (имена таблиц в Вашей базе могут отличаться, структуру таблиц можно получить с помощью стандартной функции ПолучитьСтруктуруХраненияБазыДанных)
- По документам (Пример по документу ПоступлениеТоваровУслуг)
SELECT COUNT(*) FROM _Document528 WHERE _Date_Time <=? and _Fld16056RRef in (select _IDRRef from _Reference167 WHERE _Code=?)
-
- По журналам (Пример запроса по Журналу Деньги и документу ПриходныйКассовыйОрдер
SELECT COUNT(*) FROM _DocumentJournal21517 WHERE _DocumentRRef IN (SELECT _IDRRef FROM _Document534 WHERE _Date_Time <=? and _Fld16692RRef in (select _IDRRef from _Reference167 WHERE _Code=?))
-
- По регистрам (Пример запроса по регистру НДСПредъявленный и документу ПоступлениеТоваровУслуг)
SELECT COUNT(*) FROM _AccumRg29658 WHERE _RecorderRRef IN (SELECT _IDRRef FROM _Document528 WHERE _Date_Time <=? and _Fld16056RRef in (select _IDRRef from _Reference167 WHERE _Code=?))
- Пометка удаления, распроведение и удаление движений по регистрам осуществляется путем замены части соответствующих запросов на получение количества на правильные запросы
- По документам (пример для документа ПоступлениеТоваровУслуг)
UPDATE _Document528 SET _Marked = 0x01, _Posted = 0x00 WHERE _Date_Time <=? and _Fld16056RRef in (select _IDRRef from _Reference167 WHERE _Code=?)
-
- По Журналам (пример для документа ПоступлениеТоваровУслуг журнал Документы)
UPDATE _DocumentJournal21542 SET _Marked = 0x01, _Posted = 0x00 WHERE _DocumentRRef IN (SELECT _IDRRef FROM _Document528 WHERE _Date_Time <=? and _Fld16056RRef in (select _IDRRef from _Reference167 WHERE _Code=?))
-
- По регистрам (Регистр бухгалтерии документ ПоступлениеТоваровУслуг)
DELETE FROM _AccRg1238 WHERE _RecorderRRef IN (SELECT _IDRRef FROM _Document528 WHERE _Date_Time <=? and _Fld16056RRef in (select _IDRRef from _Reference167 WHERE _Code=?))