Задвоение элементов плана счетов в базе на SQL.

Публикация № 392721

Администрирование - Администрирование данных 1С - Чистка базы

SQL SQL запрос ПланСчетов Счет план счетов предопределенные предопределенные данные удаление задвоенных счетов

Иногда приходится разбираться с "грехами отцов", когда приходишь к клиенту, а до тебя наделали делов.

Вот, собственно, проблема:
Настраивали когда-то план обмена, все работало штатно. Потом обмен пошел не как надо и в справочниках появились задвоенные предопределенные элементы. В общем, на Инфостарте нашел кучу обработок, которые помогут. Но тут оказалось, что если работать с элементом "ПланСчетов", эти обработки бесполезны.

Итак, суть бесполезности обработок:

Элементы в плане счетов предопределенные и имеют предопределенное вложение, то бишь субконто. При попытке переназначить привязку выходит ошибка, так как есть предопределенные субконто. Можно пойти в конфигуратор и вынести эти субконто, а затем добавить, но конфа-то типовая, и ломать план счетов нецелесообразно. К тому же абсолютно не ясно, какой элемент "правильный". 

Да, можно и тут постараться определить, какой из задвоенных является искомым "правильным", но только на глаз. Добавить к счету синтетический код нельзя, так как тогда появится ошибка о неуникальности записываемого элемента.

Короче, полная шляпа.

В голову пришла хорошая идея, которая отработала на ура:

База на SQL сервере, значит, можно исправить задвоение в самой базе SQL, удалив элементы непосредственно из SQL и избежав ловушки проверок конфигурации.

Делаем Select такого вида (у меня задвоение прошло по 96 счету):

SELECT [_IDRRef]
      ,[_Version]
      ,[_Marked]
      ,[_PredefinedID]
      ,[_ParentIDRRef]
      ,[_Code]
      ,[_Description]
      ,[_OrderField]
      ,[_Kind]
      ,[_OffBalance]
      ,[_Fld530]
      ,[_Fld531]
      ,[_Fld18988]
      ,[_Fld532]
      ,[_Fld533]
      ,[_Fld534]
      ,[_Fld535]
  FROM [ИмяВашейБазыНаСервере].[dbo].[_Acc15]
  Where [_Code] Like '96%'

(чтобы определить, в какой таблице лежит "ПланСчетов", нужно воспользоваться любой обработкой анализа структуры БД на SQL или попробовать разобраться тут - https://its.1c.ru/db/metod8dev#content:1591:hdoc)

Получаем табличку с данными:

[_IDRRef] [_Version] [_Marked] [_PredefinedID] [_ParentIDRRef] [_Code]

0x815400155D03291711E51846D90DC41A
0x815400155D03291711E51852F63B454F
0x815400155D03291711E51846D90DC412
0x815400155D03291711E51852F63B4547
0x815400155D03291711E51846D90DC414
0x815400155D03291711E51852F63B4549
0x815400155D03291711E51846D90DC421
0x815400155D03291711E51852F63B4556
0xAD69A720D0E7A9EB47D4D2002DF3F975
0xA9B50CDB35CD890046E60B617F27AB4E

0x00000000017933DD
0x00000000017933EF
0x00000000017933D5
0x00000000017933E7
0x00000000017933D7
0x00000000017933E9
0x00000000017933E4
0x00000000017933F6
0x000000000179350F
0x00000000017934FB

0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00

0xBEA8FB94C602B84545099B8D8AE52424
0xBEA8FB94C602B84545099B8D8AE52424
0x97A0CB0321E956714386231A1CEECB79
0x97A0CB0321E956714386231A1CEECB79
0x98CB88ECEB17AC374447CDBD3EEB439B
0x98CB88ECEB17AC374447CDBD3EEB439B
0xBF089DA9D107FF9B46A4DDF7EEE4F82E
0xBF089DA9D107FF9B46A4DDF7EEE4F82E
0xAD69A720D0E7A9EB47D4D2002DF3F975
0xA9B50CDB35CD890046E60B617F27AB4E

0x00000000000000000000000000000000
0x00000000000000000000000000000000
0x815400155D03291711E51846D90DC41A
0x815400155D03291711E51852F63B454F
0x815400155D03291711E51846D90DC412
0x815400155D03291711E51852F63B4547
0x815400155D03291711E51846D90DC412
0x815400155D03291711E51852F63B4547
0x815400155D03291711E51852F63B454F
0x815400155D03291711E51852F63B454F

96
96
96.01
96.01
96.01.1
96.01.1
96.01.2
96.01.2
96.09
96.33

 

В этой таблице мы видим данные, которые уже взяты не с потолка и поддаются анализу.

Обратите внимание, задвоился не весь 96 счет, а лишь его часть. Таким образом можно установить, что [_IDRRef] "Правильного счета" - 0x815400155D03291711E51852F63B454F, так как он описан как родитель в незадвоенных элементах в колонке [_ParentIDRRef].

В общем, после анализа делаем проверочный запрос, чтобы убедиться, что будем удалять то, что надо:

SELECT [_IDRRef]
      ,[_Version]
      ,[_Marked]
      ,[_PredefinedID]
      ,[_ParentIDRRef]
      ,[_Code]
      ,[_Description]
      ,[_OrderField]
      ,[_Kind]
      ,[_OffBalance]
      ,[_Fld530]
      ,[_Fld531]
      ,[_Fld18988]
      ,[_Fld532]
      ,[_Fld533]
      ,[_Fld534]
      ,[_Fld535]
  FROM [ИмяВашейБазыНаСервере].[dbo].[_Acc15]
  --Where [_Code] Like '96%'
 Where [_IDRRef] IN 
	(0x815400155D03291711E51846D90DC41A
	,0x815400155D03291711E51846D90DC412
	,0x815400155D03291711E51846D90DC414
	,0x815400155D03291711E51846D90DC421)

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

Теперь можно выполнить Delete:

USE [ИмяВашейБазыНаСервере]
go

DELETE FROM [dbo].[_Acc15]
      WHERE [_IDRRef] IN 
	(0x815400155D03291711E51846D90DC41A
	,0x815400155D03291711E51846D90DC412
	,0x815400155D03291711E51846D90DC414
	,0x815400155D03291711E51846D90DC421)
go

В итоге - задвоение убрали, БД целая. Едиственное, о чем стоит упомянуть - если по удаляемому счету есть обороты, сначала их надо перекинуть на "правильный счет" обработкой "Подбор и замена значений".

Нужно также понимать последствия ошибочно выбранного счета, поэтому сделайте перед манипуляциями бэкап БД, и можно экспериментировать.


ВНИМЕНИЕ!!! Данное действие может нарушить лицензионное соглашение с компанией 1С. Будьте внимательны!

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. AlX0id 27.08.15 20:12 Сейчас в теме
Есть более интересная проблема:
1. Задвоились виды субконто. Как, где, почему - фигзнает.
2. Один из видов субконто - был предопределенным. Стал - нет. (Как?? хз). Бред, конечно, но в конфигураторе в плане счетов указан на 94 счете "Неизвестный элемент" - видимо, это он. Все ссылки в данных - на него.
3. Второй - ныне предопределенный, но ссылок на него вообще нет.

Так вот вопрос - как же сделать так, чтобы элемент из п.2 стал предопределенным? И с нужным наименованием в конфигураторе?
6. vasyalisk88 3 28.08.15 14:12 Сейчас в теме
(1) AlX0id, В конфигураторе их 2 или 1? Напиши простенькую обработку, которая сделает привязку, как вариант, иначе пользуйся обработкой переноса привязок, их на форуме полно.

(3) Danila-Master, О каком лицензионном соглашении может идти речь, если БД с задвоенным ТИПОВЫМ планом счетов не пригодна для эксплуатации. Это косяк тех, кто эту платформу пишет. Если бы они реально сделали механизм, который контролировал предопределенные элементы на уникльность и не давал бы всяким "программистам" делать недопустимые вещи, тогда да, согласен. А в данный момент, если у тебя задвоится полностью план счетов хозрасчетный, придется с бэкапа восстанавливать базу. Они же не подключатся и не исправят косяк.
А вот с точки зрения разработки - у тебя не было такой проблемы, когда в конфигураторе не описан элемент, а в на SQL он есть?
Вот пример:
1й раз открываю конфигуратор клиента, причина обращения - база не открывается вообще. Выдает ошибку, не найдена таблица базы данных. Оказалось, на SQL действительно есть объект класса справочник, а в конфигураторе его нет. И вот как быть? Звонить в 1С? Что они тебе ответят? Восстановитесь с бэкапа? Который был день назад? Это неприемлемо, когда можно починить и ты знаешь как. Продукт работает, справочник удален, конфа восстановлена в типовую.
Вот серьезно, ЛС это круто, но толку от него - отмазка не делать!

Написано черным по белому - Данное ограничение необходимо для обеспечения стабильности работы механизмов системы, осуществления поддержки и возможности перехода на новые версии "1С:Предприятия".
Но оно не выполняется самой 1С. Не раз звонил в техподдержку 1С, восстанавливайтесь с Бэкапа говорят. А если бэкап был 5 лет назад? Мне новую базу с вводом остатков делать?

Давайте подробно, что означает задвоение типовых элементов в базе, а не в конфигураторе? Ошибка чего? Встроенного языка? "Фишка" платформы? На 8.2 даже о такой не думал. А тут реально шляпа.

(4) AlX0id, дождался, восстановитесь из бэкапа. Не стал бы туда лезть, черт там ногу сломит.

Ребят, серьезно, пусть программа соответствует заявленным характеристикам. Тогда ни в жизни никто не полезет в SQL составляющую. Или давайте 1С будет в рамках своих косяков БЕСПЛАТНО лечить такие косяки всем, а не предлагать восстановление.
Если есть предложения, как сделать иначе, очень хотел бы попробовать иной способ.
11. AlX0id 28.08.15 16:20 Сейчас в теме
(6)
В конфигураторе их 2 или 1? Напиши простенькую обработку, которая сделает привязку, как вариант, иначе пользуйся обработкой переноса привязок, их на форуме полно.

В конфигураторе 1 вид. Обработки переноса привязок работают, начиная с режима совместимости 8.3.3, а у клиента УПП (режим 8.2.13).

То есть, предопределенный удалить в скуле для меня не большая проблема.. Вопрос, как система поймет, что вот тот не предопределенный должен стать предопределенным?
12. vasyalisk88 3 28.08.15 17:22 Сейчас в теме
(11) AlX0id, смотри (5) oleg212, - ты этой обработкой установишь нужное значение элемента, обработка устанавливает привязку предопределенного элемента к указанному, снимая тем самым предопределенность с другого. Я правильно понял, что у тебя нет предопределенного элемента впринципе?

P.S. Так сори, плохо понял что ты написал - смотри, у объекта есть признак - "ИмяПредопределенныхДанных". В нем как раз и указывается имя предопределенного элемента, к которому должна быть привязка. К несчастью нет под рукой базы на платформе 8.2... В 8.2 такого нет, там все иначе жеж!!! Там такого не было, у тебя точно есть элемент в конфигураторе, которому нет соответствия? Можно скрин из конфигуратора и приложения?
15. AlX0id 04.09.15 11:59 Сейчас в теме
(12)
В итоге решили не лезть в SQL - поправили в конфигураторе вид субконто у плана счетов и перенесли на него все движения..
Так что показать не могу )
16. vasyalisk88 3 08.09.15 14:20 Сейчас в теме
(15) AlX0id,

Вариант, хорошая идея!
Погуглил - оказалось, что тестирование и исправление ДОЛЖНО было исправлять эти косяки, поробовал, не исправляет (храню базу с задвоенным планом счетов как память, вдруг когда-нибудь само вылечится тестированием).

Вообще нашел другое решение, надо написать простенькую обработку, которая по Uid отберет все нужные значение, но все равно надо лезть в SQL и смотреть, какой же из элементов задвоен. Но в этом случае мы ничего не меняем, что по мнению 1С правильно. Так же можно взять Uid владельца и установить связь. Правда не тестировал, но в теории, если еще Интерактивно вынести эти элементы, то ок вроде. Нужно ли будет снимать предопределенность при интерактивном удалении? Беда опять в том, что если нет, Мы лезем в предопределенный счет, меняем субконто и т.д.

Это просто замкнутый круг... (с)
2. qwed557 30 27.08.15 20:17 Сейчас в теме
Это нарушение лицензионного соглашения 1С. Там прописано, что запрещено любое вмешательство в структуру базы данных, кроме как из языка.
3. Danila-Master 105 28.08.15 06:41 Сейчас в теме
http://v8.1c.ru/predpriyatie/questions_licence.htm
Пунк 65:
...
Нельзя обращаться к данным информационной базы напрямую, минуя уровень объектов работы с данными "1С:Предприятия" - например при помощи средств СУБД или при помощи внешних компонент, которые реализуют прямой доступ к СУБД. Это ограничение распространяется на любые действия с данными, в том числе на изменение их структуры, а так же на чтение или изменение самих данных информационной базы или служебных данных "1С:Предприятия".
...
4. AlX0id 28.08.15 11:47 Сейчас в теме
(3) Danila-Master,
"Данное ограничение необходимо для обеспечения стабильности работы механизмов системы, осуществления поддержки и возможности перехода на новые версии "1С:Предприятия"."
А если она и так уже не стабильно работает (задвоены предопределенные элементы) - то что вы предлагаете делать? Ждать от ТП 1С ответа?
5. oleg212 28.08.15 13:29 Сейчас в теме
УстановкаПредопределенныхЭлементов Вам в помощь и прямые руки. Успеха!
7. vasyalisk88 3 28.08.15 14:14 Сейчас в теме
Опять же, я не утверждаю, что это единственный способ, я поделился способом решения проблемы, а лезть или нет, вопрос личный.
(5) oleg212, она то как раз и не помогла...
8. ekaruk 5238 28.08.15 14:29 Сейчас в теме
(7) А что значит "Не помогла"?
Она как раз может сделать предопределенными элементы с данными вместо левых.
Однако вполне возможно, у вас каким-то образом получилось, что в подчиненной базе у предопределенных элементов ссылки отличаются. В этом случае при обменах могут опять меняться признаки предопределенности. Проверьте, чтобы во всех базах предопределенными были одни и те же элементы.
10. vasyalisk88 3 28.08.15 14:46 Сейчас в теме
(8) ekaruk, Итак, подробнее, обе базы подключены к 1 хранилищу, соответственно конфигурации идентичны. Тот, кто писал обмен, либо не знал, о том, что можно проверить элемент на предопределенность, либо просто пренебрег этим. Собственно в конфигурации 1 предопределенный элемент. В самой базе их 2. При попытке этой обработкой что-либо сделать с этими задвоенными счетами, выходят ошибки, как в этой публикации - http://infostart.ru/public/310542/ . Собственно когда меняю привязку элемента, выходит ошибка вида - Этот объект имеет ссылки на предопределенный элемент субконто.

Я думал, что можно зайти в конфигуратор, удалить с этого счета субконто... но! элемент в конфигураторе 1! То есть я поломаю к чертям все настройки этого счета. И не факт, что после этого что-то будет нормально работать.

И кстати, как мне достоверно определить, какой из счетов верный, если они оба 96?)
В обработке выбор идет как в БД, то есть это рандом. Я могу случайно перекинуть на "левый" счет. А ссылка хоть и ПК, но не видна в списке выбора элементов. Код - 96 у обоих одинаковый)
13. ekaruk 5238 28.08.15 21:26 Сейчас в теме
(10) В той базе, где элементы в единственном экземпляре, переименуйте их временно. Например, добавить точку в название счета. Потом синхронизируйте базы. И во второй отвяжите те, которые без точек и с них перенесите данные на правильные.
14. vasyalisk88 3 02.09.15 15:32 Сейчас в теме
(13) ekaruk, Могу видео запилить даже, я же писал - они не отвязываются из-за того, что на 96 счете есть предопределенное субконто. Как его убрать можно, не заходя в конфигуратор и не убивая это субконто в плане счетов?
9. vasyalisk88 3 28.08.15 14:39 Сейчас в теме
Кстати, по поводу ЛС, очень внимательно почитал. И возник такой вопрос - есть внешняя компонента, в которую необходимо выгружать данные из 1С, напрямую. И компания не хочет нанимать для этого специалиста по 1С предприятию, а хочет сделать это через загрузку данных напрямую из SQL таблиц 1С, так как например эта вещь написана самой компанией. Выходит, что компания-разработчик обмена будет нарушать ЛС с 1С, описывая подобный прямой обмен?
P.S. Вопрос риторический. Да будет. И сделает. И 1С не узнает, так как структура БД не нарушена, все работает и даже обновляется типовым обновлением.

Буду искать альтернативное решение, если найду, отпишу.
Оставьте свое сообщение

См. также

Хранилище версий объектов в условиях массовых изменений

Чистка базы Конфигурирование 1С v8 1cv8.cf Бесплатно (free)

Проблема хранения версий объектов при огромном количестве изменений.

08.11.2020    590    Punisher_1C    4    

Быстрый способ удаления записей из журнала регистрации 1С

Журнал регистрации Чистка базы v8 Бесплатно (free)

Возникают ситуации, когда необходимо выборочно удалить из журнала регистрации определенные записи. Например, размер файлов журнала неконтролируемо вырос из-за неправильно сконфигурированного регламентного задания. С помощью Perl журнал можно очистить от лишних записей всего одной строкой.

06.08.2020    1858    DataReducer    4    

Подсистема учета характеристик. Стремление к совершенству

Чистка базы Практика программирования v8 v8::ОУ v8::ПВХ УТ10 УУ Бесплатно (free)

Цель - почистить задвоенность характеристик и предотвратить дальнейшее ее появление.

16.12.2019    4163    Rustig    0    

Хранение файлов - как уменьшить размер базы данных

Чистка базы Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Россия Бесплатно (free)

Хранение файлов в базе 1С можно оптимизировать для уменьшения размера хранимых данных.

09.09.2019    8727    2tvad    17    

Удаление записей регистров и пересчет итогов в условиях нехватки места на диске

Чистка базы v8 1cv8.cf Россия Бесплатно (free)

При обследовании базы нередко видишь незакрывающиеся регистры накопления с момента начала работы системы. Всегда есть два варианта: первый - закрываем  ежемесячно регистр в ноль и настраиваем бизнес процесс так, чтобы этот регистр правильно использовался, второй вариант - этот регистр не использовался и не будет использоваться в данной конфигурации. Второму варианту я и хочу посвятить данную статью.

17.04.2019    4067    semensemenbi4    8    

Как быстро "удалить все документы и движения" в базе (Альтернатива)

Чистка базы v8 Бесплатно (free)

Очень часто задают вопрос - как удалить все документы из базы, оставить только номенклатуру и настройки. Есть много различных вариантов (групповая обработка документов и справочников - да, работает, но медленно, у клиента в базе 460 000 документов проведенных - неделю будет удалять). Перенос данных - через ВыгрузкаЗагрузкаДанныхXML82.epf - можно, но тоже долго и требует определенных навыков.

06.03.2018    22390    Tatitutu    24    

Реально быстрая очистка документов через SQL

Чистка базы v8 УТ10 Россия Бесплатно (free)

Как делать нельзя, но если очень нужно, то можно!

21.02.2018    8455    Roman_SE    24    

Если при рассылке закончилось место

Чистка базы v8 Россия Бесплатно (free)

С некоторого релиза, не могу сказать точно с какого, при проведении массовой рассылки писем с вложениями стало быстро заканчиваться место. Как я это обнаружил и что с этим сделал, напишу ниже. Очень приветствуются другие варианты решения в комментариях.

23.03.2017    8759    hydro2588_2015    19    

Удаление лишних данных

Чистка базы v8 Бесплатно (free)

Настало то время, когда на SSD винчестерах размером 120 Гб начало заканчиваться место.  В связи с этим, было принято решение проанализиривать возможность уменьшения занимаемого места БД. Без веского обоснования у нас никакие работы не производятся, просто так оптимизацией никто заниматься не даст. 1. Выявление таблиц БД, занимающих много места. 2. Очистка записей регистров накопления. 3. Тестирование.

25.11.2016    14702    HAMMER_59    10    

Версионирование объектов в 1С УПП 1.3. Фикс дублей

Чистка базы Производительность и оптимизация (HighLoad) v8 УПП1 Россия Бесплатно (free)

В 1С УПП 1.3 есть такой замечательный механизм "версионирование объектов", который позволяет узнать: кто, когда и что изменил в документах и справочниках. Но есть недочеты в этой системе, программа не проверяет, является ли текущая записываемая версия объекта дублем (аналогична предыдущей версии), что в итоге захламляет базу и существенно увеличивает её объем.

1 стартмани

16.11.2015    13621    tehas    4    

БГУ 1.0. Чистим отчётность

Чистка базы v8 БГУ Государственные, бюджетные структуры Россия БУ Бесплатно (free)

Временами встречается проблема с заполнением бюджетной (бухгалтерской) отчётности в БГУ 1.0. По разным причинам отчётность может заполняться неправильно или не заполняться совсем. В данной статье приведена методика быстрой «чистки» отчётности.

29.09.2015    16748    Sergey123321    8    

Фоновое Задание "Удаление помеченных объектов" (не монопольно)

Чистка базы v8 1cv8.cf Россия Бесплатно (free)

Подробное описание немонопольного удаления помеченных объектов, реализованное как Фоновое Задание.

02.08.2013    21867    shvo65    10    

Как свертывать большую базу 1C 8 в максимально короткие сроки (1С 8.1, 8.2)

Производительность и оптимизация (HighLoad) Чистка базы Свертка базы v8 УТ10 Бесплатно (free)

Как свертывать большую базу 1C 8 в максимально короткие сроки (1С 8.1, 8.2). Любая база данных со временем разрастается до огромных размеров, что делает его более медлительным и работать в нем порой бывает очень тяжело. По этому периодически базу свертывают, т.е. до определенной даты все документы и движения удаляются и вводятся начальные остатки. Соответственно всегда есть архивная база за прошлые периоды. Пример свертки базы 1С на SQL приведен здесь.

14.06.2013    62041    setrak    21    

Шринк лога транзакций MS SQL 2008/2012 в экстренном случае или боремся с ошибкой HRESULT=80040E14

Чистка базы v8 Бесплатно (free)

Пошаговая инструкция по уменьшению лога транзакций (*.ldf) MS SQL 2008/2012.

15.01.2013    301507    Kserken    41