UPD Не прошло и года, как я написал гибридную версию:).
Платформа 8.2.13.219. Конфигурация — БП 2.0.20.10. Версия SQL — 2008.
В процессе работы встала задача замены аналитики без перепроводки документов. Стандартная обработка «ПоискИЗамена» не подходила как по скорости работы, так и по вышеуказанному ограничениям. Решил реализовать алгоритм со стороны базы данных. Результатом служит указанная хранимая процедура и обработка(обработка, главным образом, для красоты и удобства).
Инструмент получился мощный, использовать с осторожностью, на свой страх и риск. После каждого применения в начале делал ТИИ, ошибок не находил. По понятным причинам после применения требуется пересчет итогов и переиндексация.
Это моя первая публикация, за любую обратную связь буду благодарен.
UPD. Доработал:) Берем архив, распаковываем. Там два текстовых файла и обработка. В текстовых файлах — код процедур поиска и замены. Берем прямо текст и создаем процедуры у себя на сервере СУБД. Внешний вид обработки не изменился.
Внимание! Не использовать для баз с обменом!(Верней, надо тогда будет проводить замену на всех базах, участвующих в обмене)
После применения обработки ОБЯЗАТЕЛЬНЫМ условием является пересчет итогов(ну и проверка ссылочной целостности).
Проверял на УТ, БП, ссылки заменяет корректно, на УТ остатки сходятся, на БП суммы по счетам сходятся. Все ссылки на предыдущий объект пропадают(кроме ссылки в справочнике). Брал контрагенты, склады, товары.
P.s. Ну и, как всегда, пишите. И прошу прощения по срокам, 2 смены работы, и пр. и пр….
Обработка и хранимая процедура предназначены для поиска и замены значений в SQL-базе посредством прямых sql-запросов. UPD Внимание! Работает только при замене любой аналитики на новую! К сожалению, слияние аналитики не работает. Пишу гибридную версию.
UPD Не прошло и года, как я написал гибридную версию:).
Перейти к публикации
Серия N+1.
Хотя , Использование недокументированных возможностей
1. Противоречит интересам фирмы 1с.
2. Нарушает лицензионное соглашение.
Но
1. Соответствуют законодательству РФ
2. Отвечает интересам владельца БД(базы данных).
Я недавно работаю с 1с, до этого работал с системами, более «близкими» к SQL-серверу, т.е. использующими его функционал гораздо более полно — SP, функции, триггеры, и пр, в т.ч. и интеграцию с другими системами на уровне сервера. Любые «родные» движки этих систем при приближении к объема базы к 1 терабайту(приблизительно) уже не удовлетворяли по быстродействию при выполнении каких=то массовых операций, поэтому все частные задачи решались уже конкретными скриптами. Ну вот я рещил попробовать то же самое с базой 1с. Честно сказать, я не понял, в чем «недокументирование» возможностей — база как база. По поводу нарушения лицензионного соглашения — ну, тут сказать ничего не могу. Но вроде как мое решение некоммерческое и использование связано с определенным риском. Пользуйтесь осторожно или не пользуйтесь — как я и писал.
Вопрос :
как поставщики решений относились к такому творчеству ?
Из своего опыта скажу , что также как и 1с ,
т.е. резко отрицательно , с угрозами снятия с поддержки.
Подписки на события и собственные модули ещё никто не отменял, мне кажется. Ну вот подобных принципов придерживаются и все остальные разработчики. И потом, решения для заказчиков с размерами баз терабайт и более, они… «законно» обладают некоторой самостоятельностью. Потому что заказчики не простые.
(4)
А можно чуть подробнее про сферу, где такие базы? Очень интересно, до куда уже дотянулась «рука 1С».
Ну, насколько возможно, разумеется 🙂
По поводу применения sql в 1С — да, применяется без проблем, можно хоть весь функционал переписать, в 1С оставить только кнопки. Работает только в путь, быстро настолько, что не успеваешь «мама» сказать, когда жмакает F5 в квери аналайзере и в последний момент замечаешь, что мааааааленький косячок-таки закрался в инсерт инто или делейт 😀
По поводу недокументированности — да, не даёт 1С из под 1С фунционала прямого доступа. Такая вот позиция. Причина — посмотрите, тут на инфостарте есть несколько топиков, где народу помогают с битыми базами, и в каждом третьем посте — «последний бэкап три месяца назад, памагите!!! что делать????». А если б из под 1С-ных запросов можно было не только select писать, а и delete, то новых интересных топиков на ИС было бы в 10 раз больше ))))
Моё личное мнение — я тоже не восторге от использования sql. Причины — возможная криворукость программистов и плачевные последствия. Плюс — существенное усложнение поддержки. Особенное, если sql используется в постоянно работающих алгоритмах.
На своей базе иногда использую.
(3)
поставщики решений (oracle к примеру) относятся обычно нормально 🙂 — собственно там весь код может быть как раз и есть sql + какая-то интерфейсная приблуда. Примеры: АБС в банках.
(5) У каждого свой опыт.
Поставщики решений (oracle к примеру) относятся именно так : Боже упаси.
Хм.. Имею опыт работы с одним таким «мировым лидером».
Так и не удалось добиться , чтобы в символьное поле комментария(разумеется неключевое) одной таблицы писалась некоторая символьная информация (Update).
Другими словами , поставщики отказались создать хранимую процедуру ,
на вход которой я бы посылал два параметра для модификации таблицы : Ключ и символьное значение.
Она пока туда не дотянулась:) Слишком велики объемы данных, чтобы можно было не использовать компиляцию, индексированные временные таблицы и пр. изыски.
И правильно, на мой взгляд. Моя задача и решение — частные, конечно. Просто я вот так вот решил, исходя из опыта и возможностей. А люди делятся на 2 категории — которые делают бэкапы и которые будут их делать.
Это цветочки. Ягодки — это когда ты требуешь не разработки, а соблюдения(!) стандартов … ну, хотя бы обмена. «Мировые лидеры» класть хотели на какие-то договоренности, и частенько сообщения приходят с другой структурой полей или другими форматами кодов. Так что базу после обмена приходится «причесывать» шаблонами и разборами. В этом отношении, работая с 1с, просто отдыхаешь.
Хорошая вещь, если умеешь этим пользоваться.
Можешь еще сделать, чтобы можно было заменять любой ссылочный тип, а не только справочник ?
(8) Да. Открою тайну — я как раз сначала написал более общий случай, замену любых ссылочных типов на другие, но потом решил ограничить дело только справочниками, и подстраховался дополнительно проверкой ссылки по коду и значению. Там процедуру надо немного править для работы с любыми ссылочными типами.
Решение похожей задачи наблюдал в 77.
Для полной однозначности заменяеммых значений входными параметрами функции должны быть не код и наименование, а функция УникальныйИдентификатор() ссылки или ЗначениеВСтрокуВнутр смотря как они храняться в SQL.
Так же данная обработка может быть смертельной, при использовании РИБ (распределенных информационных баз), так как она дожна помечать объекты для фиксирования их в узлах обмена. А там еще встречается логика, такая как пометить для обмена только для определенной организации.
(10) «функция УникальныйИдентификатор() ссылки или ЗначениеВСтрокуВнутр смотря как они храняться в SQL.» Результат первой ничего не дает, результат второй надо резать…
(11) Что касается текущей базы — она помечает, однако, везде, а вот то самое ЗначениеВСтрокуВнутр() в удаленной базе да, придется менять.
(0) Мне нужно заменить один элемент плана видов характеристик на другой (вид субконто), как мне Ваша обработка может помочь?
Так же необходимо заменить УникальныйИдентификатор() в одном справочнике на соответствующие из другого,или это лучше делать обработкой синхронизации справочников?
(13) Заменить — можно, но — конкретные значения по этому субконто куда девать? Тоже надо будет менять.
(14) УникальныйИдентификатор() — функция, в базе физически лежит другое значение. Надо менять его.
(15) У меня в плане видов характеристик 2 вида субконто, но они ссылаются на один и тот же справочник. Получилось так, что были заведены 2 элемента с одним названием и типом значения, вернее 1 был предопределенный и зачем-то завели еще один точно такой же. На вопрос «а нахрена это было надо?» теперь никто ответить не может. И в плане счетов на одних счетах стоит один вид субконто, а на других другой, соответственно и в бухгалтерском регистре творится такая же хрень. Не знаю чем это может грозить в плане искажения информации, ведь по идее значения этих субконто — это элементы одного справочника, но из-за этого становится невозможным сделать, например, тот же Анализ субконто, и приходится как-то извращаться, чтобы получить то что нужно.
Ссылки на Виды Субконто ведь «живут», как ни странно, только в регистрах бухгалтерии. Попробовал на копии запустить обработку по переделке всего этого безобразия, почти как «Поиск и замена значений» только в режиме «Обмен.Загрузка = Истина», первые 2 раза (по 3 дня каждый раз) она так и не отработала вынося платформу с критической ошибкой «Нехватка памяти». Потом запустил с сервера, она вроде отработала, но ссылки все остались на месте — ничо не понял, возможно криво написана. Вот поэтому все еще думаю как это победить 🙁
(16) Тогда можно. Я имел в виду замену разных типов субконто — контрагенты на материалы, к примеру(уж не знаю, зачем такая блажь, но вдруг…) Виды субконто одного типа можно заменить.
(17) Подскажите, пожалуйста, порядок действий, просто доселе ничем подобным не занимался. Ну создать хранимую процедуру, допустим осилю, а дальше что? Скопировать туда текст Вашей процедуры, ничего в ней менять не нужно? И в обработке вроде там только справочники? Или я что-то не так понял?
(18) Мою хранимую процедуру надо упростить. Требуется обойти проверки на то, что это элементы справочника, соотвественно, вот сюда :
—Получаем ссылки
exec (‘insert #temp(sourc) select _IDRRef from ‘+@table_name_exclude+’ where _code = »’+@code_sourse+»’ and _description = »’+@desc_source+»»)
exec (‘insert #temp(dest) select _IDRRef from ‘+@table_name_exclude+’ where _code = »’+@code_dest+»’ and _description = »’+@desc_dest+»»)
Надо подсунуть ссылки(т.е. идентификаторы) на указанных видов субконто. Посмотреть, где они хранятся, можно обработкой «Описание метаданных»(вроде, навскидку не помню), короче, обработкой, которая показывает, в каких таблицах(верней, таблице) хранятся виды субконто. Получится нечто вроде:
exec(‘insert #temp(sourc) select _IDRREF from ‘+(таблица определения субконто)+’ where ‘(отличительные признаки вида субконто) = конкретные значения для данного вида субконто.
И запустить процедуру.
Это сделать, понятное дело, на тестовой базе+ ВНИМАТЕЛЬНО ПРОСМОТРЕТЬ ЧТО СКАЖЕТ СЕРВЕР! если все ок, сделать ТИИ, пересчитать остатки. Проверить.
(19) Жаль что пока, к сожалению, времени нет на эксперименты, потому что чувствую мне долго придется вкуривать это дело. Но пробовал с помощью Вашей обработки заменить в тестовой базе элементы справочников, выдавалась ошибка SQL сервера, что-то вроде «переполнен журнал транзакций» или что-то в этом духе.
В чем может быть причина ошибки:
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft SQL Server Native Client 10.0): Недопустимое имя столбца «_code».
CommandSQL.Execute();
по причине:
Произошла исключительная ситуация (Microsoft SQL Server Native Client 10.0): Недопустимое имя столбца «_code».
На некоторых справочниках отрабатывает, на других выдает ошибку
Или подскажи как переписать хранимую процедуру, чтобы работало по УникальныйИдентификатор?
Спб
(21) Нашел в чем причина, не верно определяется таблица хранения
Строка = ТЗ.Найти(«Справочник.»+строка(тип));
заменить на
Строка = ТЗ.Найти(«Справочник.»+ СтарыйОбъект.Метаданные().Имя, «ИмяТаблицы»);
Поправил, спасибо
Спасибо
Спасибо. Стоит примерно такая же задача. Сейчас скачаю теект процедуры и попробую
Доброго дня. Загнал процедуру в свою базу под 2005 SQL, запускаю замену одного элемента на другой (причем не из 1С, а на прямую в SQL) крутиться бесконечно долго и никаких результатов. В чем может быть проблемма, есть какиенибуть мысли?
И так в продолжении справочник номенклатуры 312 тыщ записей, конфа УПП 1.2, запустил на ночь свертку 2 х позиций. Через 1С’овскую обработину глянул сколько ссылок на объекты на каждый было не больше 50 ссылок. Время выполнения свертки 3,40 минут и в итоге вывалились ошибки:
Сообщение 2601, уровень 14, состояние 1, строка 1
Невозможно вставить повторяющуюся ключевую строку в объект «dbo._ReferenceChngR2461» с уникальным индексом «_Refere2461_ByDataKey_RR».
Выполнение данной инструкции было прервано.
Сообщение 2601, уровень 14, состояние 1, строка 1
Невозможно вставить повторяющуюся ключевую строку в объект «dbo._AccRgAT21549» с уникальным индексом «_AccRg21549_ByPeriod_TRRRRRN».
Выполнение данной инструкции было прервано.
Сообщение 2601, уровень 14, состояние 1, строка 1
Невозможно вставить повторяющуюся ключевую строку в объект «dbo._AccRgAT21549» с уникальным индексом «_AccRg21549_ByPeriod_TRRRRRN».
Выполнение данной инструкции было прервано.
Сообщение 2601, уровень 14, состояние 1, строка 1
Невозможно вставить повторяющуюся ключевую строку в объект «dbo._AccRgAT21579» с уникальным индексом «_AccRg21579_ByPeriod_TRRRRRN».
Выполнение данной инструкции было прервано.
(27) maxsoft83, Будем разбираться. Спотыкается об уникальный индекс, понятно… У меня такого не вылезало.
(28) а что по поводу производительности? … получается что сама 1С все это сделает ну так раз 12-15 быстрее. либо 10-20 минут либо почти 4 часа, по идее все должно быть на оборот. в чем может быть загвоздка? может я что-то сделал не так?
(28)
Еще я просмотрел количество таблиц получаемых на одну позицию .. получается больше 30000 таблиц … по моему многовато
я не настолько хороший знаток SQL, но может быть проблема в этом запросе
Select column_name,table_name from
(Select
source.name as column_name
, tables_name.name as table_name
from
(select * from sys.columns where system_type_id = 173) source
inner join
(select object_id,name from sys.objects where type = ‘U’) tables_name
on
source.object_id = tables_name.object_id) source2
все ли ограничения наложены … или если у меня более 10 БД на SQL он выбирает ссылки по всем таблицам в этих БД?
(30) maxsoft83, Каких 30 тысяч таблиц в сеансе??
Select distinct table_name from
(Select
source.name as column_name
, tables_name.name as table_name
from
(select * from sys.columns where system_type_id = 173) source
inner join
(select object_id,name from sys.objects where type = ‘U’) tables_name
on
source.object_id = tables_name.object_id) source2
Выдает 1072 строки таблиц, содержащих ссылки. Бухия 2.0. Дальше смотри по процедуре — там идет отсечка таблиц, не имеющих в какой-либо колонке данного типа упомянутого значения замены. Я прошу прощения, просто занят сильно последнее время, не могу взяться за процедуру и сесть в профайлер. Процедуру придется менять, то ли таблицы остатков отсекать с обязательным пересчетом по окончании работы процедуры, то ли апдейтить их через временные таблицы с группировкой по индексу. Все задачи решаемы, просто времени пока нет.
(31) Ну как бы у меня УПП))) там таблиц в принципе больше .. ладно попытаю порыть в редбуке, а какое время замены одной позиции на бухе??
(32) maxsoft83, Ну не в 10 раз же… Размер базы какой? У меня такая вот фихня отрабатывала 15 минут на базе порядка 20 ГБ.
У меня база 104 Gb …. так что видимо 15 минут для меня не светят, да и собственно тоже самое что через саму эску ….. потому как бы не вижу смысла заходить со стороны сиквела. если бы это процесс занимал хотябы 5 минут, а так получается то на то и выходит. у меня через эску слегка модифицированная обработка эсовская как раз сворачивает порядка 3 позиций в час.
(34) maxsoft83, Можно отловить процедуру в профайлере, которой отыскиваются все ссылки на указанный элемент, разобрать её ответ и уже работать от неё. Попробую.
(35) будем ждать результатов))) в свою очередь попытаюсь осилить тоже самое со своей стороны, может что получиться)
Да, господа, поправил публикацию. К сожалению, механизмы 1с в части модификации остатков трансцедентны и непознаваемы(в реальности просто очень сложны , в сумме потратил 2-е суток на профайлер). В настоящий момент изменил заголовок темы, процедура и скрипт остаются рабочими, но, к сожалению, работать будут только при замене аналитики на полностью новую. Т.е. как если бы вам нужно перекинуть остатки с одного контрагента на нового(только что введенного). Или на новую статью затрат, к примеру. «Слияния» аналитики реализовать не удалось, в настоящий момент пишу гибридную версию, которая в части работы работы с остатками и регистрами будет использовать механизм 1с, а в части работы с документами — механизмы SQL.
Доработал, тестируйте. Движок теперь сам считает итоги, остальное делается скриптом.
Как оказалось, я уже плюсовал это дело, так что респект еще раз без +.
А теперь как-то возник вопрос по поводу
мне и в голову не пришло бы использовать П&З для задачи, поскольку очевидно, что для «без перепроведения» надо менять не только реквизиты, но и аналитику в движениях. Но и в СКЛ бы не полез — пять минут, как говорится, в конфигураторе.
И раз уж все равно пересчитывать итоги в 1ске, то нафига огород городить? Неужели настолько существенен выигрыш по времени? По комментам судя, выигрыша-то и нет…
(39) tango, предполагалось, что все манипуляции с базой данных будут выполнены «за движком» 1с, причем минимальным числом запросов. Т.е. я отпишу Update на таблицу документа по условию, а не сделаю миллион запросов на тот же самый апдейт через движок. Идея была такова. Совсем «за движком» не получилось, приходится анализировать структуру метаданных + исключать итоги(ибо не уверен, что хорошо переводить базу в режим разделения итогов, а без него модифицировать итоги не хочу, ибо не знаю результата), но принцип остался тот же.
«пять минут, как говорится, в конфигураторе. » Какой примерно алгоритм для замены одного контрагента другого «везде» через конфигуратор?
«везде» как правило, ограничено — это какой-то конкретный, небольшой, список видов документов
1 запрос — получаем список доков, где реквизит = Контрик
2. ползем по списку, подставляем реквизит — записываем без проведения. в движениях подставляем контрика. это можно не торопясь в фоновом режиме
3. если РИБ — записываем состояния изменения
ну, и итоги, если надо
весь трабл — в скорости. практически эта задача не требует «реалтайма», лишь бы дошла до конца (за день — другой — нормально)
(2)
где вы описали эти вышеуказанные ограничения?
(41) tango,
Михаил, опять очередной студент ринулся править 1С через SQL 🙂
Не отыскав типовую обработку по поиску и замене (или доработанные от типовой же).
Плюсики вы свои, конечно, вольны расставлять кому угодно, но любые действия в 1С минуя 1с-платформу — чреваты рассылочностью базы.
И всегда предупреждаю — не лазить через SQL в 1с8 базу, плохо кончится.
Но каждый месяц — один-два студента с обработкой «как я ускорил 1С через SQL» … 🙂
(41) tango, «весь трабл — в скорости. практически эта задача не требует «реалтайма», лишь бы дошла до конца (за день — другой — нормально». Честно сказать, постепенный рост , к примеру, кредитового сальдо на 60 счете у одного контрагента и уменьшение у другого, как-то слабо себе представляю. Но возможно, возможно. Только бухгалтерам будет странно, достанут.
(42) AlexO, выше.
(43) AlexO, условия использования я описал, алгоритм описал. Если обработка кому-то поможет, я буду рад.
«И всегда предупреждаю — не лазить через SQL в 1с8 базу, плохо кончится. » — полностью согласен. Если был отрицательный опыт — зачем себя пересиливать?
(43) AlexO, дык автор же пишет — граната, абезианов не беспокоиться
(45) tango,
ну хорошо, минус ставить не будем, раз предупредил :))
(44)
где выше? номер сообщения тогда укажите
(44)
а, т.е. вы считате — что если вот так залезли и база сразу не рухнула, то все нормально? 🙂
косяки вылезают как раз в данных, когда они не совпадают по регистрам там или документам.
(48) AlexO,
косяки вылезают как раз в данных, когда они не совпадают по регистрам там или документам.
а почему не может быть все нормально? Если мы заменяем ссылки во всех таблицах (справочники, документы, регистры… и т.д.), какие могут быть косяки? Плюс пересчитываем регистры.
Если Вы имеете какой-то опыт опишите его нам.
Как бороться с ситуацией: Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Не удается вставить повторяющуюся строку ключа в объект «dbo._InfoRg35761» с уникальным индексом «_InfoR35761_ByDims_R». Повторяющееся значение ключа: (0x9e63c92e28a321ad47e4c3d6b82747a7).
(50) kauksi, аналитику заменяете?
Ответьте пожалуйста.
Поможет ли мне обработка, если мне нужно заменить одну организацию на другую везде.
Есть база с 4-мя организациями — нужно все слить на одну новую, 5-ю организацию.
(53) Да.
Поиск в таблице справочника идет по коду и наименованию, а потом берется максимальный элемент (хотя есть ссылка, по которой можно получить GUID). В итоге могут быть ошибки — подберется не тот элемент.
Как справиться с ошибкой: Невозможно вставить повторяющуюся ключевую строку в объект «dbo._InfoRg17321» с уникальным индексом «_InfoRg17321_ByDims_RN» ?
(56)
Вы пытаетесь заменить один уже существующий элемент на другой? Сожалею, можно только заменить на новый(т.е. грубо говоря, на элемент, по которму ещё не было записи в данном регистре)