Оптимизация конфигураций на платформе 1C SQL
На главную
Обратная связь
Карта сайта
Оптимизация конфигураций на платформе 1C SQL
ГлавнаяМатериалыСтатьиРазработка
  • Деятельность

  • Материалы

  •      › Скачать
         › Статьи
         › FAQ
         › Новости
  • Контакты

  • Форум



  • e-mail:
    icq: 169296011
    © 2003-2010 Шемякин Павел





    Разработка

    Опубликована: 29.06.2003, отредактирована: 29.06.2003 Автор: Хайкин Игорь

    Групповое проведение. От слов к делу

    От редактора.

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

    Далее авторский текст немного мною отредактированный.

    Итак, напомним суть задачи. Необходимо перепровести документы друг за другом за определённый период времени.

    Решение. Сначала определяем остатки на начало интервала проведения по регистрам, для которых необходим временный расчёт итогов. Заполняем этими данными временные таблицы. Число таких таблиц равно числу регистров, по которым хотим быстро рассчитывать остатки. Колонки таблиц соответствуют измерениям и ресурсам регистров. В процессе проведения вместо временного расчёта используем информацию из наших таблиц. При проведении каждого документа, обновляем таблицы остатков.

    Таблицы остатков хранятся в базе данных MySQL.

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

    Регистров, по которым необходимо в процессе проведения знать временные итоги четыре штуки:

    Основные остатки (Товар; Остаток, Стоимость);
    Складские остатки (Товар, Склад; Остаток, Стоимость);
    Финансовые остатки (Фирма, Товар; Остаток);
    ГТД (Товар, ГТД; Остаток).

    Первые три регистра — "распавшийся" регистр "Остатки товаров" из типовой конфигурации. Если кого заинтересует, почему так сделано - пишите, расскажу. А ещё у меня в базе есть МОД, кто понимает. Поэтому все справочники, в т. ч., "Номенклатура" и "Склады", имеют 17-значный реквизит IDD. По нему я синхронизировал объекты в 1С-базе и в таблицах MySQL. В качестве примера выбран регистр финансовых остатков.

    Вот как я действовал:

    1. Ввёл новую константу БыстроеПерепроведение, состояние которой регулирует способ получения остатков в модулях проведения документов — с помощью регистров 1С или с помощью методики, описанной в данной статье. Да — описанная методика, иначе — через регистры 1С;
    2. Написал обработку, рассчитывающую остатки по регистрам на заданную дату и выгружающую их во временные таблицы;
    3. Подправил свою обработку для проведения базы. При запуске она использует обработку из п.2, меняет значение константы из п.1 на "Да", проводит документы и присваивает константе из п.1 прежнее значение;
    4. В модули проведения документов, использующих временный расчёт, следующие участки кода:

    Если ИтогиАктуальны()=0 Тогда
      ВремРегистры=СоздатьОбъект("Регистры");
      РегФин=ВремРегистры.ФинОстатки;
      РегФин.ВременныйРасчет();
      ВремРегистры.Актуальность(1);
      ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент());
      ОстатокТовараФин=РегФин.Остаток(Фирма,Товар,"ОстатокТовара")
    КонецЕсли

    были заменены на такой код:

    Если БыстроеПерепроведение()=0 Тогда
      Если ИтогиАктуальны()=0 Тогда
        ВремРегистры=СоздатьОбъект("Регистры");
        РегФин=ВремРегистры.ФинОстатки;
        РегФин.ВременныйРасчет();
        ВремРегистры.Актуальность(1);
        ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент());
        ОстатокТовараФин=РегФин.Остаток(Фирма,Товар,"ОстатокТовара")
      КонецЕсли
    Иначе
      ОстатокТовараФин=ФинОстатокИзМайЭсКуЭль(Фирма,Товар)
    КонецЕсли;

    5. В них же, в модулях, вместо строк:

    Регистр.ФинОстатки.ДвижениеРасходВыполнить();

    добавлено:

    Регистр.ФинОстатки.ДвижениеРасходВыполнить();
    ДвижениеФинОстМайЭсКуЭль(Фирма,Товар,Списываем,"-");

    Вот, собственно, и всё, что было.

    Тексты процедур БыстроеПерепроведение(), ФинОстатокИзМайЭсКуЭль()и ДвижениеФинОстМайЭсКуЭль() содержатся в прилагаемом файле. Первая процедура проверяет состояние константы, вторая возвращает финансовый остаток товара по выбранной фирме и третья корректирует одну из таблиц MySQL, чтобы учесть движения, сделанные очередным документом.

    В нашей переписке с автором статьи он сообщил, что проверил описанную методику на своей базе. Скорость проведения по его словам возросла по сравнению со стандартным методом в семь (7) раз.

    Редактировал Шемякин Павел.

     наверх