Консультация № 58171
08.10.2006, 21:53
0.00 руб.
0 4 4
Я начинающий администратор 1С.
Имеется заказная конфигурация 1С 7.7
Конфигурация изменению не подлежит (это данность, не обсуждается, разработчик не я)
Требуется настроить задачи обслуживания БД.
Настроил переиндексацию, логическую и физическую проверку (с помощью запуска 1С в пакетном режиме). Но бухгалтеры иногда выполняют пересчет бух. итогов и перепроведение документов. Запускают они программу в монопольном режиме, задают нужные им действия и оставляют программу работать на ночь.
Естественно, мои настроенные на монопольный доступ задачи не работают.
Вопрос в том, как программно организовать выполнение этих действий.

Бухгалтерские итоги пересчитувают так: меню "Операции" - "Управление бухгалтерскими итогами..." - "полный пересчет итогов".
В пакетном режиме имеется параметер "RecalcTotals". Но в руководстве сказано, что произведется пересчет итогов бухгалтерского и оперативного учета. Как программоно выполнить пересчет только бухгалтерских итогов?

Для перепроведения докементов бухгалтеры выполняют: меню "Операции" - "Управление оперативными итогами..." - устанавливают дату актуальности на начало месяца, потом устанавливают на следующий день - в диалоге "переустановка актуальности итогов" выбирают все проведенные. Что при этом происходит? Как мне эти действия реализовать программно? Думаю, что необходимо установить ТА на начало указанного периода, выбрать все проведенные документы за указанный период и выполнить для каждого метод "Провести". Выполнять предполагаю с помощью OLE-автоматизации.

Обсуждение

Неизвестный
09.10.2006, 06:53
общий
это ответ
Здравствуйте, white!

"Как программоно выполнить пересчет только бухгалтерских итогов?"
Не знаю, как только бух.итоги, но что мешает пересчитать все? И может быть вообще не делать постоянного пересчета? Я сталкивался с тем, что при еженочном пересчете итогов раз-два в месяц итоги вообще слетали.

"Для перепроведения докементов бухгалтеры выполняют: ..."
Перепроведение можно делать обработкой. Их в инете много, ищите поисковиками по словам "восстановление последовательности"

"Как мне эти действия реализовать программно?"
Боюсь работа через OLE будет слишком медленной. Обычный метод, вставить свой код в процедуру ПриНачалеРаботы в глобальном модуле, что бы при запуске от определенного пользователя, выполнялись нужные действия: восстановление последовательности, открытие периода оперучета и так далее. Если нельзя менять конфигурацию, можно попробовать запускать свою внешнюю обработку обходными путями. Например, через ОЛЕ. Или, если конфигурация типовая, можно воспользоваться тем, что при запуске конфигурации есть возможность настроить автооткрытие календаря. Подменяйте соответствующий *.ert в папке ExtForms\Calendar.
Неизвестный
09.10.2006, 06:58
общий
это ответ
Здравствуйте, white!

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

Насколько знаю, "не ручками" только бух. итоги не пересчитать, но если база остаётся на ночь неужели не успевает пересчитать и то и то? тем более что регулярный пересчёт итогов вреда не приносит... :)

Происходит именно перепроведение всех проведённых документов.... то же самое можно делать, например, внешней обработкой (разумеется прийдётся писать, или искать подобное) и в правах должен быть разрешён запуск внешних обработок...

Ну, чем мог.... :)
Неизвестный
09.10.2006, 11:59
общий
это ответ
Здравствуйте, white!

[Думаю, что необходимо установить ТА на начало указанного периода, выбрать все проведенные документы за указанный период и выполнить для каждого метод "Провести". Выполнять предполагаю с помощью OLE-автоматизации.]

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

Что касается именно раздельно пересчета итогов, то в пакетном режиме таких команд не знаю, с другой стороны полный пересчет итогов может оказаться надежнее. При условии, конечно, что размер и быстродействие базы данных позволяют провести все операции за одну ночь...
Неизвестный
09.10.2006, 18:08
общий
это ответ
Здравствуйте, white!
Если конфигурацию нельзя изменить, то всегда можно запустить внешний отчет/обработку, и это для Вас спасение. По внешнему отчету всегда можно пройтись отладчиком, вылизать его до идеального состояния. Как правило, внешние отчеты работают также хорошо и быстро, как и внутренние, с одним лишь отличием: после внесения изменений не нужно выгонять всех пользователей с базы.
Теперь об обслуживании. НЕ нужно еженощно делать проверку. Проверку следует выполнять только в следующих случаях: 1.Появления Бэд-блоков, 2.Обнаружения, что планка памяти битая 3. Зависания компьютера во время транзакции (т.е. при проведении, записи, удалении).
НЕ нужно без случаев, описанных выше, делать пересчет итогов и служебных данных.
Если база ДБФ, то она сама, когда ей будет нужно, спросит переиндексацию. Если база СКЛ, то переиндексацию делать нужно только в случаях, описанных выше а также в случае аварийного завершения программы при открытом окне нового документа либо журнала.
Игры с ТА ни к чему хорошему не приводят. Переносить ТА в случае бухгалтеров следует не на начало месяца, а на первый измененный документ (после предыдущего перепроведения). Нет никакой уверенности что при переносе ТА на начало седьмого месяца в шестом месяце не было никаких изменений.
Программные перепроведения чрезвычайно нужны, без них 1С показывает искаженную себестоимость и прибыль.
Реализовать программно нужно так: посмотреть в конфигураторе, какие последовательности у Вас есть, если их нет, то потребовать, чтобы разработчики их сделали. Пример моей обработки по перепроведению в приложении (это внешний отчет, через ОЛЕ тоже можно сделать что-либо подобное, но про преимущества внешних отчетов читай выше). Обратите внимание, что я не трогаю ТА, т.к. это ни к чему.

Приложение:
В данном примере восстанавливаются обе последовательности. Эффект будет только от одновременного восстановления всех последовательностей.Процедура ПерепровестиВсеДокументы() Док=СоздатьОбъект("Документ"); Док.ВыбратьДокументы(Мин(Последовательность.ОсновнаяПоследовательность.ПолучитьДату(),Последовательность.НалоговыйКредит.ПолучитьДату())); Пока Док.ПолучитьДокумент()=1 Цикл Перепроводить=0; Если (Последовательность.НалоговыйКредит.ПринадлежитПоследовательности(Док.ТекущийДокумент())=1) Тогда Если (Последовательность.НалоговыйКредит.Сравнить(Док.ТекущийДокумент())=-1) Тогда Перепроводить=1; КонецЕсли; КонецЕсли; Если (Последовательность.ОсновнаяПоследовательность.ПринадлежитПоследовательности(Док.ТекущийДокумент())=1) Тогда Если (Последовательность.ОсновнаяПоследовательность.Сравнить(Док.ТекущийДокумент())=-1) Тогда Перепроводить=1; КонецЕсли; КонецЕсли; Если Док.Проведен()=0 Тогда Перепроводить=0; КонецЕсли; Если Перепроводить=0 Тогда Продолжить; КонецЕсли; Сообщить("Перепровожу "+Док); Если Док.Провести()=1 Тогда Иначе Сообщить("Не могу провести документ"+Док+" "+ТекущееВремя()); Возврат; КонецЕсли; Если (Последовательность.НалоговыйКредит.Сравнить(Док.ТекущийДокумент())<>0)И(Последовательность.НалоговыйКредит.ПринадлежитПоследовательности(Док.ТекущийДокумент())=1) Тогда Сообщить("После проведения документа граница последовательности НалоговыйКредит не сдвинулась. Дальше переповодить нет смысла."); Возврат; КонецЕсли; Если (Последовательность.ОсновнаяПоследовательность.Сравнить(Док.ТекущийДокумент())<>0)И(Последовательность.ОсновнаяПоследовательность.ПринадлежитПоследовательности(Док.ТекущийДокумент())=1) Тогда Сообщить("После проведения документа граница последовательности ОсновнаяПоследовательность не сдвинулась. Дальше переповодить нет смысла."); Возврат; КонецЕсли; КонецЦикла; Предупреждение("Обработка закончена.");КонецПроцедуры
Форма ответа