Как перенести настройки движений документа и логику проведения в новую базу без потери данных

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке и сопровождении систем на базе 1С часто возникает ситуация, когда необходимо перенести настройки движений документа из одной конфигурации в другую. Основная сложность заключается в том, что движения документа — это не только галочки в списке регистров в дереве метаданных, но и программный код в процедуре ОбработкаПроведения. Если просто воспользоваться стандартным конструктором движений, велика вероятность безвозвратно потерять уже написанный вручную код. В этой статье мы подробно разберем, как грамотно выполнить перенос настроек, сохранив всю логику работы документа.

Анализ проблемы: почему конструктор — не всегда лучшее решение

Рассмотрим ситуацию, когда в документе уже реализована сложная логика проведения, возможно, затрагивающая несколько регистров. Вам необходимо добавить еще один регистр, например, Запасы. Если вы откроете Конструктор движений, он действительно предложит вам удобный интерфейс для сопоставления полей документа и ресурсов регистра. Однако у конструктора есть одна особенность: при нажатии кнопки "ОК" он полностью перезаписывает содержимое процедуры ОбработкаПроведения в модуле объекта. Весь ваш предыдущий код, условия, сложные расчеты и обращения к другим регистрам будут удалены и заменены типовым кодом, сгенерированным конструктором.

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

Способ 1. Использование механизма сравнения и объединения конфигураций

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

  1. Выгрузим конфигурацию-источник в файл .cf.
  2. В базе-приемнике откроем Конфигуратор и выберем пункт меню "Конфигурация" — "Сравнить, объединить с конфигурацией из файла...".
  3. В открывшемся окне найдем наш документ. Разберем структуру дерева: нам нужно развернуть ветку документа и найти подпункт "Движения".
  4. Здесь мы можем точечно отметить галочкой только нужный регистр (например, Запасы). Это обновит список регистров, по которым документ в принципе может делать движения.
  5. Важный момент: чтобы перенести логику проведения, не закрывая окно сравнения, найдите "Модуль объекта" этого же документа. Нажмите правую кнопку мыши и выберите "Сравнить модули". В открывшемся окне вы сможете увидеть различия в коде ОбработкаПроведения и вручную перенести нужные фрагменты кода из источника в приемник, не затирая остальное содержимое.

Способ 2. Ручная настройка метаданных и программного кода

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

Шаг 1. Настройка метаданных. Откроем свойства документа в дереве конфигурации. Перейдем на закладку "Движения". В списке всех регистров системы найдем нужный нам регистр (например, Запасы) и просто установим напротив него флажок. С этого момента объект Движения внутри модуля документа будет содержать коллекцию для данного регистра.

Шаг 2. Написание кода проведения. Теперь нам нужно заставить документ записывать данные в этот регистр. Перейдем в модуль объекта в процедуру ОбработкаПроведения. Нам не нужно запускать конструктор. Мы добавим код вручную. Проанализируем пример кода для записи в регистр накопления:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Указываем, что будем записывать движения по регистру
    Движения.Запасы.Записывать = Истина;
    
    // Очищаем движения, если это необходимо (зависит от настроек документа)
    Движения.Запасы.Очистить();
    
    // Формируем записи набора
    Для Каждого ТекСтрокаТовары Из Товары Цикл
        Движение = Движения.Запасы.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
        Движение.Склад = Склад;
        Движение.Количество = ТекСтрокаТовары.Количество;
    КонецЦикла;

КонецПроцедуры

Этот метод полностью безопасен, так как вы контролируете каждую строку кода и не рискуете тем, что автоматика удалит ваши наработки.

Способ 3. Использование "чистой" базы для работы с конструктором

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

  1. Создадим пустую информационную базу с аналогичной структурой метаданных (или просто выгрузим .cf текущей базы в новую).
  2. В этой временной базе запустим Конструктор движений для нужного документа и настроим все связи.
  3. После того как конструктор сгенерирует код, скопируем его из модуля объекта временной базы.
  4. Вернемся в основную базу и аккуратно вставим скопированный фрагмент кода в нужное место процедуры ОбработкаПроведения.

Таким образом, мы получаем идеально сформированный код движений, но сохраняем полный контроль над модулем объекта.

Способ 4. Современный подход через расширения конфигурации

Если вы работаете в современной версии платформы (8.3.6 и выше), рассмотрим вариант использования Расширений. Это позволит вам вообще не менять основную конфигурацию, что существенно облегчит будущие обновления.

Проанализируем алгоритм работы с расширением:

  1. Создадим новое расширение и добавим в него наш документ и регистр Запасы.
  2. В расширении для документа укажем, что он делает движения по этому регистру.
  3. В модуле документа в расширении создадим процедуру-обработчик После или Вместо процедуры ОбработкаПроведения.
  4. В этой процедуре опишем логику заполнения регистра Запасы.

Пример кода в расширении:


&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Дополнительная логика движений, которая не затронет основной код
    Движения.Запасы.Записывать = Истина;
    // ... логика заполнения ...
    
КонецПроцедуры

Этот метод является наиболее прогрессивным, так как разделяет типовую логику и ваши доработки.

Резюме

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

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

← На главную