При разработке или модификации конфигураций на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с ситуацией, когда документ, который изначально задумывался как «проводимый», необходимо перевести в статус чистого «регистратора» или просто печатной формы. Несмотря на то что в конфигураторе снимаются все соответствующие флаги («Бухгалтерский учет», «Оперативный учет»), система в пользовательском режиме продолжает выдавать ошибку «Документ не может быть проведен» при попытке закрыть форму или нажать кнопку «ОК».
В этой статье мы подробно разберем, почему ядро системы блокирует запись документа, и какие скрытые настройки в формах и модулях могут вызывать это поведение. Мы пройдем путь от проверки свойств метаданных до тонкой настройки формул диалога.
Наиболее распространенная причина этой ошибки кроется не в программном коде модуля, а в свойствах элементов управления самой формы документа. В 1С 7.7 для кнопок «ОК», «Записать» или «Провести» часто используются предопределенные системные команды, которые начинаются с символа решетки #. Если документ создавался с помощью конструктора, система автоматически прописывает логику проведения прямо в кнопку.
Давайте проанализируем ситуацию: когда вы нажимаете на кнопку «ОК», система обращается к полю «Формула» в свойствах этой кнопки. Рассмотрим, что там может быть написано:
#Записать Провести? — эта команда заставляет систему сначала записать объект, а затем инициировать процедуру проведения. Если в метаданных проведение запрещено, ядро выдаст критическую ошибку.#Записать? — команда записи с вопросом, которая также может конфликтовать с внутренними статусами, если документ был ранее помечен как проводимый.Для решения проблемы нам необходимо изменить формулу на простую запись или закрытие формы с сохранением. Рассмотрим вариант правильной настройки формулы для кнопки «ОК»:
// Вместо старой формулы используем:
#Записать
// Или вызываем процедуру закрытия формы
Форма.Закрыть(1)
Важно помнить, что кнопка «Провести», если она физически осталась на форме после изменения свойств документа в конфигураторе, должна быть либо удалена, либо сделана невидимой. Любое интерактивное нажатие на кнопку с формулой #Провести приведет к сообщению о невозможности выполнения операции.
Если правка формул кнопок не помогла, нам следует заглянуть в предопределенные процедуры модуля формы. Часто логика проведения «зашита» в обработчик записи документа. Проанализируем процедуру ПриЗаписи().
В типовых конфигурациях или старых самописках можно встретить код, который принудительно пытается провести документ после его записи. Выглядит это примерно так:
Процедура ПриЗаписи()
// Если здесь остался такой вызов:
Если Выбран() = 1 Тогда
Провести(); // Это вызовет ошибку, если проведение отключено в метаданных
КонецЕсли;
КонецПроцедуры
Выясним причину, почему этот код там остался. Часто при «зачистке» модуля программисты удаляют содержимое процедуры ОбработкаПроведения(), но забывают про вызовы метода Провести() или Записать(1) (где единица означает проведение) в других частях программы. Нам необходимо выполнить глобальный поиск по конфигурации (Ctrl + Shift + F) по названию вашего документа и ключевым словам Провести, Записать(1) и DoPost.
Рассмотрим ситуацию глубже. Помимо очевидных галочек «Бухгалтерский учет» и «Оперативный учет», в 1С 7.7 существуют и другие настройки, влияющие на поведение ядра:
Иногда проблема носит технический характер и связана с тем, как 1С 7.7 хранит состояние документов в базе данных (особенно в формате DBF). В системной таблице журналов документов (_1SJOURN) есть поле, отвечающее за статус (проведен/не проведен). Если документ когда-то был проведен, а потом вы изменили его тип в метаданных, в этом поле может остаться некорректный флаг.
Чтобы исключить влияние кэша и старых данных, рекомендуется выполнить следующие шаги:
Хотя в версии 7.7 нет полноценных «Подписок на события», как в 8.x, их роль часто выполняет Глобальный модуль. Проанализируем процедуры типа ПриЗаписиДокумента() в глобальном модуле. Если там прописана жесткая проверка условий для всех документов (например, проверка заполнения реквизитов перед проведением), она может некорректно отрабатывать для вашего нового «непроводимого» типа.
Посмотрим на пример возможной проверки в глобальном модуле:
Процедура ПриЗаписиДокумента(Конт)
ВидДока = Конт.Вид();
Если ВидДока = "ВашНовыйДокумент" Тогда
// Проверьте, нет ли здесь логики, возвращающей СтатусВозврата(0)
// или пытающейся программно нажать кнопку "ОК"
КонецЕсли;
КонецПроцедуры
Подводя итог, можно сказать, что в 90% случаев проблема «Документ не может быть проведен» в 1С 7.7 при снятых галочках в метаданных решается исправлением формулы кнопки #Записать. Платформа 7.7 очень чувствительна к «жестко» прописанным командам в интерфейсе формы, которые имеют приоритет над логикой, заданной в свойствах объекта.
Проанализируем наши действия по шагам для закрепления:
Провести? или замените всю строку на вызов программной процедуры.Провести().Соблюдение этих правил позволит вам быстро превратить любой документ 1С 7.7 в простую печатную форму или регистратор данных без лишних системных сообщений.