Почему исчезает ручной код в процедуре ОбработкаПроведения и как его восстановить?

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

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

Суть проблемы: как работает Конструктор движений

Проанализируем механику работы платформы «1С:Предприятие». Когда мы вызываем Конструктор движений для документа, система не просто «дописывает» строки кода, она полностью перезаписывает содержимое определенного блока. Платформа ориентируется на специальные текстовые маркеры (комментарии), которые она сама же и расставляет. Рассмотрим их внимательнее:


//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

// ... здесь находится сгенерированный код ...

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

Все, что находится между этими комментариями, считается «собственностью» конструктора. Если вы решите дописать расчет себестоимости или проверку остатков прямо внутри этих тегов, то при следующем запуске конструктора (например, для добавления еще одного регистра) система просто удалит старый текст и вставит новый на основе текущих визуальных настроек. Именно это произошло в ситуации автора темы: новые изменения затерли старые, так как они были внесены в «опасную зону».

Экстренная помощь: как вернуть удаленный код

Если вы обнаружили пропажу кода, первым делом не закрывайте Конфигуратор и не нажимайте кнопку обновления (синий бочонок). Рассмотрим два основных способа восстановления:

  1. Откат к конфигурации базы данных. Это самый действенный способ, если вы еще не успели применить изменения к базе (не нажимали F7). В меню выберите пункт Конфигурация — Конфигурация БД — Вернуться к конфигурации БД. Программа заменит вашу текущую «черновую» конфигурацию на ту, которая сейчас реально работает у пользователей. Весь код, который был на момент последнего успешного обновления, вернется.
  2. Стандартная отмена действия (Ctrl+Z). Иногда, если вы не закрывали модуль объекта, многократное нажатие Ctrl+Z позволяет отменить работу конструктора и вернуть текст. Однако конструктор совершает сразу множество операций, поэтому нажимать придется долго.
  3. Сравнение и объединение. Если у вас есть архивная копия базы (файл .dt) или выгрузка конфигурации (файл .cf), выполненная до инцидента, воспользуйтесь функцией Конфигурация — Сравнить, объединить с конфигурацией из файла. В открывшемся дереве объектов найдите нужный документ, разверните его до модуля объекта и отметьте только его. Это позволит точечно восстановить процедуру, не затрагивая остальные изменения.

Почему регистры работают, если кода нет?

Разберем ситуацию, которая часто сбивает с толку новичков: в модуле кода нет, а в режиме «Предприятие» движения документа все равно формируются правильно. Выясним причину этого феномена. В системе 1С существует разделение на Основную конфигурацию (в которой вы работаете как программист) и Конфигурацию базы данных (в которой работают пользователи).

Когда вы редактируете модуль, изменения сохраняются только в «черновике». Реальные таблицы базы данных продолжают использовать старый скомпилированный код до тех пор, пока вы не выполните обновление (клавиша F7 или кнопка «Обновить конфигурацию базы данных»). Таким образом, движения в регистрах создавались старым, еще не «испорченным» кодом, который хранился в БД. Как только вы обновите базу, движения также пропадут, поэтому действовать нужно оперативно.

Как правильно совмещать Конструктор и ручной код

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

Способ 1: Изоляция тегов конструктора

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


Процедура ОбработкаПроведения(Отказ, Режим)

    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

    // Ваш ручной код начинается здесь
    Для Каждого ТекСтрокаТовары Из Товары Цикл
        // Дополнительная логика расчета
        Движение = Движения.Себестоимость.Добавить();
        // ...
    КонецЦикла;

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

При повторном вызове конструктор увидит свои теги, «подумает», что он уже что-то создавал, и просто вставит код между ними. Ваш ручной код, находящийся ниже, останется нетронутым.

Способ 2: Вынос логики в отдельные процедуры

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


Процедура ОбработкаПроведения(Отказ, Режим)
    // Код, созданный конструктором автоматически
    // ...
    
    // Вызов вашей функции
    ДополнитьДвиженияПоСебестоимости(Отказ);
КонецПроцедуры

Процедура ДополнитьДвиженияПоСебестоимости(Отказ)
    // Здесь ваша уникальная логика, которую конструктор никогда не тронет
КонецПроцедуры

Использование Расширений конфигурации

Если вы работаете в современной версии платформы 8.3, самым безопасным методом будет использование Расширений. Рассмотрим этот вариант подробнее:

  1. Создайте новое Расширение конфигурации.
  2. Добавьте в него документ РеализацияТоваров.
  3. Создайте в расширении обработчик процедуры ОбработкаПроведения с типом вызова «После».

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

Профессиональные советы по безопасности данных

Посмотрим на ситуацию шире. Любое программирование — это риск потери данных. Чтобы не зависеть от капризов конструктора, возьмем за правило следующие действия:

Подводя итог, можно сказать, что Конструктор движений — это полезный инструмент для быстрой наброски структуры, но он требует осторожности. Помните о магических тегах //{{__КОНСТРУКТОР..., умейте пользоваться отметом к конфигурации БД и старайтесь выносить свою логику в отдельные методы или расширения. Таким образом, ваш тернистый путь обучения станет намного более предсказуемым и продуктивным.

← На главную