При разработке и сопровождении систем на базе 1С часто возникает ситуация, когда необходимо перенести настройки движений документа из одной конфигурации в другую. Основная сложность заключается в том, что движения документа — это не только галочки в списке регистров в дереве метаданных, но и программный код в процедуре ОбработкаПроведения. Если просто воспользоваться стандартным конструктором движений, велика вероятность безвозвратно потерять уже написанный вручную код. В этой статье мы подробно разберем, как грамотно выполнить перенос настроек, сохранив всю логику работы документа.
Рассмотрим ситуацию, когда в документе уже реализована сложная логика проведения, возможно, затрагивающая несколько регистров. Вам необходимо добавить еще один регистр, например, Запасы. Если вы откроете Конструктор движений, он действительно предложит вам удобный интерфейс для сопоставления полей документа и ресурсов регистра. Однако у конструктора есть одна особенность: при нажатии кнопки "ОК" он полностью перезаписывает содержимое процедуры ОбработкаПроведения в модуле объекта. Весь ваш предыдущий код, условия, сложные расчеты и обращения к другим регистрам будут удалены и заменены типовым кодом, сгенерированным конструктором.
Поэтому проанализируем альтернативные и более безопасные способы решения этой задачи.
Это основной и самый профессиональный инструмент для переноса метаданных. Допустим, у вас есть "база-источник", где движения настроены правильно, и "база-приемник", куда их нужно перенести. Проделаем следующие шаги:
.cf.Запасы). Это обновит список регистров, по которым документ в принципе может делать движения.ОбработкаПроведения и вручную перенести нужные фрагменты кода из источника в приемник, не затирая остальное содержимое.Если нам нужно просто "подключить" регистр к документу, мы можем обойтись без файлов выгрузки. Разберем этот процесс по шагам:
Шаг 1. Настройка метаданных. Откроем свойства документа в дереве конфигурации. Перейдем на закладку "Движения". В списке всех регистров системы найдем нужный нам регистр (например, Запасы) и просто установим напротив него флажок. С этого момента объект Движения внутри модуля документа будет содержать коллекцию для данного регистра.
Шаг 2. Написание кода проведения. Теперь нам нужно заставить документ записывать данные в этот регистр. Перейдем в модуль объекта в процедуру ОбработкаПроведения. Нам не нужно запускать конструктор. Мы добавим код вручную. Проанализируем пример кода для записи в регистр накопления:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Указываем, что будем записывать движения по регистру
Движения.Запасы.Записывать = Истина;
// Очищаем движения, если это необходимо (зависит от настроек документа)
Движения.Запасы.Очистить();
// Формируем записи набора
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Запасы.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаТовары.Количество;
КонецЦикла;
КонецПроцедуры
Этот метод полностью безопасен, так как вы контролируете каждую строку кода и не рискуете тем, что автоматика удалит ваши наработки.
Если логика формирования движений очень сложная и писать ее вручную долго, можно схитрить. Выясним, как использовать мощь конструктора, не навредив основному коду:
.cf текущей базы в новую).ОбработкаПроведения.Таким образом, мы получаем идеально сформированный код движений, но сохраняем полный контроль над модулем объекта.
Если вы работаете в современной версии платформы (8.3.6 и выше), рассмотрим вариант использования Расширений. Это позволит вам вообще не менять основную конфигурацию, что существенно облегчит будущие обновления.
Проанализируем алгоритм работы с расширением:
Запасы.После или Вместо процедуры ОбработкаПроведения.Запасы.Пример кода в расширении:
&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)
// Дополнительная логика движений, которая не затронет основной код
Движения.Запасы.Записывать = Истина;
// ... логика заполнения ...
КонецПроцедуры
Этот метод является наиболее прогрессивным, так как разделяет типовую логику и ваши доработки.
Подведем итог. Чтобы перенести настройки движений и не "сломать" документ, придерживайтесь следующих правил:
Записывать = Истина для тех регистров, по которым вы формируете движения программно.Соблюдение этих рекомендаций позволит вам эффективно управлять метаданными и кодом, избегая досадных ошибок и потери рабочего времени на восстановление затертых алгоритмов.