В процессе обучения или при разработке реальных задач программисты 1С часто сталкиваются с ситуацией, когда после использования визуального Конструктора движений весь код, написанный вручную внутри процедуры ОбработкаПроведения, бесследно исчезает. Это может вызвать панику, особенно если не была сделана резервная копия. В данной статье мы подробно разберем, почему это происходит, как экстренно вернуть утраченные строки и как правильно организовать работу, чтобы автоматизация не мешала творчеству.
Проанализируем механику работы платформы «1С:Предприятие». Когда мы вызываем Конструктор движений для документа, система не просто «дописывает» строки кода, она полностью перезаписывает содержимое определенного блока. Платформа ориентируется на специальные текстовые маркеры (комментарии), которые она сама же и расставляет. Рассмотрим их внимательнее:
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
// ... здесь находится сгенерированный код ...
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
Все, что находится между этими комментариями, считается «собственностью» конструктора. Если вы решите дописать расчет себестоимости или проверку остатков прямо внутри этих тегов, то при следующем запуске конструктора (например, для добавления еще одного регистра) система просто удалит старый текст и вставит новый на основе текущих визуальных настроек. Именно это произошло в ситуации автора темы: новые изменения затерли старые, так как они были внесены в «опасную зону».
Если вы обнаружили пропажу кода, первым делом не закрывайте Конфигуратор и не нажимайте кнопку обновления (синий бочонок). Рассмотрим два основных способа восстановления:
Конфигурация — Конфигурация БД — Вернуться к конфигурации БД. Программа заменит вашу текущую «черновую» конфигурацию на ту, которая сейчас реально работает у пользователей. Весь код, который был на момент последнего успешного обновления, вернется.Ctrl+Z позволяет отменить работу конструктора и вернуть текст. Однако конструктор совершает сразу множество операций, поэтому нажимать придется долго.Конфигурация — Сравнить, объединить с конфигурацией из файла. В открывшемся дереве объектов найдите нужный документ, разверните его до модуля объекта и отметьте только его. Это позволит точечно восстановить процедуру, не затрагивая остальные изменения.Разберем ситуацию, которая часто сбивает с толку новичков: в модуле кода нет, а в режиме «Предприятие» движения документа все равно формируются правильно. Выясним причину этого феномена. В системе 1С существует разделение на Основную конфигурацию (в которой вы работаете как программист) и Конфигурацию базы данных (в которой работают пользователи).
Когда вы редактируете модуль, изменения сохраняются только в «черновике». Реальные таблицы базы данных продолжают использовать старый скомпилированный код до тех пор, пока вы не выполните обновление (клавиша F7 или кнопка «Обновить конфигурацию базы данных»). Таким образом, движения в регистрах создавались старым, еще не «испорченным» кодом, который хранился в БД. Как только вы обновите базу, движения также пропадут, поэтому действовать нужно оперативно.
Выясним, как использовать удобство визуального проектирования, не рискуя потерять ручные доработки. Профессиональное сообщество выделило несколько стратегий:
Рассмотрим пример правильного расположения тегов. Сразу после первого создания движений конструктором, раздвиньте его маркеры так, чтобы внутри них не осталось ничего ценного, а основной код вынесите за их пределы.
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Ваш ручной код начинается здесь
Для Каждого ТекСтрокаТовары Из Товары Цикл
// Дополнительная логика расчета
Движение = Движения.Себестоимость.Добавить();
// ...
КонецЦикла;
КонецПроцедуры
При повторном вызове конструктор увидит свои теги, «подумает», что он уже что-то создавал, и просто вставит код между ними. Ваш ручной код, находящийся ниже, останется нетронутым.
Проанализируем более элегантный архитектурный подход. Вместо того чтобы загромождать основную процедуру ОбработкаПроведения, создайте вспомогательную процедуру в этом же модуле. В основной процедуре оставьте только вызов:
Процедура ОбработкаПроведения(Отказ, Режим)
// Код, созданный конструктором автоматически
// ...
// Вызов вашей функции
ДополнитьДвиженияПоСебестоимости(Отказ);
КонецПроцедуры
Процедура ДополнитьДвиженияПоСебестоимости(Отказ)
// Здесь ваша уникальная логика, которую конструктор никогда не тронет
КонецПроцедуры
Если вы работаете в современной версии платформы 8.3, самым безопасным методом будет использование Расширений. Рассмотрим этот вариант подробнее:
РеализацияТоваров.ОбработкаПроведения с типом вызова «После».В этом случае в основной конфигурации конструктор может делать все что угодно — ваш код в расширении будет выполняться сразу после него и никогда не будет удален системой принудительно. Это золотой стандарт современной разработки в 1С.
Посмотрим на ситуацию шире. Любое программирование — это риск потери данных. Чтобы не зависеть от капризов конструктора, возьмем за правило следующие действия:
Администрирование — Выгрузить информационную базу занимает несколько минут, но экономит часы работы.Подводя итог, можно сказать, что Конструктор движений — это полезный инструмент для быстрой наброски структуры, но он требует осторожности. Помните о магических тегах //{{__КОНСТРУКТОР..., умейте пользоваться отметом к конфигурации БД и старайтесь выносить свою логику в отдельные методы или расширения. Таким образом, ваш тернистый путь обучения станет намного более предсказуемым и продуктивным.