Всем, "обрезавшим" огромные базы 7.7 посвящается...
база 7-ки более 12GB с данными за 4 года. УРБД - центр+7 перифериек. Конфига самописная, когда-то на основе типовой "Бухгалтерии".
файл инициализации периферийной базы в архиве - почти 2GB. Не знаю как на 27-м релизе, но до 21-го господа 1С-ники так и не поменяли вшитый zip, поэтому выгрузить данные, которые в итоге в архиве будут весить более более 2GB, не представляется возможным - старый zip не понимает файлы более 2GB. (Поправка - представляется возможным:Плагин romix-a //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 объектов "двоятся" и при обмене "затираются".
На SQL все так же работает на ура - проверено 20.04.08- разрезал базу размером почти 20Гб с 7-мью периферийками, на все-про-все ушло 7 часов.
Еще момент: если режем центральную с периферийными - чтобы потом быстро выгрузить новые периф. базы, достаточно в таблице _1SDBSET значение "C" поля "DBSTATUS" сменить на "N",
чтобы осуществить первичную выгрузку в периферийные с ТЕМИ ЖЕ идентификаторами. Старые идентификаторы позволят подгрузить уже в новую базу обмены с перифериек, если,
например, нет возможностью заменить базы "разом" во всех подразделениях.
док "Архив"
док "Архив" после проведения - обработка "Инициализация объектов"
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Свертка базы Чистка данных Перенос данных 1C Системный администратор Разработчик 1С:Предприятие 7.7 1С:Комплексная 7.7 1С:Торговля и склад 7.7 Абонемент ($m)
Приводится порядок действий для создания новой информационной базы на основе имеющейся файл-серверной "Торговля и Склад" ред.9.2, для учёта с нуля. В новую базу выполняется перенос справочников и остатков номенклатуры. Журналы документов, данные регистров, долги контрагентов, партии очищаются.
1 стартмани
14.01.2022 9108 6 etmarket 3
Свертка базы Разработчик Бухгалтер Бухгалтерский учет 7.7 1С:Бухгалтерия 2.0 Россия Бухгалтерский учет Абонемент ($m)
Имеется база 7.7, которую хочется свернуть. Но в процессе свертки могут съехать остатки. Для проверки нужно сравнить остатки на дату свертки.
1 стартмани
20.06.2016 20055 2 pentanom 1
Свертка базы Разработчик Оперативный учет 7.7 1С:Торговля и склад 7.7 Управленческий учет Абонемент ($m)
Хотя большинство пользователей перешло на 1С 8ХХ, но есть еще очень много торговых организаций до сих пор эксплуатирующих 1С 77 ТиС. И пока еще не собираются переходить на новую платформу, а свертку делать надо. Есть много решений, я решил поделиться своим. Основное отличие: 1. Универсальность 2. Быстрота 3. Свертку можно делать на любую дату (не обязательно на начало года)
1 стартмани
15.11.2014 34285 136 Marik 28
Свертка базы Чистка данных Бухгалтер Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Бухгалтерский учет Абонемент ($m)
Удаляет проводки(корреспонденцию) по выбранным счетам за выбранный период. Работает с забалансовыми счетами. Выбор условия соответствия вхождения счетов в корреспонденцию (и / или).
1 стартмани
06.01.2014 21354 11 by_1Cnik 8
Свертка базы Системный администратор Оперативный учет 7.7 1С:Торговля и склад 7.7 Россия Абонемент ($m)
По статье "Зачем в 1С нужно периодически пересчитывать итоги по регистрам?" http://infostart.ru/public/177171/ Обработка для 7.7, файловая, только для специалистов. Никаких гарантий и возмещений. Работает только в разделенном режиме (прямой запрос VFP). После выполнения - в обязательном порядке ТиИ (только упаковка), После ТиИ в обязательном порядке - принудительно переиндексировать. Родственная разработка для SQL: http://infostart.ru/public/177579/
8 стартмани
28.03.2013 75457 102 CheBurator 14
Свертка базы Чистка данных Системный администратор Разработчик Оперативный учет 7.7 1С:Торговля и склад 7.7 Россия Абонемент ($m)
Берем 2 базы старую и новую, новая это точная копия старой, только с подчищенными файлами d*.dbf, r*.dbf Запускаем в старой обработку, ждем 15 минут и радуемся! Только не забудьте в новой провести ручками документы (операции - проведение документов) Сворачивает остатки по фирмам и складам в усредненной себестоимости(считает по принципу отчета остатки ТМЦ), делает вводы остатков в базе к которой коннектимся И сворачивает всю дебиторскую и кредиторскую задолженность по Фирмам без детализации кредДокумент. Обновление от 12.02.13 появилась возможность сворачивать дебиторку в разрезе кред документа+переносит долги по комиссионерам. Не знаю как вам, а на мой взгляд более простого и работоспособного я тут просто не нашел!!!
1 стартмани
02.01.2013 26034 186 zoeh 8
Свертка базы Перенос данных 1C Разработчик 1С:Предприятие 7.7 1C77 Розничная и сетевая торговля (FMCG) Россия Абонемент ($m)
Обработка предназначена для переноса данных из Рарус 2.5 магазина на платформе 7.7 в Розницу ред. 1 на платформе 8.2. Перенос осуществляется с помощью OLE. Переносимые данные: Номенклатура(ед., штрих-коды), Документ ввода остатков и цены номенклатуры (после закрытия торгового периода).
1 стартмани
08.10.2012 24148 48 pervanax 5
Свертка базы Разработчик Оперативный учет 7.7 1С:Торговля и склад 7.7 Россия Управленческий учет Абонемент ($m)
Свертка данных на определенную дату, без изменения в конфигурации.
1 стартмани
03.09.2012 22204 158 Tarlich 6
Счет 21, Количество субконто = 2, Кол.=+
1 Субконто = Номенклатура (учет по количеству, учет по сумме)
2 Субконто = МестаХранения (учет по количеству)
При таком раскладе сумма не учитывается
Например -
П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
В итоге будут сформированы две проводки с количеством, а сумма не будет учитываться.
Не знаю насколько корректно - можно сделать еще одну проводку только с первым субконто и суммой
Но! в предыдущем посте (52) я положил длинный кусок кода из модуля Архива, который сам правил по ЭТОЙ ЖЕ ПРОБЛЕМЕ весной текущего года:
Счет 10, Количество субконто = 2, Кол.=+
1 Субконто = Материалы (учет по количеству, учет по сумме)
2 Субконто = МестаХранения (учет по количеству)
В итоге у меня все перенеслось корректно, даже при некорректных остатках на счете! (это когда, например, по Субк1 есть сумма, но по Субк 2 - нет количества, или наоборот)
А по-хорошему, надо все это в ТЗ собирать как-то хитро, или дописывать и проверять мою "простыню" на предмет всех возможных "грабель" сочетаний свойств счета и субконто: "Количественный", "Суммовой", "ТолькоОбороты". Предпочтительнее конечно собрать в ТЗ
//БЕЗ Количества!
СформПроводки(тзПров.Субк1,,,0,тзПров.СНДс,0,тзПров.СНКс);
//и для проводки по Субк2 - ставим ТОЛЬКО Количество
Большое спасибо за направление.
Для й=1 по Метаданные.Регистр() Цикл
//только регистры "Остатков"Если Метаданные.Регистр(й).ТипРегистра <> "Остатки" Тогда Продолжить; КонецЕсли;
ИмяРег = Метаданные.Регистр(й).Идентификатор;
ПолноеИмяРег = Метаданные.Регистр(й).ПолныйИдентификатор();
РасчРег[й] = СоздатьОбъект(ПолноеИмяРег);
Если лСписРег.Принадлежит(ИмяРег) = 1 Тогда
ЕстьРег = 1;
РасчРег[й].ВременныйРасчет(1);
КонецЕсли;
КонецЦикла;
...
...
...
Для й=1 по Метаданные.Регистр() Цикл
ИмяРег = Метаданные.Регистр(й).Идентификатор;
Если лСписРег.Принадлежит(ИмяРег) = 0 Тогда
продолжить;
КонецЕсли; ПоказатьРасчРег[й].ВыбратьИтоги();
КолДвиж = 0;
...
...
...В первом цикле допустим й=5 - регистр оборотов, тогда продолжить и РасчРег[5] - не существует...
Во втором цикле й=5 имеет место быть и "РасчРег[5].ВыбратьИтоги();" какие, извиняюсь, там итоги...
Только для простых маленьких баз.
И вообще - "без УРИБ" здесь не осуждаем.
А перепроведение оставшихся доков - необходимый этап для окончательной проверки. Идет гладко, если сделали хорошо.
Dolly_EV, выкладывание куска очень желательно.
Сочтешь возможным - давай!
{Обработка.ЗавершениеПериода.Форма.Модуль(404)}: Номер не уникальный!
Как сворачивать - х.з. ... :-(
не знаю что есть ладПереноса, если справочник, то так:
| Код |
|---|
Попытка
ладПереноса.Записать();
Исключение
ладПереноса.УстановитьНовыйКод("_Б");
КонецПопытки;Показать полностью |
Если документ - то ПрисвоитьНовыйНомер()
А вообще - если в тему - то возьми "Архив" и попробуй свернуть базу по данной метОде ))
Один "-" в справочниках тоже могут быть ссылки на документы (те же партии) про них автор "забыл".
На счет автоматизации - операция разовая, зачем ее автоматизировать? Это все равно что создавать спец. документ под какую нибудь хитрож.ую операцию совершаемую один раз ... иногда бухгалтера требуют :(
После их удаления, пересчет итогов, соответственно, тоже пойдет быстро, т.к. самих документов нету уже :)
Еще момент: если режем центральную с периферийными - чтобы потом быстро выгрузить новые периф. базы, достаточно в таблице _1SDBSET значение "C" поля "DBSTATUS" сменить на "N",
чтобы осуществить первичную выгрузку в периферийные с ТЕМИ ЖЕ идентификаторами. Старые идентификаторы позволят подгрузить уже в новую базу обмены с перифериек, если,
например, нет возможностью заменить базы "разом" во всех подразделениях.
А как тебе след. вариант: Если у тебя уже есть документ с остатками, то посредством ОЛЕ перенести этот документ с синхронизацией справочников (в пустую базу) из оригинала.
Как на меня, то быстрее выйдет.;)
так это надо ПИСАТЬ ПЕРНОС OLE для этого документа! к тому же в моем варианте документ может ПРОВОДИТЬСЯ ТОЛЬКО в Рабочей (где есть остатки) базе
Как ты "посредством ОЛЕ" перенесешь ДВИЖЕНИЯ РЕГИТРОВ И ПРОВОДКИ документа?!?!
а не могли бы вы поделиться как на SQL очистить таблицы ( DH, DT, RA, RG, 1Cxx,1CUPDTS ). может есть кусок кода, а то унаследовала базу SQL огромных размеров с 10 распределенками, срочно надо ее резать, на dbf умею а на sql не пробовала
"_1SDBSET " и т.д.
Найти таблицы можно в след. месте:
для SQL 2000: "SQL Server Enterprise Manager" - "Databases" - ветка с нашей базой - "Tables"
для SQL 2005: "SQL Server Management Studio" - дальше так же
Решил воспользоваться. Дело дошло до изменения файла выгрузки из "старой центральной" в "новую центральную". Тут всё нормально - файл выгрузки сделал файлом загрузки для центральной, но при загрузке его в "новую центральную" пишет следующее:
"ПланСчетов.Основной Нарушены правила уникальности кодов справочника '00' Код загруженного счета изменен на '_00'"
и такое на каждый бух счёт, который был затронут в документе Архив
Подскажите, как быть?
Заранее спасибо!
Поэтому, если меняем "направление" файлика - про этот момент не забываем - иначе при загрузке измененного файла якобы периферийной базы в Центр все счета "задвоятся". Проблема кстати решается заменой "испорченного" (с задвоенными счетами) файла 1SACCSEL.DBF на старую копию (это чтобы по-новой не копировать базы и т.д.)
Для ц=1 по Метаданные.Регистр(й).Измерение() Цикл
ТипРег = Метаданные.Регистр(й).Измерение(ц).Тип;
ЗнчРег = Рег.ПолучитьАтрибут(Метаданные.Регистр(й).Измерение(ц).Идентификатор);
Если флПроверятьМоксель = 1 Тогда
Если ТЗОбъектов.НайтиСтроку("индЗначение",ЗнчРег) <> 0 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
Если (фДок=1) и (ТипРег="Документ") Тогда
ТЗДок.НоваяСтрока();
ТЗДок.Док = ЗнчРег;
ИначеЕсли (фСпр=1) и (ТипРег="Справочник") Тогда
ТЗСпр.НоваяСтрока();
ТЗСпр.Спр = ЗнчРег;
КонецЕсли;
КонецЦикла;
//Зачем по реквизитам ссылки?? по ним НЕТ ОСТАТКОВ!
Для у=1 по Метаданные.Регистр(й).Реквизит() Цикл
ТипРег = Метаданные.Регистр(й).Измерение(у).Тип;
ЗнчРег = Рег.ПолучитьАтрибут(Метаданные.Регистр(й).Измерение(у).Идентификатор);
Если флПроверятьМоксель = 1 Тогда
Если ТЗОбъектов.НайтиСтроку("индЗначение",ЗнчРег) <> 0 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
Если (фДок=1) и (ТипРег="Документ") Тогда
ТЗДок.НоваяСтрока();
ТЗДок.Док = ЗнчРег;
ИначеЕсли (фСпр=1) и (ТипРег="Справочник") Тогда
ТЗСпр.НоваяСтрока();
ТЗСпр.Спр = ЗнчРег;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если субконто у счета 3, то в условии нет кода который формирует данные по 2 субконто и пытается сформировать проводки вот так -
Передается Субк2 который всегда равен ПУСТО, а вместо субконто 3 передается Субк2, который еще раз повторюсь всегда равен ПУСТО, т.к. не прописан (при условии что у счета 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);
Возврат;
Иначе
Сообщить("ДОКУМЕНТ СДЕЛАН НЕПРОВЕДЕННЫМ!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ОбработкаУдаленияПроведения()
ПоказатьИначе//субконто(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;
ПоказатьУ меня еще оказались счета по которым все три субконто "только обороты", сейчас сделаю по аналогии с первым.
Когда начал разбирать субконто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; КонецЕсли;Заходим в ЕСЛИ по ИЛИ, и дальше Если левая половина=ЛОЖЬ, ДЕЛАЕМ правую половину=ЛОЖЬ, и перенаправляем на ЭТО ЖЕ ЕСЛИ, которое уже заведомо не сработает и попадем на ИНАЧЕ (вообще, цель здесь была - попасть на ИНАЧЕ этой ветки вот таким извращенным способом)))
Вот раз ты в теме сейчас - сделал бы доброе дело!)))
ПЕРЕПИШИ весь модуль, кривой он! Лучше перед обходом субконто проанализировать свойства счета и субконто и уже на этом этапе решить чего делать дальше, имхо. А править эту портянку - дело неблагодарное
я тоже подумал по поводу - заняться оптимизацией данного документа (уже начал потихоньку), если после НГ буду в состоянии то возможно сделаю красивее код.
В любом случае ОГРОМНОЕ спасибо и за тот код который сейчас выложен, так как он отражает основную идею.
И большое спасибо за поддержку данной статьи.
По поводу вечного перехода
Иначе
//субконто(3) есть, но остатков по нему нет, или флаг "только обороты" = 1
//делаем по ветке Иначе для Субконто(2)
флНетСубк3 = 0;
Перейти ~ЕслиНетСубк3;
Получается если у нас есть Субконто3, но нет по нему остатков, он переходит сюда "~ЕслиНетСубк3;"
Там у нас условие
~ЕслиНетСубк3: Если (КолСубк=3) или (флНетСубк3 = 1) Тогда
Если КолСубк<3 Тогда флНетСубк3 = 0; Перейти ~ЕслиНетСубк3; КонецЕсли;Так как стоит оператор "или", а количество субконто у нас 3 (КолСубк=3) и остатков на нем нет, то мы снова попадаем в -
Иначе
//субконто(3) есть, но остатков по нему нет, или флаг "только обороты" = 1
//делаем по ветке Иначе для Субконто(2)
флНетСубк3 = 0;
Перейти ~ЕслиНетСубк3;
Если Метаданные.Регистр(сч).ТипРегистра <> "Остатки" Тогда Продолжить; КонецЕсли;Теперь в модуле проведения можно не проверять на "Остатки" и "й" всегда совпадет
Сейчас разбираюсь по проводкам бухгалтерским... не идет что-то... ошибка вылетает...
Док=СоздатьОбъект("Документ");
НачатьТранзакцию();
Док.ВыбратьДокументы(НачДата,КонДата);
Пока Док.ПолучитьДокумент()=1 Цикл
Док.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();Дальше - выгрузка / загрузка через УРБД
У меня тоже небольшое примечание, вроде на него никто не указывал. В первой строке модуля проведения указано:
Перем Субк[3], СпрФ, Сч, РасчРег[30];Так вот, нужно предварительно проверить, чтобы размер массива РасчРег[30] был больше общего числа регистров в конфигурации. У меня, как назло, их оказалось 31 :)
1. у 1С есть ограничения по объему файла загрузки - где-то 2 Гига,
2. есть ограничения по кол-ву движения в 1 документе, поэтому приходится делить их.
3. перенос период. реквизитов, изменяемых докуменов приходится обрабатывать отдельно - делать их срезку док-том "Архив".
4. если регистр очень "грязный" - обычно в Партиях товара много минусов и нулевых остатков, то приходится все это как-то чистить...
А если SQL, то какие проблемы точно также поступить с одноименными таблицами в базе??
1. у 1С есть ограничения по объему файла загрузки - где-то 2 Гига,
Ссылка на плагин Romix'a, позволяющий выгружать dat без упаковки в zip, имеет место быть и в статье и в комментариях в начале
?? Нет ограничений по количеству движений, есть ограничение на >9999 строк в табличной части документа, и то оно связано только с привязкой номера строки к движению регистра (строки с номером > 9999 имеют номер=0).
в данной метОде документ "Архив" НЕ ИМЕЕТ табличной части
К сабжу это не относится - или вы предлагаете, чтобы "Архив" еще и автоматом чистил "грязный регистр"?:-)))
По этому поводу есть очень удобный (в смысле реализации) документ:
Сам им пользуюсь с небольшими допилами. Как раз для "чистки" очень удобен.
нужно уметь переносить таблицы из базы в базу, а при DBF копируешь Totall Commanderom и не паришься...
Закомментировать следующие строки:
Операция.ФирмаУчета=СпрФ.ТекущийЭлемент();
.................
тзПров.НоваяКолонка("СпрФ");//,"Справочник.Фирмы");
................
СпрФ=СоздатьОбъект("Справочник.Фирмы");
СпрФ.ВыбратьЭлементы();
Пока СпрФ.ПолучитьЭлемент()=1 Цикл
Сообщить(Строка(СпрФ));
................
БИ.ИспользоватьРазделительУчета(СпрФ.ТекущийЭлемент());
................
тзПров.СпрФ = СпрФ.ТекущийЭлемент();
................
КонецЦикла;//по ФИРМАМ
ПоказатьКакой-то битый регистр. Присутствует в Конфе, но не используется, и с настройками итогов что-то не так.
Насколько помню "ВыбратьИтоги" не запрещено даже для оборотного регистра.
Не могу сейчас посмотреть модуль
Как вариант - "ВыбратьИтоги" поместить в попытка/исключение
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 17072
Создание 11.12.07 17:16
Обновление 30.01.12 11:19
Просмотры 69300
Загрузки 0
Рейтинг
69
Комментарии 118
Код открыт Не указано
Рубрики Свертка базы
Кому Разработчик
Тип файла Нет файла
Платформа
Оперативный учет 7.7
,
Бухгалтерский учет 7.7
Конфигурация
1С:Бухгалтерия 7.7
,
1С:Торговля и склад 7.7
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)