gifts2017

Всем, "обрезавшим" огромные базы 7.7 посвящается...

Опубликовал Евгений Долиновский (Dolly_EV) в раздел Обработки - Свертка базы

Альтернативный метод "обрезки" ("свертки") базы 1С.77 на конкретную дату через УРБД
Исходные даные:
база 7-ки более 12GB с данными за 4 года. УРБД - центр+7 перифериек. Конфига самописная, когда-то на основе типовой "Бухгалтерии".
файл инициализации периферийной базы в архиве - почти 2GB. Не знаю как на 27-м релизе, но до 21-го господа 1С-ники так и не поменяли вшитый zip, поэтому выгрузить данные, которые в итоге в архиве будут весить более более 2GB, не представляется возможным - старый zip не понимает файлы более 2GB. (Поправка - представляется возможным:Плагин romix-a http://infostart.ru/projects/1512/)
Как следствие размеров базы - практически невозможно работать: операторы ругаются, всякие манипуляции типа перепроведение / дальнейший обмен по УРБД и т.д. ОООЧЕНЬ трудоёмки (точнее "времяёмки")

Требуется:
в кратчайшие сроки обрезать базу (оставить текущий год)

Испробовано:
все типовые и "не совсем" типовые методы (свертка, пометка на удаление прошлого периода), рокет-ланчеры (и прочие OLE) и т.д. Не испробованы прямые запросы к SQL на удаление, по причине невладения ничем кроме языка 1С.

Основная проблема:
очень долгая пометка на удаление документов прошлого периода (исходное условие задачи - простые юзеры - опера и бухи - не заносят новые остатки в "пустую" базу ручками, обеспечение "преемственности" периодов - если поправили что-то в обрезанном периоде - изменения должны отразиться в рабочем периоде)

Решение:
1). создаем документ в конфиге, который при проведении будет писать за собой проводки и движения по регистрам (если требуется - по заданному фильтру), рассчитанные на "сам себя": т.е. после проведения такого дока (проводится на дату обрезки) имеем в базе на дату этого дока "удвоенные" остатки по бух. счетам и регистрам остатков.

2). берем копию исходной базы, оставляя в ней все справочники (без DH, DT, RA, RG, 1Cxx). Так же остаются файлы УРБД, кроме 1CUPDTS (совсем забыл - фишка метода - УРБД! Если база нераспределенная - придется распределить))).

3). в "старой" базе проводим наш чудо-документ (у меня он называется "Архив"). Делаем выгрузку в периф. базу из "старой" таким образом, чтобы выгрузился ТОЛЬКО НАШ "АРХИВ" (просто убиваем перед проведением "Архива" 1SUPDTS.DBF и CDX)

4). путем несложных манипуляций с файлом обмена УРБД превращаем его из "исходящего" во "входящий" для центра (меняем заголовок, счетчики, "Acknowledgements". Структура файла обмена здесь: http://oksla.narod.ru/urib.htm , менять надо основное содержимое файла DAT во "входящем" файле для новой базы, который изначально берем из "входящего" файла любой периферийки из старой базы

5). Памятуя о том, что копия нашей "новой" базы - это "клон" "старой", грузим в "новую" базу сей подкорректированный уже "входящий" файл обмена. Вуаля - в итоге в новой базе имеем документ "Архив", со всеми проводками и движениями регистров, которые формируют остатки на дату "Х". Один минус - ссылки в проводках и движениях регистров на документы обрезаемого периода выглядят как (со ссылками на справочники, константы и перечисления все в порядке - в "новую" базу в п. 2) мы не взяли только документы и движения по ним)- нас сие не устраивает, поэтому см. пункт 6).

6). для документа "Архив" пишем обработку (она у меня - в самом документе на кнопке его формы висит), которая, перебрав все движения дока "Архив"(проводки и регистры), "проинициализирует" все ссылки (документы и, если надо, справочники) из движений (тупо "Записать()"). Эту операцию делаем ОПЯТЬ ЖЕ ПРЕДВАРИТЕЛЬНО УДАЛИВ 1SUPDTS - чтобы в выгрузке у нас оказалось ТОЛЬКО ТО, ЧТО НАМ НУЖНО!

7). смотрим и повторяем пунк 4). и 5). - с итоге имеем в "новой" базе "восстановленные" документы, на которые ссылается наш "Архив". Идея проста - при обмене УРБД, если базе подсовывают док (справочник), который в ней отсутствует (был удален, даже совсем)- 1С его ВОССТАНАВЛИВАЕТ. Минус - "восстановленные" доки будут проведенными - в "старой"-то базе они проведены! а в "новой" базе они нужны помеченные на удаление - просто как ссылки "остатков". Но теперь пометить эти доки на удаление занимает не 3-4-5... суток (я так и не дождался окончания "эксперимента"), как на "полной" базе, а от 2 минут до 1 часа (в зависимости от размеров аналитики остатков). Другое решение - при выполнении пункта 4). эти доки перед загрузкой "пометить" в "утробе", чтобы они с обменом УРБД "приехали" уже помеченными - это еще не реализовано за неимением времени - надо основательней поковырять структуру DAT-файла обмена.

8). документы за текущий период так же переносим в "новую" базу через обмен УРБД, проинициализировав (Записать()) документы за нужный период. Перепроведение доков текущего периода - не обязательно. Если в точке "обрезки" с остатками все впорядке - перепроводить не надо, т.к. доки в текущем периоде с Обменом приедут из старой базы СО ВСЕМИ СВОИМИ ДВИЖЕНИЯМИ, а "Архив" притащит как раз ССЫЛКИ НА ЭТИ ДВИЖЕНИЯ.

Ну вот вкратце метод - РЕАЛЬНО ОПРОБОВАННЫЙ (база "порезана" в августе 2007-го, на сегодня полет нормальный).
P.S.
про "преемственность" - если меняем что-то в "старой" базе - перепроводим "Архив" и снова грузим его через УРБД в "новую".
Здесь есть АКТУАЛЬНАЯ проблема: при одновременном создании документов и справочников в обеих базах ID объектов "двоятся" и при обмене "затираются".
 
22.04.11 - чтобы не было этой проблемы проще всего "архивную" базу сделать "периферийной" по отношению к новому центру - тогда никаких "танцев с бубном" не требуется, и при надобности перепроводим архив и просто обменом гоним его в "новый" центр.
 
P.P.S.
кусок конфигурации с документом "Архив": http://infostart.ru/projects/1538/
 
P.P.P.S.
На SQL все так же работает на ура - проверено 20.04.08- разрезал базу размером почти 20Гб с 7-мью периферийками, на все-про-все ушло 7 часов.
Еще момент: если режем центральную с периферийными - чтобы потом быстро выгрузить новые периф. базы, достаточно в таблице _1SDBSET значение "C" поля "DBSTATUS" сменить на "N",
чтобы осуществить первичную выгрузку в периферийные с ТЕМИ ЖЕ идентификаторами. Старые идентификаторы позволят подгрузить уже в новую базу обмены с перифериек, если,
например, нет возможностью заменить базы "разом" во всех подразделениях.

док "Архив"

док "Архив" после проведения - обработка "Инициализация объектов"

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сhe Burashka (CheBurator) 11.12.07 18:57
Приблуда Ромикса позволяет обойти ограничение на размер файла выгрузки
2. dolly_ev (Dolly_EV) 12.12.07 03:42
Будем знать (на досуге поищу "приблуду Ромикса" или кинь ссылку))
Только все же лучше не затягивать базу до таких размеров, т.к. "2GB" - это будет просто уже камень на могилку
3. Brr (brr) 13.12.07 15:04
+1 Отличное решение, вот только эта операция похожа на танец шамана с бубном. напрашивается автоматизация
4. dolly_ev (Dolly_EV) 13.12.07 15:13
)) точно, бубен местами присутствует :-)) но работы ведутся: пишу разбор файла обмена и автоформирование "обратных" файлов обмена.
6. Romann (romann) 17.12.07 11:37
> Если тема интересна - выложу кусок конфиги с документом "Архив".
Интересна. Как раз сейчас бьюсь с 9Гб базой..
Кинь на мыло, пжалста: b-a (собака) mail.ru
7. Сергей Замуруев (z_serg_v) 17.12.07 11:49
Тема интересна. А если без УРБДН? export. import подойдет?Имеется 1 регистр остальной бух итоги. Документы текущего периода надо будет перепровести? Не хотелось бы.
8. Black Romeo (Black Romeo) 19.12.07 10:34
Наверное если в конфиге основа ТиС то для распределения номенклатуры по партиям(создание партий как при поступлении товара) в ваш "Архив" еще что то надо дописывать?
9. dolly_ev (Dolly_EV) 19.12.07 11:12
(8) Ничего не надо дописывать. Архив перенесет по регистру "Партии наличие" остатки в разрезе Партий, т.е. ссылки на Спр.Партии сохранятся
10. vova56 (vova56) 19.12.07 13:01
(7) >export. import подойдет?
Только для простых маленьких баз.
И вообще - "без УРИБ" здесь не осуждаем.
А перепроведение оставшихся доков - необходимый этап для окончательной проверки. Идет гладко, если сделали хорошо.
Dolly_EV, выкладывание куска очень желательно.
Сочтешь возможным - давай!
11. dolly_ev (Dolly_EV) 19.12.07 13:16
(10) >Сочтешь возможным - давай!
объясните ламеру - как этот кусок выложить?))) это надо статью в рубрику "Программы" переместить, или можно как-то здесь?
или заказывйте на мыло - вышлю
12. dolly_ev (Dolly_EV) 19.12.07 13:20
А перепроведение доков текущего периода - вовсе не обязательно. Если в точке "обрезки" с остатками все Ок - перепроводить не надо, т.к. доки в текущем периоде с Обменом приедут из старой базы со всеми своими движениями, а "Архив" притащит как раз ссылки на эти движения.
13. dolly_ev (Dolly_EV) 19.12.07 13:55
14. vova56 (vova56) 19.12.07 14:32
(13) Спасибо, взял, сделал рабочую базу.
На одном ПК симулировать распределенку возможно?
Тут объяснять не обязательно, но если есть ссылки
на инфу - не скрывайте.
16. dolly_ev (Dolly_EV) 19.12.07 14:51
(14) на одном ПК - конечно можно распределенку сделать
вот еще полезная ссылка http://oksla.narod.ru/urib.htm
В остальном - спрашивайте конкретно, что не понятно
17. vova56 (vova56) 19.12.07 16:02
(14) "УРБД в 1С77 (пошаговая инструкция)"
http://kb.mista.ru/article.php?id=3
Кстати, на примере 1 ПК
18. cs25 (cs25) 20.12.07 10:15
У наших : Центр и 11-ть периферийных ... База Аспект (типа ТиСа) чуть-чуть переписанный. Штатная свёртка выдаёт : ладПереноса.Записать();
{Обработка.ЗавершениеПериода.Форма.Модуль(404)}: Номер не уникальный!

Как сворачивать - х.з. ... :-(
19. dolly_ev (Dolly_EV) 20.12.07 11:24
2 sc25 (18): Вообще с вопросом - немножко оффтопик, но решается просто:
не знаю что есть ладПереноса, если справочник, то так:
Код
Попытка
    ладПереноса.Записать();
Исключение
   ладПереноса.УстановитьНовыйКод("_Б");
КонецПопытки;
Показать полностью

Если документ - то ПрисвоитьНовыйНомер()
А вообще - если в тему - то возьми "Архив" и попробуй свернуть базу по данной метОде ))
20. Mihenius (mihenius) 20.12.07 11:59
(18) Пригласите специалиста или почитайте про уникальность номеров
Решение в (19) или по этим докам временно отключить уникальность ...
21. Pavel_Lucenko (pavel_lucenko) 24.12.07 10:44
Зачет.
Один "-" в справочниках тоже могут быть ссылки на документы (те же партии) про них автор "забыл".
На счет автоматизации - операция разовая, зачем ее автоматизировать? Это все равно что создавать спец. документ под какую нибудь хитрож.ую операцию совершаемую один раз ... иногда бухгалтера требуют :(
22. dolly_ev (Dolly_EV) 24.12.07 12:14
да, про "Спр.Партии" из ТиСа забыл, ибо сам его не юзаю))
23. dolly_ev (Dolly_EV) 24.12.07 12:17
... но исправляется "на раз": 3 строки в обработке
24. dolly_ev (Dolly_EV) 24.12.07 12:23
автоматизировать "перенос" архива и ссылок стоит, если решить проблему "дубляжа" ID объектов при одновременной работе в старой и новой базе, и в дальнейшем "переформировании" Архива в старой и "перезагрузке" его в новую базу с новыми остатками и ссылками. Вот как раз у меня щас остро стоит эта проблема ((( Точнее решение то есть - работать в старой базе не в Центре, а в периферийке, в аналоге которой в новой базе НИКТО НИЧЕГО не создает...Но у меня поезд ушел ... документы и справочники насоздавались и там и сям в Центре...
25. Леся (ales_good) 15.02.08 16:24
Уважаемы автор, вы пишите:
просто убиваем перед проведением "Архива" 1SUPDTS.DBF и CDX,
из этого я сдела вывод, что Ваша "старая" база была DBF-ной?
К SQL-базе есть смысл применять такой алгоритм?
26. dolly_ev (Dolly_EV) 16.02.08 05:30
(25) в СКЛьной базе убиваем соответствующие таблицы (называются они так же, только "_" перед именем)
27. Леся (ales_good) 22.02.08 11:27
Ок, все попробовала, эксперимент прошел успешно. Большое спасибо за идею.
28. dolly_ev (Dolly_EV) 22.02.08 13:20
29. Сергей Мельник (asirius) 07.03.08 19:02
Способ многократно ускорить удаление всей кучи документов за период - вернуть взад бухгалтерские итоги (или ТА - для ТИС).
После их удаления, пересчет итогов, соответственно, тоже пойдет быстро, т.к. самих документов нету уже :)
30. dolly_ev (Dolly_EV) 21.04.08 03:17
На SQL все так же работает на ура - проверено 20.04.08- разрезал базу размером почти 20Гб с 7-мью периферийками, на все-про-все ушло 7 часов.
Еще момент: если режем центральную с периферийными - чтобы потом быстро выгрузить новые периф. базы, достаточно в таблице _1SDBSET значение "C" поля "DBSTATUS" сменить на "N",
чтобы осуществить первичную выгрузку в периферийные с ТЕМИ ЖЕ идентификаторами. Старые идентификаторы позволят подгрузить уже в новую базу обмены с перифериек, если,
например, нет возможностью заменить базы "разом" во всех подразделениях.
31. Кузьмич (Кузьмич) 02.07.08 12:01
ничо себе в кратце :))
А как тебе след. вариант: Если у тебя уже есть документ с остатками, то посредством ОЛЕ перенести этот документ с синхронизацией справочников (в пустую базу) из оригинала.
Как на меня, то быстрее выйдет.;)
32. dolly_ev (Dolly_EV) 02.07.08 12:17
to 31
так это надо ПИСАТЬ ПЕРНОС OLE для этого документа! к тому же в моем варианте документ может ПРОВОДИТЬСЯ ТОЛЬКО в Рабочей (где есть остатки) базе
Как ты "посредством ОЛЕ" перенесешь ДВИЖЕНИЯ РЕГИТРОВ И ПРОВОДКИ документа?!?!
33. Виктория (vikik) 08.07.08 17:59
to 30
а не могли бы вы поделиться как на SQL очистить таблицы ( DH, DT, RA, RG, 1Cxx,1CUPDTS ). может есть кусок кода, а то унаследовала базу SQL огромных размеров с 10 распределенками, срочно надо ее резать, на dbf умею а на sql не пробовала
34. dolly_ev (Dolly_EV) 09.07.08 03:19
на SQL - точно так же, УДАЛЯЕМ (не чистим!) полностью нужные таблицы. Именуются таблицы так же, как и файлы в dbf, только в начале знак "_"
"_1SDBSET " и т.д.
Найти таблицы можно в след. месте:
для SQL 2000: "SQL Server Enterprise Manager" - "Databases" - ветка с нашей базой - "Tables"
для SQL 2005: "SQL Server Management Studio" - дальше так же
35. Д Б (loomis) 14.12.08 17:23
Евгений, Вы могли могли бы связаться со мной по адресу Regmenow2006@yandex.ru есть вопрос по ПУБ
36. Сергей (sergy77) 04.06.09 15:29
Уважаемый Dolly_ev, подскажите начинающему программисту 1с, подойдет ли ваш метод свертки базы через УРБД для самописной конфы на базе упрощенки?

37. Алексей Смирнов (Stеls) 20.11.09 01:54
Респект за смекалку и знание УРБД!
38. Олег Валуйский (waol) 20.12.09 15:17
+за идею, возможно пригодится где нибудь
39. ONDimmON (ONDimmON) 05.05.10 11:14
40. Евгений Долиновский (Dolly_EV) 06.05.10 04:57
(39) "Регистр "продажи"... " - он скорее всего оборотный ;)
41. Роман Коновалов (Romkono) 01.07.10 10:57
Сначала - БОЛЬШОЕ спасибо автору! Идея хороша!

Решил воспользоваться. Дело дошло до изменения файла выгрузки из "старой центральной" в "новую центральную". Тут всё нормально - файл выгрузки сделал файлом загрузки для центральной, но при загрузке его в "новую центральную" пишет следующее:
"ПланСчетов.Основной Нарушены правила уникальности кодов справочника '00' Код загруженного счета изменен на '_00'"
и такое на каждый бух счёт, который был затронут в документе Архив

Подскажите, как быть?
Заранее спасибо!
42. Евгений Долиновский (Dolly_EV) 01.07.10 11:29
(41) почему-то (не знаю почему ,не разбирался, принял как данность ;) ) если присутствует компонента "Бух.учет", при выгрузке из Центра в Периферию ВСЕГДА ВЫГРУЖАЕТСЯ ПланСчетов (в файле *.dat блок "{"Accounts",") ,даже если счета не менялись ни в режиме "Предприятие" ни в режиме "Конфигуратор". А в ответе из Периферии в Центр этот блок ("{"Accounts"},") ПУСТОЙ!
Поэтому, если меняем "направление" файлика - про этот момент не забываем - иначе при загрузке измененного файла якобы периферийной базы в Центр все счета "задвоятся". Проблема кстати решается заменой "испорченного" (с задвоенными счетами) файла 1SACCSEL.DBF на старую копию (это чтобы по-новой не копировать базы и т.д.)
43. Роман Коновалов (Romkono) 01.07.10 16:12
СПАСИБО!!! загрузка прошла отлично.
44. Трактор Трактор (Трактор) 27.04.11 14:12
Большую распределённую базу так обрезать не получится.
Вот этой обработкой http://infostart.ru/public/59937/ обрезалась большая распределённая база. Без подпольных ходов.
45. Евген (evg300183) 23.09.11 11:39
46. Евгений Долиновский (Dolly_EV) 24.09.11 07:56
(45) компонента "Управление Распределенными Базами Данных" - файл DistrDB.dll в каталоге установки 1С
вот здесь, например http://www.asd-dnepr.com/urbd/index1.html можно почитать
47. evgen1977 (musatov1c.ru) 16.11.11 14:32
Большое спасибо, буду знать :))))
48. Владимир Саблин (emptyteam) 05.12.11 09:33
dolly_ev пишет:
Вот: http://infostart.ru/projects/1538/

положил конфигу


Большое спасибо, за инструкцию! Сейчас опробую данный метод, о результатах отпишусь.
49. Владимир Саблин (emptyteam) 07.12.11 07:04
Нашел ошибку в документе "Архив"

Пока Рег.ПолучитьДвижение()=1 Цикл
Для ц=1 по Метаданные.Регистр(й).Измерение() Цикл

ТипРег = Метаданные.Регистр(й).Измерение(ц).Тип;
ЗнчРег = Рег.ПолучитьАтрибут(Метаданные.Регистр(й).Измерение(ц).Идентификатор);
Если флПроверятьМоксель = 1 Тогда
Если ТЗОбъектов.НайтиСтроку("индЗначение",ЗнчРег) <> 0 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;

Если (фДок=1) и (ТипРег="Документ") Тогда
ТЗДок.НоваяСтрока();
ТЗДок.Док = ЗнчРег;
ИначеЕсли (фСпр=1) и (ТипРег="Справочник") Тогда
ТЗСпр.НоваяСтрока();
ТЗСпр.Спр = ЗнчРег;
КонецЕсли;

КонецЦикла;

//Зачем по реквизитам ссылки?? по ним НЕТ ОСТАТКОВ!

Для у=1 по Метаданные.Регистр(й).Реквизит() Цикл

ТипРег = Метаданные.Регистр(й).Измерение(у).Тип;
ЗнчРег = Рег.ПолучитьАтрибут(Метаданные.Регистр(й).Измерение(у).Идентификатор);

Если флПроверятьМоксель = 1 Тогда
Если ТЗОбъектов.НайтиСтроку("индЗначение",ЗнчРег) <> 0 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;

Если (фДок=1) и (ТипРег="Документ") Тогда
ТЗДок.НоваяСтрока();
ТЗДок.Док = ЗнчРег;
ИначеЕсли (фСпр=1) и (ТипРег="Справочник") Тогда
ТЗСпр.НоваяСтрока();
ТЗСпр.Спр = ЗнчРег;
КонецЕсли;

КонецЦикла;
КонецЦикла;
50. Евгений Долиновский (Dolly_EV) 07.12.11 08:30
(49) у меня этот кусок заремлен, ибо "//Зачем по реквизитам ссылки?? по ним НЕТ ОСТАТКОВ!" )))
51. Владимир Саблин (emptyteam) 20.12.11 12:17
Еще обнаружил ошибку, теперь при формировании бухгалтерских проводок.
Если субконто у счета 3, то в условии нет кода который формирует данные по 2 субконто и пытается сформировать проводки вот так -
СформПроводки(тзПров.Субк1,тзПров.Субк2,тзПров.Субк2,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);

Передается Субк2 который всегда равен ПУСТО, а вместо субконто 3 передается Субк2, который еще раз повторюсь всегда равен ПУСТО, т.к. не прописан (при условии что у счета 3 субконто).
52. Евгений Долиновский (Dolly_EV) 20.12.11 12:54
(51)Да, есть такое дело, каюсь.. Субконто3 - довольно редко используется.
Вот рабочий код модуля проведения док.Архив, обходящий данную проблему
Как-нибудь на досуге поправлю файлы и статью
Перем Субк[3], СпрФ, Сч, РасчРег[30];
//__________________________________________________________­___________________

Процедура СформПроводки(Субк1="",Субк2="",Субк3="",СндК=0,СндС=0,СнкК=0,СнкС=0)
	Если (СндК<>0) или (СндС<>0) Тогда
		//Делаем проводку по ДЕБЕТУ - кредит 00
		Операция.НоваяПроводка();
		Кол=Кол+1;
		Операция.Дебет.Счет=Сч;
		Если ПустоеЗначение(Субк1)=0 Тогда
			Операция.Дебет.Субконто(1,Субк1);
		КонецЕсли;
		Если ПустоеЗначение(Субк2)=0 Тогда
			Операция.Дебет.Субконто(2,Субк2);
		КонецЕсли;
		Если ПустоеЗначение(Субк3)=0 Тогда
			Операция.Дебет.Субконто(3,Субк3);
		КонецЕсли;
		Если Сч.Забалансовый=0 Тогда
			//корреспонденция по кредиту 00
			Операция.Кредит.Счет=СчетПоКоду("00");
		КонецЕсли;
		Операция.Сумма=СндС;
		Если Сч.Количественный=1 Тогда
			Операция.Количество=СндК;
		КонецЕсли;
		Операция.ФирмаУчета=СпрФ.ТекущийЭлемент();
		Операция.СодержаниеПроводки="ввод ост. АРХИВ №"+Строка(НомерДок);
		Сообщить("Д "+Строка(Операция.Дебет.Счет)+" К"+Строка(Операция.Кредит.Счет));
	КонецЕсли;
	Если (СнкК<>0) или (СнкС<>0) Тогда
		//Делаем проводку по КРЕДИТУ - дебет 00
		Операция.НоваяПроводка();
		Кол=Кол+1;
		Операция.Кредит.Счет=Сч;
		Если ПустоеЗначение(Субк1)=0 Тогда
			Операция.Кредит.Субконто(1,Субк1);
		КонецЕсли;
		Если ПустоеЗначение(Субк2)=0 Тогда
			Операция.Кредит.Субконто(2,Субк2);
		КонецЕсли;
		Если ПустоеЗначение(Субк3)=0 Тогда
			Операция.Кредит.Субконто(3,Субк3);
		КонецЕсли;
		Если Сч.Забалансовый=0 Тогда
			//корреспонденция по дебету 00
			Операция.Дебет.Счет=СчетПоКоду("00");
		КонецЕсли;
		Операция.Сумма=СнкС;
		Если Сч.Количественный=0 Тогда
			Операция.Количество=СнкК;
		КонецЕсли;
		Операция.ФирмаУчета=СпрФ.ТекущийЭлемент();
		Операция.СодержаниеПроводки="ввод ост. АРХИВ №"+Строка(НомерДок);
		Сообщить("Д "+Строка(Операция.Дебет.Счет)+" К"+Строка(Операция.Кредит.Счет));
	КонецЕсли;
КонецПроцедуры //Проводка

//__________________________________________________________­___________________
Процедура ОбработкаПроведения()    
	
	Если Проведен()=1 Тогда
		Сообщить("НЕВОЗМОЖНО ПЕРЕПРОВЕДЕНИЕ ЭТОГО ДОКУМЕНТА !!!","!!!");
		Если Право[73] = 0 Тогда
			СтатусВозврата(0);	
			Возврат;          
		КонецЕсли;
	КонецЕсли;
	
	Если Право[73]=0 Тогда //НЕ АДМИН!
		СтатусВозврата(0);	
		Возврат;          
	ИначеЕсли ГрупповаяОбработка()=1 Тогда//Случайно попал в список
		СтатусВозврата(0);	
		Возврат;          
	КонецЕсли;

	//*********************************************************
	//******************** "СЧЕТА БУ" *************************
	//*********************************************************
	
	Если флСчБУ=1 Тогда
		
		Сообщить("ПЕРЕНОС ОСТАТКОВ ПО СЧЕТАМ БУХГАЛТЕРСКОГО УЧЕТА","!!!");
		
		//**** "поиск Пометок" ****
		лСписСч = СоздатьОбъект("СписокЗначений");
		Если СокрЛП(стрСчБУ) <> "" Тогда лСписСч.ИзСтрокиСРазделителями(стрСчБУ); КонецЕсли;
		//теперь здесь ТОЛЬКО ПОМЕЧЕННЫЕ счета
		
		тзПров = СоздатьОбъект("ИндексированнаяТаблица");
		тзПров.НоваяКолонка("СпрФ");//,"Справочник.Фирмы");
		тзПров.НоваяКолонка("Сч");//,"Счет");
		тзПров.НоваяКолонка("Субк1");
		тзПров.НоваяКолонка("Субк2");
		тзПров.НоваяКолонка("Субк3");
		тзПров.НоваяКолонка("СНДк");//,"Число",14,3);
		тзПров.НоваяКолонка("СНДс");//,"Число",14,2);
		тзПров.НоваяКолонка("СНКк");//,"Число",14,3);
		тзПров.НоваяКолонка("СНКс");//,"Число",14,2);
		
		Кол=0;
		СпрФ=СоздатьОбъект("Справочник.Фирмы");
		СпрФ.ВыбратьЭлементы();
		Пока СпрФ.ПолучитьЭлемент()=1 Цикл
			Сообщить(Строка(СпрФ));
			ОбСч=СоздатьОбъект("Счет");
			ОбСч.ВыбратьСчета();
			БИ=СоздатьОбъект("БухгалтерскиеИтоги");
			Пока ОбСч.ПолучитьСчет()=1 Цикл
				Если ОбСч.ЭтоГруппа()=1 Тогда
					продолжить;
				КонецЕсли;
				Если лСписСч.Принадлежит(ОбСч.Код) = 0 Тогда
					продолжить;
				КонецЕсли;
				Сч=ОбСч.ТекущийСчет();
				КолСубк=Сч.КоличествоСубконто();
				Для i=1 по КолСубк цикл
					БИ.ИспользоватьСубконто(Сч.ВидСубконто(i),,1);
				КонецЦикла;	
				Сообщить("Обрабатывается счет "+Строка(Сч.Код)+" .....");
				БИ.ИспользоватьРазделительУчета(СпрФ.ТекущийЭлемент());
				БИ.ВыполнитьЗапрос(ТекущийДокумент(),ТекущийДокумент(),Сч.Код,,,,,"СК");
				
				//если в целом по счету 0 - пропускаем!
				П1=БИ.СНД("К");П2=БИ.СНД("С");
				П3=БИ.СНК("К");П4=БИ.СНК("С"); 
				Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
					продолжить;
				КонецЕсли;
				
				//**** ""экономичный", И ПРЯМОЙ!)) вариант" ****
				Если КолСубк>=1 Тогда
					//Первое Субконто
					Если БИ.ВыбратьСубконто(1)=1 Тогда
						Пока БИ.ПолучитьСубконто(1)=1 Цикл
							П1=БИ.СНД("К");П2=БИ.СНД("С");
							П3=БИ.СНК("К");П4=БИ.СНК("С"); 
							
							//таблица проводки
							тзПров.УдалитьСтроки();
							тзПров.НоваяСтрока();
							тзПров.СпрФ 	= СпрФ.ТекущийЭлемент();
							тзПров.Сч		= Сч;
							тзПров.Субк1	= БИ.Субконто(1);
							тзПров.СНДк		= П1;
							тзПров.СНДс		= П2;
							тзПров.СНКк		= П3;
							тзПров.СНКс		= П4;
							
							Если КолСубк>=2 Тогда
								//Второе Субконто
								Если БИ.ВыбратьСубконто(2) = 1 Тогда
									//Есть остатки
									Пока БИ.ПолучитьСубконто(2)=1 Цикл
										флНетСубк3 = 1;
~ЕслиНетСубк3:							Если (КолСубк=3) или (флНетСубк3 = 1) Тогда
											Если КолСубк<3	Тогда флНетСубк3 = 0; Перейти ~ЕслиНетСубк3; КонецЕсли;
											//Третье Субконто
											Если БИ.ВыбратьСубконто(3) = 1 Тогда
												//Есть остатки
												Пока БИ.ПолучитьСубконто(3)=1 Цикл   
													П1=БИ.СНД("К");П2=БИ.СНД("С");
													П3=БИ.СНК("К");П4=БИ.СНК("С"); 
													
													тзПров.Субк2 = БИ.Субконто(2);
													тзПров.Субк3 = БИ.Субконто(3);
													Если (Сч.Количественный = 1) и (Сч.УчетПоСумме(3) = 0) Тогда
														//УчетПоСумме = 0, значит делаем проводку по Субк1 - по СУММЕ
														//БЕЗ Количества!
														СформПроводки(тзПров.Субк1,,,0,тзПров.СНДс,0,тзПров.СНКс);
														//и для проводки по Субк2 - ставим ТОЛЬКО Количество
														тзПров.СНДк		= П1;
														тзПров.СНДс		= 0;
														тзПров.СНКк		= П3;
														тзПров.СНКс		= 0;
														
													Иначе
														//меняем суммы и количество
														тзПров.СНДк		= П1;
														тзПров.СНДс		= П2;
														тзПров.СНКк		= П3;
														тзПров.СНКс		= П4;
													КонецЕсли;
													
													Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
														продолжить;
													КонецЕсли;
													////Сообщить(" //С1: "+Строка(БИ.Субконто(1))+" //С2: "+Строка(БИ.Субконто(2))+
													////		 //" //С3: "+Строка(БИ.Субконто(3))+
													////		 " //СНД_к: "+Строка(П1)+" //СНД_с: "+Строка(П2)+" //СНК_к: "+Строка(П3)+" //СНК_с: "+Строка(П4));
													СформПроводки(тзПров.Субк1,тзПров.Субк2,тзПров.Субк3,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
													Кол=Кол+1;
												КонецЦикла;
											Иначе
												//субконто(3) есть, но остатков по нему нет, или флаг "только обороты" = 1
												//делаем по ветке Иначе для Субконто(2)
												флНетСубк3 = 0;
												Перейти ~ЕслиНетСубк3;
												//СформПроводки(тзПров.Субк1,,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
												//Кол=Кол+1;
											КонецЕсли;	
										Иначе
											П1=БИ.СНД("К");П2=БИ.СНД("С");
											П3=БИ.СНК("К");П4=БИ.СНК("С"); 
											
											тзПров.Субк2 = БИ.Субконто(2);
											Если (Сч.Количественный = 1) и (Сч.УчетПоСумме(2) = 0) Тогда
												//УчетПоСумме = 0, значит делаем проводку по Субк1 - по СУММЕ
												//БЕЗ Количества!
												СформПроводки(тзПров.Субк1,,,0,тзПров.СНДс,0,тзПров.СНКс);
												//и для проводки по Субк2 - ставим ТОЛЬКО Количество
												тзПров.СНДк		= П1;
												тзПров.СНДс		= 0;
												тзПров.СНКк		= П3;
												тзПров.СНКс		= 0;
												
												//тзПров.СНДк		= П1;
												//тзПров.СНКк		= П3;
											Иначе
												//меняем суммы и количество
												тзПров.СНДк		= П1;
												тзПров.СНДс		= П2;
												тзПров.СНКк		= П3;
												тзПров.СНКс		= П4;
											КонецЕсли;
											
											Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
												продолжить;
											КонецЕсли;
											////Сообщить(" //С1: "+Строка(БИ.Субконто(1))+" //С2: "+Строка(БИ.Субконто(2))+
											////		 //" //С3: "+Строка(БИ.Субконто(3))+
											////		 " //СНД_к: "+Строка(П1)+" //СНД_с: "+Строка(П2)+" //СНК_к: "+Строка(П3)+" //СНК_с: "+Строка(П4));
											СформПроводки(тзПров.Субк1,тзПров.Субк2,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
											Кол=Кол+1;
										КонецЕсли;	
									КонецЦикла;
								Иначе
									//субконто(2) есть, но остатков по нему нет, или флаг "только обороты" = 1
									СформПроводки(тзПров.Субк1,,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
									Кол=Кол+1;
								КонецЕсли;
							Иначе//Только Субконто(1)
								П1=БИ.СНД("К");П2=БИ.СНД("С");
								П3=БИ.СНК("К");П4=БИ.СНК("С"); 
								Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
									продолжить;
								КонецЕсли;
								СформПроводки(БИ.Субконто(1),,,П1,П2,П3,П4);
								Кол=Кол+1;
							КонецЕсли;	
						КонецЦикла;//По Субконто(1)
					Иначе//субконто(1) есть, но остатков по нему нет, или флаг "только обороты" = 1
						//это ИСКЛЮЧЕНИЕ для конфигурации БухТорг - 
						//счет 50 - Субконто(2) ДОЛЖНО БЫТЬ на ПЕРВОМ МЕСТЕ!!!
						//Сообщить("ЧУДО-СЧЕТ! "+Строка(Сч),"!!!");
						
						//СНОВА Второе Субконто! по Метке не получается, ибо прыгать надо внутрь цикла...(((
						Если КолСубк>=2 Тогда
						Если БИ.ВыбратьСубконто(2) = 1 Тогда
							//Есть остатки
							Пока БИ.ПолучитьСубконто(2)=1 Цикл
								флНетСубк3 = 1;
~ЕслиНетСубк3_:					Если (КолСубк=3) или (флНетСубк3 = 1) Тогда
									Если КолСубк<3	Тогда флНетСубк3 = 0; Перейти ~ЕслиНетСубк3_; КонецЕсли;
									//Третье Субконто
									Если БИ.ВыбратьСубконто(3) = 1 Тогда
										//Есть остатки
										Пока БИ.ПолучитьСубконто(3)=1 Цикл   
											П1=БИ.СНД("К");П2=БИ.СНД("С");
											П3=БИ.СНК("К");П4=БИ.СНК("С"); 
											
											тзПров.Субк3 = БИ.Субконто(3);
											Если (Сч.Количественный = 1) и (Сч.УчетПоСумме(3) = 0) Тогда
												//УчетПоСумме = 0, значит меняем только количество
												тзПров.СНДк		= П1;
												тзПров.СНКк		= П3;
											Иначе
												//меняем суммы и количество
												тзПров.СНДк		= П1;
												тзПров.СНДс		= П2;
												тзПров.СНКк		= П3;
												тзПров.СНКс		= П4;
											КонецЕсли;
											
											Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
												продолжить;
											КонецЕсли;
											////Сообщить(" //С1: "+Строка(БИ.Субконто(1))+" //С2: "+Строка(БИ.Субконто(2))+
											////		 //" //С3: "+Строка(БИ.Субконто(3))+
											////		 " //СНД_к: "+Строка(П1)+" //СНД_с: "+Строка(П2)+" //СНК_к: "+Строка(П3)+" //СНК_с: "+Строка(П4));
											СформПроводки(тзПров.Субк1,тзПров.Субк2,тзПров.Субк3,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
											Кол=Кол+1;
										КонецЦикла;
									Иначе
										//субконто(3) есть, но остатков по нему нет, или флаг "только обороты" = 1
										//делаем по ветке Иначе для Субконто(2)
										флНетСубк3 = 0;
										Перейти ~ЕслиНетСубк3_;
										//СформПроводки(тзПров.Субк1,,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
										//Кол=Кол+1;
									КонецЕсли;	
								Иначе
									П1=БИ.СНД("К");П2=БИ.СНД("С");
									П3=БИ.СНК("К");П4=БИ.СНК("С"); 
									
									тзПров.Субк2 = БИ.Субконто(2);
									Если (Сч.Количественный = 1) и (Сч.УчетПоСумме(2) = 0) Тогда
										//УчетПоСумме = 0, значит меняем только количество
										тзПров.СНДк		= П1;
										тзПров.СНКк		= П3;
									Иначе
										//меняем суммы и количество
										тзПров.СНДк		= П1;
										тзПров.СНДс		= П2;
										тзПров.СНКк		= П3;
										тзПров.СНКс		= П4;
									КонецЕсли;
									
									Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
										продолжить;
									КонецЕсли;
									////Сообщить(" //С1: "+Строка(БИ.Субконто(1))+" //С2: "+Строка(БИ.Субконто(2))+
									////		 //" //С3: "+Строка(БИ.Субконто(3))+
									////		 " //СНД_к: "+Строка(П1)+" //СНД_с: "+Строка(П2)+" //СНК_к: "+Строка(П3)+" //СНК_с: "+Строка(П4));
									СформПроводки(тзПров.Субк1,тзПров.Субк2,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
									Кол=Кол+1;
								КонецЕсли;	
							КонецЦикла;
						Иначе
							//субконто(2) есть, но остатков по нему нет, или флаг "только обороты" = 1
							тзПров.СНДк		= П1;
							тзПров.СНДс		= П2;
							тзПров.СНКк		= П3;
							тзПров.СНКс		= П4;
							СформПроводки(тзПров.Субк1,,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
							Кол=Кол+1;
						КонецЕсли;
						КонецЕсли;
					КонецЕсли;
				Иначе//Счет НЕ ИМЕЕТ СУБКОНТО
					П1=БИ.СНД("К");П2=БИ.СНД("С");
					П3=БИ.СНК("К");П4=БИ.СНК("С"); 
					Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
						продолжить;
					КонецЕсли;
					СформПроводки(,,,П1,П2,П3,П4);
					Кол=Кол+1;
				КонецЕсли;
				
				Сообщить("...сформировано "+Строка(Кол)+" проводок");
				Кол=0;  
			КонецЦикла;//по СЧЕТАМ
		КонецЦикла;//по ФИРМАМ
		
		//тзПров.Группировать("индСпрФ:СпрФ;индСч:Сч;индСубк1:Субк1;индСубк2:Субк2;индСубк3:Субк3","СНДк,СНДс,СНКк,СНКс",1);
		//лисхТЗ = тзПров;
		//Парам = СоздатьОбъект("СписокЗначений");
		//Парам.ДобавитьЗначение("лисхТЗ","ЗаголовокОбъекта_");
		//Парам.ДобавитьЗначение(лисхТЗ,"Объект_");
		//ОткрытьФорму("Отчет#", Парам, КаталогИБ()+"\Extforms\служб_ПросмотрСЗ_ТЗ_ИТЗ.ert");
		
		//**** "КОНТРОЛЬ ПРОВЕДЕНИЯ" ****
		Если ФС.СуществуетФайл(КаталогИБ()+"\КонтрольПроведения_ДокАрхив.mxl") = 1 Тогда
			//Таб=СоздатьОбъект("Таблица"); 
			//Таб.ИсходнаяТаблица(КаталогИБ()+"\КонтрольПроведения_ДокАрхив.mxl");
			//
			//Таб.ВывестиСекцию("Шапка");
			//Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);
			//
			//тзПров.ВыбратьСтроки();
			//Пока тзПров.ПолучитьСтроку() = 1 Цикл
			//	Таб.ВывестиСекцию("Строка");
			//КонецЦикла;
			//Таб.ВывестиСекцию("Подвал");
			//Таб.ПараметрыСтраницы(,,,2,2,2,2,0,0,1,,);
			//Таб.ТолькоПросмотр(1);
			//Таб.Показать("Таблица","");
			
		КонецЕсли;
		
	КонецЕсли;//если флСчБУ = 1
	
	Операция.Содержание="Архив № "+СокрЛП(Строка(НомерДок));
	Состояние("Запись операции документа...");
	Операция.Записать();
	
	//*********************************************************
	//******************** "РЕГИСТРЫ" *************************
	//*********************************************************
	Если флРег=1 Тогда
		
		Сообщить("ПЕРЕНОС ОСТАТКОВ ПО РЕГИСТРАМ ОПЕРАТИВНОГО УЧЕТА","!!!");
		
		//**** "поиск Пометок" ****
		лСписРег = СоздатьОбъект("СписокЗначений");
		Если СокрЛП(стрРег) <> "" Тогда лСписРег.ИзСтрокиСРазделителями(стрРег); КонецЕсли;
		//теперь здесь ТОЛЬКО ПОМЕЧЕННЫЕ Регистры
		
		ЕстьРег = 0;
		Для й=1 по Метаданные.Регистр() Цикл
			//только регистры "Остатков"
			Если Метаданные.Регистр(й).ТипРегистра <> "Остатки" Тогда Продолжить; КонецЕсли;
			ИмяРег = Метаданные.Регистр(й).Идентификатор;
			ПолноеИмяРег = Метаданные.Регистр(й).ПолныйИдентификатор();
			РасчРег[й] = СоздатьОбъект(ПолноеИмяРег);
			Если лСписРег.Принадлежит(ИмяРег) = 1 Тогда
				ЕстьРег = 1;
				РасчРег[й].ВременныйРасчет(1);
			КонецЕсли;	
		КонецЦикла;
		
		Если ЕстьРег = 1 Тогда
			Состояние("Расчет РЕГИСТРОВ.....................");
			РассчитатьРегистрыНа(ТекущийДокумент());
		КонецЕсли;
		
		Для й=1 по Метаданные.Регистр() Цикл
			ИмяРег = Метаданные.Регистр(й).Идентификатор;
			Если лСписРег.Принадлежит(ИмяРег) = 0 Тогда
				продолжить;
			КонецЕсли;	
			РасчРег[й].ВыбратьИтоги();
			КолДвиж = 0;
			Пока РасчРег[й].ПолучитьИтог() = 1 Цикл
				Состояние("обрабатывается регистр: "+ИмяРег);
				ТекРег = Регистр.ПолучитьАтрибут(ИмяРег);
				Для ц=1 по Метаданные.Регистр(й).Измерение() Цикл
					Имя=Метаданные.Регистр(й).Измерение(ц);
					Значение=РасчРег[й].ПолучитьАтрибут(Имя);
					ТекРег.УстановитьАтрибут(Имя,Значение);
				КонецЦикла;	
				Для ц=1 по Метаданные.Регистр(й).Ресурс() Цикл
					Имя=Метаданные.Регистр(й).Ресурс(ц);
					Значение=РасчРег[й].ПолучитьАтрибут(Имя);
					ТекРег.УстановитьАтрибут(Имя,Значение);
				КонецЦикла;	
				// вообще цикл по реквизитам не имеет смысла,
				// т.к. нельзя добыть остаток по реквизиту
				Для ц=1 по Метаданные.Регистр(й).Реквизит() Цикл
					Имя=Метаданные.Регистр(й).Реквизит(ц);
					Значение=РасчРег[й].ПолучитьАтрибут(Имя);
					ТекРег.УстановитьАтрибут(Имя,Значение);
				КонецЦикла;
				ТекРег.ДвижениеПриходВыполнить();
				КолДвиж = КолДвиж + 1;
			КонецЦикла;
			Сообщить("По регистру: "+ИмяРег+" сформировано "+Строка(КолДвиж)+" движений","i");
		
		КонецЦикла;//по регистрам
		
	КонецЕсли;//если флРег = 1
	
КонецПроцедуры //ОбработкаПроведения()

//************************************************************
// ОбработкаУдаленияПроведения()
//
Процедура ОбработкаУдаленияПроведения()
	
	Если Проведен()=1 Тогда
		Если Право[73] = 0 Тогда
			Сообщить("НЕВОЗМОЖНО ОТМЕНИТЬ ПРОВЕДЕНИЕ ЭТОГО ДОКУМЕНТА !!!","!!!");
			СтатусВозврата(0);	
			Возврат;
		Иначе
			Сообщить("ДОКУМЕНТ СДЕЛАН НЕПРОВЕДЕННЫМ!");
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры // ОбработкаУдаленияПроведения()
...Показать Скрыть
53. Евгений Долиновский (Dolly_EV) 20.12.11 12:58
(51) Вообще, весь модуль касательно переноса остатков по БУ надо переписать, некрасивый он.
54. Владимир Саблин (emptyteam) 23.12.11 10:03
Еще один нюанс, пока не придумал как победить.
Счет 21, Количество субконто = 2, Кол.=+
1 Субконто = Номенклатура (учет по количеству, учет по сумме)
2 Субконто = МестаХранения (учет по количеству)

При таком раскладе сумма не учитывается
Например -

ОбСч.Код = "21"
П1 = 6512
П2 = 111747.75
П3 = 0
П4 = 0
БИ.Субконто(1) = Заготовка 1

ОбСч.Код = "21"
П1 = 3367
П2 = 0
П3 = 0
П4 = 0
БИ.Субконто(1) = Заготовка 1
БИ.Субконто(2) = Склад сырья №1

ОбСч.Код = "21"
П1 = 3145
П2 = 0
П3 = 0
П4 = 0
БИ.Субконто(1) = Заготовка 1
БИ.Субконто(2) = Склад сырья №2


В итоге будут сформированы две проводки с количеством, а сумма не будет учитываться.
Не знаю насколько корректно - можно сделать еще одну проводку только с первым субконто и суммой
55. Евгений Долиновский (Dolly_EV) 23.12.11 11:09
(54) Сорри, сейчас этой темой совсем некогда заниматься!
Но! в предыдущем посте (52) я положил длинный кусок кода из модуля Архива, который сам правил по ЭТОЙ ЖЕ ПРОБЛЕМЕ весной текущего года:
Счет 10, Количество субконто = 2, Кол.=+
1 Субконто = Материалы (учет по количеству, учет по сумме)
2 Субконто = МестаХранения (учет по количеству)
В итоге у меня все перенеслось корректно, даже при некорректных остатках на счете! (это когда, например, по Субк1 есть сумма, но по Субк 2 - нет количества, или наоборот)

А по-хорошему, надо все это в ТЗ собирать как-то хитро, или дописывать и проверять мою "простыню" на предмет всех возможных "грабель" сочетаний свойств счета и субконто: "Количественный", "Суммовой", "ТолькоОбороты". Предпочтительнее конечно собрать в ТЗ
56. Владимир Саблин (emptyteam) 23.12.11 13:37
(55) Ой извиняюсь, ступил, я ведь весь код из (52) поста проанализировал, просто не заметил строчку среди комментариев, так как делал анализ через "Сравнить файлы", а там все было в одном цвете.
//УчетПоСумме = 0, значит делаем проводку по Субк1 - по СУММЕ
//БЕЗ Количества!
СформПроводки(тзПров.Субк1,,,0,тзПров.СНДс,0,тзПров.СНКс);
//и для проводки по Субк2 - ставим ТОЛЬКО Количество

Большое спасибо за направление.
57. Владимир Саблин (emptyteam) 26.12.11 11:44
Еще проблему откопал, счет с единственным субконто и с галочкой "Только обороты"
Причем это счет 50.1, уж не знаю зачем ему грамотеи поставили галочку "Только обороты"
58. Евгений Долиновский (Dolly_EV) 26.12.11 14:48
(57) Это не "грамотеи" поставили))) Просто по правилам Бухучета не может быть аналитики с остатками по счету 50 ))) Т.е. Касса - она одна касса, и Кассовая книга печататься должна со сквозной нумерацией по всем денежным документам. У меня в комментариях по этому поводу есть замечание

Иначе//субконто(1) есть, но остатков по нему нет, или флаг "только обороты" = 1
	//это ИСКЛЮЧЕНИЕ для конфигурации БухТорг - 
	//счет 50 - Субконто(2) ДОЛЖНО БЫТЬ на ПЕРВОМ МЕСТЕ!!!
	//Сообщить("ЧУДО-СЧЕТ! "+Строка(Сч),"!!!");


Просто в моей конфиге у счета 50 есть Субконто 2 "Кассы организации", по которому ЕСТЬ остатки (но по методологии БухУчета ТАК ДЕЛАТЬ НЕЛЬЗЯ!!)))

Поэтому в типовом случае (сч. 50.1, Субконто 1 (об.)Дв. ден. средств)
после комментария
//Сообщить("ЧУДО-СЧЕТ! "+Строка(Сч),"!!!");
//СНОВА Второе Субконто! по Метке не получается, ибо прыгать надо внутрь цикла...(((


для ветки
Если КолСубк>=2 Тогда

придется дописать еще вилку (скопировать из чуть ниже):
Иначе//Субконто 1 без остатка или "только обороты"
	П1=БИ.СНД("К");П2=БИ.СНД("С");
	П3=БИ.СНК("К");П4=БИ.СНК("С"); 
	Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
		продолжить;
	КонецЕсли;
	СформПроводки(,,,П1,П2,П3,П4);
	Кол=Кол+1;
...Показать Скрыть
59. Владимир Саблин (emptyteam) 27.12.11 09:18
(58) Большое спасибо за оперативный и раскрытый ответ, очень ценю.
У меня еще оказались счета по которым все три субконто "только обороты", сейчас сделаю по аналогии с первым.

Когда начал разбирать субконто3, обнаружил что в коде присутствует вечный переход, хотя сам в него не попадал.
~ЕслиНетСубк3:	Если (КолСубк=3) или (флНетСубк3 = 1) Тогда
Если КолСубк<3	Тогда флНетСубк3 = 0; Перейти ~ЕслиНетСубк3; КонецЕсли;
	//Третье Субконто
	Если БИ.ВыбратьСубконто(3) = 1 Тогда
		//Есть остатки
		Пока БИ.ПолучитьСубконто(3)=1 Цикл   
	            .......................................ТЕКСТ ЦИКЛА........
		КонецЦикла;
	Иначе
		//субконто(3) есть, но остатков по нему нет, или флаг "только обороты" = 1
		//делаем по ветке Иначе для Субконто(2)
		флНетСубк3 = 0;
		Перейти ~ЕслиНетСубк3;
		//СформПроводки(тзПров.Субк1,,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
		//Кол=Кол+1;
	КонецЕсли;
...Показать Скрыть



Я пока сделал так
~ЕслиНетСубк3:	Если (КолСубк=3) и (флНетСубк3 = 1) Тогда
//Если КолСубк<3	Тогда флНетСубк3 = 0; Перейти ~ЕслиНетСубк3; КонецЕсли;
60. Евгений Долиновский (Dolly_EV) 28.12.11 04:13
(59) Да вроде нет там "вечного" перехода...
Заходим в ЕСЛИ по ИЛИ, и дальше Если левая половина=ЛОЖЬ, ДЕЛАЕМ правую половину=ЛОЖЬ, и перенаправляем на ЭТО ЖЕ ЕСЛИ, которое уже заведомо не сработает и попадем на ИНАЧЕ (вообще, цель здесь была - попасть на ИНАЧЕ этой ветки вот таким извращенным способом)))

Вот раз ты в теме сейчас - сделал бы доброе дело!)))
ПЕРЕПИШИ весь модуль, кривой он! Лучше перед обходом субконто проанализировать свойства счета и субконто и уже на этом этапе решить чего делать дальше, имхо. А править эту портянку - дело неблагодарное
61. Владимир Саблин (emptyteam) 28.12.11 09:53
(60)Уф.. сейчас вроде все переноситься нормально.
я тоже подумал по поводу - заняться оптимизацией данного документа (уже начал потихоньку), если после НГ буду в состоянии то возможно сделаю красивее код.
В любом случае ОГРОМНОЕ спасибо и за тот код который сейчас выложен, так как он отражает основную идею.
И большое спасибо за поддержку данной статьи.

По поводу вечного перехода

Иначе
      //субконто(3) есть, но остатков по нему нет, или флаг "только обороты" = 1
      //делаем по ветке Иначе для Субконто(2)
      флНетСубк3 = 0;
      Перейти ~ЕслиНетСубк3;
...Показать Скрыть


Получается если у нас есть Субконто3, но нет по нему остатков, он переходит сюда "~ЕслиНетСубк3;"
Там у нас условие
~ЕслиНетСубк3:   Если (КолСубк=3) или (флНетСубк3 = 1) Тогда
Если КолСубк<3   Тогда флНетСубк3 = 0; Перейти ~ЕслиНетСубк3; КонецЕсли;

Так как стоит оператор "или", а количество субконто у нас 3 (КолСубк=3) и остатков на нем нет, то мы снова попадаем в -
Иначе
      //субконто(3) есть, но остатков по нему нет, или флаг "только обороты" = 1
      //делаем по ветке Иначе для Субконто(2)
      флНетСубк3 = 0;
      Перейти ~ЕслиНетСубк3;
...Показать Скрыть
62. Евгений Долиновский (Dolly_EV) 28.12.11 11:17
Угу. тогда поставить другую метку на "пониже" (ИНАЧЕ для 2-го субконто) и переходить на нее
65. Соня Иванова (CoverG) 15.02.12 13:03
А если документы изменяют периодические реквизиты справочников, как в случаем с амортизацией ОС, то теряется история... Пришлось это самому изменять.
66. Евгений Долиновский (Dolly_EV) 16.02.12 05:10
(65) ага, есть такое дело. У меня товарищ в свое время тоже дописывал этот кусок, но как-то громоздко получилось, а у самого так руки и не доходят
67. ru ru (*.ru) 16.03.12 08:54
Следующий глюк связан с регистрами...

Для й=1 по Метаданные.Регистр() Цикл
         //только регистры "Остатков"

Если Метаданные.Регистр(й).ТипРегистра <> "Остатки" Тогда Продолжить; КонецЕсли;
ИмяРег = Метаданные.Регистр(й).Идентификатор;
         ПолноеИмяРег = Метаданные.Регистр(й).ПолныйИдентификатор();
         РасчРег[й] = СоздатьОбъект(ПолноеИмяРег);
         Если лСписРег.Принадлежит(ИмяРег) = 1 Тогда
            ЕстьРег = 1;
            РасчРег[й].ВременныйРасчет(1);
         КонецЕсли;   
      КонецЦикла;
      ... 
      ...
      ...
      Для й=1 по Метаданные.Регистр() Цикл
         ИмяРег = Метаданные.Регистр(й).Идентификатор;
         Если лСписРег.Принадлежит(ИмяРег) = 0 Тогда
            продолжить;
         КонецЕсли;
...Показать Скрыть

РасчРег[й].ВыбратьИтоги();
КолДвиж = 0;
      ...
      ...
      ...


В первом цикле допустим й=5 - регистр оборотов, тогда продолжить и РасчРег[5] - не существует...
Во втором цикле й=5 имеет место быть и "РасчРег[5].ВыбратьИтоги();" какие, извиняюсь, там итоги...
68. Евгений Долиновский (Dolly_EV) 16.03.12 09:59
(67) Ну да, список тогда собрать в первом цикле, только участвующих. И второй цикл - по списку пустить, а не по Метаданным.
69. ru ru (*.ru) 16.03.12 10:03
Ну да, список тогда собрать в первом цикле, только участвующих. И второй цикл - по списку пустить, а не по Метаданным.

А на регистры оборотов просто забить ))
70. Евгений Долиновский (Dolly_EV) 16.03.12 10:22
(69) Ну хочешь - перенеси "остатки" по регистрам оборотов :-))) Расскажешь потом, что получилось)
71. Евгений Долиновский (Dolly_EV) 16.03.12 10:26
(69) Вобщем, вставил в Форму, в "ПриОткрытии()", где собирается список регистров на форму, проверку:
Если Метаданные.Регистр(сч).ТипРегистра <> "Остатки" Тогда Продолжить; КонецЕсли;

Теперь в модуле проведения можно не проверять на "Остатки" и "й" всегда совпадет
72. ru ru (*.ru) 16.03.12 10:50
(71) Dolly_EV, И это правильно ))
PS... кстати попробовал перенести "остатки" по регистру оборотов... не поверишь - переносит(!) обороты за период (указанный в конфе по этому регистру)... вот они, не документированные возможности ))))
73. Евгений Долиновский (Dolly_EV) 16.03.12 11:27
(72) всмысле? Чем ты попробовал перенести "остатки"? метод ВыбратьИтоги для регистра оборотов вернет 0.
74. ru ru (*.ru) 16.03.12 11:33
(73) Dolly_EV, я тоже так думал... для прикола решил проверить... нифига, регистр "продажи" оборотный, за последний месяц (такая периодичность указана в конфе) по всем ресурсам выдал движуху по регистру... сверил несколько позиций с отчетом по продажам за последний месяц - ровно )) я ж говорю не документированные возможности ))
Сейчас разбираюсь по проводкам бухгалтерским... не идет что-то... ошибка вылетает...
75. Евгений Долиновский (Dolly_EV) 16.03.12 11:51
(74) Хм.. ну я-то тоже проверил, правда типовой нет под рукой, в своей - один регистр оборотный - РасчРег[й].ВыбратьИтоги() = 0.
76. ru ru (*.ru) 16.03.12 12:40
77. Gimalaj Gimalaev (gimalaj) 08.04.12 20:07
Не совсем понял п.8 про документы текущего периода:
"8). документы за текущий период так же переносим в "новую" базу через обмен УРБД, проинициализировав (Записать()) документы за нужный период. ".

Как именно их переносить?
78. Евгений Долиновский (Dolly_EV) 09.04.12 03:59
(77) Документы надо какой-либо обработкой перезаписать. Примерно так:
Док=СоздатьОбъект("Документ");
НачатьТранзакцию();
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
    Док.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
...Показать Скрыть

Дальше - выгрузка / загрузка через УРБД
79. Gimalaj Gimalaev (gimalaj) 09.04.12 09:48
(78) Спасибо за быстрый ответ, я уже сам разобрался :)
У меня тоже небольшое примечание, вроде на него никто не указывал. В первой строке модуля проведения указано:
Перем Субк[3], СпрФ, Сч, РасчРег[30];

Так вот, нужно предварительно проверить, чтобы размер массива РасчРег[30] был больше общего числа регистров в конфигурации. У меня, как назло, их оказалось 31 :)
80. Евгений Долиновский (Dolly_EV) 09.04.12 10:20
(79) Мда.. 31 регистр - это жестоко :-))
81. Gimalaj Gimalaev (gimalaj) 09.04.12 15:57
Еще одно примечание. Во многих типовых конфигурациях в глобальном модуле при начале работы системы предусмотрено первоначальное заполнение информационной базы (заполняет план счетов и т.д.). Поскольку мы удаляем все, кроме справочников, то конфигурация будет пустой и при первом открытии захочет "самозаполниться", что может внести путаницу в новую базу. В моем случае (Комплексная "Бухгалтерия + Торговля и склад + Зарплата и кадры") - заполнение произошло и загрузка отказалась загружаться. Поэтому перед сверткой рекомендую закомментировать этот участок кода.
82. Gimalaj Gimalaev (gimalaj) 19.04.12 11:31
Кстати, не разбирались со структурой файла .dat в выгрузке? Как пометить (распровести) переносимые документы в утробе этого файла?
83. Евгений Долиновский (Dolly_EV) 19.04.12 11:53
(82) Бросил это гиблое дело.. Но чтобы НЕ проведенным документ был - надо чтобы его ДВИЖЕНИЯ в DAT были пустые
84. Евгений Долиновский (Dolly_EV) 19.04.12 11:58
(82) Выгрузи один и тот же ПРОВЕДЕННЫЙ и НЕПРОВЕДЕННЫЙ док (чтобы ТОЛЬКО он один в выгрузку попал). и сравни
85. Alex (AlexBugs) 28.10.12 10:24
Делал по этой методике срезку 3 разных баз... Если DBF, то можно с помощью копирования файлов, резко убыстрять процесс срезки (удалить регистры - получили док-ты без движения -> файл переноса гораздо меньше и быстрее грузит их). Какие встретил затыки:
1. у 1С есть ограничения по объему файла загрузки - где-то 2 Гига,
2. есть ограничения по кол-ву движения в 1 документе, поэтому приходится делить их.
3. перенос период. реквизитов, изменяемых докуменов приходится обрабатывать отдельно - делать их срезку док-том "Архив".
4. если регистр очень "грязный" - обычно в Партиях товара много минусов и нулевых остатков, то приходится все это как-то чистить...
86. Евгений Долиновский (Dolly_EV) 29.10.12 10:06
(85) AlexBugs,
Если DBF, то можно с помощью копирования файлов, резко убыстрять процесс срезки (удалить регистры - получили док-ты без движения -> файл переноса гораздо меньше и быстрее грузит их).

А если SQL, то какие проблемы точно также поступить с одноименными таблицами в базе??

Какие встретил затыки:
1. у 1С есть ограничения по объему файла загрузки - где-то 2 Гига,

Ссылка на плагин Romix'a, позволяющий выгружать dat без упаковки в zip, имеет место быть и в статье и в комментариях в начале

2. есть ограничения по кол-ву движения в 1 документе, поэтому приходится делить их.

?? Нет ограничений по количеству движений, есть ограничение на >9999 строк в табличной части документа, и то оно связано только с привязкой номера строки к движению регистра (строки с номером > 9999 имеют номер=0).
в данной метОде документ "Архив" НЕ ИМЕЕТ табличной части

3. перенос период. реквизитов, изменяемых докуменов приходится обрабатывать отдельно
- есть такой грех, Периодику так и не дописал... к вопросу вернусь видимо только через год, пока живем на SQL, растем в размерах, оптимизируем все, что возможно, прямыми запросами, резать базу не собираюсь

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

К сабжу это не относится - или вы предлагаете, чтобы "Архив" еще и автоматом чистил "грязный регистр"?:-)))
По этому поводу есть очень удобный (в смысле реализации) документ: http://infostart.ru/public/18708/
Сам им пользуюсь с небольшими допилами. Как раз для "чистки" очень удобен.
87. Alex (AlexBugs) 29.10.12 12:52
А если SQL, то какие проблемы точно также поступить с одноименными таблицами в базе??

нужно уметь переносить таблицы из базы в базу, а при DBF копируешь Totall Commanderom и не паришься...

плагин Romix'a
пробовал, но счастья не ощутил...

Нет ограничений по количеству движений
Пытался перенести цены у 8000 товаров - не удалось, виснет и все... разделил на 2 части и все пошло.

К сабжу это не относится
Относится, но универсального решения этой проблемы нет, поэтому я и предупреждаю, чтобы люди сами допиливали...
88. Alex (AlexBugs) 01.11.12 08:09
Периодику так и не дописал...

Вот здесь уже решили все проблемы с периодикой :)
http://infostart.ru/public/15219/
89. Владимир Владимир (knight) 16.12.13 09:45
А в чем проблемы с периодикой? Разве они не перенесутся вместо со справочниками?
90. Евгений Долиновский (Dolly_EV) 16.12.13 12:44
(89) Периодические реквизиты, установленные документами (например, документ "Ввод в эксплуатацию ОС" пишет за собой периодику по этим ОС), при удалении этих документов (а они в текущей реализации удалятся, т.к. кроме периодики никаких остатков за собой не оставляют) тоже удалятся.
91. Владимир Владимир (knight) 16.12.13 12:46
У нас такого нет. Цены в основном интересуют. Т е периодические реквизиты вводимые вручную. Не с помощью документов.
92. Евгений Долиновский (Dolly_EV) 16.12.13 12:46
(89) Тоже самое, например со справочником "Цены", где цены были установлены документом "Переоценка" - при удалении документа потрутся и установленные им значения Спр.Цены.Цена. Поэтому стоит обработкой цены установить "вручную", взяв значение на дату обрезки и установив на ту же дату
93. Евгений Долиновский (Dolly_EV) 16.12.13 12:47
(91) с введенными вручную, не документом - все в порядке. Таблица констант переедет вся в новую базу.
94. Владимир Владимир (knight) 19.12.13 10:44
Еще вот такой вопрос. То что остатки вбиваются всегда приходом с + или -. Притом что реальный остаток расход к примеру. Это как то может влиять на работу базы с этими остатками?
95. Евгений Долиновский (Dolly_EV) 20.12.13 09:38
(94) "Притом что реальный остаток расход к примеру. " - это так имеется ввиду отрицательный остаток?))
Да не важно + или -. Если был отриц. остаток - он так же с "минусом" и перенесется.
96. Евгений Долиновский (Dolly_EV) 20.12.13 09:47
(94) Это никак не может "влиять на работу базы с этими остатками"... Остаток - он и в африке остаток... Если его ввести не Приходом, а Расходом с обратным знаком - тоже ничего не изменится
97. Владимир Владимир (knight) 20.12.13 09:47
Знак остатка переносится корректно. Но в 1с есть 2 вида движения приход и расход. некоторые отчеты это учитывают. и вот был допустим расход 10 единиц. а стал приход -10 единиц. там есть 2 метода движениеприходвыполнить и движениерасходвыполнить
98. Владимир Владимир (knight) 20.12.13 09:57
(96) Dolly_EV, да пожалуй вы правы приход или расход важен обычно в оборотах. для начального остатка который в любом случае интегрирует и приходы и расходы разницы нет видимо. а в случае разных знаков ресурсов и не реализовать даже такое.
99. Владимир Владимир (knight) 31.12.13 11:08
Все сделал вроде нормально все. Единственное что удивило свежевыгруженная периферийка из обрезанной базы в 2 раза меньше самой обрезанной.. все же выгружается туда. а файл регистра партии наличие например меньше в 2 раза
100. Владимир Владимир (knight) 09.01.14 07:16
Разобрался. Я базу резал заранее на копии. Из копии выгружал док архив(чтоб не удваивать реальные остаки в базе(проводится и распроводится он у нас часов 8)) и документы до 1.09.13. Они уже не редактировались. В базе люди продолжали работать(набивать доки и тд). А на новый год я планировал прогрузить документы с 1.09.13 по 31.12.13. Вроде идея хорошая была меньше заморочек на праздники заранее прогрузить остатки и большую часть доков. В итоге архив затерся, у них там оказывается сквозная нумерация внутренняя для распределенки не зависящая от типа документа. И первый же новый док в базе затер мой архив. Хорошо бэкапил все этапы. Поковырял файлы выгрузки поигрался с id починил. Большое спасибо за обработку очень полезная вещь.
101. Евгений Долиновский (Dolly_EV) 09.01.14 07:44
(100) Большое пожалуйста )) Но "проводится и распроводится он у нас часов 8" как-то настораживает... Скорее всего "сильно не закрытые" регистры?